diff --git a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json index 043a55c14b..767f7b9b74 100644 --- a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json +++ b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json @@ -918,6 +918,25 @@ "name": "ParamSetRegistered", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "pkVerifier", + "type": "address" + } + ], + "name": "PkVerifierSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -2539,11 +2558,11 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615963806100d65f395ff3fe608060405234801561000f575f5ffd5b50600436106102ce575f3560e01c806390173a4111610182578063cb649617116100e0578063f0691cba1161008f578063f0691cba14610886578063f2fde38b14610899578063f3ceba3a146108ac578063f81b8ef6146108cd578063fad8e111146108e0578063fbdb3237146108f3578063fd2f3d011461091b575f5ffd5b8063cb649617146107ef578063cbd16872146107f8578063cf0f34c41461080b578063cfbdc98d1461081e578063d8afed3e1461084d578063e59e469514610860578063ea71aa5714610873575f5ffd5b80639e57b9341161013c5780639e57b93414610607578063a87f4ab91461061a578063ac3d2f421461076c578063bb2d1b8214610794578063bff232c1146107a7578063c1ab0f1f146107ba578063c4ccafa2146107cd575f5ffd5b806390173a41146105705780639117173c146105855780639231238614610598578063929a8faf146105ab57806399c6679d146105cc5780639c8570c8146105f4575f5ffd5b80635d1684181161022f5780637edcd7ab116101e95780637edcd7ab146104e757806381476ec21461050a578063830d71811461051d57806385814243146105305780638da5cb5b146105435780638dcdd86b1461054b5780638e5ce3ad1461055d575f5ffd5b80635d1684181461047d578063647846a51461049d5780636db5c8fd146104b0578063715018a6146104b95780637c8c3b4d146104c15780637cfa9d74146104d4575f5ffd5b806336c5d38a1161028b57806336c5d38a1461039b5780634017daf0146103ca578063406ed35c146103f75780634147a360146104175780634d600e5d146104445780634e92ec63146104575780634fc772641461046a575f5ffd5b806302a3a9c9146102d25780630ef81b2f146102e757806310bc62811461032557806311bd61d91461034d57806315cce224146103755780631ba7294514610388575b5f5ffd5b6102e56102e03660046145f6565b61092e565b005b61030f6102f5366004614618565b5f908152600960205260409020546001600160a01b031690565b60405161031c919061463c565b60405180910390f35b61030f610333366004614618565b60096020525f90815260409020546001600160a01b031681565b61036061035b366004614663565b6109da565b60405163ffffffff909116815260200161031c565b6102e56103833660046145f6565b610a16565b6102e561039636600461469b565b610abb565b6103bd6103a9366004614618565b5f908152600f602052604090205460ff1690565b60405161031c91906146dd565b6103dd6103d8366004614618565b610acf565b60405161031c9e9d9c9b9a99989796959493929190614729565b61040a610405366004614618565b610c7a565b60405161031c9190614903565b610436610425366004614618565b600c6020525f908152604090205481565b60405190815260200161031c565b6102e5610452366004614920565b610ef7565b6102e5610465366004614618565b611134565b6102e56104783660046145f6565b6111c3565b61049061048b3660046149b6565b611256565b60405161031c91906149cf565b60045461030f906001600160a01b031681565b61043660055481565b6102e56112ed565b6102e56104cf3660046149e1565b611300565b6102e56104e2366004614618565b611389565b6104fa6104f5366004614a4c565b611488565b604051901515815260200161031c565b6102e5610518366004614ac3565b6116de565b6102e561052b366004614ae3565b6117d2565b60015461030f906001600160a01b031681565b61030f6118de565b5f5461030f906001600160a01b031681565b60035461030f906001600160a01b031681565b61057861190c565b60405161031c9190614b31565b6102e5610593366004614618565b611952565b6105786105a6366004614618565b611ac0565b6105be6105b9366004614618565b611b19565b60405161031c929190614b52565b61030f6105da366004614618565b5f908152601060205260409020546001600160a01b031690565b6104fa610602366004614a4c565b611b40565b610436610615366004614b68565b611dd8565b61075f604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a0840152640100000000909104166101c082015290565b60405161031c9190614b9f565b61030f61077a366004614618565b5f908152600a60205260409020546001600160a01b031690565b6102e56107a2366004614cac565b6123ad565b6102e56107b53660046145f6565b612469565b6102e56107c8366004614ac3565b612510565b6104fa6107db3660046145f6565b60076020525f908152604090205460ff1681565b61043660065481565b6102e56108063660046149e1565b6125cd565b6102e5610819366004614618565b612687565b61084061082c366004614618565b5f908152600d602052604090205460ff1690565b60405161031c9190614ce6565b6102e561085b366004614cf4565b6126c4565b6102e561086e3660046145f6565b612951565b6102e5610881366004614d0e565b6129eb565b60025461030f906001600160a01b031681565b6102e56108a73660046145f6565b612c98565b6108bf6108ba366004614b68565b612cd2565b60405161031c929190614d45565b6103bd6108db366004614618565b6135b3565b6102e56108ee3660046145f6565b61374d565b61030f610901366004614618565b600a6020525f90815260409020546001600160a01b031681565b6102e56109293660046145f6565b6137e5565b610936613874565b6001600160a01b0381166109915760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f2081600281106109f3575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a1e613874565b6001600160a01b03811615801590610a4457506004546001600160a01b03828116911614155b8190610a645760405163eddf07f560e01b8152600401610988919061463c565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ab090839061463c565b60405180910390a150565b610ac3613874565b610acc816138a6565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff95861696949593946001600160a01b03841694600160a01b90940490931692909190610b2790614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390614d65565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b50505060088401546009850154600a860154600b870154600c8801805497986001600160a01b03958616989490951696509194509291610bdd90614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990614d65565b8015610c545780601f10610c2b57610100808354040283529160200191610c54565b820191905f5260205f20905b815481529060010190602001808311610c3757829003601f168201915b505050600d90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610c82614464565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610cbf57610cbf6146b5565b6003811115610cd057610cd06146b5565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610cf55750505091835250506005820154602082015260068201546001600160a01b0381166040830152600160a01b900460ff166060820152600782018054608090920191610d5290614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614d65565b8015610dc95780601f10610da057610100808354040283529160200191610dc9565b820191905f5260205f20905b815481529060010190602001808311610dac57829003601f168201915b505050918352505060088201546001600160a01b0390811660208301526009830154166040820152600a8201546060820152600b8201546080820152600c8201805460a090920191610e1a90614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4690614d65565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b5050509183525050600d91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a0820151919250839116610ef15760405163cd6f4a4f60e01b815260040161098891815260200190565b50919050565b5f610f00613963565b805490915060ff600160401b82041615906001600160401b03165f81158015610f265750825b90505f826001600160401b03166001148015610f415750303b155b905081158015610f4f575080155b15610f6d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f9757845460ff60401b1916600160401b1785555b610fa03361398d565b610fa987612687565b610fb28b61374d565b610fbb8a612951565b610fc48961092e565b610fcd88610a16565b610fd6866138a6565b604080516101e08101825261c3508082526161a86020808401829052611388948401859052601460608501819052620249f0608086018190526207a12060a087018190526107d060c088018190525f60e089018190526103e86101008a015261012089018190526109c46101408a018190526101608a018b90526101808a01526101a089018190526101c090980197909752601895909555601993909355601a95909555601b94909455601c55601d55601e55601f80546001600160f01b031916690138827101388000007d60a31b179055805467ffffffffffffffff191690556110bf6118de565b6001600160a01b03168c6001600160a01b0316146110e0576110e08c612c98565b831561112657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b61113c613874565b5f8181526009602052604090205481906001600160a01b0316611175576040516381c4951960e01b815260040161098891815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ab09083815260200190565b6111cb613874565b6001600160a01b0381165f90815260076020526040902054819060ff16611206576040516321ac7c5f60e01b8152600401610988919061463c565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ab090839061463c565b600b6020525f90815260409020805461126e90614d65565b80601f016020809104026020016040519081016040528092919081815260200182805461129a90614d65565b80156112e55780601f106112bc576101008083540402835291602001916112e5565b820191905f5260205f20905b8154815290600101906020018083116112c857829003601f168201915b505050505081565b6112f5613874565b6112fe5f61399e565b565b611308613874565b6001600160a01b0381161580159061133957505f828152600a60205260409020546001600160a01b03828116911614155b829061135b576040516381c4951960e01b815260040161098891815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b031633146113b35760405163b56831db60e01b815260040160405180910390fd5b5f818152600d602052604090205460ff1660018160068111156113d8576113d86146b5565b146113fd57816001826040516337e1404160e01b815260040161098893929190614d97565b5f828152600d60205260409020805460ff191660021790556015546114229042614dcc565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f5160206159375f395f51905f526001600260405161147c929190614ddf565b60405180910390a25050565b5f5f61149387610c7a565b5f888152600d602052604090205490915060ff1660048160068111156114bb576114bb6146b5565b14886004839091926114e3576040516337e1404160e01b815260040161098893929190614d97565b5050505f888152600e60209081526040918290208251606081018452815481526001820154928101929092526002015491810182905290899042811015611546576040516308f3034360e31b815260048101929092526024820152604401610988565b50505f898152600860205260409020600c01611563888a83614e6d565b505f898152600d60205260409020805460ff191660051790556101c08301511561165d57846115a557604051631eae1a4d60e31b815260040160405180910390fd5b8261010001516001600160a01b031663258ae58289896040516115c9929190614f21565b6040519081900381206001600160e01b031960e084901b1682526115f3918a908a90600401614f58565b602060405180830381865afa15801561160e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116329190614f87565b935087878561165657604051632f9f8ab960e01b8152600401610988929190614fa2565b5050611662565b600193505b61166b89613a0e565b887f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b898989896040516116a19493929190614fb5565b60405180910390a2885f5160206159375f395f51905f52600460056040516116ca929190614ddf565b60405180910390a250505095945050505050565b5f546001600160a01b031633146117085760405163b56831db60e01b815260040160405180910390fd5b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611738576117386146b5565b1461175d57836002826040516337e1404160e01b815260040161098893929190614d97565b5f848152600d6020526040808220805460ff19166003179055600a84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f5160206159375f395f51905f52600260036040516117c4929190614ddf565b60405180910390a250505050565b6117da613874565b806118165760405162461bcd60e51b815260206004820152600c60248201526b456d70747920706172616d7360a01b6044820152606401610988565b60ff83165f908152600b60205260409020805461183290614d65565b1590506118815760405162461bcd60e51b815260206004820152601b60248201527f506172616d53657420616c7265616479207265676973746572656400000000006044820152606401610988565b60ff83165f908152600b6020526040902061189d828483614e6d565b507f6e4a4ea7f38fc775e616080b155744337e6216848e886a69c918b4ab84da21958383836040516118d193929190614fe6565b60405180910390a1505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b61192d60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601554815260165460208201526017549181019190915290565b5f818152600d602052604090205460ff166006816006811115611977576119776146b5565b14829061199a57604051637cb2d48360e11b815260040161098891815260200190565b505f828152600c602052604090205482816119cb576040516345ba89d560e11b815260040161098891815260200190565b505f838152600c602052604081208190556119e584613e7a565b5f858152601160205260409020546002549192506001600160a01b0390811691611a129183911685613f67565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611a48908890879087908790600401615045565b5f604051808303815f87803b158015611a5f575f5ffd5b505af1158015611a71573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611ab1929190918252602082015260400190565b60405180910390a25050505050565b611ae160405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611b368482613fc4565b9250925050915091565b5f5f611b4b87610c7a565b5f888152600d602052604090205490915060ff166003816006811115611b7357611b736146b5565b1488600383909192611b9b576040516337e1404160e01b815260040161098893929190614d97565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611bff576040516308f3034360e31b815260048101929092526024820152604401610988565b5050606083015160200151899042811115611c365760405163017e35e560e71b815260048101929092526024820152604401610988565b5050610160830151899015611c6157604051637eb9cea960e11b815260040161098891815260200190565b505f8888604051611c73929190614f21565b60408051918290039091205f8c815260086020908152838220600b01839055600d905291909120805460ff19166004179055601754909150611cb59042614dcc565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf90611d02908d9085908c908c90600401615090565b6020604051808303815f875af1158015611d1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d429190614f87565b9450888886611d6657604051632f9f8ab960e01b8152600401610988929190614fa2565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a604051611d9a929190614fa2565b60405180910390a2895f5160206159375f395f51905f5260036004604051611dc3929190614ddf565b60405180910390a25050505095945050505050565b5f80600b81611ded60a08601608087016149b6565b60ff1660ff1681526020019081526020015f208054611e0b90614d65565b905011611e2a5760405162461bcd60e51b8152600401610988906150af565b5f601281611e3b60208601866150e6565b6003811115611e4c57611e4c6146b5565b6003811115611e5d57611e5d6146b5565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611e84579050505050505090505f81600160028110611edb57611edb61507c565b602002015163ffffffff1611835f016020810190611ef991906150e6565b90611f185760405163286c068d60e11b815260040161098891906150ff565b506020808201518251604080516101e081018252601854815260195481860152601a5491810191909152601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e0830152600160a01b810461ffff908116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152925463ffffffff8181166101a0860181905264010000000090920481166101c086015292831693919092169115612043576101a081015163ffffffff16846001602002015163ffffffff161015865f01602081019061202291906150e6565b906120415760405163010b971d60e31b815260040161098891906150ff565b505b6101c081015163ffffffff1615612092576101c081015184519063ffffffff908116908216101561209057604051630a4b6b6360e11b815263ffffffff9091166004820152602401610988565b505b604086013560208701358110156120bf5760405163174b5a0760e21b815260040161098891815260200190565b506101808101516017545f91612710916120dd9161ffff169061510d565b6120e79190615124565b61271061ffff1683610160015161ffff16601560010154612108919061510d565b6121129190615124565b61271061ffff1684610140015161ffff1660155f0154612132919061510d565b61213c9190615124565b5f5460408051634f87c3a560e11b8152815160208e81013594938f0135936001600160a01b031692639f0f874a92600480830193928290030181865afa158015612188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ac9190615143565b6121b69190614dcc565b6121c0919061515a565b6121ca9190614dcc565b6121d49190614dcc565b6121de9190614dcc565b90505f6121ec60018661515a565b6121f790600261510d565b61220290600261510d565b61220d906006614dcc565b90505f85845f015161221f919061510d565b905081868560200151612232919061510d565b61223c919061510d565b6122469082614dcc565b9050600186111561228e57600261225e60018861515a565b612268908861510d565b8560400151612277919061510d565b6122819190615124565b61228b9082614dcc565b90505b81868560c0015161229f919061510d565b6122a9919061510d565b6122b39082614dcc565b9050828685606001516122c6919061510d565b6122d0919061510d565b6122da9082614dcc565b90508484608001516122ec919061510d565b6122f69082614dcc565b9050600185111561233e57600261230e60018761515a565b612318908761510d565b8560400151612327919061510d565b6123319190615124565b61233b9082614dcc565b90505b60a084015161234d9082614dcc565b610100850151909150612710906123689061ffff1682614dcc565b612372908361510d565b61237c9190615124565b975087806123a057604051638c4fcd9360e01b815260040161098891815260200190565b5050505050505050919050565b5f546001600160a01b03163314806123cf57506003546001600160a01b031633145b6123ec57604051639e75a8b560e01b815260040160405180910390fd5b5f8160ff161180156124025750600d60ff821611155b6124475760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b6044820152606401610988565b612465828260ff16600d811115612460576124606146b5565b61414c565b5050565b612471613874565b6001600160a01b0381166124c75760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e616765722061646472657373006044820152606401610988565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461253b576040516357d6948d60e11b815260040160405180910390fd5b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612585575f5ffd5b505af1158015612597573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee5428260405161147c91815260200190565b6125d5613874565b6001600160a01b0381161580159061260657505f828152600960205260409020546001600160a01b03828116911614155b8290612628576040516381c4951960e01b815260040161098891815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb69910160405180910390a15050565b61268f613874565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ab0565b6126cc613874565b6127106126e161012083016101008401615187565b61ffff1611156126f961012083016101008401615187565b9061271e576040516301027fc160e21b815261ffff9091166004820152602401610988565b5061271061273461014083016101208401615187565b61ffff16111561274c61014083016101208401615187565b90612771576040516301027fc160e21b815261ffff9091166004820152602401610988565b5061271061278761016083016101408401615187565b61ffff16111561279f61016083016101408401615187565b906127c457604051633239953960e01b815261ffff9091166004820152602401610988565b506127106127da61018083016101608401615187565b61ffff1611156127f261018083016101608401615187565b9061281757604051633239953960e01b815261ffff9091166004820152602401610988565b5061271061282d6101a083016101808401615187565b61ffff1611156128456101a083016101808401615187565b9061286a57604051633239953960e01b815261ffff9091166004820152602401610988565b5061287d61014082016101208301615187565b61ffff1615806128a657505f61289a610100830160e084016145f6565b6001600160a01b031614155b6128c35760405163015f92ff60e51b815260040160405180910390fd5b6128d56101e082016101c083016151be565b63ffffffff166128ed6101c083016101a084016151be565b63ffffffff161015612912576040516392f55c6560e01b815260040160405180910390fd5b80601861291f82826151fd565b9050507fbf3951313e980027eb48ce363fdb707286195ec6a0f802ac153927cf929c3fc681604051610ab091906153bb565b612959613874565b6001600160a01b0381161580159061297f57506001546001600160a01b03828116911614155b819061299f576040516320252f0b60e01b8152600401610988919061463c565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ab090839061463c565b6129f3613874565b612a0060208201826151be565b63ffffffff16612a1660408301602084016151be565b63ffffffff1610158015612a3b57505f612a3360208301836151be565b63ffffffff16115b612a5857604051634564ab9b60e01b815260040160405180910390fd5b604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a08401819052640100000000909204166101c083015215612b91576101a081015163ffffffff16612b4160408401602085016151be565b63ffffffff161015612b5960408401602085016151be565b826101a001519091612b8e57604051633ccc4c2160e21b815263ffffffff928316600482015291166024820152604401610988565b50505b6101c081015163ffffffff1615612c08576101c081015163ffffffff16612bbb60208401846151be565b63ffffffff161015612bd060208401846151be565b826101c001519091612c055760405163156c4e5b60e11b815263ffffffff928316600482015291166024820152604401610988565b50505b8160125f856003811115612c1e57612c1e6146b5565b6003811115612c2f57612c2f6146b5565b815260208101919091526040015f20612c499160026144e1565b50826003811115612c5c57612c5c6146b5565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa83604051612c8b91906154c5565b60405180910390a2505050565b612ca0613874565b6001600160a01b038116612cc9575f604051631e4fbdf760e01b8152600401610988919061463c565b610acc8161399e565b5f612cdb614464565b5f601281612cec60208701876150e6565b6003811115612cfd57612cfd6146b5565b6003811115612d0e57612d0e6146b5565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d35579050505050505090505f81600160028110612d8c57612d8c61507c565b602002015163ffffffff1611845f016020810190612daa91906150e6565b90612dc95760405163286c068d60e11b815260040161098891906150ff565b50602084013542811015612df357604051630b99e87960e01b815260040161098891815260200190565b5060408401356020850135811015612e215760405163174b5a0760e21b815260040161098891815260200190565b506017546016545f9190612e3942604089013561515a565b612e439190614dcc565b612e4d9190614dcc565b905060055481108190612e76576040516313b783af60e21b815260040161098891815260200190565b5060075f612e8a60808801606089016145f6565b6001600160a01b0316815260208101919091526040015f205460ff16612eb660808701606088016145f6565b90612ed55760405163295a6a6f60e11b8152600401610988919061463c565b505f612ee086611dd8565b60068054965090915085905f612ef583615505565b9091555050604080514460208201529081018690525f9060600160408051601f1981840301815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b03199081166001600160a01b0393841617909155601f805460138852868520805461ffff191661ffff600160b01b909304929092169190911790555460148752858420805483169190931617909155600d8552838220805460ff191660011790556010909452829020805433941693909317909255601654919250612fd09190890135614dcc565b5f878152600e6020908152604090912060010191909155818652612ff6908801886150e6565b8560200190600381111561300c5761300c6146b5565b9081600381111561301f5761301f6146b5565b905250436040808701919091528051808201825290602089019060029083908390808284375f92019190915250505060608087019190915261306790608089019089016145f6565b6001600160a01b031660a080870191909152613088908801608089016149b6565b60ff1660c0808701919091526130a09088018861551d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e0808701919091526130ed90610100890190890161555f565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a0860181905260045461313d916001600160a01b039091169030856142a7565b5f600b8161315160a08b0160808c016149b6565b60ff1660ff1681526020019081526020015f20805461316f90614d65565b80601f016020809104026020016040519081016040528092919081815260200182805461319b90614d65565b80156131e65780601f106131bd576101008083540402835291602001916131e6565b820191905f5260205f20905b8154815290600101906020018083116131c957829003601f168201915b505050505090505f81511161320d5760405162461bcd60e51b8152600401610988906150af565b5f61321e60808a0160608b016145f6565b6001600160a01b031663fefd9a8b89858561323c60a08f018f61551d565b8f8060c0019061324c919061551d565b6040518863ffffffff1660e01b815260040161326e979695949392919061557a565b6020604051808303815f875af115801561328a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132ae9190615143565b5f818152600960205260409020549091506001600160a01b031681816132ea576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409020546001600160a01b03168281613324576040516381c4951960e01b815260040161098891815260200190565b50608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff199190911690836003811115613382576133826146b5565b0217905550604082015181600201556060820151816003019060026133a8929190614582565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e0820151600782019061340190826155ce565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c82019061346990826155ce565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b906134cf908d9089908d90600401615683565b6020604051808303815f875af11580156134eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061350f9190614f87565b61352c57604051630d8dbe2560e01b815260040160405180910390fd5b61353c60808c0160608d016145f6565b6001600160a01b03167f5090c9764b5cd13df7afc0013f733dfbe6eaf1b6ddc22a5e291fa387efd4c15e8b8b604051613576929190614d45565b60405180910390a2895f5160206159375f395f51905f525f600160405161359e929190614ddf565b60405180910390a25050505050505050915091565b5f818152600d602052604081205460ff16818160068111156135d7576135d76146b5565b036135fc57826001826040516337e1404160e01b815260040161098893929190614d97565b6005816006811115613610576136106146b5565b036136315760405163462c7bed60e01b815260048101849052602401610988565b6006816006811115613645576136456146b5565b0361366657604051633de16e3560e11b815260048101849052602401610988565b5f6136718483613fc4565b935090508061369657604051639f65d93560e01b815260048101859052602401610988565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d8111156136df576136df6146b5565b0217905550835f5160206159375f395f51905f52836006604051613704929190614ddf565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb838560405161373e9291906156c8565b60405180910390a25050919050565b613755613874565b6001600160a01b0381161580159061377a57505f546001600160a01b03828116911614155b819061379a576040516375ac4eb760e11b8152600401610988919061463c565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ab090839061463c565b6001600160a01b0381165f90815260076020526040902054819060ff16156138215760405163b29d459560e01b8152600401610988919061463c565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ab090839061463c565b3361387d6118de565b6001600160a01b0316146112fe573360405163118cdaa760e01b8152600401610988919061463c565b80356138c55760405163055f269d60e01b815260040160405180910390fd5b5f8160200135116138e95760405163055f269d60e01b815260040160405180910390fd5b5f81604001351161390d5760405163055f269d60e01b815260040160405180910390fd5b80356015819055602080830135601681905560408085013560178190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ab0565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6139956142e6565b610acc8161430b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa158015613a53573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613a7a919081019061579f565b5080515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b031690829003613b19576002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613ae590889088908690600401615864565b5f604051808303815f87803b158015613afc575f5ffd5b505af1158015613b0e573d5f5f3e3d5ffd5b505050505050505050565b825f03613bba575f858152601060205260409020546001600160a01b03168015613b5157613b516001600160a01b0383168285613f67565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613b8590899089908790600401615864565b5f604051808303815f87803b158015613b9c575f5ffd5b505af1158015613bae573d5f5f3e3d5ffd5b50505050505050505050565b5f85815260136020908152604080832054601490925282205461ffff909116906001600160a01b03168115801590613bfa57506001600160a01b03811615155b15613c3657612710613c1061ffff84168761510d565b613c1a9190615124565b92508215613c3657613c366001600160a01b0385168285613f67565b5f613c41848761515a565b90505f876001600160401b03811115613c5c57613c5c614dfa565b604051908082528060200260200182016040528015613c85578160200160208202803683370190505b5090505f613c938984615124565b90505f805b8a811015613cd25782848281518110613cb357613cb361507c565b6020908102919091010152613cc88383614dcc565b9150600101613c98565b505f613cde828661515a565b90508015613d1b578084613cf360018e61515a565b81518110613d0357613d0361507c565b60200260200101818151613d179190614dcc565b9052505b600154613d35906001600160a01b038b8116911687614313565b60015f9054906101000a90046001600160a01b03166001600160a01b031663dd8c818e8a8e876040518463ffffffff1660e01b8152600401613d79939291906158c4565b5f604051808303815f87803b158015613d90575f5ffd5b505af1158015613da2573d5f5f3e3d5ffd5b5050600154613dc092506001600160a01b038c81169250165f614313565b8c7fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a8d86604051613df29291906158f9565b60405180910390a260025f9054906101000a90046001600160a01b03166001600160a01b03166341489f158e8e8c6040518463ffffffff1660e01b8152600401613e3e93929190615864565b5f604051808303815f87803b158015613e55575f5ffd5b505af1158015613e67573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b5f818152600f602052604090205460609060ff16600181600d811115613ea257613ea26146b5565b1480613ebf5750600281600d811115613ebd57613ebd6146b5565b145b15613ef7575f5b604051908082528060200260200182016040528015613eef578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015613f5d57506040513d5f823e601f3d908101601f19168201604052613f5a919081019061579f565b60015b613eef575f613ec6565b613fbf83846001600160a01b031663a9059cbb8585604051602401613f8d92919061591d565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061439f565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa15801561403e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140629190615143565b90506001856006811115614078576140786146b5565b14801561408457508042115b1561409757600180935093505050614145565b60028560068111156140ab576140ab6146b5565b1480156140b85750815142115b156140cc5760016003935093505050614145565b60038560068111156140e0576140e06146b5565b1480156140f05750816020015142115b156141045760016006935093505050614145565b6004856006811115614118576141186146b5565b1480156141285750816040015142115b1561413c576001600a935093505050614145565b5f5f9350935050505b9250929050565b5f828152600d602052604081205460ff1690816006811115614170576141706146b5565b0361419557826001826040516337e1404160e01b815260040161098893929190614d97565b60058160068111156141a9576141a96146b5565b036141ca5760405163462c7bed60e01b815260048101849052602401610988565b60068160068111156141de576141de6146b5565b036141ff57604051633de16e3560e11b815260048101849052602401610988565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d811115614248576142486146b5565b0217905550825f5160206159375f395f51905f5282600660405161426d929190614ddf565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8284604051612c8b9291906156c8565b6040516001600160a01b0384811660248301528381166044830152606482018390526142e09186918216906323b872dd90608401613f8d565b50505050565b6142ee614402565b6112fe57604051631afcd79f60e31b815260040160405180910390fd5b612ca06142e6565b5f836001600160a01b031663095ea7b3848460405160240161433692919061591d565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061436f848261441b565b6142e05761439984856001600160a01b031663095ea7b3865f604051602401613f8d92919061591d565b6142e084825b5f5f60205f8451602086015f885af1806143be576040513d5f823e3d81fd5b50505f513d915081156143d55780600114156143e2565b6001600160a01b0384163b155b156142e05783604051635274afe760e01b8152600401610988919061463c565b5f61440b613963565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f51905082801561445a5750811561444c578060011461445a565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f815260200161448c6145b0565b81525f602082018190526040820181905260608083018290526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b600183019183908215614572579160200282015f5b8382111561454057833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026144f6565b80156145705782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614540565b505b5061457e9291506145ce565b5090565b8260028101928215614572579160200282015b82811115614572578251825591602001919060010190614595565b60405180604001604052806002906020820280368337509192915050565b5b8082111561457e575f81556001016145cf565b6001600160a01b0381168114610acc575f5ffd5b5f60208284031215614606575f5ffd5b8135614611816145e2565b9392505050565b5f60208284031215614628575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b80356004811061465e575f5ffd5b919050565b5f5f60408385031215614674575f5ffd5b61467d83614650565b946020939093013593505050565b5f60608284031215610ef1575f5ffd5b5f606082840312156146ab575f5ffd5b614611838361468b565b634e487b7160e01b5f52602160045260245ffd5b600e81106146d9576146d96146b5565b9052565b6020810161398782846146c9565b600481106146d9576146d96146b5565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152614739602082018f6146eb565b8c60408201528b6060820152614752608082018c61462f565b60ff8a1660a08201526101c060c08201525f6147726101c083018b6146fb565b61477f60e084018b61462f565b61478d61010084018a61462f565b87610120840152866101408401528281036101608401526147ae81876146fb565b9150506147bf61018083018561462f565b8215156101a08301529f9e505050505050505050505050505050565b805f5b60028110156142e05781518452602093840193909101906001016147de565b805182525f602082015161481460208501826146eb565b5060408201516040840152606082015161483160608501826147db565b50608082015160a084015260a082015161484e60c085018261462f565b5060c082015160ff811660e08501525060e082015161020061010085015261487a6102008501826146fb565b905061010083015161489061012086018261462f565b506101208301516148a561014086018261462f565b506101408301516101608501526101608301516101808501526101808301518482036101a08601526148d782826146fb565b9150506101a08301516148ee6101c086018261462f565b506101c08301518015156101e0860152613eef565b602081525f61461160208301846147fd565b803561465e816145e2565b5f5f5f5f5f5f5f610120888a031215614937575f5ffd5b8735614942816145e2565b96506020880135614952816145e2565b95506040880135614962816145e2565b94506060880135614972816145e2565b93506080880135614982816145e2565b925060a088013591506149988960c08a0161468b565b905092959891949750929550565b803560ff8116811461465e575f5ffd5b5f602082840312156149c6575f5ffd5b614611826149a6565b602081525f61461160208301846146fb565b5f5f604083850312156149f2575f5ffd5b823591506020830135614a04816145e2565b809150509250929050565b5f5f83601f840112614a1f575f5ffd5b5081356001600160401b03811115614a35575f5ffd5b602083019150836020828501011115614145575f5ffd5b5f5f5f5f5f60608688031215614a60575f5ffd5b8535945060208601356001600160401b03811115614a7c575f5ffd5b614a8888828901614a0f565b90955093505060408601356001600160401b03811115614aa6575f5ffd5b614ab288828901614a0f565b969995985093965092949392505050565b5f5f60408385031215614ad4575f5ffd5b50508035926020909101359150565b5f5f5f60408486031215614af5575f5ffd5b614afe846149a6565b925060208401356001600160401b03811115614b18575f5ffd5b614b2486828701614a0f565b9497909650939450505050565b81518152602080830151908201526040808301519082015260608101613987565b82151581526040810161461160208301846146c9565b5f60208284031215614b78575f5ffd5b81356001600160401b03811115614b8d575f5ffd5b82016101008185031215614611575f5ffd5b5f6101e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151614bf960e084018261462f565b50610100830151614c1161010084018261ffff169052565b50610120830151614c2961012084018261ffff169052565b50610140830151614c4161014084018261ffff169052565b50610160830151614c5961016084018261ffff169052565b50610180830151614c7161018084018261ffff169052565b506101a0830151614c8b6101a084018263ffffffff169052565b506101c0830151614ca56101c084018263ffffffff169052565b5092915050565b5f5f60408385031215614cbd575f5ffd5b82359150614ccd602084016149a6565b90509250929050565b600781106146d9576146d96146b5565b602081016139878284614cd6565b5f6101e0828403128015614d06575f5ffd5b509092915050565b5f5f60608385031215614d1f575f5ffd5b614d2883614650565b915083606084011115614d39575f5ffd5b50926020919091019150565b828152604060208201525f614d5d60408301846147fd565b949350505050565b600181811c90821680614d7957607f821691505b602082108103610ef157634e487b7160e01b5f52602260045260245ffd5b83815260608101614dab6020830185614cd6565b614d5d6040830184614cd6565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561398757613987614db8565b60408101614ded8285614cd6565b6146116020830184614cd6565b634e487b7160e01b5f52604160045260245ffd5b601f821115613fbf57805f5260205f20601f840160051c81016020851015614e335750805b601f840160051c820191505b81811015614e52575f8155600101614e3f565b5050505050565b5f19600383901b1c191660019190911b1790565b6001600160401b03831115614e8457614e84614dfa565b614e9883614e928354614d65565b83614e0e565b5f601f841160018114614ec4575f8515614eb25750838201355b614ebc8682614e59565b845550614e52565b5f83815260208120601f198716915b82811015614ef35786850135825560209485019460019092019101614ed3565b5086821015614f0f575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f614f71604083018486614f30565b95945050505050565b8015158114610acc575f5ffd5b5f60208284031215614f97575f5ffd5b815161461181614f7a565b602081525f614d5d602083018486614f30565b604081525f614fc8604083018688614f30565b8281036020840152614fdb818587614f30565b979650505050505050565b60ff84168152604060208201525f614f71604083018486614f30565b5f8151808452602084019350602083015f5b8281101561503b5781516001600160a01b0316865260209586019590910190600101615014565b5093949350505050565b848152836020820152608060408201525f6150636080830185615002565b905060018060a01b038316606083015295945050505050565b634e487b7160e01b5f52603260045260245ffd5b848152836020820152606060408201525f61445a606083018486614f30565b6020808252601c908201527f42465620706172616d20736574206e6f74207265676973746572656400000000604082015260600190565b5f602082840312156150f6575f5ffd5b61461182614650565b6020810161398782846146eb565b808202811582820484141761398757613987614db8565b5f8261513e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615153575f5ffd5b5051919050565b8181038181111561398757613987614db8565b61ffff81168114610acc575f5ffd5b803561465e8161516d565b5f60208284031215615197575f5ffd5b81356146118161516d565b63ffffffff81168114610acc575f5ffd5b803561465e816151a2565b5f602082840312156151ce575f5ffd5b8135614611816151a2565b5f8135613987816145e2565b5f81356139878161516d565b5f8135613987816151a2565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c082013560068201556007810161526d61525060e085016151d9565b82546001600160a01b0319166001600160a01b0391909116178255565b61529d61527d61010085016151e5565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b6152cd6152ad61012085016151e5565b82805461ffff60b01b191660b09290921b61ffff60b01b16919091179055565b6152fd6152dd61014085016151e5565b82805461ffff60c01b191660c09290921b61ffff60c01b16919091179055565b61532d61530d61016085016151e5565b82805461ffff60d01b191660d09290921b61ffff60d01b16919091179055565b61535d61533d61018085016151e5565b82805461ffff60e01b191660e09290921b61ffff60e01b16919091179055565b50600881016153896153726101a085016151f1565b825463ffffffff191663ffffffff91909116178255565b613fbf6153996101c085016151f1565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c080830135908201526101e0810161540c60e08401614915565b61541960e084018261462f565b50615427610100840161517c565b61ffff1661010083015261543e610120840161517c565b61ffff16610120830152615455610140840161517c565b61ffff1661014083015261546c610160840161517c565b61ffff16610160830152615483610180840161517c565b61ffff1661018083015261549a6101a084016151b3565b63ffffffff166101a08301526154b36101c084016151b3565b63ffffffff81166101c0840152614ca5565b6040810181835f5b60028110156154fc5781356154e1816151a2565b63ffffffff16835260209283019291909101906001016154cd565b50505092915050565b5f6001820161551657615516614db8565b5060010190565b5f5f8335601e19843603018112615532575f5ffd5b8301803591506001600160401b0382111561554b575f5ffd5b602001915036819003821315614145575f5ffd5b5f6020828403121561556f575f5ffd5b813561461181614f7a565b87815286602082015260a060408201525f61559860a08301886146fb565b82810360608401526155ab818789614f30565b905082810360808401526155c0818587614f30565b9a9950505050505050505050565b81516001600160401b038111156155e7576155e7614dfa565b6155fb816155f58454614d65565b84614e0e565b6020601f821160018114615628575f83156156165750848201515b6156208482614e59565b855550614e52565b5f84815260208120601f198516915b828110156156575787850151825560209485019460019092019101615637565b508482101561567457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b60028110156156bd57815163ffffffff16835260209283019290910190600101615698565b505050949350505050565b604081016156d68285614cd6565b61461160208301846146c9565b604051601f8201601f191681016001600160401b038111828210171561570b5761570b614dfa565b604052919050565b5f6001600160401b0382111561572b5761572b614dfa565b5060051b60200190565b5f82601f830112615744575f5ffd5b815161575761575282615713565b6156e3565b8082825260208201915060208360051b860101925085831115615778575f5ffd5b602085015b8381101561579557805183526020928301920161577d565b5095945050505050565b5f5f604083850312156157b0575f5ffd5b82516001600160401b038111156157c5575f5ffd5b8301601f810185136157d5575f5ffd5b80516157e361575282615713565b8082825260208201915060208360051b850101925087831115615804575f5ffd5b6020840193505b8284101561582f57835161581e816145e2565b82526020938401939091019061580b565b8095505050505060208301516001600160401b0381111561584e575f5ffd5b61585a85828601615735565b9150509250929050565b838152606060208201525f61587c6060830185615002565b905060018060a01b0383166040830152949350505050565b5f8151808452602084019350602083015f5b8281101561503b5781518652602095860195909101906001016158a6565b6001600160a01b03841681526060602082018190525f906158e790830185615002565b828103604084015261445a8185615894565b604081525f61590b6040830185615002565b8281036020840152614f718185615894565b6001600160a01b0392909216825260208201526040019056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102ce575f3560e01c806390173a4111610182578063cb649617116100e0578063f0691cba1161008f578063f0691cba14610886578063f2fde38b14610899578063f3ceba3a146108ac578063f81b8ef6146108cd578063fad8e111146108e0578063fbdb3237146108f3578063fd2f3d011461091b575f5ffd5b8063cb649617146107ef578063cbd16872146107f8578063cf0f34c41461080b578063cfbdc98d1461081e578063d8afed3e1461084d578063e59e469514610860578063ea71aa5714610873575f5ffd5b80639e57b9341161013c5780639e57b93414610607578063a87f4ab91461061a578063ac3d2f421461076c578063bb2d1b8214610794578063bff232c1146107a7578063c1ab0f1f146107ba578063c4ccafa2146107cd575f5ffd5b806390173a41146105705780639117173c146105855780639231238614610598578063929a8faf146105ab57806399c6679d146105cc5780639c8570c8146105f4575f5ffd5b80635d1684181161022f5780637edcd7ab116101e95780637edcd7ab146104e757806381476ec21461050a578063830d71811461051d57806385814243146105305780638da5cb5b146105435780638dcdd86b1461054b5780638e5ce3ad1461055d575f5ffd5b80635d1684181461047d578063647846a51461049d5780636db5c8fd146104b0578063715018a6146104b95780637c8c3b4d146104c15780637cfa9d74146104d4575f5ffd5b806336c5d38a1161028b57806336c5d38a1461039b5780634017daf0146103ca578063406ed35c146103f75780634147a360146104175780634d600e5d146104445780634e92ec63146104575780634fc772641461046a575f5ffd5b806302a3a9c9146102d25780630ef81b2f146102e757806310bc62811461032557806311bd61d91461034d57806315cce224146103755780631ba7294514610388575b5f5ffd5b6102e56102e03660046145f6565b61092e565b005b61030f6102f5366004614618565b5f908152600960205260409020546001600160a01b031690565b60405161031c919061463c565b60405180910390f35b61030f610333366004614618565b60096020525f90815260409020546001600160a01b031681565b61036061035b366004614663565b6109da565b60405163ffffffff909116815260200161031c565b6102e56103833660046145f6565b610a16565b6102e561039636600461469b565b610abb565b6103bd6103a9366004614618565b5f908152600f602052604090205460ff1690565b60405161031c91906146dd565b6103dd6103d8366004614618565b610acf565b60405161031c9e9d9c9b9a99989796959493929190614729565b61040a610405366004614618565b610c7a565b60405161031c9190614903565b610436610425366004614618565b600c6020525f908152604090205481565b60405190815260200161031c565b6102e5610452366004614920565b610ef7565b6102e5610465366004614618565b611134565b6102e56104783660046145f6565b6111c3565b61049061048b3660046149b6565b611256565b60405161031c91906149cf565b60045461030f906001600160a01b031681565b61043660055481565b6102e56112ed565b6102e56104cf3660046149e1565b611300565b6102e56104e2366004614618565b611389565b6104fa6104f5366004614a4c565b611488565b604051901515815260200161031c565b6102e5610518366004614ac3565b6116de565b6102e561052b366004614ae3565b6117d2565b60015461030f906001600160a01b031681565b61030f6118de565b5f5461030f906001600160a01b031681565b60035461030f906001600160a01b031681565b61057861190c565b60405161031c9190614b31565b6102e5610593366004614618565b611952565b6105786105a6366004614618565b611ac0565b6105be6105b9366004614618565b611b19565b60405161031c929190614b52565b61030f6105da366004614618565b5f908152601060205260409020546001600160a01b031690565b6104fa610602366004614a4c565b611b40565b610436610615366004614b68565b611dd8565b61075f604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a0840152640100000000909104166101c082015290565b60405161031c9190614b9f565b61030f61077a366004614618565b5f908152600a60205260409020546001600160a01b031690565b6102e56107a2366004614cac565b6123ad565b6102e56107b53660046145f6565b612469565b6102e56107c8366004614ac3565b612510565b6104fa6107db3660046145f6565b60076020525f908152604090205460ff1681565b61043660065481565b6102e56108063660046149e1565b6125cd565b6102e5610819366004614618565b612687565b61084061082c366004614618565b5f908152600d602052604090205460ff1690565b60405161031c9190614ce6565b6102e561085b366004614cf4565b6126c4565b6102e561086e3660046145f6565b612951565b6102e5610881366004614d0e565b6129eb565b60025461030f906001600160a01b031681565b6102e56108a73660046145f6565b612c98565b6108bf6108ba366004614b68565b612cd2565b60405161031c929190614d45565b6103bd6108db366004614618565b6135b3565b6102e56108ee3660046145f6565b61374d565b61030f610901366004614618565b600a6020525f90815260409020546001600160a01b031681565b6102e56109293660046145f6565b6137e5565b610936613874565b6001600160a01b0381166109915760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f2081600281106109f3575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a1e613874565b6001600160a01b03811615801590610a4457506004546001600160a01b03828116911614155b8190610a645760405163eddf07f560e01b8152600401610988919061463c565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ab090839061463c565b60405180910390a150565b610ac3613874565b610acc816138a6565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff95861696949593946001600160a01b03841694600160a01b90940490931692909190610b2790614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390614d65565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b50505060088401546009850154600a860154600b870154600c8801805497986001600160a01b03958616989490951696509194509291610bdd90614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990614d65565b8015610c545780601f10610c2b57610100808354040283529160200191610c54565b820191905f5260205f20905b815481529060010190602001808311610c3757829003601f168201915b505050600d90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610c82614464565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610cbf57610cbf6146b5565b6003811115610cd057610cd06146b5565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610cf55750505091835250506005820154602082015260068201546001600160a01b0381166040830152600160a01b900460ff166060820152600782018054608090920191610d5290614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614d65565b8015610dc95780601f10610da057610100808354040283529160200191610dc9565b820191905f5260205f20905b815481529060010190602001808311610dac57829003601f168201915b505050918352505060088201546001600160a01b0390811660208301526009830154166040820152600a8201546060820152600b8201546080820152600c8201805460a090920191610e1a90614d65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4690614d65565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b5050509183525050600d91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a0820151919250839116610ef15760405163cd6f4a4f60e01b815260040161098891815260200190565b50919050565b5f610f00613963565b805490915060ff600160401b82041615906001600160401b03165f81158015610f265750825b90505f826001600160401b03166001148015610f415750303b155b905081158015610f4f575080155b15610f6d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f9757845460ff60401b1916600160401b1785555b610fa03361398d565b610fa987612687565b610fb28b61374d565b610fbb8a612951565b610fc48961092e565b610fcd88610a16565b610fd6866138a6565b604080516101e08101825261c3508082526161a86020808401829052611388948401859052601460608501819052620249f0608086018190526207a12060a087018190526107d060c088018190525f60e089018190526103e86101008a015261012089018190526109c46101408a018190526101608a018b90526101808a01526101a089018190526101c090980197909752601895909555601993909355601a95909555601b94909455601c55601d55601e55601f80546001600160f01b031916690138827101388000007d60a31b179055805467ffffffffffffffff191690556110bf6118de565b6001600160a01b03168c6001600160a01b0316146110e0576110e08c612c98565b831561112657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b61113c613874565b5f8181526009602052604090205481906001600160a01b0316611175576040516381c4951960e01b815260040161098891815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ab09083815260200190565b6111cb613874565b6001600160a01b0381165f90815260076020526040902054819060ff16611206576040516321ac7c5f60e01b8152600401610988919061463c565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ab090839061463c565b600b6020525f90815260409020805461126e90614d65565b80601f016020809104026020016040519081016040528092919081815260200182805461129a90614d65565b80156112e55780601f106112bc576101008083540402835291602001916112e5565b820191905f5260205f20905b8154815290600101906020018083116112c857829003601f168201915b505050505081565b6112f5613874565b6112fe5f61399e565b565b611308613874565b6001600160a01b0381161580159061133957505f828152600a60205260409020546001600160a01b03828116911614155b829061135b576040516381c4951960e01b815260040161098891815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b031633146113b35760405163b56831db60e01b815260040160405180910390fd5b5f818152600d602052604090205460ff1660018160068111156113d8576113d86146b5565b146113fd57816001826040516337e1404160e01b815260040161098893929190614d97565b5f828152600d60205260409020805460ff191660021790556015546114229042614dcc565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f5160206159375f395f51905f526001600260405161147c929190614ddf565b60405180910390a25050565b5f5f61149387610c7a565b5f888152600d602052604090205490915060ff1660048160068111156114bb576114bb6146b5565b14886004839091926114e3576040516337e1404160e01b815260040161098893929190614d97565b5050505f888152600e60209081526040918290208251606081018452815481526001820154928101929092526002015491810182905290899042811015611546576040516308f3034360e31b815260048101929092526024820152604401610988565b50505f898152600860205260409020600c01611563888a83614e6d565b505f898152600d60205260409020805460ff191660051790556101c08301511561165d57846115a557604051631eae1a4d60e31b815260040160405180910390fd5b8261010001516001600160a01b031663258ae58289896040516115c9929190614f21565b6040519081900381206001600160e01b031960e084901b1682526115f3918a908a90600401614f58565b602060405180830381865afa15801561160e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116329190614f87565b935087878561165657604051632f9f8ab960e01b8152600401610988929190614fa2565b5050611662565b600193505b61166b89613a0e565b887f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b898989896040516116a19493929190614fb5565b60405180910390a2885f5160206159375f395f51905f52600460056040516116ca929190614ddf565b60405180910390a250505095945050505050565b5f546001600160a01b031633146117085760405163b56831db60e01b815260040160405180910390fd5b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611738576117386146b5565b1461175d57836002826040516337e1404160e01b815260040161098893929190614d97565b5f848152600d6020526040808220805460ff19166003179055600a84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f5160206159375f395f51905f52600260036040516117c4929190614ddf565b60405180910390a250505050565b6117da613874565b806118165760405162461bcd60e51b815260206004820152600c60248201526b456d70747920706172616d7360a01b6044820152606401610988565b60ff83165f908152600b60205260409020805461183290614d65565b1590506118815760405162461bcd60e51b815260206004820152601b60248201527f506172616d53657420616c7265616479207265676973746572656400000000006044820152606401610988565b60ff83165f908152600b6020526040902061189d828483614e6d565b507f6e4a4ea7f38fc775e616080b155744337e6216848e886a69c918b4ab84da21958383836040516118d193929190614fe6565b60405180910390a1505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b61192d60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601554815260165460208201526017549181019190915290565b5f818152600d602052604090205460ff166006816006811115611977576119776146b5565b14829061199a57604051637cb2d48360e11b815260040161098891815260200190565b505f828152600c602052604090205482816119cb576040516345ba89d560e11b815260040161098891815260200190565b505f838152600c602052604081208190556119e584613e7a565b5f858152601160205260409020546002549192506001600160a01b0390811691611a129183911685613f67565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611a48908890879087908790600401615045565b5f604051808303815f87803b158015611a5f575f5ffd5b505af1158015611a71573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611ab1929190918252602082015260400190565b60405180910390a25050505050565b611ae160405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611b368482613fc4565b9250925050915091565b5f5f611b4b87610c7a565b5f888152600d602052604090205490915060ff166003816006811115611b7357611b736146b5565b1488600383909192611b9b576040516337e1404160e01b815260040161098893929190614d97565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611bff576040516308f3034360e31b815260048101929092526024820152604401610988565b5050606083015160200151899042811115611c365760405163017e35e560e71b815260048101929092526024820152604401610988565b5050610160830151899015611c6157604051637eb9cea960e11b815260040161098891815260200190565b505f8888604051611c73929190614f21565b60408051918290039091205f8c815260086020908152838220600b01839055600d905291909120805460ff19166004179055601754909150611cb59042614dcc565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf90611d02908d9085908c908c90600401615090565b6020604051808303815f875af1158015611d1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d429190614f87565b9450888886611d6657604051632f9f8ab960e01b8152600401610988929190614fa2565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a604051611d9a929190614fa2565b60405180910390a2895f5160206159375f395f51905f5260036004604051611dc3929190614ddf565b60405180910390a25050505095945050505050565b5f80600b81611ded60a08601608087016149b6565b60ff1660ff1681526020019081526020015f208054611e0b90614d65565b905011611e2a5760405162461bcd60e51b8152600401610988906150af565b5f601281611e3b60208601866150e6565b6003811115611e4c57611e4c6146b5565b6003811115611e5d57611e5d6146b5565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611e84579050505050505090505f81600160028110611edb57611edb61507c565b602002015163ffffffff1611835f016020810190611ef991906150e6565b90611f185760405163286c068d60e11b815260040161098891906150ff565b506020808201518251604080516101e081018252601854815260195481860152601a5491810191909152601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e0830152600160a01b810461ffff908116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152925463ffffffff8181166101a0860181905264010000000090920481166101c086015292831693919092169115612043576101a081015163ffffffff16846001602002015163ffffffff161015865f01602081019061202291906150e6565b906120415760405163010b971d60e31b815260040161098891906150ff565b505b6101c081015163ffffffff1615612092576101c081015184519063ffffffff908116908216101561209057604051630a4b6b6360e11b815263ffffffff9091166004820152602401610988565b505b604086013560208701358110156120bf5760405163174b5a0760e21b815260040161098891815260200190565b506101808101516017545f91612710916120dd9161ffff169061510d565b6120e79190615124565b61271061ffff1683610160015161ffff16601560010154612108919061510d565b6121129190615124565b61271061ffff1684610140015161ffff1660155f0154612132919061510d565b61213c9190615124565b5f5460408051634f87c3a560e11b8152815160208e81013594938f0135936001600160a01b031692639f0f874a92600480830193928290030181865afa158015612188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ac9190615143565b6121b69190614dcc565b6121c0919061515a565b6121ca9190614dcc565b6121d49190614dcc565b6121de9190614dcc565b90505f6121ec60018661515a565b6121f790600261510d565b61220290600261510d565b61220d906006614dcc565b90505f85845f015161221f919061510d565b905081868560200151612232919061510d565b61223c919061510d565b6122469082614dcc565b9050600186111561228e57600261225e60018861515a565b612268908861510d565b8560400151612277919061510d565b6122819190615124565b61228b9082614dcc565b90505b81868560c0015161229f919061510d565b6122a9919061510d565b6122b39082614dcc565b9050828685606001516122c6919061510d565b6122d0919061510d565b6122da9082614dcc565b90508484608001516122ec919061510d565b6122f69082614dcc565b9050600185111561233e57600261230e60018761515a565b612318908761510d565b8560400151612327919061510d565b6123319190615124565b61233b9082614dcc565b90505b60a084015161234d9082614dcc565b610100850151909150612710906123689061ffff1682614dcc565b612372908361510d565b61237c9190615124565b975087806123a057604051638c4fcd9360e01b815260040161098891815260200190565b5050505050505050919050565b5f546001600160a01b03163314806123cf57506003546001600160a01b031633145b6123ec57604051639e75a8b560e01b815260040160405180910390fd5b5f8160ff161180156124025750600d60ff821611155b6124475760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b6044820152606401610988565b612465828260ff16600d811115612460576124606146b5565b61414c565b5050565b612471613874565b6001600160a01b0381166124c75760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e616765722061646472657373006044820152606401610988565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461253b576040516357d6948d60e11b815260040160405180910390fd5b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612585575f5ffd5b505af1158015612597573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee5428260405161147c91815260200190565b6125d5613874565b6001600160a01b0381161580159061260657505f828152600960205260409020546001600160a01b03828116911614155b8290612628576040516381c4951960e01b815260040161098891815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb69910160405180910390a15050565b61268f613874565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ab0565b6126cc613874565b6127106126e161012083016101008401615187565b61ffff1611156126f961012083016101008401615187565b9061271e576040516301027fc160e21b815261ffff9091166004820152602401610988565b5061271061273461014083016101208401615187565b61ffff16111561274c61014083016101208401615187565b90612771576040516301027fc160e21b815261ffff9091166004820152602401610988565b5061271061278761016083016101408401615187565b61ffff16111561279f61016083016101408401615187565b906127c457604051633239953960e01b815261ffff9091166004820152602401610988565b506127106127da61018083016101608401615187565b61ffff1611156127f261018083016101608401615187565b9061281757604051633239953960e01b815261ffff9091166004820152602401610988565b5061271061282d6101a083016101808401615187565b61ffff1611156128456101a083016101808401615187565b9061286a57604051633239953960e01b815261ffff9091166004820152602401610988565b5061287d61014082016101208301615187565b61ffff1615806128a657505f61289a610100830160e084016145f6565b6001600160a01b031614155b6128c35760405163015f92ff60e51b815260040160405180910390fd5b6128d56101e082016101c083016151be565b63ffffffff166128ed6101c083016101a084016151be565b63ffffffff161015612912576040516392f55c6560e01b815260040160405180910390fd5b80601861291f82826151fd565b9050507fbf3951313e980027eb48ce363fdb707286195ec6a0f802ac153927cf929c3fc681604051610ab091906153bb565b612959613874565b6001600160a01b0381161580159061297f57506001546001600160a01b03828116911614155b819061299f576040516320252f0b60e01b8152600401610988919061463c565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ab090839061463c565b6129f3613874565b612a0060208201826151be565b63ffffffff16612a1660408301602084016151be565b63ffffffff1610158015612a3b57505f612a3360208301836151be565b63ffffffff16115b612a5857604051634564ab9b60e01b815260040160405180910390fd5b604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a08401819052640100000000909204166101c083015215612b91576101a081015163ffffffff16612b4160408401602085016151be565b63ffffffff161015612b5960408401602085016151be565b826101a001519091612b8e57604051633ccc4c2160e21b815263ffffffff928316600482015291166024820152604401610988565b50505b6101c081015163ffffffff1615612c08576101c081015163ffffffff16612bbb60208401846151be565b63ffffffff161015612bd060208401846151be565b826101c001519091612c055760405163156c4e5b60e11b815263ffffffff928316600482015291166024820152604401610988565b50505b8160125f856003811115612c1e57612c1e6146b5565b6003811115612c2f57612c2f6146b5565b815260208101919091526040015f20612c499160026144e1565b50826003811115612c5c57612c5c6146b5565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa83604051612c8b91906154c5565b60405180910390a2505050565b612ca0613874565b6001600160a01b038116612cc9575f604051631e4fbdf760e01b8152600401610988919061463c565b610acc8161399e565b5f612cdb614464565b5f601281612cec60208701876150e6565b6003811115612cfd57612cfd6146b5565b6003811115612d0e57612d0e6146b5565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d35579050505050505090505f81600160028110612d8c57612d8c61507c565b602002015163ffffffff1611845f016020810190612daa91906150e6565b90612dc95760405163286c068d60e11b815260040161098891906150ff565b50602084013542811015612df357604051630b99e87960e01b815260040161098891815260200190565b5060408401356020850135811015612e215760405163174b5a0760e21b815260040161098891815260200190565b506017546016545f9190612e3942604089013561515a565b612e439190614dcc565b612e4d9190614dcc565b905060055481108190612e76576040516313b783af60e21b815260040161098891815260200190565b5060075f612e8a60808801606089016145f6565b6001600160a01b0316815260208101919091526040015f205460ff16612eb660808701606088016145f6565b90612ed55760405163295a6a6f60e11b8152600401610988919061463c565b505f612ee086611dd8565b60068054965090915085905f612ef583615505565b9091555050604080514460208201529081018690525f9060600160408051601f1981840301815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b03199081166001600160a01b0393841617909155601f805460138852868520805461ffff191661ffff600160b01b909304929092169190911790555460148752858420805483169190931617909155600d8552838220805460ff191660011790556010909452829020805433941693909317909255601654919250612fd09190890135614dcc565b5f878152600e6020908152604090912060010191909155818652612ff6908801886150e6565b8560200190600381111561300c5761300c6146b5565b9081600381111561301f5761301f6146b5565b905250436040808701919091528051808201825290602089019060029083908390808284375f92019190915250505060608087019190915261306790608089019089016145f6565b6001600160a01b031660a080870191909152613088908801608089016149b6565b60ff1660c0808701919091526130a09088018861551d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e0808701919091526130ed90610100890190890161555f565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a0860181905260045461313d916001600160a01b039091169030856142a7565b5f600b8161315160a08b0160808c016149b6565b60ff1660ff1681526020019081526020015f20805461316f90614d65565b80601f016020809104026020016040519081016040528092919081815260200182805461319b90614d65565b80156131e65780601f106131bd576101008083540402835291602001916131e6565b820191905f5260205f20905b8154815290600101906020018083116131c957829003601f168201915b505050505090505f81511161320d5760405162461bcd60e51b8152600401610988906150af565b5f61321e60808a0160608b016145f6565b6001600160a01b031663fefd9a8b89858561323c60a08f018f61551d565b8f8060c0019061324c919061551d565b6040518863ffffffff1660e01b815260040161326e979695949392919061557a565b6020604051808303815f875af115801561328a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132ae9190615143565b5f818152600960205260409020549091506001600160a01b031681816132ea576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409020546001600160a01b03168281613324576040516381c4951960e01b815260040161098891815260200190565b50608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff199190911690836003811115613382576133826146b5565b0217905550604082015181600201556060820151816003019060026133a8929190614582565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e0820151600782019061340190826155ce565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c82019061346990826155ce565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b906134cf908d9089908d90600401615683565b6020604051808303815f875af11580156134eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061350f9190614f87565b61352c57604051630d8dbe2560e01b815260040160405180910390fd5b61353c60808c0160608d016145f6565b6001600160a01b03167f5090c9764b5cd13df7afc0013f733dfbe6eaf1b6ddc22a5e291fa387efd4c15e8b8b604051613576929190614d45565b60405180910390a2895f5160206159375f395f51905f525f600160405161359e929190614ddf565b60405180910390a25050505050505050915091565b5f818152600d602052604081205460ff16818160068111156135d7576135d76146b5565b036135fc57826001826040516337e1404160e01b815260040161098893929190614d97565b6005816006811115613610576136106146b5565b036136315760405163462c7bed60e01b815260048101849052602401610988565b6006816006811115613645576136456146b5565b0361366657604051633de16e3560e11b815260048101849052602401610988565b5f6136718483613fc4565b935090508061369657604051639f65d93560e01b815260048101859052602401610988565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d8111156136df576136df6146b5565b0217905550835f5160206159375f395f51905f52836006604051613704929190614ddf565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb838560405161373e9291906156c8565b60405180910390a25050919050565b613755613874565b6001600160a01b0381161580159061377a57505f546001600160a01b03828116911614155b819061379a576040516375ac4eb760e11b8152600401610988919061463c565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ab090839061463c565b6001600160a01b0381165f90815260076020526040902054819060ff16156138215760405163b29d459560e01b8152600401610988919061463c565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ab090839061463c565b3361387d6118de565b6001600160a01b0316146112fe573360405163118cdaa760e01b8152600401610988919061463c565b80356138c55760405163055f269d60e01b815260040160405180910390fd5b5f8160200135116138e95760405163055f269d60e01b815260040160405180910390fd5b5f81604001351161390d5760405163055f269d60e01b815260040160405180910390fd5b80356015819055602080830135601681905560408085013560178190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ab0565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6139956142e6565b610acc8161430b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa158015613a53573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613a7a919081019061579f565b5080515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b031690829003613b19576002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613ae590889088908690600401615864565b5f604051808303815f87803b158015613afc575f5ffd5b505af1158015613b0e573d5f5f3e3d5ffd5b505050505050505050565b825f03613bba575f858152601060205260409020546001600160a01b03168015613b5157613b516001600160a01b0383168285613f67565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613b8590899089908790600401615864565b5f604051808303815f87803b158015613b9c575f5ffd5b505af1158015613bae573d5f5f3e3d5ffd5b50505050505050505050565b5f85815260136020908152604080832054601490925282205461ffff909116906001600160a01b03168115801590613bfa57506001600160a01b03811615155b15613c3657612710613c1061ffff84168761510d565b613c1a9190615124565b92508215613c3657613c366001600160a01b0385168285613f67565b5f613c41848761515a565b90505f876001600160401b03811115613c5c57613c5c614dfa565b604051908082528060200260200182016040528015613c85578160200160208202803683370190505b5090505f613c938984615124565b90505f805b8a811015613cd25782848281518110613cb357613cb361507c565b6020908102919091010152613cc88383614dcc565b9150600101613c98565b505f613cde828661515a565b90508015613d1b578084613cf360018e61515a565b81518110613d0357613d0361507c565b60200260200101818151613d179190614dcc565b9052505b600154613d35906001600160a01b038b8116911687614313565b60015f9054906101000a90046001600160a01b03166001600160a01b031663dd8c818e8a8e876040518463ffffffff1660e01b8152600401613d79939291906158c4565b5f604051808303815f87803b158015613d90575f5ffd5b505af1158015613da2573d5f5f3e3d5ffd5b5050600154613dc092506001600160a01b038c81169250165f614313565b8c7fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a8d86604051613df29291906158f9565b60405180910390a260025f9054906101000a90046001600160a01b03166001600160a01b03166341489f158e8e8c6040518463ffffffff1660e01b8152600401613e3e93929190615864565b5f604051808303815f87803b158015613e55575f5ffd5b505af1158015613e67573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b5f818152600f602052604090205460609060ff16600181600d811115613ea257613ea26146b5565b1480613ebf5750600281600d811115613ebd57613ebd6146b5565b145b15613ef7575f5b604051908082528060200260200182016040528015613eef578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015613f5d57506040513d5f823e601f3d908101601f19168201604052613f5a919081019061579f565b60015b613eef575f613ec6565b613fbf83846001600160a01b031663a9059cbb8585604051602401613f8d92919061591d565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061439f565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa15801561403e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140629190615143565b90506001856006811115614078576140786146b5565b14801561408457508042115b1561409757600180935093505050614145565b60028560068111156140ab576140ab6146b5565b1480156140b85750815142115b156140cc5760016003935093505050614145565b60038560068111156140e0576140e06146b5565b1480156140f05750816020015142115b156141045760016006935093505050614145565b6004856006811115614118576141186146b5565b1480156141285750816040015142115b1561413c576001600a935093505050614145565b5f5f9350935050505b9250929050565b5f828152600d602052604081205460ff1690816006811115614170576141706146b5565b0361419557826001826040516337e1404160e01b815260040161098893929190614d97565b60058160068111156141a9576141a96146b5565b036141ca5760405163462c7bed60e01b815260048101849052602401610988565b60068160068111156141de576141de6146b5565b036141ff57604051633de16e3560e11b815260048101849052602401610988565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d811115614248576142486146b5565b0217905550825f5160206159375f395f51905f5282600660405161426d929190614ddf565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8284604051612c8b9291906156c8565b6040516001600160a01b0384811660248301528381166044830152606482018390526142e09186918216906323b872dd90608401613f8d565b50505050565b6142ee614402565b6112fe57604051631afcd79f60e31b815260040160405180910390fd5b612ca06142e6565b5f836001600160a01b031663095ea7b3848460405160240161433692919061591d565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061436f848261441b565b6142e05761439984856001600160a01b031663095ea7b3865f604051602401613f8d92919061591d565b6142e084825b5f5f60205f8451602086015f885af1806143be576040513d5f823e3d81fd5b50505f513d915081156143d55780600114156143e2565b6001600160a01b0384163b155b156142e05783604051635274afe760e01b8152600401610988919061463c565b5f61440b613963565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f51905082801561445a5750811561444c578060011461445a565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f815260200161448c6145b0565b81525f602082018190526040820181905260608083018290526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b600183019183908215614572579160200282015f5b8382111561454057833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026144f6565b80156145705782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614540565b505b5061457e9291506145ce565b5090565b8260028101928215614572579160200282015b82811115614572578251825591602001919060010190614595565b60405180604001604052806002906020820280368337509192915050565b5b8082111561457e575f81556001016145cf565b6001600160a01b0381168114610acc575f5ffd5b5f60208284031215614606575f5ffd5b8135614611816145e2565b9392505050565b5f60208284031215614628575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b80356004811061465e575f5ffd5b919050565b5f5f60408385031215614674575f5ffd5b61467d83614650565b946020939093013593505050565b5f60608284031215610ef1575f5ffd5b5f606082840312156146ab575f5ffd5b614611838361468b565b634e487b7160e01b5f52602160045260245ffd5b600e81106146d9576146d96146b5565b9052565b6020810161398782846146c9565b600481106146d9576146d96146b5565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152614739602082018f6146eb565b8c60408201528b6060820152614752608082018c61462f565b60ff8a1660a08201526101c060c08201525f6147726101c083018b6146fb565b61477f60e084018b61462f565b61478d61010084018a61462f565b87610120840152866101408401528281036101608401526147ae81876146fb565b9150506147bf61018083018561462f565b8215156101a08301529f9e505050505050505050505050505050565b805f5b60028110156142e05781518452602093840193909101906001016147de565b805182525f602082015161481460208501826146eb565b5060408201516040840152606082015161483160608501826147db565b50608082015160a084015260a082015161484e60c085018261462f565b5060c082015160ff811660e08501525060e082015161020061010085015261487a6102008501826146fb565b905061010083015161489061012086018261462f565b506101208301516148a561014086018261462f565b506101408301516101608501526101608301516101808501526101808301518482036101a08601526148d782826146fb565b9150506101a08301516148ee6101c086018261462f565b506101c08301518015156101e0860152613eef565b602081525f61461160208301846147fd565b803561465e816145e2565b5f5f5f5f5f5f5f610120888a031215614937575f5ffd5b8735614942816145e2565b96506020880135614952816145e2565b95506040880135614962816145e2565b94506060880135614972816145e2565b93506080880135614982816145e2565b925060a088013591506149988960c08a0161468b565b905092959891949750929550565b803560ff8116811461465e575f5ffd5b5f602082840312156149c6575f5ffd5b614611826149a6565b602081525f61461160208301846146fb565b5f5f604083850312156149f2575f5ffd5b823591506020830135614a04816145e2565b809150509250929050565b5f5f83601f840112614a1f575f5ffd5b5081356001600160401b03811115614a35575f5ffd5b602083019150836020828501011115614145575f5ffd5b5f5f5f5f5f60608688031215614a60575f5ffd5b8535945060208601356001600160401b03811115614a7c575f5ffd5b614a8888828901614a0f565b90955093505060408601356001600160401b03811115614aa6575f5ffd5b614ab288828901614a0f565b969995985093965092949392505050565b5f5f60408385031215614ad4575f5ffd5b50508035926020909101359150565b5f5f5f60408486031215614af5575f5ffd5b614afe846149a6565b925060208401356001600160401b03811115614b18575f5ffd5b614b2486828701614a0f565b9497909650939450505050565b81518152602080830151908201526040808301519082015260608101613987565b82151581526040810161461160208301846146c9565b5f60208284031215614b78575f5ffd5b81356001600160401b03811115614b8d575f5ffd5b82016101008185031215614611575f5ffd5b5f6101e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151614bf960e084018261462f565b50610100830151614c1161010084018261ffff169052565b50610120830151614c2961012084018261ffff169052565b50610140830151614c4161014084018261ffff169052565b50610160830151614c5961016084018261ffff169052565b50610180830151614c7161018084018261ffff169052565b506101a0830151614c8b6101a084018263ffffffff169052565b506101c0830151614ca56101c084018263ffffffff169052565b5092915050565b5f5f60408385031215614cbd575f5ffd5b82359150614ccd602084016149a6565b90509250929050565b600781106146d9576146d96146b5565b602081016139878284614cd6565b5f6101e0828403128015614d06575f5ffd5b509092915050565b5f5f60608385031215614d1f575f5ffd5b614d2883614650565b915083606084011115614d39575f5ffd5b50926020919091019150565b828152604060208201525f614d5d60408301846147fd565b949350505050565b600181811c90821680614d7957607f821691505b602082108103610ef157634e487b7160e01b5f52602260045260245ffd5b83815260608101614dab6020830185614cd6565b614d5d6040830184614cd6565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561398757613987614db8565b60408101614ded8285614cd6565b6146116020830184614cd6565b634e487b7160e01b5f52604160045260245ffd5b601f821115613fbf57805f5260205f20601f840160051c81016020851015614e335750805b601f840160051c820191505b81811015614e52575f8155600101614e3f565b5050505050565b5f19600383901b1c191660019190911b1790565b6001600160401b03831115614e8457614e84614dfa565b614e9883614e928354614d65565b83614e0e565b5f601f841160018114614ec4575f8515614eb25750838201355b614ebc8682614e59565b845550614e52565b5f83815260208120601f198716915b82811015614ef35786850135825560209485019460019092019101614ed3565b5086821015614f0f575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f614f71604083018486614f30565b95945050505050565b8015158114610acc575f5ffd5b5f60208284031215614f97575f5ffd5b815161461181614f7a565b602081525f614d5d602083018486614f30565b604081525f614fc8604083018688614f30565b8281036020840152614fdb818587614f30565b979650505050505050565b60ff84168152604060208201525f614f71604083018486614f30565b5f8151808452602084019350602083015f5b8281101561503b5781516001600160a01b0316865260209586019590910190600101615014565b5093949350505050565b848152836020820152608060408201525f6150636080830185615002565b905060018060a01b038316606083015295945050505050565b634e487b7160e01b5f52603260045260245ffd5b848152836020820152606060408201525f61445a606083018486614f30565b6020808252601c908201527f42465620706172616d20736574206e6f74207265676973746572656400000000604082015260600190565b5f602082840312156150f6575f5ffd5b61461182614650565b6020810161398782846146eb565b808202811582820484141761398757613987614db8565b5f8261513e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615153575f5ffd5b5051919050565b8181038181111561398757613987614db8565b61ffff81168114610acc575f5ffd5b803561465e8161516d565b5f60208284031215615197575f5ffd5b81356146118161516d565b63ffffffff81168114610acc575f5ffd5b803561465e816151a2565b5f602082840312156151ce575f5ffd5b8135614611816151a2565b5f8135613987816145e2565b5f81356139878161516d565b5f8135613987816151a2565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c082013560068201556007810161526d61525060e085016151d9565b82546001600160a01b0319166001600160a01b0391909116178255565b61529d61527d61010085016151e5565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b6152cd6152ad61012085016151e5565b82805461ffff60b01b191660b09290921b61ffff60b01b16919091179055565b6152fd6152dd61014085016151e5565b82805461ffff60c01b191660c09290921b61ffff60c01b16919091179055565b61532d61530d61016085016151e5565b82805461ffff60d01b191660d09290921b61ffff60d01b16919091179055565b61535d61533d61018085016151e5565b82805461ffff60e01b191660e09290921b61ffff60e01b16919091179055565b50600881016153896153726101a085016151f1565b825463ffffffff191663ffffffff91909116178255565b613fbf6153996101c085016151f1565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c080830135908201526101e0810161540c60e08401614915565b61541960e084018261462f565b50615427610100840161517c565b61ffff1661010083015261543e610120840161517c565b61ffff16610120830152615455610140840161517c565b61ffff1661014083015261546c610160840161517c565b61ffff16610160830152615483610180840161517c565b61ffff1661018083015261549a6101a084016151b3565b63ffffffff166101a08301526154b36101c084016151b3565b63ffffffff81166101c0840152614ca5565b6040810181835f5b60028110156154fc5781356154e1816151a2565b63ffffffff16835260209283019291909101906001016154cd565b50505092915050565b5f6001820161551657615516614db8565b5060010190565b5f5f8335601e19843603018112615532575f5ffd5b8301803591506001600160401b0382111561554b575f5ffd5b602001915036819003821315614145575f5ffd5b5f6020828403121561556f575f5ffd5b813561461181614f7a565b87815286602082015260a060408201525f61559860a08301886146fb565b82810360608401526155ab818789614f30565b905082810360808401526155c0818587614f30565b9a9950505050505050505050565b81516001600160401b038111156155e7576155e7614dfa565b6155fb816155f58454614d65565b84614e0e565b6020601f821160018114615628575f83156156165750848201515b6156208482614e59565b855550614e52565b5f84815260208120601f198516915b828110156156575787850151825560209485019460019092019101615637565b508482101561567457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b60028110156156bd57815163ffffffff16835260209283019290910190600101615698565b505050949350505050565b604081016156d68285614cd6565b61461160208301846146c9565b604051601f8201601f191681016001600160401b038111828210171561570b5761570b614dfa565b604052919050565b5f6001600160401b0382111561572b5761572b614dfa565b5060051b60200190565b5f82601f830112615744575f5ffd5b815161575761575282615713565b6156e3565b8082825260208201915060208360051b860101925085831115615778575f5ffd5b602085015b8381101561579557805183526020928301920161577d565b5095945050505050565b5f5f604083850312156157b0575f5ffd5b82516001600160401b038111156157c5575f5ffd5b8301601f810185136157d5575f5ffd5b80516157e361575282615713565b8082825260208201915060208360051b850101925087831115615804575f5ffd5b6020840193505b8284101561582f57835161581e816145e2565b82526020938401939091019061580b565b8095505050505060208301516001600160401b0381111561584e575f5ffd5b61585a85828601615735565b9150509250929050565b838152606060208201525f61587c6060830185615002565b905060018060a01b0383166040830152949350505050565b5f8151808452602084019350602083015f5b8281101561503b5781518652602095860195909101906001016158a6565b6001600160a01b03841681526060602082018190525f906158e790830185615002565b828103604084015261445a8185615894565b604081525f61590b6040830185615002565b8281036020840152614f718185615894565b6001600160a01b0392909216825260208201526040019056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", + "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615af7806100d65f395ff3fe608060405234801561000f575f5ffd5b50600436106102ce575f3560e01c806390173a4111610182578063cb649617116100e0578063f0691cba1161008f578063f0691cba14610886578063f2fde38b14610899578063f3ceba3a146108ac578063f81b8ef6146108cd578063fad8e111146108e0578063fbdb3237146108f3578063fd2f3d011461091b575f5ffd5b8063cb649617146107ef578063cbd16872146107f8578063cf0f34c41461080b578063cfbdc98d1461081e578063d8afed3e1461084d578063e59e469514610860578063ea71aa5714610873575f5ffd5b80639e57b9341161013c5780639e57b93414610607578063a87f4ab91461061a578063ac3d2f421461076c578063bb2d1b8214610794578063bff232c1146107a7578063c1ab0f1f146107ba578063c4ccafa2146107cd575f5ffd5b806390173a41146105705780639117173c146105855780639231238614610598578063929a8faf146105ab57806399c6679d146105cc5780639c8570c8146105f4575f5ffd5b80635d1684181161022f5780637edcd7ab116101e95780637edcd7ab146104e757806381476ec21461050a578063830d71811461051d57806385814243146105305780638da5cb5b146105435780638dcdd86b1461054b5780638e5ce3ad1461055d575f5ffd5b80635d1684181461047d578063647846a51461049d5780636db5c8fd146104b0578063715018a6146104b95780637c8c3b4d146104c15780637cfa9d74146104d4575f5ffd5b806336c5d38a1161028b57806336c5d38a1461039b5780634017daf0146103ca578063406ed35c146103f75780634147a360146104175780634d600e5d146104445780634e92ec63146104575780634fc772641461046a575f5ffd5b806302a3a9c9146102d25780630ef81b2f146102e757806310bc62811461032557806311bd61d91461034d57806315cce224146103755780631ba7294514610388575b5f5ffd5b6102e56102e036600461478a565b61092e565b005b61030f6102f53660046147ac565b5f908152600960205260409020546001600160a01b031690565b60405161031c91906147d0565b60405180910390f35b61030f6103333660046147ac565b60096020525f90815260409020546001600160a01b031681565b61036061035b3660046147f7565b6109da565b60405163ffffffff909116815260200161031c565b6102e561038336600461478a565b610a16565b6102e561039636600461482f565b610abb565b6103bd6103a93660046147ac565b5f908152600f602052604090205460ff1690565b60405161031c9190614871565b6103dd6103d83660046147ac565b610acf565b60405161031c9e9d9c9b9a999897969594939291906148bd565b61040a6104053660046147ac565b610c7a565b60405161031c9190614a97565b6104366104253660046147ac565b600c6020525f908152604090205481565b60405190815260200161031c565b6102e5610452366004614ab4565b610ef7565b6102e56104653660046147ac565b611135565b6102e561047836600461478a565b6111c4565b61049061048b366004614b4a565b611257565b60405161031c9190614b63565b60045461030f906001600160a01b031681565b61043660055481565b6102e56112ee565b6102e56104cf366004614b75565b611301565b6102e56104e23660046147ac565b6113c1565b6104fa6104f5366004614be0565b6114b4565b604051901515815260200161031c565b6102e5610518366004614c57565b61170a565b6102e561052b366004614c77565b6117fe565b60015461030f906001600160a01b031681565b61030f61190a565b5f5461030f906001600160a01b031681565b60035461030f906001600160a01b031681565b610578611938565b60405161031c9190614cc5565b6102e56105933660046147ac565b61197e565b6105786105a63660046147ac565b611aec565b6105be6105b93660046147ac565b611b45565b60405161031c929190614ce6565b61030f6105da3660046147ac565b5f908152601060205260409020546001600160a01b031690565b6104fa610602366004614be0565b611b6c565b610436610615366004614cfc565b611e04565b61075f604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a0840152640100000000909104166101c082015290565b60405161031c9190614d33565b61030f61077a3660046147ac565b5f908152600a60205260409020546001600160a01b031690565b6102e56107a2366004614e40565b6123ce565b6102e56107b536600461478a565b61248a565b6102e56107c8366004614c57565b612531565b6104fa6107db36600461478a565b60076020525f908152604090205460ff1681565b61043660065481565b6102e5610806366004614b75565b6125ee565b6102e56108193660046147ac565b6126a8565b61084061082c3660046147ac565b5f908152600d602052604090205460ff1690565b60405161031c9190614e7a565b6102e561085b366004614e88565b6126e5565b6102e561086e36600461478a565b612972565b6102e5610881366004614ea2565b612a0c565b60025461030f906001600160a01b031681565b6102e56108a736600461478a565b612cb9565b6108bf6108ba366004614cfc565b612cf3565b60405161031c929190614ed9565b6103bd6108db3660046147ac565b613747565b6102e56108ee36600461478a565b6138e1565b61030f6109013660046147ac565b600a6020525f90815260409020546001600160a01b031681565b6102e561092936600461478a565b613979565b610936613a08565b6001600160a01b0381166109915760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f2081600281106109f3575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a1e613a08565b6001600160a01b03811615801590610a4457506004546001600160a01b03828116911614155b8190610a645760405163eddf07f560e01b815260040161098891906147d0565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ab09083906147d0565b60405180910390a150565b610ac3613a08565b610acc81613a3a565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff95861696949593946001600160a01b03841694600160a01b90940490931692909190610b2790614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390614ef9565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b50505060088401546009850154600a860154600b870154600c8801805497986001600160a01b03958616989490951696509194509291610bdd90614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990614ef9565b8015610c545780601f10610c2b57610100808354040283529160200191610c54565b820191905f5260205f20905b815481529060010190602001808311610c3757829003601f168201915b505050600d90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610c826145f8565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610cbf57610cbf614849565b6003811115610cd057610cd0614849565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610cf55750505091835250506005820154602082015260068201546001600160a01b0381166040830152600160a01b900460ff166060820152600782018054608090920191610d5290614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614ef9565b8015610dc95780601f10610da057610100808354040283529160200191610dc9565b820191905f5260205f20905b815481529060010190602001808311610dac57829003601f168201915b505050918352505060088201546001600160a01b0390811660208301526009830154166040820152600a8201546060820152600b8201546080820152600c8201805460a090920191610e1a90614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4690614ef9565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b5050509183525050600d91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a0820151919250839116610ef15760405163cd6f4a4f60e01b815260040161098891815260200190565b50919050565b5f610f00613af7565b805490915060ff600160401b82041615906001600160401b03165f81158015610f265750825b90505f826001600160401b03166001148015610f415750303b155b905081158015610f4f575080155b15610f6d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f9757845460ff60401b1916600160401b1785555b610fa033613b21565b610fa9876126a8565b610fb28b6138e1565b610fbb8a612972565b610fc48961092e565b610fcd88610a16565b610fd686613a3a565b604080516101e081018252620186a080825261c3506020808401829052612710948401859052603260608501819052620493e060808601819052620f424060a0870181905261138860c088018190525f60e089018190526105dc6101008a015261012089018190526109c46101408a018190526101608a018390526101808a01526101a089018190526101c090980197909752601895909555601993909355601a95909555601b94909455601c55601d55601e55601f80546001600160f01b03191669027104e202710000017760a21b179055805467ffffffffffffffff191690556110c061190a565b6001600160a01b03168c6001600160a01b0316146110e1576110e18c612cb9565b831561112757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b61113d613a08565b5f8181526009602052604090205481906001600160a01b0316611176576040516381c4951960e01b815260040161098891815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ab09083815260200190565b6111cc613a08565b6001600160a01b0381165f90815260076020526040902054819060ff16611207576040516321ac7c5f60e01b815260040161098891906147d0565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ab09083906147d0565b600b6020525f90815260409020805461126f90614ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461129b90614ef9565b80156112e65780601f106112bd576101008083540402835291602001916112e6565b820191905f5260205f20905b8154815290600101906020018083116112c957829003601f168201915b505050505081565b6112f6613a08565b6112ff5f613b32565b565b611309613a08565b6001600160a01b0381161580159061133a57505f828152600a60205260409020546001600160a01b03828116911614155b829061135c576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f53661e3e12f23eea1e322a5352171ad3e4407d1394f869f53bb148c27e00908a906113b59084906147d0565b60405180910390a25050565b5f546001600160a01b031633146113eb5760405163b56831db60e01b815260040160405180910390fd5b5f818152600d602052604090205460ff16600181600681111561141057611410614849565b1461143557816001826040516337e1404160e01b815260040161098893929190614f2b565b5f828152600d60205260409020805460ff1916600217905560155461145a9042614f60565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f516020615acb5f395f51905f52600160026040516113b5929190614f73565b5f5f6114bf87610c7a565b5f888152600d602052604090205490915060ff1660048160068111156114e7576114e7614849565b148860048390919261150f576040516337e1404160e01b815260040161098893929190614f2b565b5050505f888152600e60209081526040918290208251606081018452815481526001820154928101929092526002015491810182905290899042811015611572576040516308f3034360e31b815260048101929092526024820152604401610988565b50505f898152600860205260409020600c0161158f888a83615001565b505f898152600d60205260409020805460ff191660051790556101c08301511561168957846115d157604051631eae1a4d60e31b815260040160405180910390fd5b8261010001516001600160a01b031663258ae58289896040516115f59291906150b5565b6040519081900381206001600160e01b031960e084901b16825261161f918a908a906004016150ec565b602060405180830381865afa15801561163a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165e919061511b565b935087878561168257604051632f9f8ab960e01b8152600401610988929190615136565b505061168e565b600193505b61169789613ba2565b887f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b898989896040516116cd9493929190615149565b60405180910390a2885f516020615acb5f395f51905f52600460056040516116f6929190614f73565b60405180910390a250505095945050505050565b5f546001600160a01b031633146117345760405163b56831db60e01b815260040160405180910390fd5b5f828152600860209081526040808320600d9092529091205460ff16600281600681111561176457611764614849565b1461178957836002826040516337e1404160e01b815260040161098893929190614f2b565b5f848152600d6020526040808220805460ff19166003179055600a84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f516020615acb5f395f51905f52600260036040516117f0929190614f73565b60405180910390a250505050565b611806613a08565b806118425760405162461bcd60e51b815260206004820152600c60248201526b456d70747920706172616d7360a01b6044820152606401610988565b60ff83165f908152600b60205260409020805461185e90614ef9565b1590506118ad5760405162461bcd60e51b815260206004820152601b60248201527f506172616d53657420616c7265616479207265676973746572656400000000006044820152606401610988565b60ff83165f908152600b602052604090206118c9828483615001565b507f6e4a4ea7f38fc775e616080b155744337e6216848e886a69c918b4ab84da21958383836040516118fd9392919061517a565b60405180910390a1505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b61195960405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601554815260165460208201526017549181019190915290565b5f818152600d602052604090205460ff1660068160068111156119a3576119a3614849565b1482906119c657604051637cb2d48360e11b815260040161098891815260200190565b505f828152600c602052604090205482816119f7576040516345ba89d560e11b815260040161098891815260200190565b505f838152600c60205260408120819055611a118461400e565b5f858152601160205260409020546002549192506001600160a01b0390811691611a3e91839116856140fb565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611a749088908790879087906004016151d9565b5f604051808303815f87803b158015611a8b575f5ffd5b505af1158015611a9d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611add929190918252602082015260400190565b60405180910390a25050505050565b611b0d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611b628482614158565b9250925050915091565b5f5f611b7787610c7a565b5f888152600d602052604090205490915060ff166003816006811115611b9f57611b9f614849565b1488600383909192611bc7576040516337e1404160e01b815260040161098893929190614f2b565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611c2b576040516308f3034360e31b815260048101929092526024820152604401610988565b5050606083015160200151899042811115611c625760405163017e35e560e71b815260048101929092526024820152604401610988565b5050610160830151899015611c8d57604051637eb9cea960e11b815260040161098891815260200190565b505f8888604051611c9f9291906150b5565b60408051918290039091205f8c815260086020908152838220600b01839055600d905291909120805460ff19166004179055601754909150611ce19042614f60565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf90611d2e908d9085908c908c90600401615224565b6020604051808303815f875af1158015611d4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6e919061511b565b9450888886611d9257604051632f9f8ab960e01b8152600401610988929190615136565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a604051611dc6929190615136565b60405180910390a2895f516020615acb5f395f51905f5260036004604051611def929190614f73565b60405180910390a25050505095945050505050565b5f80600b81611e1960a0860160808701614b4a565b60ff1660ff1681526020019081526020015f208054611e3790614ef9565b905011611e565760405162461bcd60e51b815260040161098890615243565b5f601281611e67602086018661527a565b6003811115611e7857611e78614849565b6003811115611e8957611e89614849565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611eb0579050505050505090505f81600160028110611f0757611f07615210565b602002015163ffffffff1611835f016020810190611f25919061527a565b90611f445760405163286c068d60e11b81526004016109889190615293565b506020808201518251604080516101e081018252601854815260195481860152601a5491810191909152601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e0830152600160a01b810461ffff908116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152925463ffffffff8181166101a0860181905264010000000090920481166101c08601529283169391909216911561206f576101a081015163ffffffff16846001602002015163ffffffff161015865f01602081019061204e919061527a565b9061206d5760405163010b971d60e31b81526004016109889190615293565b505b6101c081015163ffffffff16156120be576101c081015184519063ffffffff90811690821610156120bc57604051630a4b6b6360e11b815263ffffffff9091166004820152602401610988565b505b604086013560208701358110156120eb5760405163174b5a0760e21b815260040161098891815260200190565b506101808101516017545f91612710916121099161ffff16906152a1565b61211391906152b8565b61271061ffff1683610160015161ffff1660156001015461213491906152a1565b61213e91906152b8565b61271061ffff1684610140015161ffff1660155f015461215e91906152a1565b61216891906152b8565b5f5460408051634f87c3a560e11b8152815160208e81013594938f0135936001600160a01b031692639f0f874a92600480830193928290030181865afa1580156121b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d891906152d7565b6121e29190614f60565b6121ec91906152ee565b6121f69190614f60565b6122009190614f60565b61220a9190614f60565b90505f6122186001866152ee565b6122239060046152a1565b61222e90600e614f60565b90505f85845f015161224091906152a1565b90508186856020015161225391906152a1565b61225d91906152a1565b6122679082614f60565b905060018611156122af57600261227f6001886152ee565b61228990886152a1565b856040015161229891906152a1565b6122a291906152b8565b6122ac9082614f60565b90505b81868560c001516122c091906152a1565b6122ca91906152a1565b6122d49082614f60565b9050828685606001516122e791906152a1565b6122f191906152a1565b6122fb9082614f60565b905084846080015161230d91906152a1565b6123179082614f60565b9050600185111561235f57600261232f6001876152ee565b61233990876152a1565b856040015161234891906152a1565b61235291906152b8565b61235c9082614f60565b90505b60a084015161236e9082614f60565b610100850151909150612710906123899061ffff1682614f60565b61239390836152a1565b61239d91906152b8565b975087806123c157604051638c4fcd9360e01b815260040161098891815260200190565b5050505050505050919050565b5f546001600160a01b03163314806123f057506003546001600160a01b031633145b61240d57604051639e75a8b560e01b815260040160405180910390fd5b5f8160ff161180156124235750600d60ff821611155b6124685760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b6044820152606401610988565b612486828260ff16600d81111561248157612481614849565b6142e0565b5050565b612492613a08565b6001600160a01b0381166124e85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e616765722061646472657373006044820152606401610988565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461255c576040516357d6948d60e11b815260040160405180910390fd5b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b1580156125a6575f5ffd5b505af11580156125b8573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee542826040516113b591815260200190565b6125f6613a08565b6001600160a01b0381161580159061262757505f828152600960205260409020546001600160a01b03828116911614155b8290612649576040516381c4951960e01b815260040161098891815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb69910160405180910390a15050565b6126b0613a08565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ab0565b6126ed613a08565b6127106127026101208301610100840161531b565b61ffff16111561271a6101208301610100840161531b565b9061273f576040516301027fc160e21b815261ffff9091166004820152602401610988565b506127106127556101408301610120840161531b565b61ffff16111561276d6101408301610120840161531b565b90612792576040516301027fc160e21b815261ffff9091166004820152602401610988565b506127106127a86101608301610140840161531b565b61ffff1611156127c06101608301610140840161531b565b906127e557604051633239953960e01b815261ffff9091166004820152602401610988565b506127106127fb6101808301610160840161531b565b61ffff1611156128136101808301610160840161531b565b9061283857604051633239953960e01b815261ffff9091166004820152602401610988565b5061271061284e6101a08301610180840161531b565b61ffff1611156128666101a08301610180840161531b565b9061288b57604051633239953960e01b815261ffff9091166004820152602401610988565b5061289e6101408201610120830161531b565b61ffff1615806128c757505f6128bb610100830160e0840161478a565b6001600160a01b031614155b6128e45760405163015f92ff60e51b815260040160405180910390fd5b6128f66101e082016101c08301615352565b63ffffffff1661290e6101c083016101a08401615352565b63ffffffff161015612933576040516392f55c6560e01b815260040160405180910390fd5b8060186129408282615391565b9050507fbf3951313e980027eb48ce363fdb707286195ec6a0f802ac153927cf929c3fc681604051610ab0919061554f565b61297a613a08565b6001600160a01b038116158015906129a057506001546001600160a01b03828116911614155b81906129c0576040516320252f0b60e01b815260040161098891906147d0565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ab09083906147d0565b612a14613a08565b612a216020820182615352565b63ffffffff16612a376040830160208401615352565b63ffffffff1610158015612a5c57505f612a546020830183615352565b63ffffffff16115b612a7957604051634564ab9b60e01b815260040160405180910390fd5b604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a08401819052640100000000909204166101c083015215612bb2576101a081015163ffffffff16612b626040840160208501615352565b63ffffffff161015612b7a6040840160208501615352565b826101a001519091612baf57604051633ccc4c2160e21b815263ffffffff928316600482015291166024820152604401610988565b50505b6101c081015163ffffffff1615612c29576101c081015163ffffffff16612bdc6020840184615352565b63ffffffff161015612bf16020840184615352565b826101c001519091612c265760405163156c4e5b60e11b815263ffffffff928316600482015291166024820152604401610988565b50505b8160125f856003811115612c3f57612c3f614849565b6003811115612c5057612c50614849565b815260208101919091526040015f20612c6a916002614675565b50826003811115612c7d57612c7d614849565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa83604051612cac9190615659565b60405180910390a2505050565b612cc1613a08565b6001600160a01b038116612cea575f604051631e4fbdf760e01b815260040161098891906147d0565b610acc81613b32565b5f612cfc6145f8565b5f601281612d0d602087018761527a565b6003811115612d1e57612d1e614849565b6003811115612d2f57612d2f614849565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d56579050505050505090505f81600160028110612dad57612dad615210565b602002015163ffffffff1611845f016020810190612dcb919061527a565b90612dea5760405163286c068d60e11b81526004016109889190615293565b50602084013542811015612e1457604051630b99e87960e01b815260040161098891815260200190565b5060408401356020850135811015612e425760405163174b5a0760e21b815260040161098891815260200190565b506017546016545f9190612e5a4260408901356152ee565b612e649190614f60565b612e6e9190614f60565b905060055481108190612e97576040516313b783af60e21b815260040161098891815260200190565b5060075f612eab608088016060890161478a565b6001600160a01b0316815260208101919091526040015f205460ff16612ed7608087016060880161478a565b90612ef65760405163295a6a6f60e11b815260040161098891906147d0565b505f612f0186611e04565b60068054965090915085905f612f1683615699565b9091555050604080514460208201529081018690525f9060600160408051601f1981840301815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b03199081166001600160a01b0393841617909155601f805460138852868520805461ffff191661ffff600160b01b909304929092169190911790555460148752858420805483169190931617909155600d8552838220805460ff191660011790556010909452829020805433941693909317909255601654919250612ff19190890135614f60565b5f878152600e60209081526040909120600101919091558186526130179088018861527a565b8560200190600381111561302d5761302d614849565b9081600381111561304057613040614849565b905250436040808701919091528051808201825290602089019060029083908390808284375f920191909152505050606080870191909152613088906080890190890161478a565b6001600160a01b031660a0808701919091526130a990880160808901614b4a565b60ff1660c0808701919091526130c1908801886156b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e08087019190915261310e9061010089019089016156f3565b15156101c08601525f610140860181905261016086018190526040805160208101909152818152610180870152336101a0870152600b8161315560a08b0160808c01614b4a565b60ff1660ff1681526020019081526020015f20805461317390614ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461319f90614ef9565b80156131ea5780601f106131c1576101008083540402835291602001916131ea565b820191905f5260205f20905b8154815290600101906020018083116131cd57829003601f168201915b505050505090505f8151116132115760405162461bcd60e51b815260040161098890615243565b5f61322260808a0160608b0161478a565b6001600160a01b031663fefd9a8b89858561324060a08f018f6156b1565b8f8060c0019061325091906156b1565b6040518863ffffffff1660e01b8152600401613272979695949392919061570e565b6020604051808303815f875af115801561328e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b291906152d7565b5f818152600960205260409020549091506001600160a01b031681816132ee576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409020546001600160a01b03168281613328576040516381c4951960e01b815260040161098891815260200190565b50608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff19919091169083600381111561338657613386614849565b0217905550604082015181600201556060820151816003019060026133ac929190614716565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e082015160078201906134059082615762565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c82019061346d9082615762565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091556004546134b9911633308961443b565b608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff19919091169083600381111561351657613516614849565b02179055506040820151816002015560608201518160030190600261353c929190614716565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e082015160078201906135959082615762565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c8201906135fd9082615762565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90613663908d9089908d90600401615817565b6020604051808303815f875af115801561367f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061511b565b6136c057604051630d8dbe2560e01b815260040160405180910390fd5b6136d060808c0160608d0161478a565b6001600160a01b03167f5090c9764b5cd13df7afc0013f733dfbe6eaf1b6ddc22a5e291fa387efd4c15e8b8b60405161370a929190614ed9565b60405180910390a2895f516020615acb5f395f51905f525f6001604051613732929190614f73565b60405180910390a25050505050505050915091565b5f818152600d602052604081205460ff168181600681111561376b5761376b614849565b0361379057826001826040516337e1404160e01b815260040161098893929190614f2b565b60058160068111156137a4576137a4614849565b036137c55760405163462c7bed60e01b815260048101849052602401610988565b60068160068111156137d9576137d9614849565b036137fa57604051633de16e3560e11b815260048101849052602401610988565b5f6138058483614158565b935090508061382a57604051639f65d93560e01b815260048101859052602401610988565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d81111561387357613873614849565b0217905550835f516020615acb5f395f51905f52836006604051613898929190614f73565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb83856040516138d292919061585c565b60405180910390a25050919050565b6138e9613a08565b6001600160a01b0381161580159061390e57505f546001600160a01b03828116911614155b819061392e576040516375ac4eb760e11b815260040161098891906147d0565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ab09083906147d0565b6001600160a01b0381165f90815260076020526040902054819060ff16156139b55760405163b29d459560e01b815260040161098891906147d0565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ab09083906147d0565b33613a1161190a565b6001600160a01b0316146112ff573360405163118cdaa760e01b815260040161098891906147d0565b8035613a595760405163055f269d60e01b815260040160405180910390fd5b5f816020013511613a7d5760405163055f269d60e01b815260040160405180910390fd5b5f816040013511613aa15760405163055f269d60e01b815260040160405180910390fd5b80356015819055602080830135601681905560408085013560178190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ab0565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b613b2961447a565b610acc8161449f565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa158015613be7573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613c0e9190810190615933565b5080515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b031690829003613cad576002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613c79908890889086906004016159f8565b5f604051808303815f87803b158015613c90575f5ffd5b505af1158015613ca2573d5f5f3e3d5ffd5b505050505050505050565b825f03613d4e575f858152601060205260409020546001600160a01b03168015613ce557613ce56001600160a01b03831682856140fb565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613d19908990899087906004016159f8565b5f604051808303815f87803b158015613d30575f5ffd5b505af1158015613d42573d5f5f3e3d5ffd5b50505050505050505050565b5f85815260136020908152604080832054601490925282205461ffff909116906001600160a01b03168115801590613d8e57506001600160a01b03811615155b15613dca57612710613da461ffff8416876152a1565b613dae91906152b8565b92508215613dca57613dca6001600160a01b03851682856140fb565b5f613dd584876152ee565b90505f876001600160401b03811115613df057613df0614f8e565b604051908082528060200260200182016040528015613e19578160200160208202803683370190505b5090505f613e2789846152b8565b90505f805b8a811015613e665782848281518110613e4757613e47615210565b6020908102919091010152613e5c8383614f60565b9150600101613e2c565b505f613e7282866152ee565b90508015613eaf578084613e8760018e6152ee565b81518110613e9757613e97615210565b60200260200101818151613eab9190614f60565b9052505b600154613ec9906001600160a01b038b81169116876144a7565b60015f9054906101000a90046001600160a01b03166001600160a01b031663dd8c818e8a8e876040518463ffffffff1660e01b8152600401613f0d93929190615a58565b5f604051808303815f87803b158015613f24575f5ffd5b505af1158015613f36573d5f5f3e3d5ffd5b5050600154613f5492506001600160a01b038c81169250165f6144a7565b8c7fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a8d86604051613f86929190615a8d565b60405180910390a260025f9054906101000a90046001600160a01b03166001600160a01b03166341489f158e8e8c6040518463ffffffff1660e01b8152600401613fd2939291906159f8565b5f604051808303815f87803b158015613fe9575f5ffd5b505af1158015613ffb573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b5f818152600f602052604090205460609060ff16600181600d81111561403657614036614849565b14806140535750600281600d81111561405157614051614849565b145b1561408b575f5b604051908082528060200260200182016040528015614083578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa9250505080156140f157506040513d5f823e601f3d908101601f191682016040526140ee9190810190615933565b60015b614083575f61405a565b61415383846001600160a01b031663a9059cbb8585604051602401614121929190615ab1565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614533565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa1580156141d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141f691906152d7565b9050600185600681111561420c5761420c614849565b14801561421857508042115b1561422b576001809350935050506142d9565b600285600681111561423f5761423f614849565b14801561424c5750815142115b1561426057600160039350935050506142d9565b600385600681111561427457614274614849565b1480156142845750816020015142115b1561429857600160069350935050506142d9565b60048560068111156142ac576142ac614849565b1480156142bc5750816040015142115b156142d0576001600a9350935050506142d9565b5f5f9350935050505b9250929050565b5f828152600d602052604081205460ff169081600681111561430457614304614849565b0361432957826001826040516337e1404160e01b815260040161098893929190614f2b565b600581600681111561433d5761433d614849565b0361435e5760405163462c7bed60e01b815260048101849052602401610988565b600681600681111561437257614372614849565b0361439357604051633de16e3560e11b815260048101849052602401610988565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d8111156143dc576143dc614849565b0217905550825f516020615acb5f395f51905f52826006604051614401929190614f73565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8284604051612cac92919061585c565b6040516001600160a01b0384811660248301528381166044830152606482018390526144749186918216906323b872dd90608401614121565b50505050565b614482614596565b6112ff57604051631afcd79f60e31b815260040160405180910390fd5b612cc161447a565b5f836001600160a01b031663095ea7b384846040516024016144ca929190615ab1565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061450384826145af565b6144745761452d84856001600160a01b031663095ea7b3865f604051602401614121929190615ab1565b61447484825b5f5f60205f8451602086015f885af180614552576040513d5f823e3d81fd5b50505f513d91508115614569578060011415614576565b6001600160a01b0384163b155b156144745783604051635274afe760e01b815260040161098891906147d0565b5f61459f613af7565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156145ee575081156145e057806001146145ee565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001614620614744565b81525f602082018190526040820181905260608083018290526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b600183019183908215614706579160200282015f5b838211156146d457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261468a565b80156147045782816101000a81549063ffffffff02191690556004016020816003010492830192600103026146d4565b505b50614712929150614762565b5090565b8260028101928215614706579160200282015b82811115614706578251825591602001919060010190614729565b60405180604001604052806002906020820280368337509192915050565b5b80821115614712575f8155600101614763565b6001600160a01b0381168114610acc575f5ffd5b5f6020828403121561479a575f5ffd5b81356147a581614776565b9392505050565b5f602082840312156147bc575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b8035600481106147f2575f5ffd5b919050565b5f5f60408385031215614808575f5ffd5b614811836147e4565b946020939093013593505050565b5f60608284031215610ef1575f5ffd5b5f6060828403121561483f575f5ffd5b6147a5838361481f565b634e487b7160e01b5f52602160045260245ffd5b600e811061486d5761486d614849565b9052565b60208101613b1b828461485d565b6004811061486d5761486d614849565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e81526148cd602082018f61487f565b8c60408201528b60608201526148e6608082018c6147c3565b60ff8a1660a08201526101c060c08201525f6149066101c083018b61488f565b61491360e084018b6147c3565b61492161010084018a6147c3565b8761012084015286610140840152828103610160840152614942818761488f565b9150506149536101808301856147c3565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015614474578151845260209384019390910190600101614972565b805182525f60208201516149a8602085018261487f565b506040820151604084015260608201516149c5606085018261496f565b50608082015160a084015260a08201516149e260c08501826147c3565b5060c082015160ff811660e08501525060e0820151610200610100850152614a0e61020085018261488f565b9050610100830151614a246101208601826147c3565b50610120830151614a396101408601826147c3565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152614a6b828261488f565b9150506101a0830151614a826101c08601826147c3565b506101c08301518015156101e0860152614083565b602081525f6147a56020830184614991565b80356147f281614776565b5f5f5f5f5f5f5f610120888a031215614acb575f5ffd5b8735614ad681614776565b96506020880135614ae681614776565b95506040880135614af681614776565b94506060880135614b0681614776565b93506080880135614b1681614776565b925060a08801359150614b2c8960c08a0161481f565b905092959891949750929550565b803560ff811681146147f2575f5ffd5b5f60208284031215614b5a575f5ffd5b6147a582614b3a565b602081525f6147a5602083018461488f565b5f5f60408385031215614b86575f5ffd5b823591506020830135614b9881614776565b809150509250929050565b5f5f83601f840112614bb3575f5ffd5b5081356001600160401b03811115614bc9575f5ffd5b6020830191508360208285010111156142d9575f5ffd5b5f5f5f5f5f60608688031215614bf4575f5ffd5b8535945060208601356001600160401b03811115614c10575f5ffd5b614c1c88828901614ba3565b90955093505060408601356001600160401b03811115614c3a575f5ffd5b614c4688828901614ba3565b969995985093965092949392505050565b5f5f60408385031215614c68575f5ffd5b50508035926020909101359150565b5f5f5f60408486031215614c89575f5ffd5b614c9284614b3a565b925060208401356001600160401b03811115614cac575f5ffd5b614cb886828701614ba3565b9497909650939450505050565b81518152602080830151908201526040808301519082015260608101613b1b565b8215158152604081016147a5602083018461485d565b5f60208284031215614d0c575f5ffd5b81356001600160401b03811115614d21575f5ffd5b820161010081850312156147a5575f5ffd5b5f6101e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151614d8d60e08401826147c3565b50610100830151614da561010084018261ffff169052565b50610120830151614dbd61012084018261ffff169052565b50610140830151614dd561014084018261ffff169052565b50610160830151614ded61016084018261ffff169052565b50610180830151614e0561018084018261ffff169052565b506101a0830151614e1f6101a084018263ffffffff169052565b506101c0830151614e396101c084018263ffffffff169052565b5092915050565b5f5f60408385031215614e51575f5ffd5b82359150614e6160208401614b3a565b90509250929050565b6007811061486d5761486d614849565b60208101613b1b8284614e6a565b5f6101e0828403128015614e9a575f5ffd5b509092915050565b5f5f60608385031215614eb3575f5ffd5b614ebc836147e4565b915083606084011115614ecd575f5ffd5b50926020919091019150565b828152604060208201525f614ef16040830184614991565b949350505050565b600181811c90821680614f0d57607f821691505b602082108103610ef157634e487b7160e01b5f52602260045260245ffd5b83815260608101614f3f6020830185614e6a565b614ef16040830184614e6a565b634e487b7160e01b5f52601160045260245ffd5b80820180821115613b1b57613b1b614f4c565b60408101614f818285614e6a565b6147a56020830184614e6a565b634e487b7160e01b5f52604160045260245ffd5b601f82111561415357805f5260205f20601f840160051c81016020851015614fc75750805b601f840160051c820191505b81811015614fe6575f8155600101614fd3565b5050505050565b5f19600383901b1c191660019190911b1790565b6001600160401b0383111561501857615018614f8e565b61502c836150268354614ef9565b83614fa2565b5f601f841160018114615058575f85156150465750838201355b6150508682614fed565b845550614fe6565b5f83815260208120601f198716915b828110156150875786850135825560209485019460019092019101615067565b50868210156150a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6151056040830184866150c4565b95945050505050565b8015158114610acc575f5ffd5b5f6020828403121561512b575f5ffd5b81516147a58161510e565b602081525f614ef16020830184866150c4565b604081525f61515c6040830186886150c4565b828103602084015261516f8185876150c4565b979650505050505050565b60ff84168152604060208201525f6151056040830184866150c4565b5f8151808452602084019350602083015f5b828110156151cf5781516001600160a01b03168652602095860195909101906001016151a8565b5093949350505050565b848152836020820152608060408201525f6151f76080830185615196565b905060018060a01b038316606083015295945050505050565b634e487b7160e01b5f52603260045260245ffd5b848152836020820152606060408201525f6145ee6060830184866150c4565b6020808252601c908201527f42465620706172616d20736574206e6f74207265676973746572656400000000604082015260600190565b5f6020828403121561528a575f5ffd5b6147a5826147e4565b60208101613b1b828461487f565b8082028115828204841417613b1b57613b1b614f4c565b5f826152d257634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156152e7575f5ffd5b5051919050565b81810381811115613b1b57613b1b614f4c565b61ffff81168114610acc575f5ffd5b80356147f281615301565b5f6020828403121561532b575f5ffd5b81356147a581615301565b63ffffffff81168114610acc575f5ffd5b80356147f281615336565b5f60208284031215615362575f5ffd5b81356147a581615336565b5f8135613b1b81614776565b5f8135613b1b81615301565b5f8135613b1b81615336565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c08201356006820155600781016154016153e460e0850161536d565b82546001600160a01b0319166001600160a01b0391909116178255565b6154316154116101008501615379565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b6154616154416101208501615379565b82805461ffff60b01b191660b09290921b61ffff60b01b16919091179055565b6154916154716101408501615379565b82805461ffff60c01b191660c09290921b61ffff60c01b16919091179055565b6154c16154a16101608501615379565b82805461ffff60d01b191660d09290921b61ffff60d01b16919091179055565b6154f16154d16101808501615379565b82805461ffff60e01b191660e09290921b61ffff60e01b16919091179055565b506008810161551d6155066101a08501615385565b825463ffffffff191663ffffffff91909116178255565b61415361552d6101c08501615385565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c080830135908201526101e081016155a060e08401614aa9565b6155ad60e08401826147c3565b506155bb6101008401615310565b61ffff166101008301526155d26101208401615310565b61ffff166101208301526155e96101408401615310565b61ffff166101408301526156006101608401615310565b61ffff166101608301526156176101808401615310565b61ffff1661018083015261562e6101a08401615347565b63ffffffff166101a08301526156476101c08401615347565b63ffffffff81166101c0840152614e39565b6040810181835f5b600281101561569057813561567581615336565b63ffffffff1683526020928301929190910190600101615661565b50505092915050565b5f600182016156aa576156aa614f4c565b5060010190565b5f5f8335601e198436030181126156c6575f5ffd5b8301803591506001600160401b038211156156df575f5ffd5b6020019150368190038213156142d9575f5ffd5b5f60208284031215615703575f5ffd5b81356147a58161510e565b87815286602082015260a060408201525f61572c60a083018861488f565b828103606084015261573f8187896150c4565b905082810360808401526157548185876150c4565b9a9950505050505050505050565b81516001600160401b0381111561577b5761577b614f8e565b61578f816157898454614ef9565b84614fa2565b6020601f8211600181146157bc575f83156157aa5750848201515b6157b48482614fed565b855550614fe6565b5f84815260208120601f198516915b828110156157eb57878501518255602094850194600190920191016157cb565b508482101561580857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561585157815163ffffffff1683526020928301929091019060010161582c565b505050949350505050565b6040810161586a8285614e6a565b6147a5602083018461485d565b604051601f8201601f191681016001600160401b038111828210171561589f5761589f614f8e565b604052919050565b5f6001600160401b038211156158bf576158bf614f8e565b5060051b60200190565b5f82601f8301126158d8575f5ffd5b81516158eb6158e6826158a7565b615877565b8082825260208201915060208360051b86010192508583111561590c575f5ffd5b602085015b83811015615929578051835260209283019201615911565b5095945050505050565b5f5f60408385031215615944575f5ffd5b82516001600160401b03811115615959575f5ffd5b8301601f81018513615969575f5ffd5b80516159776158e6826158a7565b8082825260208201915060208360051b850101925087831115615998575f5ffd5b6020840193505b828410156159c35783516159b281614776565b82526020938401939091019061599f565b8095505050505060208301516001600160401b038111156159e2575f5ffd5b6159ee858286016158c9565b9150509250929050565b838152606060208201525f615a106060830185615196565b905060018060a01b0383166040830152949350505050565b5f8151808452602084019350602083015f5b828110156151cf578151865260209586019590910190600101615a3a565b6001600160a01b03841681526060602082018190525f90615a7b90830185615196565b82810360408401526145ee8185615a28565b604081525f615a9f6040830185615196565b82810360208401526151058185615a28565b6001600160a01b0392909216825260208201526040019056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102ce575f3560e01c806390173a4111610182578063cb649617116100e0578063f0691cba1161008f578063f0691cba14610886578063f2fde38b14610899578063f3ceba3a146108ac578063f81b8ef6146108cd578063fad8e111146108e0578063fbdb3237146108f3578063fd2f3d011461091b575f5ffd5b8063cb649617146107ef578063cbd16872146107f8578063cf0f34c41461080b578063cfbdc98d1461081e578063d8afed3e1461084d578063e59e469514610860578063ea71aa5714610873575f5ffd5b80639e57b9341161013c5780639e57b93414610607578063a87f4ab91461061a578063ac3d2f421461076c578063bb2d1b8214610794578063bff232c1146107a7578063c1ab0f1f146107ba578063c4ccafa2146107cd575f5ffd5b806390173a41146105705780639117173c146105855780639231238614610598578063929a8faf146105ab57806399c6679d146105cc5780639c8570c8146105f4575f5ffd5b80635d1684181161022f5780637edcd7ab116101e95780637edcd7ab146104e757806381476ec21461050a578063830d71811461051d57806385814243146105305780638da5cb5b146105435780638dcdd86b1461054b5780638e5ce3ad1461055d575f5ffd5b80635d1684181461047d578063647846a51461049d5780636db5c8fd146104b0578063715018a6146104b95780637c8c3b4d146104c15780637cfa9d74146104d4575f5ffd5b806336c5d38a1161028b57806336c5d38a1461039b5780634017daf0146103ca578063406ed35c146103f75780634147a360146104175780634d600e5d146104445780634e92ec63146104575780634fc772641461046a575f5ffd5b806302a3a9c9146102d25780630ef81b2f146102e757806310bc62811461032557806311bd61d91461034d57806315cce224146103755780631ba7294514610388575b5f5ffd5b6102e56102e036600461478a565b61092e565b005b61030f6102f53660046147ac565b5f908152600960205260409020546001600160a01b031690565b60405161031c91906147d0565b60405180910390f35b61030f6103333660046147ac565b60096020525f90815260409020546001600160a01b031681565b61036061035b3660046147f7565b6109da565b60405163ffffffff909116815260200161031c565b6102e561038336600461478a565b610a16565b6102e561039636600461482f565b610abb565b6103bd6103a93660046147ac565b5f908152600f602052604090205460ff1690565b60405161031c9190614871565b6103dd6103d83660046147ac565b610acf565b60405161031c9e9d9c9b9a999897969594939291906148bd565b61040a6104053660046147ac565b610c7a565b60405161031c9190614a97565b6104366104253660046147ac565b600c6020525f908152604090205481565b60405190815260200161031c565b6102e5610452366004614ab4565b610ef7565b6102e56104653660046147ac565b611135565b6102e561047836600461478a565b6111c4565b61049061048b366004614b4a565b611257565b60405161031c9190614b63565b60045461030f906001600160a01b031681565b61043660055481565b6102e56112ee565b6102e56104cf366004614b75565b611301565b6102e56104e23660046147ac565b6113c1565b6104fa6104f5366004614be0565b6114b4565b604051901515815260200161031c565b6102e5610518366004614c57565b61170a565b6102e561052b366004614c77565b6117fe565b60015461030f906001600160a01b031681565b61030f61190a565b5f5461030f906001600160a01b031681565b60035461030f906001600160a01b031681565b610578611938565b60405161031c9190614cc5565b6102e56105933660046147ac565b61197e565b6105786105a63660046147ac565b611aec565b6105be6105b93660046147ac565b611b45565b60405161031c929190614ce6565b61030f6105da3660046147ac565b5f908152601060205260409020546001600160a01b031690565b6104fa610602366004614be0565b611b6c565b610436610615366004614cfc565b611e04565b61075f604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a0840152640100000000909104166101c082015290565b60405161031c9190614d33565b61030f61077a3660046147ac565b5f908152600a60205260409020546001600160a01b031690565b6102e56107a2366004614e40565b6123ce565b6102e56107b536600461478a565b61248a565b6102e56107c8366004614c57565b612531565b6104fa6107db36600461478a565b60076020525f908152604090205460ff1681565b61043660065481565b6102e5610806366004614b75565b6125ee565b6102e56108193660046147ac565b6126a8565b61084061082c3660046147ac565b5f908152600d602052604090205460ff1690565b60405161031c9190614e7a565b6102e561085b366004614e88565b6126e5565b6102e561086e36600461478a565b612972565b6102e5610881366004614ea2565b612a0c565b60025461030f906001600160a01b031681565b6102e56108a736600461478a565b612cb9565b6108bf6108ba366004614cfc565b612cf3565b60405161031c929190614ed9565b6103bd6108db3660046147ac565b613747565b6102e56108ee36600461478a565b6138e1565b61030f6109013660046147ac565b600a6020525f90815260409020546001600160a01b031681565b6102e561092936600461478a565b613979565b610936613a08565b6001600160a01b0381166109915760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f2081600281106109f3575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a1e613a08565b6001600160a01b03811615801590610a4457506004546001600160a01b03828116911614155b8190610a645760405163eddf07f560e01b815260040161098891906147d0565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ab09083906147d0565b60405180910390a150565b610ac3613a08565b610acc81613a3a565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff95861696949593946001600160a01b03841694600160a01b90940490931692909190610b2790614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390614ef9565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b50505060088401546009850154600a860154600b870154600c8801805497986001600160a01b03958616989490951696509194509291610bdd90614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990614ef9565b8015610c545780601f10610c2b57610100808354040283529160200191610c54565b820191905f5260205f20905b815481529060010190602001808311610c3757829003601f168201915b505050600d90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610c826145f8565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610cbf57610cbf614849565b6003811115610cd057610cd0614849565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610cf55750505091835250506005820154602082015260068201546001600160a01b0381166040830152600160a01b900460ff166060820152600782018054608090920191610d5290614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614ef9565b8015610dc95780601f10610da057610100808354040283529160200191610dc9565b820191905f5260205f20905b815481529060010190602001808311610dac57829003601f168201915b505050918352505060088201546001600160a01b0390811660208301526009830154166040820152600a8201546060820152600b8201546080820152600c8201805460a090920191610e1a90614ef9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4690614ef9565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b5050509183525050600d91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a0820151919250839116610ef15760405163cd6f4a4f60e01b815260040161098891815260200190565b50919050565b5f610f00613af7565b805490915060ff600160401b82041615906001600160401b03165f81158015610f265750825b90505f826001600160401b03166001148015610f415750303b155b905081158015610f4f575080155b15610f6d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f9757845460ff60401b1916600160401b1785555b610fa033613b21565b610fa9876126a8565b610fb28b6138e1565b610fbb8a612972565b610fc48961092e565b610fcd88610a16565b610fd686613a3a565b604080516101e081018252620186a080825261c3506020808401829052612710948401859052603260608501819052620493e060808601819052620f424060a0870181905261138860c088018190525f60e089018190526105dc6101008a015261012089018190526109c46101408a018190526101608a018390526101808a01526101a089018190526101c090980197909752601895909555601993909355601a95909555601b94909455601c55601d55601e55601f80546001600160f01b03191669027104e202710000017760a21b179055805467ffffffffffffffff191690556110c061190a565b6001600160a01b03168c6001600160a01b0316146110e1576110e18c612cb9565b831561112757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b61113d613a08565b5f8181526009602052604090205481906001600160a01b0316611176576040516381c4951960e01b815260040161098891815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ab09083815260200190565b6111cc613a08565b6001600160a01b0381165f90815260076020526040902054819060ff16611207576040516321ac7c5f60e01b815260040161098891906147d0565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ab09083906147d0565b600b6020525f90815260409020805461126f90614ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461129b90614ef9565b80156112e65780601f106112bd576101008083540402835291602001916112e6565b820191905f5260205f20905b8154815290600101906020018083116112c957829003601f168201915b505050505081565b6112f6613a08565b6112ff5f613b32565b565b611309613a08565b6001600160a01b0381161580159061133a57505f828152600a60205260409020546001600160a01b03828116911614155b829061135c576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f53661e3e12f23eea1e322a5352171ad3e4407d1394f869f53bb148c27e00908a906113b59084906147d0565b60405180910390a25050565b5f546001600160a01b031633146113eb5760405163b56831db60e01b815260040160405180910390fd5b5f818152600d602052604090205460ff16600181600681111561141057611410614849565b1461143557816001826040516337e1404160e01b815260040161098893929190614f2b565b5f828152600d60205260409020805460ff1916600217905560155461145a9042614f60565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f516020615acb5f395f51905f52600160026040516113b5929190614f73565b5f5f6114bf87610c7a565b5f888152600d602052604090205490915060ff1660048160068111156114e7576114e7614849565b148860048390919261150f576040516337e1404160e01b815260040161098893929190614f2b565b5050505f888152600e60209081526040918290208251606081018452815481526001820154928101929092526002015491810182905290899042811015611572576040516308f3034360e31b815260048101929092526024820152604401610988565b50505f898152600860205260409020600c0161158f888a83615001565b505f898152600d60205260409020805460ff191660051790556101c08301511561168957846115d157604051631eae1a4d60e31b815260040160405180910390fd5b8261010001516001600160a01b031663258ae58289896040516115f59291906150b5565b6040519081900381206001600160e01b031960e084901b16825261161f918a908a906004016150ec565b602060405180830381865afa15801561163a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165e919061511b565b935087878561168257604051632f9f8ab960e01b8152600401610988929190615136565b505061168e565b600193505b61169789613ba2565b887f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b898989896040516116cd9493929190615149565b60405180910390a2885f516020615acb5f395f51905f52600460056040516116f6929190614f73565b60405180910390a250505095945050505050565b5f546001600160a01b031633146117345760405163b56831db60e01b815260040160405180910390fd5b5f828152600860209081526040808320600d9092529091205460ff16600281600681111561176457611764614849565b1461178957836002826040516337e1404160e01b815260040161098893929190614f2b565b5f848152600d6020526040808220805460ff19166003179055600a84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f516020615acb5f395f51905f52600260036040516117f0929190614f73565b60405180910390a250505050565b611806613a08565b806118425760405162461bcd60e51b815260206004820152600c60248201526b456d70747920706172616d7360a01b6044820152606401610988565b60ff83165f908152600b60205260409020805461185e90614ef9565b1590506118ad5760405162461bcd60e51b815260206004820152601b60248201527f506172616d53657420616c7265616479207265676973746572656400000000006044820152606401610988565b60ff83165f908152600b602052604090206118c9828483615001565b507f6e4a4ea7f38fc775e616080b155744337e6216848e886a69c918b4ab84da21958383836040516118fd9392919061517a565b60405180910390a1505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b61195960405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601554815260165460208201526017549181019190915290565b5f818152600d602052604090205460ff1660068160068111156119a3576119a3614849565b1482906119c657604051637cb2d48360e11b815260040161098891815260200190565b505f828152600c602052604090205482816119f7576040516345ba89d560e11b815260040161098891815260200190565b505f838152600c60205260408120819055611a118461400e565b5f858152601160205260409020546002549192506001600160a01b0390811691611a3e91839116856140fb565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611a749088908790879087906004016151d9565b5f604051808303815f87803b158015611a8b575f5ffd5b505af1158015611a9d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611add929190918252602082015260400190565b60405180910390a25050505050565b611b0d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611b628482614158565b9250925050915091565b5f5f611b7787610c7a565b5f888152600d602052604090205490915060ff166003816006811115611b9f57611b9f614849565b1488600383909192611bc7576040516337e1404160e01b815260040161098893929190614f2b565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611c2b576040516308f3034360e31b815260048101929092526024820152604401610988565b5050606083015160200151899042811115611c625760405163017e35e560e71b815260048101929092526024820152604401610988565b5050610160830151899015611c8d57604051637eb9cea960e11b815260040161098891815260200190565b505f8888604051611c9f9291906150b5565b60408051918290039091205f8c815260086020908152838220600b01839055600d905291909120805460ff19166004179055601754909150611ce19042614f60565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf90611d2e908d9085908c908c90600401615224565b6020604051808303815f875af1158015611d4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6e919061511b565b9450888886611d9257604051632f9f8ab960e01b8152600401610988929190615136565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a604051611dc6929190615136565b60405180910390a2895f516020615acb5f395f51905f5260036004604051611def929190614f73565b60405180910390a25050505095945050505050565b5f80600b81611e1960a0860160808701614b4a565b60ff1660ff1681526020019081526020015f208054611e3790614ef9565b905011611e565760405162461bcd60e51b815260040161098890615243565b5f601281611e67602086018661527a565b6003811115611e7857611e78614849565b6003811115611e8957611e89614849565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611eb0579050505050505090505f81600160028110611f0757611f07615210565b602002015163ffffffff1611835f016020810190611f25919061527a565b90611f445760405163286c068d60e11b81526004016109889190615293565b506020808201518251604080516101e081018252601854815260195481860152601a5491810191909152601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e0830152600160a01b810461ffff908116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152925463ffffffff8181166101a0860181905264010000000090920481166101c08601529283169391909216911561206f576101a081015163ffffffff16846001602002015163ffffffff161015865f01602081019061204e919061527a565b9061206d5760405163010b971d60e31b81526004016109889190615293565b505b6101c081015163ffffffff16156120be576101c081015184519063ffffffff90811690821610156120bc57604051630a4b6b6360e11b815263ffffffff9091166004820152602401610988565b505b604086013560208701358110156120eb5760405163174b5a0760e21b815260040161098891815260200190565b506101808101516017545f91612710916121099161ffff16906152a1565b61211391906152b8565b61271061ffff1683610160015161ffff1660156001015461213491906152a1565b61213e91906152b8565b61271061ffff1684610140015161ffff1660155f015461215e91906152a1565b61216891906152b8565b5f5460408051634f87c3a560e11b8152815160208e81013594938f0135936001600160a01b031692639f0f874a92600480830193928290030181865afa1580156121b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d891906152d7565b6121e29190614f60565b6121ec91906152ee565b6121f69190614f60565b6122009190614f60565b61220a9190614f60565b90505f6122186001866152ee565b6122239060046152a1565b61222e90600e614f60565b90505f85845f015161224091906152a1565b90508186856020015161225391906152a1565b61225d91906152a1565b6122679082614f60565b905060018611156122af57600261227f6001886152ee565b61228990886152a1565b856040015161229891906152a1565b6122a291906152b8565b6122ac9082614f60565b90505b81868560c001516122c091906152a1565b6122ca91906152a1565b6122d49082614f60565b9050828685606001516122e791906152a1565b6122f191906152a1565b6122fb9082614f60565b905084846080015161230d91906152a1565b6123179082614f60565b9050600185111561235f57600261232f6001876152ee565b61233990876152a1565b856040015161234891906152a1565b61235291906152b8565b61235c9082614f60565b90505b60a084015161236e9082614f60565b610100850151909150612710906123899061ffff1682614f60565b61239390836152a1565b61239d91906152b8565b975087806123c157604051638c4fcd9360e01b815260040161098891815260200190565b5050505050505050919050565b5f546001600160a01b03163314806123f057506003546001600160a01b031633145b61240d57604051639e75a8b560e01b815260040160405180910390fd5b5f8160ff161180156124235750600d60ff821611155b6124685760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b6044820152606401610988565b612486828260ff16600d81111561248157612481614849565b6142e0565b5050565b612492613a08565b6001600160a01b0381166124e85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e616765722061646472657373006044820152606401610988565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461255c576040516357d6948d60e11b815260040160405180910390fd5b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b1580156125a6575f5ffd5b505af11580156125b8573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee542826040516113b591815260200190565b6125f6613a08565b6001600160a01b0381161580159061262757505f828152600960205260409020546001600160a01b03828116911614155b8290612649576040516381c4951960e01b815260040161098891815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb69910160405180910390a15050565b6126b0613a08565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ab0565b6126ed613a08565b6127106127026101208301610100840161531b565b61ffff16111561271a6101208301610100840161531b565b9061273f576040516301027fc160e21b815261ffff9091166004820152602401610988565b506127106127556101408301610120840161531b565b61ffff16111561276d6101408301610120840161531b565b90612792576040516301027fc160e21b815261ffff9091166004820152602401610988565b506127106127a86101608301610140840161531b565b61ffff1611156127c06101608301610140840161531b565b906127e557604051633239953960e01b815261ffff9091166004820152602401610988565b506127106127fb6101808301610160840161531b565b61ffff1611156128136101808301610160840161531b565b9061283857604051633239953960e01b815261ffff9091166004820152602401610988565b5061271061284e6101a08301610180840161531b565b61ffff1611156128666101a08301610180840161531b565b9061288b57604051633239953960e01b815261ffff9091166004820152602401610988565b5061289e6101408201610120830161531b565b61ffff1615806128c757505f6128bb610100830160e0840161478a565b6001600160a01b031614155b6128e45760405163015f92ff60e51b815260040160405180910390fd5b6128f66101e082016101c08301615352565b63ffffffff1661290e6101c083016101a08401615352565b63ffffffff161015612933576040516392f55c6560e01b815260040160405180910390fd5b8060186129408282615391565b9050507fbf3951313e980027eb48ce363fdb707286195ec6a0f802ac153927cf929c3fc681604051610ab0919061554f565b61297a613a08565b6001600160a01b038116158015906129a057506001546001600160a01b03828116911614155b81906129c0576040516320252f0b60e01b815260040161098891906147d0565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ab09083906147d0565b612a14613a08565b612a216020820182615352565b63ffffffff16612a376040830160208401615352565b63ffffffff1610158015612a5c57505f612a546020830183615352565b63ffffffff16115b612a7957604051634564ab9b60e01b815260040160405180910390fd5b604080516101e0810182526018548152601954602080830191909152601a5492820192909252601b546060820152601c546080820152601d5460a0820152601e5460c0820152601f546001600160a01b03811660e083015261ffff600160a01b82048116610100840152600160b01b82048116610120840152600160c01b82048116610140840152600160d01b82048116610160840152600160e01b90910416610180820152905463ffffffff8082166101a08401819052640100000000909204166101c083015215612bb2576101a081015163ffffffff16612b626040840160208501615352565b63ffffffff161015612b7a6040840160208501615352565b826101a001519091612baf57604051633ccc4c2160e21b815263ffffffff928316600482015291166024820152604401610988565b50505b6101c081015163ffffffff1615612c29576101c081015163ffffffff16612bdc6020840184615352565b63ffffffff161015612bf16020840184615352565b826101c001519091612c265760405163156c4e5b60e11b815263ffffffff928316600482015291166024820152604401610988565b50505b8160125f856003811115612c3f57612c3f614849565b6003811115612c5057612c50614849565b815260208101919091526040015f20612c6a916002614675565b50826003811115612c7d57612c7d614849565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa83604051612cac9190615659565b60405180910390a2505050565b612cc1613a08565b6001600160a01b038116612cea575f604051631e4fbdf760e01b815260040161098891906147d0565b610acc81613b32565b5f612cfc6145f8565b5f601281612d0d602087018761527a565b6003811115612d1e57612d1e614849565b6003811115612d2f57612d2f614849565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d56579050505050505090505f81600160028110612dad57612dad615210565b602002015163ffffffff1611845f016020810190612dcb919061527a565b90612dea5760405163286c068d60e11b81526004016109889190615293565b50602084013542811015612e1457604051630b99e87960e01b815260040161098891815260200190565b5060408401356020850135811015612e425760405163174b5a0760e21b815260040161098891815260200190565b506017546016545f9190612e5a4260408901356152ee565b612e649190614f60565b612e6e9190614f60565b905060055481108190612e97576040516313b783af60e21b815260040161098891815260200190565b5060075f612eab608088016060890161478a565b6001600160a01b0316815260208101919091526040015f205460ff16612ed7608087016060880161478a565b90612ef65760405163295a6a6f60e11b815260040161098891906147d0565b505f612f0186611e04565b60068054965090915085905f612f1683615699565b9091555050604080514460208201529081018690525f9060600160408051601f1981840301815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b03199081166001600160a01b0393841617909155601f805460138852868520805461ffff191661ffff600160b01b909304929092169190911790555460148752858420805483169190931617909155600d8552838220805460ff191660011790556010909452829020805433941693909317909255601654919250612ff19190890135614f60565b5f878152600e60209081526040909120600101919091558186526130179088018861527a565b8560200190600381111561302d5761302d614849565b9081600381111561304057613040614849565b905250436040808701919091528051808201825290602089019060029083908390808284375f920191909152505050606080870191909152613088906080890190890161478a565b6001600160a01b031660a0808701919091526130a990880160808901614b4a565b60ff1660c0808701919091526130c1908801886156b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e08087019190915261310e9061010089019089016156f3565b15156101c08601525f610140860181905261016086018190526040805160208101909152818152610180870152336101a0870152600b8161315560a08b0160808c01614b4a565b60ff1660ff1681526020019081526020015f20805461317390614ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461319f90614ef9565b80156131ea5780601f106131c1576101008083540402835291602001916131ea565b820191905f5260205f20905b8154815290600101906020018083116131cd57829003601f168201915b505050505090505f8151116132115760405162461bcd60e51b815260040161098890615243565b5f61322260808a0160608b0161478a565b6001600160a01b031663fefd9a8b89858561324060a08f018f6156b1565b8f8060c0019061325091906156b1565b6040518863ffffffff1660e01b8152600401613272979695949392919061570e565b6020604051808303815f875af115801561328e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b291906152d7565b5f818152600960205260409020549091506001600160a01b031681816132ee576040516381c4951960e01b815260040161098891815260200190565b505f828152600a60205260409020546001600160a01b03168281613328576040516381c4951960e01b815260040161098891815260200190565b50608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff19919091169083600381111561338657613386614849565b0217905550604082015181600201556060820151816003019060026133ac929190614716565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e082015160078201906134059082615762565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c82019061346d9082615762565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091556004546134b9911633308961443b565b608089018390526001600160a01b038083166101008b015281166101208a01525f8a81526008602090815260409091208a518155908a0151600180830180548d94939260ff19919091169083600381111561351657613516614849565b02179055506040820151816002015560608201518160030190600261353c929190614716565b506080820151600582015560a082015160068201805460c085015160ff16600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560e082015160078201906135959082615762565b506101008201516008820180546001600160a01b039283166001600160a01b031991821617909155610120840151600984018054919093169116179055610140820151600a820155610160820151600b820155610180820151600c8201906135fd9082615762565b506101a0820151600d90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90613663908d9089908d90600401615817565b6020604051808303815f875af115801561367f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061511b565b6136c057604051630d8dbe2560e01b815260040160405180910390fd5b6136d060808c0160608d0161478a565b6001600160a01b03167f5090c9764b5cd13df7afc0013f733dfbe6eaf1b6ddc22a5e291fa387efd4c15e8b8b60405161370a929190614ed9565b60405180910390a2895f516020615acb5f395f51905f525f6001604051613732929190614f73565b60405180910390a25050505050505050915091565b5f818152600d602052604081205460ff168181600681111561376b5761376b614849565b0361379057826001826040516337e1404160e01b815260040161098893929190614f2b565b60058160068111156137a4576137a4614849565b036137c55760405163462c7bed60e01b815260048101849052602401610988565b60068160068111156137d9576137d9614849565b036137fa57604051633de16e3560e11b815260048101849052602401610988565b5f6138058483614158565b935090508061382a57604051639f65d93560e01b815260048101859052602401610988565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d81111561387357613873614849565b0217905550835f516020615acb5f395f51905f52836006604051613898929190614f73565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb83856040516138d292919061585c565b60405180910390a25050919050565b6138e9613a08565b6001600160a01b0381161580159061390e57505f546001600160a01b03828116911614155b819061392e576040516375ac4eb760e11b815260040161098891906147d0565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ab09083906147d0565b6001600160a01b0381165f90815260076020526040902054819060ff16156139b55760405163b29d459560e01b815260040161098891906147d0565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ab09083906147d0565b33613a1161190a565b6001600160a01b0316146112ff573360405163118cdaa760e01b815260040161098891906147d0565b8035613a595760405163055f269d60e01b815260040160405180910390fd5b5f816020013511613a7d5760405163055f269d60e01b815260040160405180910390fd5b5f816040013511613aa15760405163055f269d60e01b815260040160405180910390fd5b80356015819055602080830135601681905560408085013560178190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ab0565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b613b2961447a565b610acc8161449f565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa158015613be7573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613c0e9190810190615933565b5080515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b031690829003613cad576002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613c79908890889086906004016159f8565b5f604051808303815f87803b158015613c90575f5ffd5b505af1158015613ca2573d5f5f3e3d5ffd5b505050505050505050565b825f03613d4e575f858152601060205260409020546001600160a01b03168015613ce557613ce56001600160a01b03831682856140fb565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613d19908990899087906004016159f8565b5f604051808303815f87803b158015613d30575f5ffd5b505af1158015613d42573d5f5f3e3d5ffd5b50505050505050505050565b5f85815260136020908152604080832054601490925282205461ffff909116906001600160a01b03168115801590613d8e57506001600160a01b03811615155b15613dca57612710613da461ffff8416876152a1565b613dae91906152b8565b92508215613dca57613dca6001600160a01b03851682856140fb565b5f613dd584876152ee565b90505f876001600160401b03811115613df057613df0614f8e565b604051908082528060200260200182016040528015613e19578160200160208202803683370190505b5090505f613e2789846152b8565b90505f805b8a811015613e665782848281518110613e4757613e47615210565b6020908102919091010152613e5c8383614f60565b9150600101613e2c565b505f613e7282866152ee565b90508015613eaf578084613e8760018e6152ee565b81518110613e9757613e97615210565b60200260200101818151613eab9190614f60565b9052505b600154613ec9906001600160a01b038b81169116876144a7565b60015f9054906101000a90046001600160a01b03166001600160a01b031663dd8c818e8a8e876040518463ffffffff1660e01b8152600401613f0d93929190615a58565b5f604051808303815f87803b158015613f24575f5ffd5b505af1158015613f36573d5f5f3e3d5ffd5b5050600154613f5492506001600160a01b038c81169250165f6144a7565b8c7fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a8d86604051613f86929190615a8d565b60405180910390a260025f9054906101000a90046001600160a01b03166001600160a01b03166341489f158e8e8c6040518463ffffffff1660e01b8152600401613fd2939291906159f8565b5f604051808303815f87803b158015613fe9575f5ffd5b505af1158015613ffb573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b5f818152600f602052604090205460609060ff16600181600d81111561403657614036614849565b14806140535750600281600d81111561405157614051614849565b145b1561408b575f5b604051908082528060200260200182016040528015614083578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa9250505080156140f157506040513d5f823e601f3d908101601f191682016040526140ee9190810190615933565b60015b614083575f61405a565b61415383846001600160a01b031663a9059cbb8585604051602401614121929190615ab1565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614533565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa1580156141d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141f691906152d7565b9050600185600681111561420c5761420c614849565b14801561421857508042115b1561422b576001809350935050506142d9565b600285600681111561423f5761423f614849565b14801561424c5750815142115b1561426057600160039350935050506142d9565b600385600681111561427457614274614849565b1480156142845750816020015142115b1561429857600160069350935050506142d9565b60048560068111156142ac576142ac614849565b1480156142bc5750816040015142115b156142d0576001600a9350935050506142d9565b5f5f9350935050505b9250929050565b5f828152600d602052604081205460ff169081600681111561430457614304614849565b0361432957826001826040516337e1404160e01b815260040161098893929190614f2b565b600581600681111561433d5761433d614849565b0361435e5760405163462c7bed60e01b815260048101849052602401610988565b600681600681111561437257614372614849565b0361439357604051633de16e3560e11b815260048101849052602401610988565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d8111156143dc576143dc614849565b0217905550825f516020615acb5f395f51905f52826006604051614401929190614f73565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8284604051612cac92919061585c565b6040516001600160a01b0384811660248301528381166044830152606482018390526144749186918216906323b872dd90608401614121565b50505050565b614482614596565b6112ff57604051631afcd79f60e31b815260040160405180910390fd5b612cc161447a565b5f836001600160a01b031663095ea7b384846040516024016144ca929190615ab1565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061450384826145af565b6144745761452d84856001600160a01b031663095ea7b3865f604051602401614121929190615ab1565b61447484825b5f5f60205f8451602086015f885af180614552576040513d5f823e3d81fd5b50505f513d91508115614569578060011415614576565b6001600160a01b0384163b155b156144745783604051635274afe760e01b815260040161098891906147d0565b5f61459f613af7565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156145ee575081156145e057806001146145ee565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001614620614744565b81525f602082018190526040820181905260608083018290526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b600183019183908215614706579160200282015f5b838211156146d457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261468a565b80156147045782816101000a81549063ffffffff02191690556004016020816003010492830192600103026146d4565b505b50614712929150614762565b5090565b8260028101928215614706579160200282015b82811115614706578251825591602001919060010190614729565b60405180604001604052806002906020820280368337509192915050565b5b80821115614712575f8155600101614763565b6001600160a01b0381168114610acc575f5ffd5b5f6020828403121561479a575f5ffd5b81356147a581614776565b9392505050565b5f602082840312156147bc575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b8035600481106147f2575f5ffd5b919050565b5f5f60408385031215614808575f5ffd5b614811836147e4565b946020939093013593505050565b5f60608284031215610ef1575f5ffd5b5f6060828403121561483f575f5ffd5b6147a5838361481f565b634e487b7160e01b5f52602160045260245ffd5b600e811061486d5761486d614849565b9052565b60208101613b1b828461485d565b6004811061486d5761486d614849565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e81526148cd602082018f61487f565b8c60408201528b60608201526148e6608082018c6147c3565b60ff8a1660a08201526101c060c08201525f6149066101c083018b61488f565b61491360e084018b6147c3565b61492161010084018a6147c3565b8761012084015286610140840152828103610160840152614942818761488f565b9150506149536101808301856147c3565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015614474578151845260209384019390910190600101614972565b805182525f60208201516149a8602085018261487f565b506040820151604084015260608201516149c5606085018261496f565b50608082015160a084015260a08201516149e260c08501826147c3565b5060c082015160ff811660e08501525060e0820151610200610100850152614a0e61020085018261488f565b9050610100830151614a246101208601826147c3565b50610120830151614a396101408601826147c3565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152614a6b828261488f565b9150506101a0830151614a826101c08601826147c3565b506101c08301518015156101e0860152614083565b602081525f6147a56020830184614991565b80356147f281614776565b5f5f5f5f5f5f5f610120888a031215614acb575f5ffd5b8735614ad681614776565b96506020880135614ae681614776565b95506040880135614af681614776565b94506060880135614b0681614776565b93506080880135614b1681614776565b925060a08801359150614b2c8960c08a0161481f565b905092959891949750929550565b803560ff811681146147f2575f5ffd5b5f60208284031215614b5a575f5ffd5b6147a582614b3a565b602081525f6147a5602083018461488f565b5f5f60408385031215614b86575f5ffd5b823591506020830135614b9881614776565b809150509250929050565b5f5f83601f840112614bb3575f5ffd5b5081356001600160401b03811115614bc9575f5ffd5b6020830191508360208285010111156142d9575f5ffd5b5f5f5f5f5f60608688031215614bf4575f5ffd5b8535945060208601356001600160401b03811115614c10575f5ffd5b614c1c88828901614ba3565b90955093505060408601356001600160401b03811115614c3a575f5ffd5b614c4688828901614ba3565b969995985093965092949392505050565b5f5f60408385031215614c68575f5ffd5b50508035926020909101359150565b5f5f5f60408486031215614c89575f5ffd5b614c9284614b3a565b925060208401356001600160401b03811115614cac575f5ffd5b614cb886828701614ba3565b9497909650939450505050565b81518152602080830151908201526040808301519082015260608101613b1b565b8215158152604081016147a5602083018461485d565b5f60208284031215614d0c575f5ffd5b81356001600160401b03811115614d21575f5ffd5b820161010081850312156147a5575f5ffd5b5f6101e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151614d8d60e08401826147c3565b50610100830151614da561010084018261ffff169052565b50610120830151614dbd61012084018261ffff169052565b50610140830151614dd561014084018261ffff169052565b50610160830151614ded61016084018261ffff169052565b50610180830151614e0561018084018261ffff169052565b506101a0830151614e1f6101a084018263ffffffff169052565b506101c0830151614e396101c084018263ffffffff169052565b5092915050565b5f5f60408385031215614e51575f5ffd5b82359150614e6160208401614b3a565b90509250929050565b6007811061486d5761486d614849565b60208101613b1b8284614e6a565b5f6101e0828403128015614e9a575f5ffd5b509092915050565b5f5f60608385031215614eb3575f5ffd5b614ebc836147e4565b915083606084011115614ecd575f5ffd5b50926020919091019150565b828152604060208201525f614ef16040830184614991565b949350505050565b600181811c90821680614f0d57607f821691505b602082108103610ef157634e487b7160e01b5f52602260045260245ffd5b83815260608101614f3f6020830185614e6a565b614ef16040830184614e6a565b634e487b7160e01b5f52601160045260245ffd5b80820180821115613b1b57613b1b614f4c565b60408101614f818285614e6a565b6147a56020830184614e6a565b634e487b7160e01b5f52604160045260245ffd5b601f82111561415357805f5260205f20601f840160051c81016020851015614fc75750805b601f840160051c820191505b81811015614fe6575f8155600101614fd3565b5050505050565b5f19600383901b1c191660019190911b1790565b6001600160401b0383111561501857615018614f8e565b61502c836150268354614ef9565b83614fa2565b5f601f841160018114615058575f85156150465750838201355b6150508682614fed565b845550614fe6565b5f83815260208120601f198716915b828110156150875786850135825560209485019460019092019101615067565b50868210156150a3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6151056040830184866150c4565b95945050505050565b8015158114610acc575f5ffd5b5f6020828403121561512b575f5ffd5b81516147a58161510e565b602081525f614ef16020830184866150c4565b604081525f61515c6040830186886150c4565b828103602084015261516f8185876150c4565b979650505050505050565b60ff84168152604060208201525f6151056040830184866150c4565b5f8151808452602084019350602083015f5b828110156151cf5781516001600160a01b03168652602095860195909101906001016151a8565b5093949350505050565b848152836020820152608060408201525f6151f76080830185615196565b905060018060a01b038316606083015295945050505050565b634e487b7160e01b5f52603260045260245ffd5b848152836020820152606060408201525f6145ee6060830184866150c4565b6020808252601c908201527f42465620706172616d20736574206e6f74207265676973746572656400000000604082015260600190565b5f6020828403121561528a575f5ffd5b6147a5826147e4565b60208101613b1b828461487f565b8082028115828204841417613b1b57613b1b614f4c565b5f826152d257634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156152e7575f5ffd5b5051919050565b81810381811115613b1b57613b1b614f4c565b61ffff81168114610acc575f5ffd5b80356147f281615301565b5f6020828403121561532b575f5ffd5b81356147a581615301565b63ffffffff81168114610acc575f5ffd5b80356147f281615336565b5f60208284031215615362575f5ffd5b81356147a581615336565b5f8135613b1b81614776565b5f8135613b1b81615301565b5f8135613b1b81615336565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c08201356006820155600781016154016153e460e0850161536d565b82546001600160a01b0319166001600160a01b0391909116178255565b6154316154116101008501615379565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b6154616154416101208501615379565b82805461ffff60b01b191660b09290921b61ffff60b01b16919091179055565b6154916154716101408501615379565b82805461ffff60c01b191660c09290921b61ffff60c01b16919091179055565b6154c16154a16101608501615379565b82805461ffff60d01b191660d09290921b61ffff60d01b16919091179055565b6154f16154d16101808501615379565b82805461ffff60e01b191660e09290921b61ffff60e01b16919091179055565b506008810161551d6155066101a08501615385565b825463ffffffff191663ffffffff91909116178255565b61415361552d6101c08501615385565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c080830135908201526101e081016155a060e08401614aa9565b6155ad60e08401826147c3565b506155bb6101008401615310565b61ffff166101008301526155d26101208401615310565b61ffff166101208301526155e96101408401615310565b61ffff166101408301526156006101608401615310565b61ffff166101608301526156176101808401615310565b61ffff1661018083015261562e6101a08401615347565b63ffffffff166101a08301526156476101c08401615347565b63ffffffff81166101c0840152614e39565b6040810181835f5b600281101561569057813561567581615336565b63ffffffff1683526020928301929190910190600101615661565b50505092915050565b5f600182016156aa576156aa614f4c565b5060010190565b5f5f8335601e198436030181126156c6575f5ffd5b8301803591506001600160401b038211156156df575f5ffd5b6020019150368190038213156142d9575f5ffd5b5f60208284031215615703575f5ffd5b81356147a58161510e565b87815286602082015260a060408201525f61572c60a083018861488f565b828103606084015261573f8187896150c4565b905082810360808401526157548185876150c4565b9a9950505050505050505050565b81516001600160401b0381111561577b5761577b614f8e565b61578f816157898454614ef9565b84614fa2565b6020601f8211600181146157bc575f83156157aa5750848201515b6157b48482614fed565b855550614fe6565b5f84815260208120601f198516915b828110156157eb57878501518255602094850194600190920191016157cb565b508482101561580857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561585157815163ffffffff1683526020928301929091019060010161582c565b505050949350505050565b6040810161586a8285614e6a565b6147a5602083018461485d565b604051601f8201601f191681016001600160401b038111828210171561589f5761589f614f8e565b604052919050565b5f6001600160401b038211156158bf576158bf614f8e565b5060051b60200190565b5f82601f8301126158d8575f5ffd5b81516158eb6158e6826158a7565b615877565b8082825260208201915060208360051b86010192508583111561590c575f5ffd5b602085015b83811015615929578051835260209283019201615911565b5095945050505050565b5f5f60408385031215615944575f5ffd5b82516001600160401b03811115615959575f5ffd5b8301601f81018513615969575f5ffd5b80516159776158e6826158a7565b8082825260208201915060208360051b850101925087831115615998575f5ffd5b6020840193505b828410156159c35783516159b281614776565b82526020938401939091019061599f565b8095505050505060208301516001600160401b038111156159e2575f5ffd5b6159ee858286016158c9565b9150509250929050565b838152606060208201525f615a106060830185615196565b905060018060a01b0383166040830152949350505050565b5f8151808452602084019350602083015f5b828110156151cf578151865260209586019590910190600101615a3a565b6001600160a01b03841681526060602082018190525f90615a7b90830185615196565b82810360408401526145ee8185615a28565b604081525f615a9f6040830185615196565b82810360208401526151058185615a28565b6001600160a01b0392909216825260208201526040019056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/Enclave.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json index 6c074722e3..6946870540 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json @@ -153,6 +153,19 @@ "name": "LicenseBondUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "licenseToken", + "type": "address" + } + ], + "name": "LicenseTokenSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -172,6 +185,19 @@ "name": "OperatorActivationChanged", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "registry", + "type": "address" + } + ], + "name": "RegistrySet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -191,6 +217,19 @@ "name": "RewardDistributorUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "treasury", + "type": "address" + } + ], + "name": "SlashedFundsTreasurySet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -216,6 +255,19 @@ "name": "SlashedFundsWithdrawn", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "slashingManager", + "type": "address" + } + ], + "name": "SlashingManagerSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -247,6 +299,19 @@ "name": "TicketBalanceUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ticketToken", + "type": "address" + } + ], + "name": "TicketTokenSet", + "type": "event" + }, { "inputs": [ { @@ -940,5 +1005,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IBondingRegistry.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json index a428dccd8a..c2def89b18 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -971,5 +971,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ICiphernodeRegistry.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json index 2d85e9e8c1..83e49e9f6e 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -838,6 +838,25 @@ "name": "ParamSetRegistered", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "pkVerifier", + "type": "address" + } + ], + "name": "PkVerifierSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -2078,5 +2097,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IEnclave.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json index f44e888218..9e5c214eb8 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json @@ -216,6 +216,58 @@ "name": "AppealResolved", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bondingRegistry", + "type": "address" + } + ], + "name": "BondingRegistrySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "ciphernodeRegistry", + "type": "address" + } + ], + "name": "CiphernodeRegistrySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "e3RefundManager", + "type": "address" + } + ], + "name": "E3RefundManagerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "enclave", + "type": "address" + } + ], + "name": "EnclaveSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -954,5 +1006,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ISlashingManager.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json index f6edab0a13..208465867b 100644 --- a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json +++ b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json @@ -513,6 +513,19 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "slashingManager", + "type": "address" + } + ], + "name": "SlashingManagerSet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1270,30 +1283,30 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d8e806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639a7a2ffc11610135578063dbb06c93116100b4578063f165053611610079578063f165053614610578578063f2fde38b14610592578063f379b0df146105a5578063f52fd803146105df578063f6fc05d514610651575f5ffd5b8063dbb06c9314610525578063e59e469514610537578063e6745e131461054a578063e82f3b701461055d578063ebf0c71714610570575f5ffd5b8063c2b40ae4116100fa578063c2b40ae4146104b0578063c3a0ec30146104cf578063ca2869a0146104e0578063cd6dc687146104ff578063da881e5a14610512575f5ffd5b80639a7a2ffc146104255780639f0f874a14610461578063a01649301461046a578063a8a4d69b1461048a578063bff232c11461049d575f5ffd5b806370e36bbe116101c15780638cb89ecb116101865780638cb89ecb146103c25780638d1ddfb1146103e15780638da5cb5b146103f75780638e5ce3ad146103ff5780639015d37114610412575f5ffd5b806370e36bbe14610347578063715018a61461035a5780637c92f52414610362578063858142431461038f5780638a78bb15146103af575f5ffd5b8063291a691b11610207578063291a691b146102c95780632e7b716d146102ec5780634d6861a6146102ff57806350e6d94c146103125780635d50477614610334575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780631cc321b5146102955780632800d829146102a8575b5f5ffd5b6102566102513660046132dc565b61065a565b005b6102566102663660046132f7565b6107a6565b61027e6102793660046132f7565b6107e9565b60405161028c929190613381565b60405180910390f35b6102566102a33660046133f2565b610993565b6102bb6102b63660046132f7565b610cb7565b60405190815260200161028c565b6102dc6102d73660046134d1565b610d03565b604051901515815260200161028c565b6102dc6102fa3660046132dc565b610edd565b6102dc61030d3660046132f7565b610f90565b6102dc6103203660046132dc565b60066020525f908152604090205460ff1681565b6102dc61034236600461350a565b610fcf565b6102566103553660046132dc565b611013565b610256611089565b610375610370366004613538565b61109c565b6040805192835263ffffffff90911660208301520161028c565b6001546103a2906001600160a01b031681565b60405161028c919061356d565b6102566103bd3660046132dc565b611243565b6102bb6103d03660046132f7565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102bb565b6103a2611381565b600b546103a2906001600160a01b031681565b6102dc6104203660046132dc565b6113af565b61044b6104333660046132dc565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028c565b6102bb60035481565b61047d6104783660046132f7565b6113cc565b60405161028c9190613581565b6102dc61049836600461350a565b611462565b6102566104ab3660046132dc565b6114a6565b6102bb6104be3660046132f7565b60086020525f908152604090205481565b6001546001600160a01b03166103a2565b6102bb6104ee3660046132f7565b5f9081526008602052604090205490565b61025661050d366004613593565b6114f7565b6102dc6105203660046132f7565b611654565b5f546103a2906001600160a01b031681565b6102566105453660046132dc565b61192e565b6102566105583660046135bd565b6119a6565b6102bb61056b3660046132f7565b611b69565b6102bb611b9a565b610580601481565b60405160ff909116815260200161028c565b6102566105a03660046132dc565b611bac565b6004546105c19064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028c565b6106226105ed3660046132f7565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028c949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102bb60025481565b610662611381565b6001600160a01b0316336001600160a01b0316148061068b57506001546001600160a01b031633145b6106a857604051632864c4e160e01b815260040160405180910390fd5b6106b1816113af565b81906106da576040516381e5828960e01b81526004016106d1919061356d565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906107089060049083611be6565b6001600160a01b0382165f908152600660205260408120805460ff191690556002805491610735836135f1565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107ae611e88565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a60208190526040909120600681015491810154606092839291806001600160401b0381111561082057610820613606565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b509450806001600160401b0381111561086457610864613606565b60405190808252806020026020018201604052801561088d578160200160208202803683370190505b5093505f805b83811015610989575f8560060182815481106108b1576108b161361a565b5f918252602090912001546001600160a01b0316905060016001600160a01b0382165f90815260098801602052604090205460ff1660028111156108f7576108f761362e565b03610980578088848151811061090f5761090f61361a565b60200260200101906001600160a01b031690816001600160a01b031681525050856008015f826001600160a01b03166001600160a01b031681526020019081526020015f20548784815181106109675761096761361a565b60209081029190910101528261097c81613642565b9350505b50600101610893565b5050505050915091565b5f888152600a602052604090206002815460ff1660038111156109b8576109b861362e565b146109d657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156109f95760405163632a22bb60e01b815260040160405180910390fd5b60068101548714610a425760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106d1565b83610a875760405162461bcd60e51b81526020600482015260156024820152741c1ad0dbdb5b5a5d1b595b9d081c995c5d5a5c9959605a1b60448201526064016106d1565b5f805460405163101bb4d760e21b8152600481018c90526001600160a01b039091169063406ed35c906024015f60405180830381865afa158015610acd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af491908101906137b0565b9050806101c0015115610bf35782610b3f5760405162461bcd60e51b815260206004820152600e60248201526d1c1c9bdbd9881c995c5d5a5c995960921b60448201526064016106d1565b8061012001516001600160a01b031663258ae5828686866040518463ffffffff1660e01b8152600401610b7493929190613936565b602060405180830381865afa158015610b8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb3919061394f565b610bf35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2102225a390383937b7b360791b60448201526064016106d1565b60048281018690555f8b815260096020526040808220889055905490516340a3b76160e11b81529182018c9052602482018790526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015610c51575f5ffd5b505af1158015610c63573d5f5f3e3d5ffd5b50505050897fbf0636a312095f6c09c909823813b50e392323588d2d83432e7512c64041e67f8a8a8a8a8a8a8a604051610ca39796959493929190613968565b60405180910390a250505050505050505050565b5f818152600a6020526040812081815460ff166003811115610cdb57610cdb61362e565b03610cf957604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b03163314610d2e5760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff166003811115610d5257610d5261362e565b14610d70576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddb91906139e8565b905080610dee6040860160208701613a12565b63ffffffff161115610e066040860160208701613a12565b829091610e34576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106d1565b5050815460ff1916600190811783558201859055436002830155600354610e5b9042613a2b565b6003830155610e6f60058301856002613213565b50610e78611b9a565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610ec9928a928a9291613a3e565b60405180910390a250600195945050505050565b5f610ee7826113af565b610ef257505f919050565b6001546001600160a01b0316610f1b576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610f4b90859060040161356d565b602060405180830381865afa158015610f66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8a919061394f565b92915050565b5f818152600a602052604081206001815460ff166003811115610fb557610fb561362e565b14610fc257505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561100b5761100b61362e565b149392505050565b61101b611e88565b6001600160a01b0381166110425760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b611091611e88565b61109a5f611eba565b565b600b545f9081906001600160a01b031633146110cb5760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff1660038111156110f0576110f061362e565b1461110e57604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff16600281111561114e5761114e61362e565b1461115e57600a0154915061123b565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491611192836135f1565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b84986866040516111e3929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b61124b611381565b6001600160a01b0316336001600160a01b0316148061127457506001546001600160a01b031633145b61129157604051632864c4e160e01b815260040160405180910390fd5b61129a816113af565b61137e5760048054600160281b900464ffffffffff16906112c4906001600160a01b038416611f2a565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff19909116179055600280549161131583613642565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161079a565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a602052604090206004810154606091906113ff576040516322e679e360e11b815260040160405180910390fd5b8060060180548060200260200160405190810160405280929190818152602001828054801561145557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611437575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561149d5761149d61362e565b14159392505050565b6114ae611e88565b6001600160a01b0381166114d55760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611500612100565b805490915060ff600160401b82041615906001600160401b03165f811580156115265750825b90505f826001600160401b031660011480156115415750303b155b90508115801561154f575080155b1561156d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561159757845460ff60401b1916600160401b1785555b6001600160a01b0387166115be5760405163d92e233d60e01b815260040160405180910390fd5b6115c733612128565b6115d360046014612139565b6115dc866107a6565b6115e4611381565b6001600160a01b0316876001600160a01b0316146116055761160587611bac565b831561164b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156116785761167861362e565b0361169657604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116ae576116ae61362e565b146116cc57604051631860f69960e31b815260040160405180910390fd5b806003015442116116f057604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff161115806117d5578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b1580156117b6575f5ffd5b505af11580156117c8573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561180557611805613606565b60405190808252806020026020018201604052801561182e578160200160208202803683370190505b5090505f5b828110156118a057846008015f8660060183815481106118555761185561361a565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061188d5761188d61361a565b6020908102919091010152600101611833565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b1580156118e3575f5ffd5b505af11580156118f5573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610ec9929190613a8e565b611936611e88565b6001600160a01b03811661195d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156119ca576119ca61362e565b036119e857604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff166003811115611a0057611a0061362e565b14611a1e57604051631860f69960e31b815260040160405180910390fd5b8060030154421115611a4357604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff1615611a755760405163257309f160e11b815260040160405180910390fd5b611a7e33610edd565b611a9b5760405163149fbcfd60e11b815260040160405180910390fd5b611aa63383856121b8565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff19166001179055909150611b2590839083612389565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611b95576040516322e679e360e11b815260040160405180910390fd5b919050565b5f611ba76004601461258a565b905090565b611bb4611e88565b6001600160a01b038116611bdd575f604051631e4fbdf760e01b81526004016106d1919061356d565b61137e81611eba565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611c255760405162461bcd60e51b81526004016106d190613af1565b825464ffffffffff600160281b90910481169082168111611c835760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106d1565b825f5b81866001015f611c968488612683565b64ffffffffff1681526020019081526020015f20819055505f816001611cbc9190613b3b565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611cf15750611e80565b600185165f03611db8575f611d1083611d0b886001613b54565b612683565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d7191600401613b71565b602060405180830381865af4158015611d8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db091906139e8565b935050611e6c565b5f611dc883611d0b600189613ba1565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611e2991600401613b71565b602060405180830381865af4158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6891906139e8565b9350505b50647fffffffff600194851c169301611c86565b505050505050565b33611e91611381565b6001600160a01b03161461109a573360405163118cdaa760e01b81526004016106d1919061356d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611f795760405162461bcd60e51b81526004016106d190613af1565b825464ffffffffff90811690821610611fcc5760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106d1565b611fd7816001613b54565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f61200e8487612683565b64ffffffffff16815260208101919091526040015f205560018316156120f9575f61203e82611d0b600187613ba1565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe9161209f91600401613b71565b602060405180830381865af41580156120ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120de91906139e8565b647fffffffff600195861c1694909350919091019050611ffe565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610f8a565b6121306126a0565b61137e816126c5565b602060ff821611156121875760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106d1565b612198600160ff831681901b613bbe565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121d85760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612201576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161223791613bbe565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561227e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a291906139e8565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231991906139e8565b90505f811161233b5760405163aeaddff160e01b815260040160405180910390fd5b5f6123468284613bd1565b90505f81116123685760405163149fbcfd60e11b815260040160405180910390fd5b8086111561164b5760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561240757508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff1916821790559050612583565b5f5f90505f876008015f855f815481106124235761242361361a565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b84548110156124ab575f896008015f87848154811061246d5761246d61361a565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549050828111156124a2578092508193505b5060010161244c565b508086106124bf575f945050505050612583565b5f886009015f8685815481106124d7576124d761361a565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156125145761251461362e565b02179055508684838154811061252c5761252c61361a565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116125dd5760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106d1565b602060ff831611156126015760405162461bcd60e51b81526004016106d190613bf0565b8254600160281b900464ffffffffff168061262060ff85166002613d41565b64ffffffffff1610156126705760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106d1565b61267b8482856126cd565b949350505050565b5f8161269660ff851663ffffffff613d5a565b6125839190613b54565b6126a8612795565b61109a57604051631afcd79f60e31b815260040160405180910390fd5b611bb46126a0565b5f602060ff831611156126f25760405162461bcd60e51b81526004016106d190613bf0565b8264ffffffffff165f0361271057612709826127ae565b9050612583565b5f61271c836001613b3b565b60ff166001600160401b0381111561273657612736613606565b60405190808252806020026020018201604052801561275f578160200160208202803683370190505b50905061276e85858584612e48565b808360ff16815181106127835761278361361a565b60200260200101519150509392505050565b5f61279e612100565b54600160401b900460ff16919050565b5f8160ff165f036127c057505f919050565b8160ff166001036127f257507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361282457507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361285657507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361288857507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff166005036128ba57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036128ec57507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361291e57507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361295057507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361298257507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a036129b457507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b036129e657507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c03612a1857507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d03612a4a57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e03612a7c57507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612aae57507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612ae057507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612b1257507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612b4457507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612b7657507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612ba857507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612bda57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612c0c57507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612c3e57507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612c7057507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612ca257507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612cd457507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612d0657507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612d3857507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612d6a57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612d9c57507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612dce57507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612e0057507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106d1565b602060ff83161115612e6c5760405162461bcd60e51b81526004016106d190613bf0565b5f8364ffffffffff1611612ed05760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106d1565b5f612edc600185613ba1565b9050600181165f03612f2f57846001015f612ef75f84612683565b64ffffffffff1681526020019081526020015f2054825f81518110612f1e57612f1e61361a565b602002602001018181525050612f57565b612f385f6127ae565b825f81518110612f4a57612f4a61361a565b6020026020010181815250505b5f5b8360ff168160ff161015611e8057600182165f0361304f5773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612fab57612fab61361a565b60200260200101518152602001612fc1856127ae565b8152506040518263ffffffff1660e01b8152600401612fe09190613b71565b602060405180830381865af4158015612ffb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301f91906139e8565b8361302b836001613b3b565b60ff168151811061303e5761303e61361a565b602002602001018181525050613200565b5f61305b826001613b3b565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff168111156130fd575f876001015f6130b28560016130a19190613b3b565b60018864ffffffffff16901c612683565b64ffffffffff1681526020019081526020015f2054905080858460016130d89190613b3b565b60ff16815181106130eb576130eb61361a565b602002602001018181525050506131fe565b5f876001015f61311485600188611d0b9190613ba1565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff168151811061316b5761316b61361a565b60200260200101518152506040518263ffffffff1660e01b81526004016131929190613b71565b602060405180830381865af41580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d191906139e8565b856131dd856001613b3b565b60ff16815181106131f0576131f061361a565b602002602001018181525050505b505b647fffffffff600192831c169101612f59565b6001830191839082156132a4579160200282015f5b8382111561327257833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613228565b80156132a25782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613272565b505b506132b09291506132b4565b5090565b5b808211156132b0575f81556001016132b5565b6001600160a01b038116811461137e575f5ffd5b5f602082840312156132ec575f5ffd5b8135612583816132c8565b5f60208284031215613307575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b828110156133475781516001600160a01b0316865260209586019590910190600101613320565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613347578151865260209586019590910190600101613363565b604081525f613393604083018561330e565b82810360208401526133a58185613351565b95945050505050565b5f5f83601f8401126133be575f5ffd5b5081356001600160401b038111156133d4575f5ffd5b6020830191508360208285010111156133eb575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215613409575f5ffd5b8835975060208901356001600160401b03811115613425575f5ffd5b8901601f81018b13613435575f5ffd5b80356001600160401b0381111561344a575f5ffd5b8b60208260051b840101111561345e575f5ffd5b6020919091019750955060408901356001600160401b03811115613480575f5ffd5b61348c8b828c016133ae565b9096509450506060890135925060808901356001600160401b038111156134b1575f5ffd5b6134bd8b828c016133ae565b999c989b5096995094979396929594505050565b5f5f5f608084860312156134e3575f5ffd5b8335925060208401359150608084018510156134fd575f5ffd5b6040840190509250925092565b5f5f6040838503121561351b575f5ffd5b82359150602083013561352d816132c8565b809150509250929050565b5f5f5f6060848603121561354a575f5ffd5b83359250602084013561355c816132c8565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b602081525f612583602083018461330e565b5f5f604083850312156135a4575f5ffd5b82356135af816132c8565b946020939093013593505050565b5f5f604083850312156135ce575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f816135ff576135ff6135dd565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60018201613653576136536135dd565b5060010190565b6040516101e081016001600160401b038111828210171561367d5761367d613606565b60405290565b805160048110611b95575f5ffd5b5f82601f8301126136a0575f5ffd5b604080519081016001600160401b03811182821017156136c2576136c2613606565b80604052508060408401858111156136d8575f5ffd5b845b818110156136f25780518352602092830192016136da565b509195945050505050565b8051611b95816132c8565b805160ff81168114611b95575f5ffd5b5f82601f830112613727575f5ffd5b81516001600160401b0381111561374057613740613606565b604051601f8201601f19908116603f011681016001600160401b038111828210171561376e5761376e613606565b604052818152838201602001851015613785575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80518015158114611b95575f5ffd5b5f602082840312156137c0575f5ffd5b81516001600160401b038111156137d5575f5ffd5b820161020081850312156137e7575f5ffd5b6137ef61365a565b815181526137ff60208301613683565b60208201526040828101519082015261381b8560608401613691565b606082015260a0820151608082015261383660c083016136fd565b60a082015261384760e08301613708565b60c08201526101008201516001600160401b03811115613865575f5ffd5b61387186828501613718565b60e08301525061388461012083016136fd565b61010082015261389761014083016136fd565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156138cd575f5ffd5b6138d986828501613718565b610180830152506138ed6101c083016136fd565b6101a08201526139006101e083016137a1565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6133a560408301848661390e565b5f6020828403121561395f575f5ffd5b612583826137a1565b608080825281018790525f8860a08301825b8a8110156139aa57823561398d816132c8565b6001600160a01b031682526020928301929091019060010161397a565b5083810360208501526139be81898b61390e565b91505085604084015282810360608401526139da81858761390e565b9a9950505050505050505050565b5f602082840312156139f8575f5ffd5b5051919050565b803563ffffffff81168114611b95575f5ffd5b5f60208284031215613a22575f5ffd5b612583826139ff565b80820180821115610f8a57610f8a6135dd565b84815260a0810160208201855f5b6002811015613a795763ffffffff613a63836139ff565b1683526020928301929190910190600101613a4c565b50505060608201939093526080015292915050565b604080825283549082018190525f8481526020812090916060840190835b81811015613ad35783546001600160a01b0316835260019384019360209093019201613aac565b50508381036020850152613ae78186613351565b9695505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610f8a57610f8a6135dd565b64ffffffffff8181168382160190811115610f8a57610f8a6135dd565b6040810181835f5b6002811015613b98578151835260209283019290910190600101613b79565b50505092915050565b64ffffffffff8281168282160390811115610f8a57610f8a6135dd565b81810381811115610f8a57610f8a6135dd565b5f82613beb57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b600184111561123b57808504811115613c5257613c526135dd565b6001841615613c6057908102905b60019390931c928002613c37565b5f82613c7c57506001610f8a565b81613c8857505f610f8a565b8160018114613c9e5760028114613ca857613cda565b6001915050610f8a565b60ff841115613cb957613cb96135dd565b6001841b915064ffffffffff821115613cd457613cd46135dd565b50610f8a565b5060208310610133831016604e8410600b8410161715613d12575081810a64ffffffffff811115613d0d57613d0d6135dd565b610f8a565b613d2264ffffffffff8484613c33565b8064ffffffffff04821115613d3957613d396135dd565b029392505050565b5f61258364ffffffffff841664ffffffffff8416613c6e565b64ffffffffff8181168382160290811690818114613d7a57613d7a6135dd565b509291505056fea164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639a7a2ffc11610135578063dbb06c93116100b4578063f165053611610079578063f165053614610578578063f2fde38b14610592578063f379b0df146105a5578063f52fd803146105df578063f6fc05d514610651575f5ffd5b8063dbb06c9314610525578063e59e469514610537578063e6745e131461054a578063e82f3b701461055d578063ebf0c71714610570575f5ffd5b8063c2b40ae4116100fa578063c2b40ae4146104b0578063c3a0ec30146104cf578063ca2869a0146104e0578063cd6dc687146104ff578063da881e5a14610512575f5ffd5b80639a7a2ffc146104255780639f0f874a14610461578063a01649301461046a578063a8a4d69b1461048a578063bff232c11461049d575f5ffd5b806370e36bbe116101c15780638cb89ecb116101865780638cb89ecb146103c25780638d1ddfb1146103e15780638da5cb5b146103f75780638e5ce3ad146103ff5780639015d37114610412575f5ffd5b806370e36bbe14610347578063715018a61461035a5780637c92f52414610362578063858142431461038f5780638a78bb15146103af575f5ffd5b8063291a691b11610207578063291a691b146102c95780632e7b716d146102ec5780634d6861a6146102ff57806350e6d94c146103125780635d50477614610334575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780631cc321b5146102955780632800d829146102a8575b5f5ffd5b6102566102513660046132dc565b61065a565b005b6102566102663660046132f7565b6107a6565b61027e6102793660046132f7565b6107e9565b60405161028c929190613381565b60405180910390f35b6102566102a33660046133f2565b610993565b6102bb6102b63660046132f7565b610cb7565b60405190815260200161028c565b6102dc6102d73660046134d1565b610d03565b604051901515815260200161028c565b6102dc6102fa3660046132dc565b610edd565b6102dc61030d3660046132f7565b610f90565b6102dc6103203660046132dc565b60066020525f908152604090205460ff1681565b6102dc61034236600461350a565b610fcf565b6102566103553660046132dc565b611013565b610256611089565b610375610370366004613538565b61109c565b6040805192835263ffffffff90911660208301520161028c565b6001546103a2906001600160a01b031681565b60405161028c919061356d565b6102566103bd3660046132dc565b611243565b6102bb6103d03660046132f7565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102bb565b6103a2611381565b600b546103a2906001600160a01b031681565b6102dc6104203660046132dc565b6113af565b61044b6104333660046132dc565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028c565b6102bb60035481565b61047d6104783660046132f7565b6113cc565b60405161028c9190613581565b6102dc61049836600461350a565b611462565b6102566104ab3660046132dc565b6114a6565b6102bb6104be3660046132f7565b60086020525f908152604090205481565b6001546001600160a01b03166103a2565b6102bb6104ee3660046132f7565b5f9081526008602052604090205490565b61025661050d366004613593565b6114f7565b6102dc6105203660046132f7565b611654565b5f546103a2906001600160a01b031681565b6102566105453660046132dc565b61192e565b6102566105583660046135bd565b6119a6565b6102bb61056b3660046132f7565b611b69565b6102bb611b9a565b610580601481565b60405160ff909116815260200161028c565b6102566105a03660046132dc565b611bac565b6004546105c19064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028c565b6106226105ed3660046132f7565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028c949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102bb60025481565b610662611381565b6001600160a01b0316336001600160a01b0316148061068b57506001546001600160a01b031633145b6106a857604051632864c4e160e01b815260040160405180910390fd5b6106b1816113af565b81906106da576040516381e5828960e01b81526004016106d1919061356d565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906107089060049083611be6565b6001600160a01b0382165f908152600660205260408120805460ff191690556002805491610735836135f1565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107ae611e88565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a60208190526040909120600681015491810154606092839291806001600160401b0381111561082057610820613606565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b509450806001600160401b0381111561086457610864613606565b60405190808252806020026020018201604052801561088d578160200160208202803683370190505b5093505f805b83811015610989575f8560060182815481106108b1576108b161361a565b5f918252602090912001546001600160a01b0316905060016001600160a01b0382165f90815260098801602052604090205460ff1660028111156108f7576108f761362e565b03610980578088848151811061090f5761090f61361a565b60200260200101906001600160a01b031690816001600160a01b031681525050856008015f826001600160a01b03166001600160a01b031681526020019081526020015f20548784815181106109675761096761361a565b60209081029190910101528261097c81613642565b9350505b50600101610893565b5050505050915091565b5f888152600a602052604090206002815460ff1660038111156109b8576109b861362e565b146109d657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156109f95760405163632a22bb60e01b815260040160405180910390fd5b60068101548714610a425760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106d1565b83610a875760405162461bcd60e51b81526020600482015260156024820152741c1ad0dbdb5b5a5d1b595b9d081c995c5d5a5c9959605a1b60448201526064016106d1565b5f805460405163101bb4d760e21b8152600481018c90526001600160a01b039091169063406ed35c906024015f60405180830381865afa158015610acd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af491908101906137b0565b9050806101c0015115610bf35782610b3f5760405162461bcd60e51b815260206004820152600e60248201526d1c1c9bdbd9881c995c5d5a5c995960921b60448201526064016106d1565b8061012001516001600160a01b031663258ae5828686866040518463ffffffff1660e01b8152600401610b7493929190613936565b602060405180830381865afa158015610b8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb3919061394f565b610bf35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2102225a390383937b7b360791b60448201526064016106d1565b60048281018690555f8b815260096020526040808220889055905490516340a3b76160e11b81529182018c9052602482018790526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015610c51575f5ffd5b505af1158015610c63573d5f5f3e3d5ffd5b50505050897fbf0636a312095f6c09c909823813b50e392323588d2d83432e7512c64041e67f8a8a8a8a8a8a8a604051610ca39796959493929190613968565b60405180910390a250505050505050505050565b5f818152600a6020526040812081815460ff166003811115610cdb57610cdb61362e565b03610cf957604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b03163314610d2e5760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff166003811115610d5257610d5261362e565b14610d70576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddb91906139e8565b905080610dee6040860160208701613a12565b63ffffffff161115610e066040860160208701613a12565b829091610e34576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106d1565b5050815460ff1916600190811783558201859055436002830155600354610e5b9042613a2b565b6003830155610e6f60058301856002613213565b50610e78611b9a565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610ec9928a928a9291613a3e565b60405180910390a250600195945050505050565b5f610ee7826113af565b610ef257505f919050565b6001546001600160a01b0316610f1b576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610f4b90859060040161356d565b602060405180830381865afa158015610f66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8a919061394f565b92915050565b5f818152600a602052604081206001815460ff166003811115610fb557610fb561362e565b14610fc257505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561100b5761100b61362e565b149392505050565b61101b611e88565b6001600160a01b0381166110425760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b611091611e88565b61109a5f611eba565b565b600b545f9081906001600160a01b031633146110cb5760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff1660038111156110f0576110f061362e565b1461110e57604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff16600281111561114e5761114e61362e565b1461115e57600a0154915061123b565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491611192836135f1565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b84986866040516111e3929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b61124b611381565b6001600160a01b0316336001600160a01b0316148061127457506001546001600160a01b031633145b61129157604051632864c4e160e01b815260040160405180910390fd5b61129a816113af565b61137e5760048054600160281b900464ffffffffff16906112c4906001600160a01b038416611f2a565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff19909116179055600280549161131583613642565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161079a565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a602052604090206004810154606091906113ff576040516322e679e360e11b815260040160405180910390fd5b8060060180548060200260200160405190810160405280929190818152602001828054801561145557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611437575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561149d5761149d61362e565b14159392505050565b6114ae611e88565b6001600160a01b0381166114d55760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611500612100565b805490915060ff600160401b82041615906001600160401b03165f811580156115265750825b90505f826001600160401b031660011480156115415750303b155b90508115801561154f575080155b1561156d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561159757845460ff60401b1916600160401b1785555b6001600160a01b0387166115be5760405163d92e233d60e01b815260040160405180910390fd5b6115c733612128565b6115d360046014612139565b6115dc866107a6565b6115e4611381565b6001600160a01b0316876001600160a01b0316146116055761160587611bac565b831561164b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156116785761167861362e565b0361169657604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116ae576116ae61362e565b146116cc57604051631860f69960e31b815260040160405180910390fd5b806003015442116116f057604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff161115806117d5578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b1580156117b6575f5ffd5b505af11580156117c8573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561180557611805613606565b60405190808252806020026020018201604052801561182e578160200160208202803683370190505b5090505f5b828110156118a057846008015f8660060183815481106118555761185561361a565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061188d5761188d61361a565b6020908102919091010152600101611833565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b1580156118e3575f5ffd5b505af11580156118f5573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610ec9929190613a8e565b611936611e88565b6001600160a01b03811661195d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156119ca576119ca61362e565b036119e857604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff166003811115611a0057611a0061362e565b14611a1e57604051631860f69960e31b815260040160405180910390fd5b8060030154421115611a4357604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff1615611a755760405163257309f160e11b815260040160405180910390fd5b611a7e33610edd565b611a9b5760405163149fbcfd60e11b815260040160405180910390fd5b611aa63383856121b8565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff19166001179055909150611b2590839083612389565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611b95576040516322e679e360e11b815260040160405180910390fd5b919050565b5f611ba76004601461258a565b905090565b611bb4611e88565b6001600160a01b038116611bdd575f604051631e4fbdf760e01b81526004016106d1919061356d565b61137e81611eba565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611c255760405162461bcd60e51b81526004016106d190613af1565b825464ffffffffff600160281b90910481169082168111611c835760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106d1565b825f5b81866001015f611c968488612683565b64ffffffffff1681526020019081526020015f20819055505f816001611cbc9190613b3b565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611cf15750611e80565b600185165f03611db8575f611d1083611d0b886001613b54565b612683565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d7191600401613b71565b602060405180830381865af4158015611d8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db091906139e8565b935050611e6c565b5f611dc883611d0b600189613ba1565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611e2991600401613b71565b602060405180830381865af4158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6891906139e8565b9350505b50647fffffffff600194851c169301611c86565b505050505050565b33611e91611381565b6001600160a01b03161461109a573360405163118cdaa760e01b81526004016106d1919061356d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611f795760405162461bcd60e51b81526004016106d190613af1565b825464ffffffffff90811690821610611fcc5760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106d1565b611fd7816001613b54565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f61200e8487612683565b64ffffffffff16815260208101919091526040015f205560018316156120f9575f61203e82611d0b600187613ba1565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe9161209f91600401613b71565b602060405180830381865af41580156120ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120de91906139e8565b647fffffffff600195861c1694909350919091019050611ffe565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610f8a565b6121306126a0565b61137e816126c5565b602060ff821611156121875760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106d1565b612198600160ff831681901b613bbe565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121d85760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612201576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161223791613bbe565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561227e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a291906139e8565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231991906139e8565b90505f811161233b5760405163aeaddff160e01b815260040160405180910390fd5b5f6123468284613bd1565b90505f81116123685760405163149fbcfd60e11b815260040160405180910390fd5b8086111561164b5760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561240757508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff1916821790559050612583565b5f5f90505f876008015f855f815481106124235761242361361a565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b84548110156124ab575f896008015f87848154811061246d5761246d61361a565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549050828111156124a2578092508193505b5060010161244c565b508086106124bf575f945050505050612583565b5f886009015f8685815481106124d7576124d761361a565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156125145761251461362e565b02179055508684838154811061252c5761252c61361a565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116125dd5760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106d1565b602060ff831611156126015760405162461bcd60e51b81526004016106d190613bf0565b8254600160281b900464ffffffffff168061262060ff85166002613d41565b64ffffffffff1610156126705760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106d1565b61267b8482856126cd565b949350505050565b5f8161269660ff851663ffffffff613d5a565b6125839190613b54565b6126a8612795565b61109a57604051631afcd79f60e31b815260040160405180910390fd5b611bb46126a0565b5f602060ff831611156126f25760405162461bcd60e51b81526004016106d190613bf0565b8264ffffffffff165f0361271057612709826127ae565b9050612583565b5f61271c836001613b3b565b60ff166001600160401b0381111561273657612736613606565b60405190808252806020026020018201604052801561275f578160200160208202803683370190505b50905061276e85858584612e48565b808360ff16815181106127835761278361361a565b60200260200101519150509392505050565b5f61279e612100565b54600160401b900460ff16919050565b5f8160ff165f036127c057505f919050565b8160ff166001036127f257507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361282457507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361285657507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361288857507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff166005036128ba57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036128ec57507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361291e57507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361295057507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361298257507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a036129b457507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b036129e657507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c03612a1857507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d03612a4a57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e03612a7c57507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612aae57507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612ae057507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612b1257507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612b4457507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612b7657507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612ba857507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612bda57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612c0c57507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612c3e57507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612c7057507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612ca257507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612cd457507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612d0657507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612d3857507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612d6a57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612d9c57507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612dce57507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612e0057507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106d1565b602060ff83161115612e6c5760405162461bcd60e51b81526004016106d190613bf0565b5f8364ffffffffff1611612ed05760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106d1565b5f612edc600185613ba1565b9050600181165f03612f2f57846001015f612ef75f84612683565b64ffffffffff1681526020019081526020015f2054825f81518110612f1e57612f1e61361a565b602002602001018181525050612f57565b612f385f6127ae565b825f81518110612f4a57612f4a61361a565b6020026020010181815250505b5f5b8360ff168160ff161015611e8057600182165f0361304f5773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612fab57612fab61361a565b60200260200101518152602001612fc1856127ae565b8152506040518263ffffffff1660e01b8152600401612fe09190613b71565b602060405180830381865af4158015612ffb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301f91906139e8565b8361302b836001613b3b565b60ff168151811061303e5761303e61361a565b602002602001018181525050613200565b5f61305b826001613b3b565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff168111156130fd575f876001015f6130b28560016130a19190613b3b565b60018864ffffffffff16901c612683565b64ffffffffff1681526020019081526020015f2054905080858460016130d89190613b3b565b60ff16815181106130eb576130eb61361a565b602002602001018181525050506131fe565b5f876001015f61311485600188611d0b9190613ba1565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff168151811061316b5761316b61361a565b60200260200101518152506040518263ffffffff1660e01b81526004016131929190613b71565b602060405180830381865af41580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d191906139e8565b856131dd856001613b3b565b60ff16815181106131f0576131f061361a565b602002602001018181525050505b505b647fffffffff600192831c169101612f59565b6001830191839082156132a4579160200282015f5b8382111561327257833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613228565b80156132a25782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613272565b505b506132b09291506132b4565b5090565b5b808211156132b0575f81556001016132b5565b6001600160a01b038116811461137e575f5ffd5b5f602082840312156132ec575f5ffd5b8135612583816132c8565b5f60208284031215613307575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b828110156133475781516001600160a01b0316865260209586019590910190600101613320565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613347578151865260209586019590910190600101613363565b604081525f613393604083018561330e565b82810360208401526133a58185613351565b95945050505050565b5f5f83601f8401126133be575f5ffd5b5081356001600160401b038111156133d4575f5ffd5b6020830191508360208285010111156133eb575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215613409575f5ffd5b8835975060208901356001600160401b03811115613425575f5ffd5b8901601f81018b13613435575f5ffd5b80356001600160401b0381111561344a575f5ffd5b8b60208260051b840101111561345e575f5ffd5b6020919091019750955060408901356001600160401b03811115613480575f5ffd5b61348c8b828c016133ae565b9096509450506060890135925060808901356001600160401b038111156134b1575f5ffd5b6134bd8b828c016133ae565b999c989b5096995094979396929594505050565b5f5f5f608084860312156134e3575f5ffd5b8335925060208401359150608084018510156134fd575f5ffd5b6040840190509250925092565b5f5f6040838503121561351b575f5ffd5b82359150602083013561352d816132c8565b809150509250929050565b5f5f5f6060848603121561354a575f5ffd5b83359250602084013561355c816132c8565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b602081525f612583602083018461330e565b5f5f604083850312156135a4575f5ffd5b82356135af816132c8565b946020939093013593505050565b5f5f604083850312156135ce575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f816135ff576135ff6135dd565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60018201613653576136536135dd565b5060010190565b6040516101e081016001600160401b038111828210171561367d5761367d613606565b60405290565b805160048110611b95575f5ffd5b5f82601f8301126136a0575f5ffd5b604080519081016001600160401b03811182821017156136c2576136c2613606565b80604052508060408401858111156136d8575f5ffd5b845b818110156136f25780518352602092830192016136da565b509195945050505050565b8051611b95816132c8565b805160ff81168114611b95575f5ffd5b5f82601f830112613727575f5ffd5b81516001600160401b0381111561374057613740613606565b604051601f8201601f19908116603f011681016001600160401b038111828210171561376e5761376e613606565b604052818152838201602001851015613785575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80518015158114611b95575f5ffd5b5f602082840312156137c0575f5ffd5b81516001600160401b038111156137d5575f5ffd5b820161020081850312156137e7575f5ffd5b6137ef61365a565b815181526137ff60208301613683565b60208201526040828101519082015261381b8560608401613691565b606082015260a0820151608082015261383660c083016136fd565b60a082015261384760e08301613708565b60c08201526101008201516001600160401b03811115613865575f5ffd5b61387186828501613718565b60e08301525061388461012083016136fd565b61010082015261389761014083016136fd565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156138cd575f5ffd5b6138d986828501613718565b610180830152506138ed6101c083016136fd565b6101a08201526139006101e083016137a1565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6133a560408301848661390e565b5f6020828403121561395f575f5ffd5b612583826137a1565b608080825281018790525f8860a08301825b8a8110156139aa57823561398d816132c8565b6001600160a01b031682526020928301929091019060010161397a565b5083810360208501526139be81898b61390e565b91505085604084015282810360608401526139da81858761390e565b9a9950505050505050505050565b5f602082840312156139f8575f5ffd5b5051919050565b803563ffffffff81168114611b95575f5ffd5b5f60208284031215613a22575f5ffd5b612583826139ff565b80820180821115610f8a57610f8a6135dd565b84815260a0810160208201855f5b6002811015613a795763ffffffff613a63836139ff565b1683526020928301929190910190600101613a4c565b50505060608201939093526080015292915050565b604080825283549082018190525f8481526020812090916060840190835b81811015613ad35783546001600160a01b0316835260019384019360209093019201613aac565b50508381036020850152613ae78186613351565b9695505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610f8a57610f8a6135dd565b64ffffffffff8181168382160190811115610f8a57610f8a6135dd565b6040810181835f5b6002811015613b98578151835260209283019290910190600101613b79565b50505092915050565b64ffffffffff8281168282160390811115610f8a57610f8a6135dd565b81810381811115610f8a57610f8a6135dd565b5f82613beb57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b600184111561123b57808504811115613c5257613c526135dd565b6001841615613c6057908102905b60019390931c928002613c37565b5f82613c7c57506001610f8a565b81613c8857505f610f8a565b8160018114613c9e5760028114613ca857613cda565b6001915050610f8a565b60ff841115613cb957613cb96135dd565b6001841b915064ffffffffff821115613cd457613cd46135dd565b50610f8a565b5060208310610133831016604e8410600b8410161715613d12575081810a64ffffffffff811115613d0d57613d0d6135dd565b610f8a565b613d2264ffffffffff8484613c33565b8064ffffffffff04821115613d3957613d396135dd565b029392505050565b5f61258364ffffffffff841664ffffffffff8416613c6e565b64ffffffffff8181168382160290811690818114613d7a57613d7a6135dd565b509291505056fea164736f6c634300081c000a", + "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613db5806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639a7a2ffc11610135578063dbb06c93116100b4578063f165053611610079578063f165053614610578578063f2fde38b14610592578063f379b0df146105a5578063f52fd803146105df578063f6fc05d514610651575f5ffd5b8063dbb06c9314610525578063e59e469514610537578063e6745e131461054a578063e82f3b701461055d578063ebf0c71714610570575f5ffd5b8063c2b40ae4116100fa578063c2b40ae4146104b0578063c3a0ec30146104cf578063ca2869a0146104e0578063cd6dc687146104ff578063da881e5a14610512575f5ffd5b80639a7a2ffc146104255780639f0f874a14610461578063a01649301461046a578063a8a4d69b1461048a578063bff232c11461049d575f5ffd5b806370e36bbe116101c15780638cb89ecb116101865780638cb89ecb146103c25780638d1ddfb1146103e15780638da5cb5b146103f75780638e5ce3ad146103ff5780639015d37114610412575f5ffd5b806370e36bbe14610347578063715018a61461035a5780637c92f52414610362578063858142431461038f5780638a78bb15146103af575f5ffd5b8063291a691b11610207578063291a691b146102c95780632e7b716d146102ec5780634d6861a6146102ff57806350e6d94c146103125780635d50477614610334575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780631cc321b5146102955780632800d829146102a8575b5f5ffd5b610256610251366004613303565b61065a565b005b61025661026636600461331e565b6107a6565b61027e61027936600461331e565b6107e9565b60405161028c9291906133a8565b60405180910390f35b6102566102a3366004613419565b610993565b6102bb6102b636600461331e565b610cb7565b60405190815260200161028c565b6102dc6102d73660046134f8565b610d03565b604051901515815260200161028c565b6102dc6102fa366004613303565b610edd565b6102dc61030d36600461331e565b610f90565b6102dc610320366004613303565b60066020525f908152604090205460ff1681565b6102dc610342366004613531565b610fcf565b610256610355366004613303565b611013565b610256611089565b61037561037036600461355f565b61109c565b6040805192835263ffffffff90911660208301520161028c565b6001546103a2906001600160a01b031681565b60405161028c9190613594565b6102566103bd366004613303565b611243565b6102bb6103d036600461331e565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102bb565b6103a2611381565b600b546103a2906001600160a01b031681565b6102dc610420366004613303565b6113af565b61044b610433366004613303565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028c565b6102bb60035481565b61047d61047836600461331e565b6113cc565b60405161028c91906135a8565b6102dc610498366004613531565b611462565b6102566104ab366004613303565b6114a6565b6102bb6104be36600461331e565b60086020525f908152604090205481565b6001546001600160a01b03166103a2565b6102bb6104ee36600461331e565b5f9081526008602052604090205490565b61025661050d3660046135ba565b61151e565b6102dc61052036600461331e565b61167b565b5f546103a2906001600160a01b031681565b610256610545366004613303565b611955565b6102566105583660046135e4565b6119cd565b6102bb61056b36600461331e565b611b90565b6102bb611bc1565b610580601481565b60405160ff909116815260200161028c565b6102566105a0366004613303565b611bd3565b6004546105c19064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028c565b6106226105ed36600461331e565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028c949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102bb60025481565b610662611381565b6001600160a01b0316336001600160a01b0316148061068b57506001546001600160a01b031633145b6106a857604051632864c4e160e01b815260040160405180910390fd5b6106b1816113af565b81906106da576040516381e5828960e01b81526004016106d19190613594565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906107089060049083611c0d565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161073583613618565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107ae611eaf565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a60208190526040909120600681015491810154606092839291806001600160401b038111156108205761082061362d565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b509450806001600160401b038111156108645761086461362d565b60405190808252806020026020018201604052801561088d578160200160208202803683370190505b5093505f805b83811015610989575f8560060182815481106108b1576108b1613641565b5f918252602090912001546001600160a01b0316905060016001600160a01b0382165f90815260098801602052604090205460ff1660028111156108f7576108f7613655565b03610980578088848151811061090f5761090f613641565b60200260200101906001600160a01b031690816001600160a01b031681525050856008015f826001600160a01b03166001600160a01b031681526020019081526020015f205487848151811061096757610967613641565b60209081029190910101528261097c81613669565b9350505b50600101610893565b5050505050915091565b5f888152600a602052604090206002815460ff1660038111156109b8576109b8613655565b146109d657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156109f95760405163632a22bb60e01b815260040160405180910390fd5b60068101548714610a425760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106d1565b83610a875760405162461bcd60e51b81526020600482015260156024820152741c1ad0dbdb5b5a5d1b595b9d081c995c5d5a5c9959605a1b60448201526064016106d1565b5f805460405163101bb4d760e21b8152600481018c90526001600160a01b039091169063406ed35c906024015f60405180830381865afa158015610acd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af491908101906137d7565b9050806101c0015115610bf35782610b3f5760405162461bcd60e51b815260206004820152600e60248201526d1c1c9bdbd9881c995c5d5a5c995960921b60448201526064016106d1565b8061012001516001600160a01b031663258ae5828686866040518463ffffffff1660e01b8152600401610b749392919061395d565b602060405180830381865afa158015610b8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb39190613976565b610bf35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2102225a390383937b7b360791b60448201526064016106d1565b60048281018690555f8b815260096020526040808220889055905490516340a3b76160e11b81529182018c9052602482018790526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015610c51575f5ffd5b505af1158015610c63573d5f5f3e3d5ffd5b50505050897fbf0636a312095f6c09c909823813b50e392323588d2d83432e7512c64041e67f8a8a8a8a8a8a8a604051610ca3979695949392919061398f565b60405180910390a250505050505050505050565b5f818152600a6020526040812081815460ff166003811115610cdb57610cdb613655565b03610cf957604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b03163314610d2e5760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff166003811115610d5257610d52613655565b14610d70576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddb9190613a0f565b905080610dee6040860160208701613a39565b63ffffffff161115610e066040860160208701613a39565b829091610e34576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106d1565b5050815460ff1916600190811783558201859055436002830155600354610e5b9042613a52565b6003830155610e6f6005830185600261323a565b50610e78611bc1565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610ec9928a928a9291613a65565b60405180910390a250600195945050505050565b5f610ee7826113af565b610ef257505f919050565b6001546001600160a01b0316610f1b576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610f4b908590600401613594565b602060405180830381865afa158015610f66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8a9190613976565b92915050565b5f818152600a602052604081206001815460ff166003811115610fb557610fb5613655565b14610fc257505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561100b5761100b613655565b149392505050565b61101b611eaf565b6001600160a01b0381166110425760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b611091611eaf565b61109a5f611ee1565b565b600b545f9081906001600160a01b031633146110cb5760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff1660038111156110f0576110f0613655565b1461110e57604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff16600281111561114e5761114e613655565b1461115e57600a0154915061123b565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a820180549161119283613618565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b84986866040516111e3929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b61124b611381565b6001600160a01b0316336001600160a01b0316148061127457506001546001600160a01b031633145b61129157604051632864c4e160e01b815260040160405180910390fd5b61129a816113af565b61137e5760048054600160281b900464ffffffffff16906112c4906001600160a01b038416611f51565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff19909116179055600280549161131583613669565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161079a565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a602052604090206004810154606091906113ff576040516322e679e360e11b815260040160405180910390fd5b8060060180548060200260200160405190810160405280929190818152602001828054801561145557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611437575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561149d5761149d613655565b14159392505050565b6114ae611eaf565b6001600160a01b0381166114d55760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b5f611527612127565b805490915060ff600160401b82041615906001600160401b03165f8115801561154d5750825b90505f826001600160401b031660011480156115685750303b155b905081158015611576575080155b156115945760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156115be57845460ff60401b1916600160401b1785555b6001600160a01b0387166115e55760405163d92e233d60e01b815260040160405180910390fd5b6115ee3361214f565b6115fa60046014612160565b611603866107a6565b61160b611381565b6001600160a01b0316876001600160a01b03161461162c5761162c87611bd3565b831561167257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff16600381111561169f5761169f613655565b036116bd57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116d5576116d5613655565b146116f357604051631860f69960e31b815260040160405180910390fd5b8060030154421161171757604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff161115806117fc578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b1580156117dd575f5ffd5b505af11580156117ef573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561182c5761182c61362d565b604051908082528060200260200182016040528015611855578160200160208202803683370190505b5090505f5b828110156118c757846008015f86600601838154811061187c5761187c613641565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106118b4576118b4613641565b602090810291909101015260010161185a565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b15801561190a575f5ffd5b505af115801561191c573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610ec9929190613ab5565b61195d611eaf565b6001600160a01b0381166119845760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156119f1576119f1613655565b03611a0f57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff166003811115611a2757611a27613655565b14611a4557604051631860f69960e31b815260040160405180910390fd5b8060030154421115611a6a57604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff1615611a9c5760405163257309f160e11b815260040160405180910390fd5b611aa533610edd565b611ac25760405163149fbcfd60e11b815260040160405180910390fd5b611acd3383856121df565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff19166001179055909150611b4c908390836123b0565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611bbc576040516322e679e360e11b815260040160405180910390fd5b919050565b5f611bce600460146125b1565b905090565b611bdb611eaf565b6001600160a01b038116611c04575f604051631e4fbdf760e01b81526004016106d19190613594565b61137e81611ee1565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611c4c5760405162461bcd60e51b81526004016106d190613b18565b825464ffffffffff600160281b90910481169082168111611caa5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106d1565b825f5b81866001015f611cbd84886126aa565b64ffffffffff1681526020019081526020015f20819055505f816001611ce39190613b62565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611d185750611ea7565b600185165f03611ddf575f611d3783611d32886001613b7b565b6126aa565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d9891600401613b98565b602060405180830381865af4158015611db3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd79190613a0f565b935050611e93565b5f611def83611d32600189613bc8565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611e5091600401613b98565b602060405180830381865af4158015611e6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8f9190613a0f565b9350505b50647fffffffff600194851c169301611cad565b505050505050565b33611eb8611381565b6001600160a01b03161461109a573360405163118cdaa760e01b81526004016106d19190613594565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611fa05760405162461bcd60e51b81526004016106d190613b18565b825464ffffffffff90811690821610611ff35760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106d1565b611ffe816001613b7b565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f61203584876126aa565b64ffffffffff16815260208101919091526040015f20556001831615612120575f61206582611d32600187613bc8565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe916120c691600401613b98565b602060405180830381865af41580156120e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121059190613a0f565b647fffffffff600195861c1694909350919091019050612025565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610f8a565b6121576126c7565b61137e816126ec565b602060ff821611156121ae5760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106d1565b6121bf600160ff831681901b613be5565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121ff5760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612228576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161225e91613be5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156122a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c99190613a0f565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561231c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123409190613a0f565b90505f81116123625760405163aeaddff160e01b815260040160405180910390fd5b5f61236d8284613bf8565b90505f811161238f5760405163149fbcfd60e11b815260040160405180910390fd5b808611156116725760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561242e57508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff19168217905590506125aa565b5f5f90505f876008015f855f8154811061244a5761244a613641565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b84548110156124d2575f896008015f87848154811061249457612494613641565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549050828111156124c9578092508193505b50600101612473565b508086106124e6575f9450505050506125aa565b5f886009015f8685815481106124fe576124fe613641565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff1916600183600281111561253b5761253b613655565b02179055508684838154811061255357612553613641565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116126045760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106d1565b602060ff831611156126285760405162461bcd60e51b81526004016106d190613c17565b8254600160281b900464ffffffffff168061264760ff85166002613d68565b64ffffffffff1610156126975760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106d1565b6126a28482856126f4565b949350505050565b5f816126bd60ff851663ffffffff613d81565b6125aa9190613b7b565b6126cf6127bc565b61109a57604051631afcd79f60e31b815260040160405180910390fd5b611bdb6126c7565b5f602060ff831611156127195760405162461bcd60e51b81526004016106d190613c17565b8264ffffffffff165f0361273757612730826127d5565b90506125aa565b5f612743836001613b62565b60ff166001600160401b0381111561275d5761275d61362d565b604051908082528060200260200182016040528015612786578160200160208202803683370190505b50905061279585858584612e6f565b808360ff16815181106127aa576127aa613641565b60200260200101519150509392505050565b5f6127c5612127565b54600160401b900460ff16919050565b5f8160ff165f036127e757505f919050565b8160ff1660010361281957507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361284b57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361287d57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff166004036128af57507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff166005036128e157507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff1660060361291357507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361294557507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361297757507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff166009036129a957507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a036129db57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b03612a0d57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c03612a3f57507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d03612a7157507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e03612aa357507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612ad557507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612b0757507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612b3957507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612b6b57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612b9d57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612bcf57507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612c0157507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612c3357507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612c6557507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612c9757507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612cc957507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612cfb57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612d2d57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612d5f57507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612d9157507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612dc357507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612df557507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612e2757507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106d1565b602060ff83161115612e935760405162461bcd60e51b81526004016106d190613c17565b5f8364ffffffffff1611612ef75760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106d1565b5f612f03600185613bc8565b9050600181165f03612f5657846001015f612f1e5f846126aa565b64ffffffffff1681526020019081526020015f2054825f81518110612f4557612f45613641565b602002602001018181525050612f7e565b612f5f5f6127d5565b825f81518110612f7157612f71613641565b6020026020010181815250505b5f5b8360ff168160ff161015611ea757600182165f036130765773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612fd257612fd2613641565b60200260200101518152602001612fe8856127d5565b8152506040518263ffffffff1660e01b81526004016130079190613b98565b602060405180830381865af4158015613022573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130469190613a0f565b83613052836001613b62565b60ff168151811061306557613065613641565b602002602001018181525050613227565b5f613082826001613b62565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115613124575f876001015f6130d98560016130c89190613b62565b60018864ffffffffff16901c6126aa565b64ffffffffff1681526020019081526020015f2054905080858460016130ff9190613b62565b60ff168151811061311257613112613641565b60200260200101818152505050613225565b5f876001015f61313b85600188611d329190613bc8565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff168151811061319257613192613641565b60200260200101518152506040518263ffffffff1660e01b81526004016131b99190613b98565b602060405180830381865af41580156131d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131f89190613a0f565b85613204856001613b62565b60ff168151811061321757613217613641565b602002602001018181525050505b505b647fffffffff600192831c169101612f80565b6001830191839082156132cb579160200282015f5b8382111561329957833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261324f565b80156132c95782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613299565b505b506132d79291506132db565b5090565b5b808211156132d7575f81556001016132dc565b6001600160a01b038116811461137e575f5ffd5b5f60208284031215613313575f5ffd5b81356125aa816132ef565b5f6020828403121561332e575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b8281101561336e5781516001600160a01b0316865260209586019590910190600101613347565b5093949350505050565b5f8151808452602084019350602083015f5b8281101561336e57815186526020958601959091019060010161338a565b604081525f6133ba6040830185613335565b82810360208401526133cc8185613378565b95945050505050565b5f5f83601f8401126133e5575f5ffd5b5081356001600160401b038111156133fb575f5ffd5b602083019150836020828501011115613412575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215613430575f5ffd5b8835975060208901356001600160401b0381111561344c575f5ffd5b8901601f81018b1361345c575f5ffd5b80356001600160401b03811115613471575f5ffd5b8b60208260051b8401011115613485575f5ffd5b6020919091019750955060408901356001600160401b038111156134a7575f5ffd5b6134b38b828c016133d5565b9096509450506060890135925060808901356001600160401b038111156134d8575f5ffd5b6134e48b828c016133d5565b999c989b5096995094979396929594505050565b5f5f5f6080848603121561350a575f5ffd5b833592506020840135915060808401851015613524575f5ffd5b6040840190509250925092565b5f5f60408385031215613542575f5ffd5b823591506020830135613554816132ef565b809150509250929050565b5f5f5f60608486031215613571575f5ffd5b833592506020840135613583816132ef565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b602081525f6125aa6020830184613335565b5f5f604083850312156135cb575f5ffd5b82356135d6816132ef565b946020939093013593505050565b5f5f604083850312156135f5575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f8161362657613626613604565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f6001820161367a5761367a613604565b5060010190565b6040516101e081016001600160401b03811182821017156136a4576136a461362d565b60405290565b805160048110611bbc575f5ffd5b5f82601f8301126136c7575f5ffd5b604080519081016001600160401b03811182821017156136e9576136e961362d565b80604052508060408401858111156136ff575f5ffd5b845b81811015613719578051835260209283019201613701565b509195945050505050565b8051611bbc816132ef565b805160ff81168114611bbc575f5ffd5b5f82601f83011261374e575f5ffd5b81516001600160401b038111156137675761376761362d565b604051601f8201601f19908116603f011681016001600160401b03811182821017156137955761379561362d565b6040528181528382016020018510156137ac575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80518015158114611bbc575f5ffd5b5f602082840312156137e7575f5ffd5b81516001600160401b038111156137fc575f5ffd5b8201610200818503121561380e575f5ffd5b613816613681565b81518152613826602083016136aa565b60208201526040828101519082015261384285606084016136b8565b606082015260a0820151608082015261385d60c08301613724565b60a082015261386e60e0830161372f565b60c08201526101008201516001600160401b0381111561388c575f5ffd5b6138988682850161373f565b60e0830152506138ab6101208301613724565b6101008201526138be6101408301613724565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156138f4575f5ffd5b6139008682850161373f565b610180830152506139146101c08301613724565b6101a08201526139276101e083016137c8565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6133cc604083018486613935565b5f60208284031215613986575f5ffd5b6125aa826137c8565b608080825281018790525f8860a08301825b8a8110156139d15782356139b4816132ef565b6001600160a01b03168252602092830192909101906001016139a1565b5083810360208501526139e581898b613935565b9150508560408401528281036060840152613a01818587613935565b9a9950505050505050505050565b5f60208284031215613a1f575f5ffd5b5051919050565b803563ffffffff81168114611bbc575f5ffd5b5f60208284031215613a49575f5ffd5b6125aa82613a26565b80820180821115610f8a57610f8a613604565b84815260a0810160208201855f5b6002811015613aa05763ffffffff613a8a83613a26565b1683526020928301929190910190600101613a73565b50505060608201939093526080015292915050565b604080825283549082018190525f8481526020812090916060840190835b81811015613afa5783546001600160a01b0316835260019384019360209093019201613ad3565b50508381036020850152613b0e8186613378565b9695505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610f8a57610f8a613604565b64ffffffffff8181168382160190811115610f8a57610f8a613604565b6040810181835f5b6002811015613bbf578151835260209283019290910190600101613ba0565b50505092915050565b64ffffffffff8281168282160390811115610f8a57610f8a613604565b81810381811115610f8a57610f8a613604565b5f82613c1257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b600184111561123b57808504811115613c7957613c79613604565b6001841615613c8757908102905b60019390931c928002613c5e565b5f82613ca357506001610f8a565b81613caf57505f610f8a565b8160018114613cc55760028114613ccf57613d01565b6001915050610f8a565b60ff841115613ce057613ce0613604565b6001841b915064ffffffffff821115613cfb57613cfb613604565b50610f8a565b5060208310610133831016604e8410600b8410161715613d39575081810a64ffffffffff811115613d3457613d34613604565b610f8a565b613d4964ffffffffff8484613c5a565b8064ffffffffff04821115613d6057613d60613604565b029392505050565b5f6125aa64ffffffffff841664ffffffffff8416613c95565b64ffffffffff8181168382160290811690818114613da157613da1613604565b509291505056fea164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639a7a2ffc11610135578063dbb06c93116100b4578063f165053611610079578063f165053614610578578063f2fde38b14610592578063f379b0df146105a5578063f52fd803146105df578063f6fc05d514610651575f5ffd5b8063dbb06c9314610525578063e59e469514610537578063e6745e131461054a578063e82f3b701461055d578063ebf0c71714610570575f5ffd5b8063c2b40ae4116100fa578063c2b40ae4146104b0578063c3a0ec30146104cf578063ca2869a0146104e0578063cd6dc687146104ff578063da881e5a14610512575f5ffd5b80639a7a2ffc146104255780639f0f874a14610461578063a01649301461046a578063a8a4d69b1461048a578063bff232c11461049d575f5ffd5b806370e36bbe116101c15780638cb89ecb116101865780638cb89ecb146103c25780638d1ddfb1146103e15780638da5cb5b146103f75780638e5ce3ad146103ff5780639015d37114610412575f5ffd5b806370e36bbe14610347578063715018a61461035a5780637c92f52414610362578063858142431461038f5780638a78bb15146103af575f5ffd5b8063291a691b11610207578063291a691b146102c95780632e7b716d146102ec5780634d6861a6146102ff57806350e6d94c146103125780635d50477614610334575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780631cc321b5146102955780632800d829146102a8575b5f5ffd5b610256610251366004613303565b61065a565b005b61025661026636600461331e565b6107a6565b61027e61027936600461331e565b6107e9565b60405161028c9291906133a8565b60405180910390f35b6102566102a3366004613419565b610993565b6102bb6102b636600461331e565b610cb7565b60405190815260200161028c565b6102dc6102d73660046134f8565b610d03565b604051901515815260200161028c565b6102dc6102fa366004613303565b610edd565b6102dc61030d36600461331e565b610f90565b6102dc610320366004613303565b60066020525f908152604090205460ff1681565b6102dc610342366004613531565b610fcf565b610256610355366004613303565b611013565b610256611089565b61037561037036600461355f565b61109c565b6040805192835263ffffffff90911660208301520161028c565b6001546103a2906001600160a01b031681565b60405161028c9190613594565b6102566103bd366004613303565b611243565b6102bb6103d036600461331e565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102bb565b6103a2611381565b600b546103a2906001600160a01b031681565b6102dc610420366004613303565b6113af565b61044b610433366004613303565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028c565b6102bb60035481565b61047d61047836600461331e565b6113cc565b60405161028c91906135a8565b6102dc610498366004613531565b611462565b6102566104ab366004613303565b6114a6565b6102bb6104be36600461331e565b60086020525f908152604090205481565b6001546001600160a01b03166103a2565b6102bb6104ee36600461331e565b5f9081526008602052604090205490565b61025661050d3660046135ba565b61151e565b6102dc61052036600461331e565b61167b565b5f546103a2906001600160a01b031681565b610256610545366004613303565b611955565b6102566105583660046135e4565b6119cd565b6102bb61056b36600461331e565b611b90565b6102bb611bc1565b610580601481565b60405160ff909116815260200161028c565b6102566105a0366004613303565b611bd3565b6004546105c19064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028c565b6106226105ed36600461331e565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028c949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102bb60025481565b610662611381565b6001600160a01b0316336001600160a01b0316148061068b57506001546001600160a01b031633145b6106a857604051632864c4e160e01b815260040160405180910390fd5b6106b1816113af565b81906106da576040516381e5828960e01b81526004016106d19190613594565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906107089060049083611c0d565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161073583613618565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107ae611eaf565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a60208190526040909120600681015491810154606092839291806001600160401b038111156108205761082061362d565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b509450806001600160401b038111156108645761086461362d565b60405190808252806020026020018201604052801561088d578160200160208202803683370190505b5093505f805b83811015610989575f8560060182815481106108b1576108b1613641565b5f918252602090912001546001600160a01b0316905060016001600160a01b0382165f90815260098801602052604090205460ff1660028111156108f7576108f7613655565b03610980578088848151811061090f5761090f613641565b60200260200101906001600160a01b031690816001600160a01b031681525050856008015f826001600160a01b03166001600160a01b031681526020019081526020015f205487848151811061096757610967613641565b60209081029190910101528261097c81613669565b9350505b50600101610893565b5050505050915091565b5f888152600a602052604090206002815460ff1660038111156109b8576109b8613655565b146109d657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156109f95760405163632a22bb60e01b815260040160405180910390fd5b60068101548714610a425760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106d1565b83610a875760405162461bcd60e51b81526020600482015260156024820152741c1ad0dbdb5b5a5d1b595b9d081c995c5d5a5c9959605a1b60448201526064016106d1565b5f805460405163101bb4d760e21b8152600481018c90526001600160a01b039091169063406ed35c906024015f60405180830381865afa158015610acd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af491908101906137d7565b9050806101c0015115610bf35782610b3f5760405162461bcd60e51b815260206004820152600e60248201526d1c1c9bdbd9881c995c5d5a5c995960921b60448201526064016106d1565b8061012001516001600160a01b031663258ae5828686866040518463ffffffff1660e01b8152600401610b749392919061395d565b602060405180830381865afa158015610b8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb39190613976565b610bf35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2102225a390383937b7b360791b60448201526064016106d1565b60048281018690555f8b815260096020526040808220889055905490516340a3b76160e11b81529182018c9052602482018790526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015610c51575f5ffd5b505af1158015610c63573d5f5f3e3d5ffd5b50505050897fbf0636a312095f6c09c909823813b50e392323588d2d83432e7512c64041e67f8a8a8a8a8a8a8a604051610ca3979695949392919061398f565b60405180910390a250505050505050505050565b5f818152600a6020526040812081815460ff166003811115610cdb57610cdb613655565b03610cf957604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b03163314610d2e5760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff166003811115610d5257610d52613655565b14610d70576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610db7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddb9190613a0f565b905080610dee6040860160208701613a39565b63ffffffff161115610e066040860160208701613a39565b829091610e34576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106d1565b5050815460ff1916600190811783558201859055436002830155600354610e5b9042613a52565b6003830155610e6f6005830185600261323a565b50610e78611bc1565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610ec9928a928a9291613a65565b60405180910390a250600195945050505050565b5f610ee7826113af565b610ef257505f919050565b6001546001600160a01b0316610f1b576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610f4b908590600401613594565b602060405180830381865afa158015610f66573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8a9190613976565b92915050565b5f818152600a602052604081206001815460ff166003811115610fb557610fb5613655565b14610fc257505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561100b5761100b613655565b149392505050565b61101b611eaf565b6001600160a01b0381166110425760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b611091611eaf565b61109a5f611ee1565b565b600b545f9081906001600160a01b031633146110cb5760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff1660038111156110f0576110f0613655565b1461110e57604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff16600281111561114e5761114e613655565b1461115e57600a0154915061123b565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a820180549161119283613618565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b84986866040516111e3929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b61124b611381565b6001600160a01b0316336001600160a01b0316148061127457506001546001600160a01b031633145b61129157604051632864c4e160e01b815260040160405180910390fd5b61129a816113af565b61137e5760048054600160281b900464ffffffffff16906112c4906001600160a01b038416611f51565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff19909116179055600280549161131583613669565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161079a565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a602052604090206004810154606091906113ff576040516322e679e360e11b815260040160405180910390fd5b8060060180548060200260200160405190810160405280929190818152602001828054801561145557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611437575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561149d5761149d613655565b14159392505050565b6114ae611eaf565b6001600160a01b0381166114d55760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b5f611527612127565b805490915060ff600160401b82041615906001600160401b03165f8115801561154d5750825b90505f826001600160401b031660011480156115685750303b155b905081158015611576575080155b156115945760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156115be57845460ff60401b1916600160401b1785555b6001600160a01b0387166115e55760405163d92e233d60e01b815260040160405180910390fd5b6115ee3361214f565b6115fa60046014612160565b611603866107a6565b61160b611381565b6001600160a01b0316876001600160a01b03161461162c5761162c87611bd3565b831561167257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff16600381111561169f5761169f613655565b036116bd57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116d5576116d5613655565b146116f357604051631860f69960e31b815260040160405180910390fd5b8060030154421161171757604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff161115806117fc578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b1580156117dd575f5ffd5b505af11580156117ef573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561182c5761182c61362d565b604051908082528060200260200182016040528015611855578160200160208202803683370190505b5090505f5b828110156118c757846008015f86600601838154811061187c5761187c613641565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106118b4576118b4613641565b602090810291909101015260010161185a565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b15801561190a575f5ffd5b505af115801561191c573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610ec9929190613ab5565b61195d611eaf565b6001600160a01b0381166119845760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156119f1576119f1613655565b03611a0f57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff166003811115611a2757611a27613655565b14611a4557604051631860f69960e31b815260040160405180910390fd5b8060030154421115611a6a57604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff1615611a9c5760405163257309f160e11b815260040160405180910390fd5b611aa533610edd565b611ac25760405163149fbcfd60e11b815260040160405180910390fd5b611acd3383856121df565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff19166001179055909150611b4c908390836123b0565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611bbc576040516322e679e360e11b815260040160405180910390fd5b919050565b5f611bce600460146125b1565b905090565b611bdb611eaf565b6001600160a01b038116611c04575f604051631e4fbdf760e01b81526004016106d19190613594565b61137e81611ee1565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611c4c5760405162461bcd60e51b81526004016106d190613b18565b825464ffffffffff600160281b90910481169082168111611caa5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106d1565b825f5b81866001015f611cbd84886126aa565b64ffffffffff1681526020019081526020015f20819055505f816001611ce39190613b62565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611d185750611ea7565b600185165f03611ddf575f611d3783611d32886001613b7b565b6126aa565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d9891600401613b98565b602060405180830381865af4158015611db3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd79190613a0f565b935050611e93565b5f611def83611d32600189613bc8565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611e5091600401613b98565b602060405180830381865af4158015611e6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8f9190613a0f565b9350505b50647fffffffff600194851c169301611cad565b505050505050565b33611eb8611381565b6001600160a01b03161461109a573360405163118cdaa760e01b81526004016106d19190613594565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611fa05760405162461bcd60e51b81526004016106d190613b18565b825464ffffffffff90811690821610611ff35760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106d1565b611ffe816001613b7b565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f61203584876126aa565b64ffffffffff16815260208101919091526040015f20556001831615612120575f61206582611d32600187613bc8565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe916120c691600401613b98565b602060405180830381865af41580156120e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121059190613a0f565b647fffffffff600195861c1694909350919091019050612025565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610f8a565b6121576126c7565b61137e816126ec565b602060ff821611156121ae5760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106d1565b6121bf600160ff831681901b613be5565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121ff5760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612228576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161225e91613be5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156122a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c99190613a0f565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561231c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123409190613a0f565b90505f81116123625760405163aeaddff160e01b815260040160405180910390fd5b5f61236d8284613bf8565b90505f811161238f5760405163149fbcfd60e11b815260040160405180910390fd5b808611156116725760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561242e57508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff19168217905590506125aa565b5f5f90505f876008015f855f8154811061244a5761244a613641565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b84548110156124d2575f896008015f87848154811061249457612494613641565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549050828111156124c9578092508193505b50600101612473565b508086106124e6575f9450505050506125aa565b5f886009015f8685815481106124fe576124fe613641565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff1916600183600281111561253b5761253b613655565b02179055508684838154811061255357612553613641565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116126045760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106d1565b602060ff831611156126285760405162461bcd60e51b81526004016106d190613c17565b8254600160281b900464ffffffffff168061264760ff85166002613d68565b64ffffffffff1610156126975760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106d1565b6126a28482856126f4565b949350505050565b5f816126bd60ff851663ffffffff613d81565b6125aa9190613b7b565b6126cf6127bc565b61109a57604051631afcd79f60e31b815260040160405180910390fd5b611bdb6126c7565b5f602060ff831611156127195760405162461bcd60e51b81526004016106d190613c17565b8264ffffffffff165f0361273757612730826127d5565b90506125aa565b5f612743836001613b62565b60ff166001600160401b0381111561275d5761275d61362d565b604051908082528060200260200182016040528015612786578160200160208202803683370190505b50905061279585858584612e6f565b808360ff16815181106127aa576127aa613641565b60200260200101519150509392505050565b5f6127c5612127565b54600160401b900460ff16919050565b5f8160ff165f036127e757505f919050565b8160ff1660010361281957507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361284b57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361287d57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff166004036128af57507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff166005036128e157507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff1660060361291357507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361294557507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361297757507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff166009036129a957507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a036129db57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b03612a0d57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c03612a3f57507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d03612a7157507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e03612aa357507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612ad557507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612b0757507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612b3957507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612b6b57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612b9d57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612bcf57507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612c0157507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612c3357507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612c6557507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612c9757507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612cc957507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612cfb57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612d2d57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612d5f57507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612d9157507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612dc357507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612df557507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612e2757507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106d1565b602060ff83161115612e935760405162461bcd60e51b81526004016106d190613c17565b5f8364ffffffffff1611612ef75760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106d1565b5f612f03600185613bc8565b9050600181165f03612f5657846001015f612f1e5f846126aa565b64ffffffffff1681526020019081526020015f2054825f81518110612f4557612f45613641565b602002602001018181525050612f7e565b612f5f5f6127d5565b825f81518110612f7157612f71613641565b6020026020010181815250505b5f5b8360ff168160ff161015611ea757600182165f036130765773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612fd257612fd2613641565b60200260200101518152602001612fe8856127d5565b8152506040518263ffffffff1660e01b81526004016130079190613b98565b602060405180830381865af4158015613022573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130469190613a0f565b83613052836001613b62565b60ff168151811061306557613065613641565b602002602001018181525050613227565b5f613082826001613b62565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115613124575f876001015f6130d98560016130c89190613b62565b60018864ffffffffff16901c6126aa565b64ffffffffff1681526020019081526020015f2054905080858460016130ff9190613b62565b60ff168151811061311257613112613641565b60200260200101818152505050613225565b5f876001015f61313b85600188611d329190613bc8565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff168151811061319257613192613641565b60200260200101518152506040518263ffffffff1660e01b81526004016131b99190613b98565b602060405180830381865af41580156131d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131f89190613a0f565b85613204856001613b62565b60ff168151811061321757613217613641565b602002602001018181525050505b505b647fffffffff600192831c169101612f80565b6001830191839082156132cb579160200282015f5b8382111561329957833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261324f565b80156132c95782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613299565b505b506132d79291506132db565b5090565b5b808211156132d7575f81556001016132dc565b6001600160a01b038116811461137e575f5ffd5b5f60208284031215613313575f5ffd5b81356125aa816132ef565b5f6020828403121561332e575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b8281101561336e5781516001600160a01b0316865260209586019590910190600101613347565b5093949350505050565b5f8151808452602084019350602083015f5b8281101561336e57815186526020958601959091019060010161338a565b604081525f6133ba6040830185613335565b82810360208401526133cc8185613378565b95945050505050565b5f5f83601f8401126133e5575f5ffd5b5081356001600160401b038111156133fb575f5ffd5b602083019150836020828501011115613412575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215613430575f5ffd5b8835975060208901356001600160401b0381111561344c575f5ffd5b8901601f81018b1361345c575f5ffd5b80356001600160401b03811115613471575f5ffd5b8b60208260051b8401011115613485575f5ffd5b6020919091019750955060408901356001600160401b038111156134a7575f5ffd5b6134b38b828c016133d5565b9096509450506060890135925060808901356001600160401b038111156134d8575f5ffd5b6134e48b828c016133d5565b999c989b5096995094979396929594505050565b5f5f5f6080848603121561350a575f5ffd5b833592506020840135915060808401851015613524575f5ffd5b6040840190509250925092565b5f5f60408385031215613542575f5ffd5b823591506020830135613554816132ef565b809150509250929050565b5f5f5f60608486031215613571575f5ffd5b833592506020840135613583816132ef565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b602081525f6125aa6020830184613335565b5f5f604083850312156135cb575f5ffd5b82356135d6816132ef565b946020939093013593505050565b5f5f604083850312156135f5575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b5f8161362657613626613604565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f6001820161367a5761367a613604565b5060010190565b6040516101e081016001600160401b03811182821017156136a4576136a461362d565b60405290565b805160048110611bbc575f5ffd5b5f82601f8301126136c7575f5ffd5b604080519081016001600160401b03811182821017156136e9576136e961362d565b80604052508060408401858111156136ff575f5ffd5b845b81811015613719578051835260209283019201613701565b509195945050505050565b8051611bbc816132ef565b805160ff81168114611bbc575f5ffd5b5f82601f83011261374e575f5ffd5b81516001600160401b038111156137675761376761362d565b604051601f8201601f19908116603f011681016001600160401b03811182821017156137955761379561362d565b6040528181528382016020018510156137ac575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80518015158114611bbc575f5ffd5b5f602082840312156137e7575f5ffd5b81516001600160401b038111156137fc575f5ffd5b8201610200818503121561380e575f5ffd5b613816613681565b81518152613826602083016136aa565b60208201526040828101519082015261384285606084016136b8565b606082015260a0820151608082015261385d60c08301613724565b60a082015261386e60e0830161372f565b60c08201526101008201516001600160401b0381111561388c575f5ffd5b6138988682850161373f565b60e0830152506138ab6101208301613724565b6101008201526138be6101408301613724565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156138f4575f5ffd5b6139008682850161373f565b610180830152506139146101c08301613724565b6101a08201526139276101e083016137c8565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f6133cc604083018486613935565b5f60208284031215613986575f5ffd5b6125aa826137c8565b608080825281018790525f8860a08301825b8a8110156139d15782356139b4816132ef565b6001600160a01b03168252602092830192909101906001016139a1565b5083810360208501526139e581898b613935565b9150508560408401528281036060840152613a01818587613935565b9a9950505050505050505050565b5f60208284031215613a1f575f5ffd5b5051919050565b803563ffffffff81168114611bbc575f5ffd5b5f60208284031215613a49575f5ffd5b6125aa82613a26565b80820180821115610f8a57610f8a613604565b84815260a0810160208201855f5b6002811015613aa05763ffffffff613a8a83613a26565b1683526020928301929190910190600101613a73565b50505060608201939093526080015292915050565b604080825283549082018190525f8481526020812090916060840190835b81811015613afa5783546001600160a01b0316835260019384019360209093019201613ad3565b50508381036020850152613b0e8186613378565b9695505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610f8a57610f8a613604565b64ffffffffff8181168382160190811115610f8a57610f8a613604565b6040810181835f5b6002811015613bbf578151835260209283019290910190600101613ba0565b50505092915050565b64ffffffffff8281168282160390811115610f8a57610f8a613604565b81810381811115610f8a57610f8a613604565b5f82613c1257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b600184111561123b57808504811115613c7957613c79613604565b6001841615613c8757908102905b60019390931c928002613c5e565b5f82613ca357506001610f8a565b81613caf57505f610f8a565b8160018114613cc55760028114613ccf57613d01565b6001915050610f8a565b60ff841115613ce057613ce0613604565b6001841b915064ffffffffff821115613cfb57613cfb613604565b50610f8a565b5060208310610133831016604e8410600b8410161715613d39575081810a64ffffffffff811115613d3457613d34613604565b610f8a565b613d4964ffffffffff8484613c5a565b8064ffffffffff04821115613d6057613d60613604565b029392505050565b5f6125aa64ffffffffff841664ffffffffff8416613c95565b64ffffffffff8181168382160290811690818114613da157613da1613604565b509291505056fea164736f6c634300081c000a", "linkReferences": { "npm/poseidon-solidity@0.0.5/PoseidonT3.sol": { "PoseidonT3": [ { "length": 20, - "start": 7713 + "start": 7752 }, { "length": 20, - "start": 7897 + "start": 7936 }, { "length": 20, - "start": 8527 + "start": 8566 }, { "length": 20, - "start": 12361 + "start": 12400 }, { "length": 20, - "start": 12803 + "start": 12842 } ] } @@ -1303,28 +1316,28 @@ "PoseidonT3": [ { "length": 20, - "start": 7499 + "start": 7538 }, { "length": 20, - "start": 7683 + "start": 7722 }, { "length": 20, - "start": 8313 + "start": 8352 }, { "length": 20, - "start": 12147 + "start": 12186 }, { "length": 20, - "start": 12589 + "start": 12628 } ] } }, "immutableReferences": {}, "inputSourceName": "project/contracts/registry/CiphernodeRegistryOwnable.sol", - "buildInfoId": "solc-0_8_28-64228f31c3990e4616cf0578598d186612e83409" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json b/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json index 295b45fae6..283b2a4ffe 100644 --- a/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json +++ b/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json @@ -429,6 +429,38 @@ "name": "OwnershipTransferred", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Payout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRegistry", + "type": "address" + } + ], + "name": "RegistrySet", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1156,72 +1188,72 @@ "type": "function" } ], - "bytecode": "0x610180604052348015610010575f5ffd5b5060405161292e38038061292e83398101604081905261002f9161037d565b82816040518060400160405280601481526020017f456e636c617665205469636b657420546f6b656e00000000000000000000000081525080604051806040016040528060018152602001603160f81b8152506040518060400160405280601481526020017f456e636c617665205469636b657420546f6b656e0000000000000000000000008152506040518060400160405280600381526020016245544b60e81b81525081600390816100e3919061045f565b5060046100f0828261045f565b5061010091508390506005610226565b6101205261010f816006610226565b61014052815160208084019190912060e052815190820120610100524660a05261019b60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b0381166101d357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101dc81610258565b50306001600160a01b038216036102085760405163438d6fe360e01b81523060048201526024016101ca565b6001600160a01b03166101605261021e826102a9565b505050610571565b5f6020835110156102415761023a836102fa565b9050610252565b8161024c848261045f565b5060ff90505b92915050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6102b1610337565b6001600160a01b0381166102d85760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f829050601f81511115610324578260405163305a27a960e01b81526004016101ca9190610519565b805161032f8261054e565b179392505050565b600b546001600160a01b031633146103645760405163118cdaa760e01b81523360048201526024016101ca565b565b6001600160a01b038116811461037a575f5ffd5b50565b5f5f5f6060848603121561038f575f5ffd5b835161039a81610366565b60208501519093506103ab81610366565b60408501519092506103bc81610366565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806103ef57607f821691505b60208210810361040d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561045a57805f5260205f20601f840160051c810160208510156104385750805b601f840160051c820191505b81811015610457575f8155600101610444565b50505b505050565b81516001600160401b03811115610478576104786103c7565b61048c8161048684546103db565b84610413565b6020601f8211600181146104be575f83156104a75750848201515b5f19600385901b1c1916600184901b178455610457565b5f84815260208120601f198516915b828110156104ed57878501518255602094850194600190920191016104cd565b508482101561050a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561040d575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161234d6105e15f395f818161084301528181610c2d01528181610d5e0152610e0b01525f61122701525f6111fa01525f610f6b01525f610f4301525f610e9e01525f610ec801525f610ef2015261234d5ff3fe608060405234801561000f575f5ffd5b50600436106101cc575f3560e01c806370a082311161010157806395d89b411161009a57806395d89b41146103f45780639ab24eb0146103fc578063a9059cbb1461040f578063a91ee0dc14610422578063c3cda52014610435578063d505accf14610443578063dd62ed3e14610456578063f1127ed814610469578063f2fde38b146104a8575f5ffd5b806370a082311461032d578063715018a6146103555780637b1039991461035d5780637ecebe001461037057806384b0196e1461038357806385bc898c1461039e5780638da5cb5b146103b15780638e539e8c146103c257806391ddadf4146103d5575f5ffd5b80633644e515116101735780633644e5151461028b5780633a46b1a81461029357806344b279a2146102a65780634bf5d7e9146102af578063587cde1e146102b75780635c19a95c146102d757806368a9674d146102ea5780636f307dc3146102fd5780636fcfff4514610305575f5ffd5b806306fdde03146101d0578063095ea7b3146101ee578063117de2fd1461021157806318160ddd14610226578063205c28781461023857806323b872dd1461024b5780632f4f21e21461025e578063313ce56714610271575b5f5ffd5b6101d86104bb565b6040516101e59190611f5b565b60405180910390f35b6102016101fc366004611f83565b61054b565b60405190151581526020016101e5565b61022461021f366004611f83565b610565565b005b6002545b6040519081526020016101e5565b610201610246366004611f83565b61060e565b610201610259366004611fab565b61064e565b61020161026c366004611f83565b610671565b6102796106cc565b60405160ff90911681526020016101e5565b61022a6106da565b61022a6102a1366004611f83565b6106e3565b61022a600d5481565b6101d861071d565b6102ca6102c5366004611fe5565b610795565b6040516101e59190611ffe565b6102246102e5366004611fe5565b6107b2565b6102016102f8366004611fab565b6107cb565b6102ca610841565b610318610313366004611fe5565b610865565b60405163ffffffff90911681526020016101e5565b61022a61033b366004611fe5565b6001600160a01b03165f9081526020819052604090205490565b61022461086f565b600c546102ca906001600160a01b031681565b61022a61037e366004611fe5565b610882565b61038b61088c565b6040516101e59796959493929190612012565b6102246103ac366004611f83565b6108ce565b600b546001600160a01b03166102ca565b61022a6103d03660046120a8565b61091a565b6103dd61093e565b60405165ffffffffffff90911681526020016101e5565b6101d8610947565b61022a61040a366004611fe5565b610956565b61020161041d366004611f83565b610976565b610224610430366004611fe5565b610983565b6102246102e53660046120cd565b610224610451366004612123565b6109d4565b61022a61046436600461218b565b610b0a565b61047c6104773660046121bc565b610b34565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101e5565b6102246104b6366004611fe5565b610b51565b6060600380546104ca906121f9565b80601f01602080910402602001604051908101604052809291908181526020018280546104f6906121f9565b80156105415780601f1061051857610100808354040283529160200191610541565b820191905f5260205f20905b81548152906001019060200180831161052457829003601f168201915b5050505050905090565b5f604051638cd22d1960e01b815260040160405180910390fd5b600c546001600160a01b0316331461059057604051633217675b60e21b815260040160405180910390fd5b600d548111156105e15760405162461bcd60e51b8152602060048201526017602482015276457863656564732070617961626c652062616c616e636560481b60448201526064015b60405180910390fd5b80600d5f8282546105f29190612245565b9091555061060a9050610603610841565b8383610b8e565b5050565b600c545f906001600160a01b0316331461063b57604051633217675b60e21b815260040160405180910390fd5b6106458383610bf2565b90505b92915050565b5f3361065b858285610c5c565b610666858585610cad565b506001949350505050565b600c545f906001600160a01b0316331461069e57604051633217675b60e21b815260040160405180910390fd5b6106a88383610d0a565b90505f6106b484610795565b6001600160a01b031603610648576106488384610d8f565b5f6106d5610e08565b905090565b5f6106d5610e92565b5f61070d6106f083610fbb565b6001600160a01b0385165f90815260096020526040902090611010565b6001600160d01b03169392505050565b60606107276110c0565b65ffffffffffff1661073761093e565b65ffffffffffff161461075d576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b039081165f908152600860205260409020541690565b604051635e81118160e11b815260040160405180910390fd5b600c545f906001600160a01b031633146107f857604051633217675b60e21b815260040160405180910390fd5b61080b610803610841565b8530856110ca565b6108158383611103565b5f61081f84610795565b6001600160a01b031603610837576108378384610d8f565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b5f61064882611137565b610877611158565b6108805f611185565b565b5f610648826111d6565b5f6060805f5f5f606061089d6111f3565b6108a5611220565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600c546001600160a01b031633146108f957604051633217675b60e21b815260040160405180910390fd5b80600d5f82825461090a9190612258565b9091555061060a9050828261124d565b5f61092f61092783610fbb565b600a90611010565b6001600160d01b031692915050565b5f6106d56110c0565b6060600480546104ca906121f9565b6001600160a01b0381165f90815260096020526040812061092f90611281565b5f33610837818585610cad565b61098b611158565b6001600160a01b0381166109b25760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b834211156109f85760405163313c898160e11b8152600481018590526024016105d8565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a438c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610a9d826112b8565b90505f610aac828787876112e4565b9050896001600160a01b0316816001600160a01b031614610af3576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105d8565b610afe8a8a8a611310565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b604080518082019091525f8082526020820152610645838361131d565b610b59611158565b6001600160a01b038116610b82575f604051631e4fbdf760e01b81526004016105d89190611ffe565b610b8b81611185565b50565b6040516001600160a01b03838116602483015260448201839052610bed91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611351565b505050565b5f306001600160a01b03841603610c1e578260405163ec442f0560e01b81526004016105d89190611ffe565b610c28338361124d565b610c537f00000000000000000000000000000000000000000000000000000000000000008484610b8e565b50600192915050565b5f610c678484610b0a565b90505f19811015610ca75781811015610c9957828183604051637dc7a0d960e11b81526004016105d89392919061226b565b610ca784848484035f6113b4565b50505050565b6001600160a01b038316610cd6575f604051634b637e8f60e11b81526004016105d89190611ffe565b6001600160a01b038216610cff575f60405163ec442f0560e01b81526004016105d89190611ffe565b610bed838383611486565b5f33308103610d2e5730604051634b637e8f60e11b81526004016105d89190611ffe565b306001600160a01b03851603610d59578360405163ec442f0560e01b81526004016105d89190611ffe565b610d857f00000000000000000000000000000000000000000000000000000000000000008230866110ca565b6108378484611103565b5f610d9983610795565b6001600160a01b038481165f8181526008602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610bed8183610e03866114cf565b6114ec565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e83575060408051601f3d908101601f19168201909252610e809181019061228c565b60015b610e8d5750601290565b919050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eea57507f000000000000000000000000000000000000000000000000000000000000000046145b15610f1457507f000000000000000000000000000000000000000000000000000000000000000090565b6106d5604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f610fc561093e565b90508065ffffffffffff16831061100057604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105d8565b61100983611655565b9392505050565b81545f908181600581111561106c575f6110298461168b565b6110339085612245565b5f8881526020902090915081015465ffffffffffff908116908716101561105c5780915061106a565b611067816001612258565b92505b505b5f611079878785856117de565b905080156110b35761109d87611090600184612245565b5f91825260209091200190565b54600160301b90046001600160d01b03166110b5565b5f5b979650505050505050565b5f6106d543611655565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca79186918216906323b872dd90608401610bbb565b6001600160a01b03821661112c575f60405163ec442f0560e01b81526004016105d89190611ffe565b61060a5f8383611486565b6001600160a01b0381165f908152600960205260408120546106489061183d565b600b546001600160a01b03163314610880573360405163118cdaa760e01b81526004016105d89190611ffe565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f90815260076020526040812054610648565b60606106d57f0000000000000000000000000000000000000000000000000000000000000000600561186d565b60606106d57f0000000000000000000000000000000000000000000000000000000000000000600661186d565b6001600160a01b038216611276575f604051634b637e8f60e11b81526004016105d89190611ffe565b61060a825f83611486565b80545f9080156112b05761129a83611090600184612245565b54600160301b90046001600160d01b0316611009565b5f9392505050565b5f6106486112c4610e92565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f6112f488888888611916565b92509250925061130482826119d4565b50909695505050505050565b610bed83838360016113b4565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206106459083611a8c565b5f5f60205f8451602086015f885af180611370576040513d5f823e3d81fd5b50505f513d91508115611387578060011415611394565b6001600160a01b0384163b155b15610ca75783604051635274afe760e01b81526004016105d89190611ffe565b6001600160a01b0384166113dd575f60405163e602df0560e01b81526004016105d89190611ffe565b6001600160a01b038316611406575f604051634a1406b160e11b81526004016105d89190611ffe565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610ca757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161147891815260200190565b60405180910390a350505050565b6001600160a01b038316158015906114a657506001600160a01b03821615155b156114c457604051638cd22d1960e01b815260040160405180910390fd5b610bed838383611af9565b6001600160a01b0381165f90815260208190526040812054610648565b816001600160a01b0316836001600160a01b03161415801561150d57505f81115b15610bed576001600160a01b038316156115b4576001600160a01b0383165f908152600960205260408120819061154f90611b5f61154a86611b6a565b611b9d565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516115a9929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610bed576001600160a01b0382165f90815260096020526040812081906115ec90611bd561154a86611b6a565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611646929190918252602082015260400190565b60405180910390a25050505050565b5f65ffffffffffff821115611687576040516306dfcc6560e41b815260306004820152602481018390526044016105d8565b5090565b5f60018211611698575090565b816001600160801b82106116b15760809190911c9060401b5b600160401b82106116c75760409190911c9060201b5b64010000000082106116de5760209190911c9060101b5b6201000082106116f35760109190911c9060081b5b61010082106117075760089190911c9060041b5b6010821061171a5760049190911c9060021b5b600482106117265760011b5b600302600190811c9081858161173e5761173e6122a7565b048201901c90506001818581611756576117566122a7565b048201901c9050600181858161176e5761176e6122a7565b048201901c90506001818581611786576117866122a7565b048201901c9050600181858161179e5761179e6122a7565b048201901c905060018185816117b6576117b66122a7565b048201901c90506117d58185816117cf576117cf6122a7565b04821190565b90039392505050565b5f5b81831015611835575f6117f38484611be0565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff1611156118215780925061182f565b61182c816001612258565b93505b506117e0565b509392505050565b5f63ffffffff821115611687576040516306dfcc6560e41b815260206004820152602481018390526044016105d8565b606060ff83146118875761188083611bfa565b9050610648565b818054611893906121f9565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906121f9565b801561190a5780601f106118e15761010080835404028352916020019161190a565b820191905f5260205f20905b8154815290600101906020018083116118ed57829003601f168201915b50505050509050610648565b5f80806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0384111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f8260038111156119e7576119e76122bb565b036119f0575050565b6001826003811115611a0457611a046122bb565b03611a225760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611a3657611a366122bb565b03611a575760405163fce698f760e01b8152600481018290526024016105d8565b6003826003811115611a6b57611a6b6122bb565b0361060a576040516335e2f38360e21b8152600481018290526024016105d8565b604080518082019091525f8082526020820152825f018263ffffffff1681548110611ab957611ab96122cf565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b611b04838383611c37565b6001600160a01b038316611b54575f611b1c60025490565b90506001600160d01b0380821115611b5157604051630e58ae9360e11b815260048101839052602481018290526044016105d8565b50505b610bed838383611d4a565b5f61064582846122e3565b5f6001600160d01b03821115611687576040516306dfcc6560e41b815260d06004820152602481018390526044016105d8565b5f5f611bc8611baa61093e565b611bc0611bb688611281565b868863ffffffff16565b879190611da9565b915091505b935093915050565b5f6106458284612302565b5f611bee6002848418612321565b61064590848416612258565b60605f611c0683611db6565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038316611c61578060025f828254611c569190612258565b90915550611cbe9050565b6001600160a01b0383165f9081526020819052604090205481811015611ca05783818360405163391434e360e21b81526004016105d89392919061226b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611cda57600280548290039055611cf8565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d3d91815260200190565b60405180910390a3505050565b6001600160a01b038316611d6c57611d69600a611bd561154a84611b6a565b50505b6001600160a01b038216611d8e57611d8b600a611b5f61154a84611b6a565b50505b610bed611d9a84610795565b611da384610795565b836114ec565b5f80611bc8858585611ddd565b5f60ff8216601f81111561064857604051632cd44ac360e21b815260040160405180910390fd5b82545f9081908015611ed3575f611df987611090600185612245565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115611e3c57604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603611e7557825465ffffffffffff16600160301b6001600160d01b03891602178355611ec5565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b9450859350611bcd92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b029190931617920191909155905081611bcd565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6106456020830184611f2d565b80356001600160a01b0381168114610e8d575f5ffd5b5f5f60408385031215611f94575f5ffd5b611f9d83611f6d565b946020939093013593505050565b5f5f5f60608486031215611fbd575f5ffd5b611fc684611f6d565b9250611fd460208501611f6d565b929592945050506040919091013590565b5f60208284031215611ff5575f5ffd5b61064582611f6d565b6001600160a01b0391909116815260200190565b60ff60f81b8816815260e060208201525f61203060e0830189611f2d565b82810360408401526120428189611f2d565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612097578351835260209384019390920191600101612079565b50909b9a5050505050505050505050565b5f602082840312156120b8575f5ffd5b5035919050565b60ff81168114610b8b575f5ffd5b5f5f5f5f5f5f60c087890312156120e2575f5ffd5b6120eb87611f6d565b955060208701359450604087013593506060870135612109816120bf565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215612139575f5ffd5b61214288611f6d565b965061215060208901611f6d565b95506040880135945060608801359350608088013561216e816120bf565b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561219c575f5ffd5b6121a583611f6d565b91506121b360208401611f6d565b90509250929050565b5f5f604083850312156121cd575f5ffd5b6121d683611f6d565b9150602083013563ffffffff811681146121ee575f5ffd5b809150509250929050565b600181811c9082168061220d57607f821691505b60208210810361222b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561064857610648612231565b8082018082111561064857610648612231565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561229c575f5ffd5b8151611009816120bf565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b6001600160d01b03828116828216039081111561064857610648612231565b6001600160d01b03818116838216019081111561064857610648612231565b5f8261233b57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101cc575f3560e01c806370a082311161010157806395d89b411161009a57806395d89b41146103f45780639ab24eb0146103fc578063a9059cbb1461040f578063a91ee0dc14610422578063c3cda52014610435578063d505accf14610443578063dd62ed3e14610456578063f1127ed814610469578063f2fde38b146104a8575f5ffd5b806370a082311461032d578063715018a6146103555780637b1039991461035d5780637ecebe001461037057806384b0196e1461038357806385bc898c1461039e5780638da5cb5b146103b15780638e539e8c146103c257806391ddadf4146103d5575f5ffd5b80633644e515116101735780633644e5151461028b5780633a46b1a81461029357806344b279a2146102a65780634bf5d7e9146102af578063587cde1e146102b75780635c19a95c146102d757806368a9674d146102ea5780636f307dc3146102fd5780636fcfff4514610305575f5ffd5b806306fdde03146101d0578063095ea7b3146101ee578063117de2fd1461021157806318160ddd14610226578063205c28781461023857806323b872dd1461024b5780632f4f21e21461025e578063313ce56714610271575b5f5ffd5b6101d86104bb565b6040516101e59190611f5b565b60405180910390f35b6102016101fc366004611f83565b61054b565b60405190151581526020016101e5565b61022461021f366004611f83565b610565565b005b6002545b6040519081526020016101e5565b610201610246366004611f83565b61060e565b610201610259366004611fab565b61064e565b61020161026c366004611f83565b610671565b6102796106cc565b60405160ff90911681526020016101e5565b61022a6106da565b61022a6102a1366004611f83565b6106e3565b61022a600d5481565b6101d861071d565b6102ca6102c5366004611fe5565b610795565b6040516101e59190611ffe565b6102246102e5366004611fe5565b6107b2565b6102016102f8366004611fab565b6107cb565b6102ca610841565b610318610313366004611fe5565b610865565b60405163ffffffff90911681526020016101e5565b61022a61033b366004611fe5565b6001600160a01b03165f9081526020819052604090205490565b61022461086f565b600c546102ca906001600160a01b031681565b61022a61037e366004611fe5565b610882565b61038b61088c565b6040516101e59796959493929190612012565b6102246103ac366004611f83565b6108ce565b600b546001600160a01b03166102ca565b61022a6103d03660046120a8565b61091a565b6103dd61093e565b60405165ffffffffffff90911681526020016101e5565b6101d8610947565b61022a61040a366004611fe5565b610956565b61020161041d366004611f83565b610976565b610224610430366004611fe5565b610983565b6102246102e53660046120cd565b610224610451366004612123565b6109d4565b61022a61046436600461218b565b610b0a565b61047c6104773660046121bc565b610b34565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101e5565b6102246104b6366004611fe5565b610b51565b6060600380546104ca906121f9565b80601f01602080910402602001604051908101604052809291908181526020018280546104f6906121f9565b80156105415780601f1061051857610100808354040283529160200191610541565b820191905f5260205f20905b81548152906001019060200180831161052457829003601f168201915b5050505050905090565b5f604051638cd22d1960e01b815260040160405180910390fd5b600c546001600160a01b0316331461059057604051633217675b60e21b815260040160405180910390fd5b600d548111156105e15760405162461bcd60e51b8152602060048201526017602482015276457863656564732070617961626c652062616c616e636560481b60448201526064015b60405180910390fd5b80600d5f8282546105f29190612245565b9091555061060a9050610603610841565b8383610b8e565b5050565b600c545f906001600160a01b0316331461063b57604051633217675b60e21b815260040160405180910390fd5b6106458383610bf2565b90505b92915050565b5f3361065b858285610c5c565b610666858585610cad565b506001949350505050565b600c545f906001600160a01b0316331461069e57604051633217675b60e21b815260040160405180910390fd5b6106a88383610d0a565b90505f6106b484610795565b6001600160a01b031603610648576106488384610d8f565b5f6106d5610e08565b905090565b5f6106d5610e92565b5f61070d6106f083610fbb565b6001600160a01b0385165f90815260096020526040902090611010565b6001600160d01b03169392505050565b60606107276110c0565b65ffffffffffff1661073761093e565b65ffffffffffff161461075d576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b039081165f908152600860205260409020541690565b604051635e81118160e11b815260040160405180910390fd5b600c545f906001600160a01b031633146107f857604051633217675b60e21b815260040160405180910390fd5b61080b610803610841565b8530856110ca565b6108158383611103565b5f61081f84610795565b6001600160a01b031603610837576108378384610d8f565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b5f61064882611137565b610877611158565b6108805f611185565b565b5f610648826111d6565b5f6060805f5f5f606061089d6111f3565b6108a5611220565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600c546001600160a01b031633146108f957604051633217675b60e21b815260040160405180910390fd5b80600d5f82825461090a9190612258565b9091555061060a9050828261124d565b5f61092f61092783610fbb565b600a90611010565b6001600160d01b031692915050565b5f6106d56110c0565b6060600480546104ca906121f9565b6001600160a01b0381165f90815260096020526040812061092f90611281565b5f33610837818585610cad565b61098b611158565b6001600160a01b0381166109b25760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b834211156109f85760405163313c898160e11b8152600481018590526024016105d8565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a438c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610a9d826112b8565b90505f610aac828787876112e4565b9050896001600160a01b0316816001600160a01b031614610af3576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105d8565b610afe8a8a8a611310565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b604080518082019091525f8082526020820152610645838361131d565b610b59611158565b6001600160a01b038116610b82575f604051631e4fbdf760e01b81526004016105d89190611ffe565b610b8b81611185565b50565b6040516001600160a01b03838116602483015260448201839052610bed91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611351565b505050565b5f306001600160a01b03841603610c1e578260405163ec442f0560e01b81526004016105d89190611ffe565b610c28338361124d565b610c537f00000000000000000000000000000000000000000000000000000000000000008484610b8e565b50600192915050565b5f610c678484610b0a565b90505f19811015610ca75781811015610c9957828183604051637dc7a0d960e11b81526004016105d89392919061226b565b610ca784848484035f6113b4565b50505050565b6001600160a01b038316610cd6575f604051634b637e8f60e11b81526004016105d89190611ffe565b6001600160a01b038216610cff575f60405163ec442f0560e01b81526004016105d89190611ffe565b610bed838383611486565b5f33308103610d2e5730604051634b637e8f60e11b81526004016105d89190611ffe565b306001600160a01b03851603610d59578360405163ec442f0560e01b81526004016105d89190611ffe565b610d857f00000000000000000000000000000000000000000000000000000000000000008230866110ca565b6108378484611103565b5f610d9983610795565b6001600160a01b038481165f8181526008602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610bed8183610e03866114cf565b6114ec565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e83575060408051601f3d908101601f19168201909252610e809181019061228c565b60015b610e8d5750601290565b919050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eea57507f000000000000000000000000000000000000000000000000000000000000000046145b15610f1457507f000000000000000000000000000000000000000000000000000000000000000090565b6106d5604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f610fc561093e565b90508065ffffffffffff16831061100057604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105d8565b61100983611655565b9392505050565b81545f908181600581111561106c575f6110298461168b565b6110339085612245565b5f8881526020902090915081015465ffffffffffff908116908716101561105c5780915061106a565b611067816001612258565b92505b505b5f611079878785856117de565b905080156110b35761109d87611090600184612245565b5f91825260209091200190565b54600160301b90046001600160d01b03166110b5565b5f5b979650505050505050565b5f6106d543611655565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca79186918216906323b872dd90608401610bbb565b6001600160a01b03821661112c575f60405163ec442f0560e01b81526004016105d89190611ffe565b61060a5f8383611486565b6001600160a01b0381165f908152600960205260408120546106489061183d565b600b546001600160a01b03163314610880573360405163118cdaa760e01b81526004016105d89190611ffe565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f90815260076020526040812054610648565b60606106d57f0000000000000000000000000000000000000000000000000000000000000000600561186d565b60606106d57f0000000000000000000000000000000000000000000000000000000000000000600661186d565b6001600160a01b038216611276575f604051634b637e8f60e11b81526004016105d89190611ffe565b61060a825f83611486565b80545f9080156112b05761129a83611090600184612245565b54600160301b90046001600160d01b0316611009565b5f9392505050565b5f6106486112c4610e92565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f6112f488888888611916565b92509250925061130482826119d4565b50909695505050505050565b610bed83838360016113b4565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206106459083611a8c565b5f5f60205f8451602086015f885af180611370576040513d5f823e3d81fd5b50505f513d91508115611387578060011415611394565b6001600160a01b0384163b155b15610ca75783604051635274afe760e01b81526004016105d89190611ffe565b6001600160a01b0384166113dd575f60405163e602df0560e01b81526004016105d89190611ffe565b6001600160a01b038316611406575f604051634a1406b160e11b81526004016105d89190611ffe565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610ca757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161147891815260200190565b60405180910390a350505050565b6001600160a01b038316158015906114a657506001600160a01b03821615155b156114c457604051638cd22d1960e01b815260040160405180910390fd5b610bed838383611af9565b6001600160a01b0381165f90815260208190526040812054610648565b816001600160a01b0316836001600160a01b03161415801561150d57505f81115b15610bed576001600160a01b038316156115b4576001600160a01b0383165f908152600960205260408120819061154f90611b5f61154a86611b6a565b611b9d565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516115a9929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610bed576001600160a01b0382165f90815260096020526040812081906115ec90611bd561154a86611b6a565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611646929190918252602082015260400190565b60405180910390a25050505050565b5f65ffffffffffff821115611687576040516306dfcc6560e41b815260306004820152602481018390526044016105d8565b5090565b5f60018211611698575090565b816001600160801b82106116b15760809190911c9060401b5b600160401b82106116c75760409190911c9060201b5b64010000000082106116de5760209190911c9060101b5b6201000082106116f35760109190911c9060081b5b61010082106117075760089190911c9060041b5b6010821061171a5760049190911c9060021b5b600482106117265760011b5b600302600190811c9081858161173e5761173e6122a7565b048201901c90506001818581611756576117566122a7565b048201901c9050600181858161176e5761176e6122a7565b048201901c90506001818581611786576117866122a7565b048201901c9050600181858161179e5761179e6122a7565b048201901c905060018185816117b6576117b66122a7565b048201901c90506117d58185816117cf576117cf6122a7565b04821190565b90039392505050565b5f5b81831015611835575f6117f38484611be0565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff1611156118215780925061182f565b61182c816001612258565b93505b506117e0565b509392505050565b5f63ffffffff821115611687576040516306dfcc6560e41b815260206004820152602481018390526044016105d8565b606060ff83146118875761188083611bfa565b9050610648565b818054611893906121f9565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906121f9565b801561190a5780601f106118e15761010080835404028352916020019161190a565b820191905f5260205f20905b8154815290600101906020018083116118ed57829003601f168201915b50505050509050610648565b5f80806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0384111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f8260038111156119e7576119e76122bb565b036119f0575050565b6001826003811115611a0457611a046122bb565b03611a225760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611a3657611a366122bb565b03611a575760405163fce698f760e01b8152600481018290526024016105d8565b6003826003811115611a6b57611a6b6122bb565b0361060a576040516335e2f38360e21b8152600481018290526024016105d8565b604080518082019091525f8082526020820152825f018263ffffffff1681548110611ab957611ab96122cf565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b611b04838383611c37565b6001600160a01b038316611b54575f611b1c60025490565b90506001600160d01b0380821115611b5157604051630e58ae9360e11b815260048101839052602481018290526044016105d8565b50505b610bed838383611d4a565b5f61064582846122e3565b5f6001600160d01b03821115611687576040516306dfcc6560e41b815260d06004820152602481018390526044016105d8565b5f5f611bc8611baa61093e565b611bc0611bb688611281565b868863ffffffff16565b879190611da9565b915091505b935093915050565b5f6106458284612302565b5f611bee6002848418612321565b61064590848416612258565b60605f611c0683611db6565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038316611c61578060025f828254611c569190612258565b90915550611cbe9050565b6001600160a01b0383165f9081526020819052604090205481811015611ca05783818360405163391434e360e21b81526004016105d89392919061226b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611cda57600280548290039055611cf8565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d3d91815260200190565b60405180910390a3505050565b6001600160a01b038316611d6c57611d69600a611bd561154a84611b6a565b50505b6001600160a01b038216611d8e57611d8b600a611b5f61154a84611b6a565b50505b610bed611d9a84610795565b611da384610795565b836114ec565b5f80611bc8858585611ddd565b5f60ff8216601f81111561064857604051632cd44ac360e21b815260040160405180910390fd5b82545f9081908015611ed3575f611df987611090600185612245565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115611e3c57604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603611e7557825465ffffffffffff16600160301b6001600160d01b03891602178355611ec5565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b9450859350611bcd92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b029190931617920191909155905081611bcd565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6106456020830184611f2d565b80356001600160a01b0381168114610e8d575f5ffd5b5f5f60408385031215611f94575f5ffd5b611f9d83611f6d565b946020939093013593505050565b5f5f5f60608486031215611fbd575f5ffd5b611fc684611f6d565b9250611fd460208501611f6d565b929592945050506040919091013590565b5f60208284031215611ff5575f5ffd5b61064582611f6d565b6001600160a01b0391909116815260200190565b60ff60f81b8816815260e060208201525f61203060e0830189611f2d565b82810360408401526120428189611f2d565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612097578351835260209384019390920191600101612079565b50909b9a5050505050505050505050565b5f602082840312156120b8575f5ffd5b5035919050565b60ff81168114610b8b575f5ffd5b5f5f5f5f5f5f60c087890312156120e2575f5ffd5b6120eb87611f6d565b955060208701359450604087013593506060870135612109816120bf565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215612139575f5ffd5b61214288611f6d565b965061215060208901611f6d565b95506040880135945060608801359350608088013561216e816120bf565b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561219c575f5ffd5b6121a583611f6d565b91506121b360208401611f6d565b90509250929050565b5f5f604083850312156121cd575f5ffd5b6121d683611f6d565b9150602083013563ffffffff811681146121ee575f5ffd5b809150509250929050565b600181811c9082168061220d57607f821691505b60208210810361222b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561064857610648612231565b8082018082111561064857610648612231565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561229c575f5ffd5b8151611009816120bf565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b6001600160d01b03828116828216039081111561064857610648612231565b6001600160d01b03818116838216019081111561064857610648612231565b5f8261233b57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", + "bytecode": "0x610180604052348015610010575f5ffd5b506040516129c33803806129c383398101604081905261002f916103a4565b82816040518060400160405280601481526020017f456e636c617665205469636b657420546f6b656e00000000000000000000000081525080604051806040016040528060018152602001603160f81b8152506040518060400160405280601481526020017f456e636c617665205469636b657420546f6b656e0000000000000000000000008152506040518060400160405280600381526020016245544b60e81b81525081600390816100e39190610486565b5060046100f08282610486565b5061010091508390506005610226565b6101205261010f816006610226565b61014052815160208084019190912060e052815190820120610100524660a05261019b60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b0381166101d357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101dc81610258565b50306001600160a01b038216036102085760405163438d6fe360e01b81523060048201526024016101ca565b6001600160a01b03166101605261021e826102a9565b505050610598565b5f6020835110156102415761023a83610321565b9050610252565b8161024c8482610486565b5060ff90505b92915050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6102b161035e565b6001600160a01b0381166102d85760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b905f90a250565b5f5f829050601f8151111561034b578260405163305a27a960e01b81526004016101ca9190610540565b805161035682610575565b179392505050565b600b546001600160a01b0316331461038b5760405163118cdaa760e01b81523360048201526024016101ca565b565b6001600160a01b03811681146103a1575f5ffd5b50565b5f5f5f606084860312156103b6575f5ffd5b83516103c18161038d565b60208501519093506103d28161038d565b60408501519092506103e38161038d565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061041657607f821691505b60208210810361043457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048157805f5260205f20601f840160051c8101602085101561045f5750805b601f840160051c820191505b8181101561047e575f815560010161046b565b50505b505050565b81516001600160401b0381111561049f5761049f6103ee565b6104b3816104ad8454610402565b8461043a565b6020601f8211600181146104e5575f83156104ce5750848201515b5f19600385901b1c1916600184901b17845561047e565b5f84815260208120601f198516915b8281101561051457878501518255602094850194600190920191016104f4565b508482101561053157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610434575f1960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051610160516123bb6106085f395f818161088601528181610c9b01528181610dcc0152610e7901525f61129501525f61126801525f610fd901525f610fb101525f610f0c01525f610f3601525f610f6001526123bb5ff3fe608060405234801561000f575f5ffd5b50600436106101cc575f3560e01c806370a082311161010157806395d89b411161009a57806395d89b41146103f45780639ab24eb0146103fc578063a9059cbb1461040f578063a91ee0dc14610422578063c3cda52014610435578063d505accf14610443578063dd62ed3e14610456578063f1127ed814610469578063f2fde38b146104a8575f5ffd5b806370a082311461032d578063715018a6146103555780637b1039991461035d5780637ecebe001461037057806384b0196e1461038357806385bc898c1461039e5780638da5cb5b146103b15780638e539e8c146103c257806391ddadf4146103d5575f5ffd5b80633644e515116101735780633644e5151461028b5780633a46b1a81461029357806344b279a2146102a65780634bf5d7e9146102af578063587cde1e146102b75780635c19a95c146102d757806368a9674d146102ea5780636f307dc3146102fd5780636fcfff4514610305575f5ffd5b806306fdde03146101d0578063095ea7b3146101ee578063117de2fd1461021157806318160ddd14610226578063205c28781461023857806323b872dd1461024b5780632f4f21e21461025e578063313ce56714610271575b5f5ffd5b6101d86104bb565b6040516101e59190611fc9565b60405180910390f35b6102016101fc366004611ff1565b61054b565b60405190151581526020016101e5565b61022461021f366004611ff1565b610565565b005b6002545b6040519081526020016101e5565b610201610246366004611ff1565b610651565b610201610259366004612019565b610691565b61020161026c366004611ff1565b6106b4565b61027961070f565b60405160ff90911681526020016101e5565b61022a61071d565b61022a6102a1366004611ff1565b610726565b61022a600d5481565b6101d8610760565b6102ca6102c5366004612053565b6107d8565b6040516101e5919061206c565b6102246102e5366004612053565b6107f5565b6102016102f8366004612019565b61080e565b6102ca610884565b610318610313366004612053565b6108a8565b60405163ffffffff90911681526020016101e5565b61022a61033b366004612053565b6001600160a01b03165f9081526020819052604090205490565b6102246108b2565b600c546102ca906001600160a01b031681565b61022a61037e366004612053565b6108c5565b61038b6108cf565b6040516101e59796959493929190612080565b6102246103ac366004611ff1565b610911565b600b546001600160a01b03166102ca565b61022a6103d0366004612116565b610961565b6103dd610985565b60405165ffffffffffff90911681526020016101e5565b6101d861098e565b61022a61040a366004612053565b61099d565b61020161041d366004611ff1565b6109bd565b610224610430366004612053565b6109ca565b6102246102e536600461213b565b610224610451366004612191565b610a42565b61022a6104643660046121f9565b610b78565b61047c61047736600461222a565b610ba2565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101e5565b6102246104b6366004612053565b610bbf565b6060600380546104ca90612267565b80601f01602080910402602001604051908101604052809291908181526020018280546104f690612267565b80156105415780601f1061051857610100808354040283529160200191610541565b820191905f5260205f20905b81548152906001019060200180831161052457829003601f168201915b5050505050905090565b5f604051638cd22d1960e01b815260040160405180910390fd5b600c546001600160a01b0316331461059057604051633217675b60e21b815260040160405180910390fd5b600d548111156105e15760405162461bcd60e51b8152602060048201526017602482015276457863656564732070617961626c652062616c616e636560481b60448201526064015b60405180910390fd5b80600d5f8282546105f291906122b3565b9091555061060a9050610603610884565b8383610bfc565b816001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a68260405161064591815260200190565b60405180910390a25050565b600c545f906001600160a01b0316331461067e57604051633217675b60e21b815260040160405180910390fd5b6106888383610c60565b90505b92915050565b5f3361069e858285610cca565b6106a9858585610d1b565b506001949350505050565b600c545f906001600160a01b031633146106e157604051633217675b60e21b815260040160405180910390fd5b6106eb8383610d78565b90505f6106f7846107d8565b6001600160a01b03160361068b5761068b8384610dfd565b5f610718610e76565b905090565b5f610718610f00565b5f61075061073383611029565b6001600160a01b0385165f9081526009602052604090209061107e565b6001600160d01b03169392505050565b606061076a61112e565b65ffffffffffff1661077a610985565b65ffffffffffff16146107a0576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b039081165f908152600860205260409020541690565b604051635e81118160e11b815260040160405180910390fd5b600c545f906001600160a01b0316331461083b57604051633217675b60e21b815260040160405180910390fd5b61084e610846610884565b853085611138565b6108588383611171565b5f610862846107d8565b6001600160a01b03160361087a5761087a8384610dfd565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b5f61068b826111a5565b6108ba6111c6565b6108c35f6111f3565b565b5f61068b82611244565b5f6060805f5f5f60606108e0611261565b6108e861128e565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600c546001600160a01b0316331461093c57604051633217675b60e21b815260040160405180910390fd5b80600d5f82825461094d91906122c6565b9091555061095d905082826112bb565b5050565b5f61097661096e83611029565b600a9061107e565b6001600160d01b031692915050565b5f61071861112e565b6060600480546104ca90612267565b6001600160a01b0381165f908152600960205260408120610976906112ef565b5f3361087a818585610d1b565b6109d26111c6565b6001600160a01b0381166109f95760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b905f90a250565b83421115610a665760405163313c898160e11b8152600481018590526024016105d8565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610ab18c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610b0b82611326565b90505f610b1a82878787611352565b9050896001600160a01b0316816001600160a01b031614610b61576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105d8565b610b6c8a8a8a61137e565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b604080518082019091525f8082526020820152610688838361138b565b610bc76111c6565b6001600160a01b038116610bf0575f604051631e4fbdf760e01b81526004016105d8919061206c565b610bf9816111f3565b50565b6040516001600160a01b03838116602483015260448201839052610c5b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506113bf565b505050565b5f306001600160a01b03841603610c8c578260405163ec442f0560e01b81526004016105d8919061206c565b610c9633836112bb565b610cc17f00000000000000000000000000000000000000000000000000000000000000008484610bfc565b50600192915050565b5f610cd58484610b78565b90505f19811015610d155781811015610d0757828183604051637dc7a0d960e11b81526004016105d8939291906122d9565b610d1584848484035f611422565b50505050565b6001600160a01b038316610d44575f604051634b637e8f60e11b81526004016105d8919061206c565b6001600160a01b038216610d6d575f60405163ec442f0560e01b81526004016105d8919061206c565b610c5b8383836114f4565b5f33308103610d9c5730604051634b637e8f60e11b81526004016105d8919061206c565b306001600160a01b03851603610dc7578360405163ec442f0560e01b81526004016105d8919061206c565b610df37f0000000000000000000000000000000000000000000000000000000000000000823086611138565b61087a8484611171565b5f610e07836107d8565b6001600160a01b038481165f8181526008602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610c5b8183610e718661153d565b61155a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ef1575060408051601f3d908101601f19168201909252610eee918101906122fa565b60015b610efb5750601290565b919050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f5857507f000000000000000000000000000000000000000000000000000000000000000046145b15610f8257507f000000000000000000000000000000000000000000000000000000000000000090565b610718604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f611033610985565b90508065ffffffffffff16831061106e57604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105d8565b611077836116c3565b9392505050565b81545f90818160058111156110da575f611097846116f9565b6110a190856122b3565b5f8881526020902090915081015465ffffffffffff90811690871610156110ca578091506110d8565b6110d58160016122c6565b92505b505b5f6110e78787858561184c565b905080156111215761110b876110fe6001846122b3565b5f91825260209091200190565b54600160301b90046001600160d01b0316611123565b5f5b979650505050505050565b5f610718436116c3565b6040516001600160a01b038481166024830152838116604483015260648201839052610d159186918216906323b872dd90608401610c29565b6001600160a01b03821661119a575f60405163ec442f0560e01b81526004016105d8919061206c565b61095d5f83836114f4565b6001600160a01b0381165f9081526009602052604081205461068b906118ab565b600b546001600160a01b031633146108c3573360405163118cdaa760e01b81526004016105d8919061206c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f9081526007602052604081205461068b565b60606107187f000000000000000000000000000000000000000000000000000000000000000060056118db565b60606107187f000000000000000000000000000000000000000000000000000000000000000060066118db565b6001600160a01b0382166112e4575f604051634b637e8f60e11b81526004016105d8919061206c565b61095d825f836114f4565b80545f90801561131e57611308836110fe6001846122b3565b54600160301b90046001600160d01b0316611077565b5f9392505050565b5f61068b611332610f00565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61136288888888611984565b9250925092506113728282611a42565b50909695505050505050565b610c5b8383836001611422565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206106889083611afa565b5f5f60205f8451602086015f885af1806113de576040513d5f823e3d81fd5b50505f513d915081156113f5578060011415611402565b6001600160a01b0384163b155b15610d155783604051635274afe760e01b81526004016105d8919061206c565b6001600160a01b03841661144b575f60405163e602df0560e01b81526004016105d8919061206c565b6001600160a01b038316611474575f604051634a1406b160e11b81526004016105d8919061206c565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610d1557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114e691815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061151457506001600160a01b03821615155b1561153257604051638cd22d1960e01b815260040160405180910390fd5b610c5b838383611b67565b6001600160a01b0381165f9081526020819052604081205461068b565b816001600160a01b0316836001600160a01b03161415801561157b57505f81115b15610c5b576001600160a01b03831615611622576001600160a01b0383165f90815260096020526040812081906115bd90611bcd6115b886611bd8565b611c0b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611617929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610c5b576001600160a01b0382165f908152600960205260408120819061165a90611c436115b886611bd8565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516116b4929190918252602082015260400190565b60405180910390a25050505050565b5f65ffffffffffff8211156116f5576040516306dfcc6560e41b815260306004820152602481018390526044016105d8565b5090565b5f60018211611706575090565b816001600160801b821061171f5760809190911c9060401b5b600160401b82106117355760409190911c9060201b5b640100000000821061174c5760209190911c9060101b5b6201000082106117615760109190911c9060081b5b61010082106117755760089190911c9060041b5b601082106117885760049190911c9060021b5b600482106117945760011b5b600302600190811c908185816117ac576117ac612315565b048201901c905060018185816117c4576117c4612315565b048201901c905060018185816117dc576117dc612315565b048201901c905060018185816117f4576117f4612315565b048201901c9050600181858161180c5761180c612315565b048201901c9050600181858161182457611824612315565b048201901c905061184381858161183d5761183d612315565b04821190565b90039392505050565b5f5b818310156118a3575f6118618484611c4e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561188f5780925061189d565b61189a8160016122c6565b93505b5061184e565b509392505050565b5f63ffffffff8211156116f5576040516306dfcc6560e41b815260206004820152602481018390526044016105d8565b606060ff83146118f5576118ee83611c68565b905061068b565b81805461190190612267565b80601f016020809104026020016040519081016040528092919081815260200182805461192d90612267565b80156119785780601f1061194f57610100808354040283529160200191611978565b820191905f5260205f20905b81548152906001019060200180831161195b57829003601f168201915b5050505050905061068b565b5f80806fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411156119b357505f91506003905082611a38565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a04573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a2f57505f925060019150829050611a38565b92505f91508190505b9450945094915050565b5f826003811115611a5557611a55612329565b03611a5e575050565b6001826003811115611a7257611a72612329565b03611a905760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611aa457611aa4612329565b03611ac55760405163fce698f760e01b8152600481018290526024016105d8565b6003826003811115611ad957611ad9612329565b0361095d576040516335e2f38360e21b8152600481018290526024016105d8565b604080518082019091525f8082526020820152825f018263ffffffff1681548110611b2757611b2761233d565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b611b72838383611ca5565b6001600160a01b038316611bc2575f611b8a60025490565b90506001600160d01b0380821115611bbf57604051630e58ae9360e11b815260048101839052602481018290526044016105d8565b50505b610c5b838383611db8565b5f6106888284612351565b5f6001600160d01b038211156116f5576040516306dfcc6560e41b815260d06004820152602481018390526044016105d8565b5f5f611c36611c18610985565b611c2e611c24886112ef565b868863ffffffff16565b879190611e17565b915091505b935093915050565b5f6106888284612370565b5f611c5c600284841861238f565b610688908484166122c6565b60605f611c7483611e24565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038316611ccf578060025f828254611cc491906122c6565b90915550611d2c9050565b6001600160a01b0383165f9081526020819052604090205481811015611d0e5783818360405163391434e360e21b81526004016105d8939291906122d9565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611d4857600280548290039055611d66565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611dab91815260200190565b60405180910390a3505050565b6001600160a01b038316611dda57611dd7600a611c436115b884611bd8565b50505b6001600160a01b038216611dfc57611df9600a611bcd6115b884611bd8565b50505b610c5b611e08846107d8565b611e11846107d8565b8361155a565b5f80611c36858585611e4b565b5f60ff8216601f81111561068b57604051632cd44ac360e21b815260040160405180910390fd5b82545f9081908015611f41575f611e67876110fe6001856122b3565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115611eaa57604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603611ee357825465ffffffffffff16600160301b6001600160d01b03891602178355611f33565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b9450859350611c3b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b029190931617920191909155905081611c3b565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6106886020830184611f9b565b80356001600160a01b0381168114610efb575f5ffd5b5f5f60408385031215612002575f5ffd5b61200b83611fdb565b946020939093013593505050565b5f5f5f6060848603121561202b575f5ffd5b61203484611fdb565b925061204260208501611fdb565b929592945050506040919091013590565b5f60208284031215612063575f5ffd5b61068882611fdb565b6001600160a01b0391909116815260200190565b60ff60f81b8816815260e060208201525f61209e60e0830189611f9b565b82810360408401526120b08189611f9b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156121055783518352602093840193909201916001016120e7565b50909b9a5050505050505050505050565b5f60208284031215612126575f5ffd5b5035919050565b60ff81168114610bf9575f5ffd5b5f5f5f5f5f5f60c08789031215612150575f5ffd5b61215987611fdb565b9550602087013594506040870135935060608701356121778161212d565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a0312156121a7575f5ffd5b6121b088611fdb565b96506121be60208901611fdb565b9550604088013594506060880135935060808801356121dc8161212d565b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561220a575f5ffd5b61221383611fdb565b915061222160208401611fdb565b90509250929050565b5f5f6040838503121561223b575f5ffd5b61224483611fdb565b9150602083013563ffffffff8116811461225c575f5ffd5b809150509250929050565b600181811c9082168061227b57607f821691505b60208210810361229957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561068b5761068b61229f565b8082018082111561068b5761068b61229f565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561230a575f5ffd5b81516110778161212d565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b6001600160d01b03828116828216039081111561068b5761068b61229f565b6001600160d01b03818116838216019081111561068b5761068b61229f565b5f826123a957634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101cc575f3560e01c806370a082311161010157806395d89b411161009a57806395d89b41146103f45780639ab24eb0146103fc578063a9059cbb1461040f578063a91ee0dc14610422578063c3cda52014610435578063d505accf14610443578063dd62ed3e14610456578063f1127ed814610469578063f2fde38b146104a8575f5ffd5b806370a082311461032d578063715018a6146103555780637b1039991461035d5780637ecebe001461037057806384b0196e1461038357806385bc898c1461039e5780638da5cb5b146103b15780638e539e8c146103c257806391ddadf4146103d5575f5ffd5b80633644e515116101735780633644e5151461028b5780633a46b1a81461029357806344b279a2146102a65780634bf5d7e9146102af578063587cde1e146102b75780635c19a95c146102d757806368a9674d146102ea5780636f307dc3146102fd5780636fcfff4514610305575f5ffd5b806306fdde03146101d0578063095ea7b3146101ee578063117de2fd1461021157806318160ddd14610226578063205c28781461023857806323b872dd1461024b5780632f4f21e21461025e578063313ce56714610271575b5f5ffd5b6101d86104bb565b6040516101e59190611fc9565b60405180910390f35b6102016101fc366004611ff1565b61054b565b60405190151581526020016101e5565b61022461021f366004611ff1565b610565565b005b6002545b6040519081526020016101e5565b610201610246366004611ff1565b610651565b610201610259366004612019565b610691565b61020161026c366004611ff1565b6106b4565b61027961070f565b60405160ff90911681526020016101e5565b61022a61071d565b61022a6102a1366004611ff1565b610726565b61022a600d5481565b6101d8610760565b6102ca6102c5366004612053565b6107d8565b6040516101e5919061206c565b6102246102e5366004612053565b6107f5565b6102016102f8366004612019565b61080e565b6102ca610884565b610318610313366004612053565b6108a8565b60405163ffffffff90911681526020016101e5565b61022a61033b366004612053565b6001600160a01b03165f9081526020819052604090205490565b6102246108b2565b600c546102ca906001600160a01b031681565b61022a61037e366004612053565b6108c5565b61038b6108cf565b6040516101e59796959493929190612080565b6102246103ac366004611ff1565b610911565b600b546001600160a01b03166102ca565b61022a6103d0366004612116565b610961565b6103dd610985565b60405165ffffffffffff90911681526020016101e5565b6101d861098e565b61022a61040a366004612053565b61099d565b61020161041d366004611ff1565b6109bd565b610224610430366004612053565b6109ca565b6102246102e536600461213b565b610224610451366004612191565b610a42565b61022a6104643660046121f9565b610b78565b61047c61047736600461222a565b610ba2565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101e5565b6102246104b6366004612053565b610bbf565b6060600380546104ca90612267565b80601f01602080910402602001604051908101604052809291908181526020018280546104f690612267565b80156105415780601f1061051857610100808354040283529160200191610541565b820191905f5260205f20905b81548152906001019060200180831161052457829003601f168201915b5050505050905090565b5f604051638cd22d1960e01b815260040160405180910390fd5b600c546001600160a01b0316331461059057604051633217675b60e21b815260040160405180910390fd5b600d548111156105e15760405162461bcd60e51b8152602060048201526017602482015276457863656564732070617961626c652062616c616e636560481b60448201526064015b60405180910390fd5b80600d5f8282546105f291906122b3565b9091555061060a9050610603610884565b8383610bfc565b816001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a68260405161064591815260200190565b60405180910390a25050565b600c545f906001600160a01b0316331461067e57604051633217675b60e21b815260040160405180910390fd5b6106888383610c60565b90505b92915050565b5f3361069e858285610cca565b6106a9858585610d1b565b506001949350505050565b600c545f906001600160a01b031633146106e157604051633217675b60e21b815260040160405180910390fd5b6106eb8383610d78565b90505f6106f7846107d8565b6001600160a01b03160361068b5761068b8384610dfd565b5f610718610e76565b905090565b5f610718610f00565b5f61075061073383611029565b6001600160a01b0385165f9081526009602052604090209061107e565b6001600160d01b03169392505050565b606061076a61112e565b65ffffffffffff1661077a610985565b65ffffffffffff16146107a0576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b039081165f908152600860205260409020541690565b604051635e81118160e11b815260040160405180910390fd5b600c545f906001600160a01b0316331461083b57604051633217675b60e21b815260040160405180910390fd5b61084e610846610884565b853085611138565b6108588383611171565b5f610862846107d8565b6001600160a01b03160361087a5761087a8384610dfd565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b5f61068b826111a5565b6108ba6111c6565b6108c35f6111f3565b565b5f61068b82611244565b5f6060805f5f5f60606108e0611261565b6108e861128e565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600c546001600160a01b0316331461093c57604051633217675b60e21b815260040160405180910390fd5b80600d5f82825461094d91906122c6565b9091555061095d905082826112bb565b5050565b5f61097661096e83611029565b600a9061107e565b6001600160d01b031692915050565b5f61071861112e565b6060600480546104ca90612267565b6001600160a01b0381165f908152600960205260408120610976906112ef565b5f3361087a818585610d1b565b6109d26111c6565b6001600160a01b0381166109f95760405163d92e233d60e01b815260040160405180910390fd5b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b905f90a250565b83421115610a665760405163313c898160e11b8152600481018590526024016105d8565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610ab18c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610b0b82611326565b90505f610b1a82878787611352565b9050896001600160a01b0316816001600160a01b031614610b61576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105d8565b610b6c8a8a8a61137e565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b604080518082019091525f8082526020820152610688838361138b565b610bc76111c6565b6001600160a01b038116610bf0575f604051631e4fbdf760e01b81526004016105d8919061206c565b610bf9816111f3565b50565b6040516001600160a01b03838116602483015260448201839052610c5b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506113bf565b505050565b5f306001600160a01b03841603610c8c578260405163ec442f0560e01b81526004016105d8919061206c565b610c9633836112bb565b610cc17f00000000000000000000000000000000000000000000000000000000000000008484610bfc565b50600192915050565b5f610cd58484610b78565b90505f19811015610d155781811015610d0757828183604051637dc7a0d960e11b81526004016105d8939291906122d9565b610d1584848484035f611422565b50505050565b6001600160a01b038316610d44575f604051634b637e8f60e11b81526004016105d8919061206c565b6001600160a01b038216610d6d575f60405163ec442f0560e01b81526004016105d8919061206c565b610c5b8383836114f4565b5f33308103610d9c5730604051634b637e8f60e11b81526004016105d8919061206c565b306001600160a01b03851603610dc7578360405163ec442f0560e01b81526004016105d8919061206c565b610df37f0000000000000000000000000000000000000000000000000000000000000000823086611138565b61087a8484611171565b5f610e07836107d8565b6001600160a01b038481165f8181526008602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610c5b8183610e718661153d565b61155a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ef1575060408051601f3d908101601f19168201909252610eee918101906122fa565b60015b610efb5750601290565b919050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f5857507f000000000000000000000000000000000000000000000000000000000000000046145b15610f8257507f000000000000000000000000000000000000000000000000000000000000000090565b610718604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f611033610985565b90508065ffffffffffff16831061106e57604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105d8565b611077836116c3565b9392505050565b81545f90818160058111156110da575f611097846116f9565b6110a190856122b3565b5f8881526020902090915081015465ffffffffffff90811690871610156110ca578091506110d8565b6110d58160016122c6565b92505b505b5f6110e78787858561184c565b905080156111215761110b876110fe6001846122b3565b5f91825260209091200190565b54600160301b90046001600160d01b0316611123565b5f5b979650505050505050565b5f610718436116c3565b6040516001600160a01b038481166024830152838116604483015260648201839052610d159186918216906323b872dd90608401610c29565b6001600160a01b03821661119a575f60405163ec442f0560e01b81526004016105d8919061206c565b61095d5f83836114f4565b6001600160a01b0381165f9081526009602052604081205461068b906118ab565b600b546001600160a01b031633146108c3573360405163118cdaa760e01b81526004016105d8919061206c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f9081526007602052604081205461068b565b60606107187f000000000000000000000000000000000000000000000000000000000000000060056118db565b60606107187f000000000000000000000000000000000000000000000000000000000000000060066118db565b6001600160a01b0382166112e4575f604051634b637e8f60e11b81526004016105d8919061206c565b61095d825f836114f4565b80545f90801561131e57611308836110fe6001846122b3565b54600160301b90046001600160d01b0316611077565b5f9392505050565b5f61068b611332610f00565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61136288888888611984565b9250925092506113728282611a42565b50909695505050505050565b610c5b8383836001611422565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206106889083611afa565b5f5f60205f8451602086015f885af1806113de576040513d5f823e3d81fd5b50505f513d915081156113f5578060011415611402565b6001600160a01b0384163b155b15610d155783604051635274afe760e01b81526004016105d8919061206c565b6001600160a01b03841661144b575f60405163e602df0560e01b81526004016105d8919061206c565b6001600160a01b038316611474575f604051634a1406b160e11b81526004016105d8919061206c565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610d1557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114e691815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061151457506001600160a01b03821615155b1561153257604051638cd22d1960e01b815260040160405180910390fd5b610c5b838383611b67565b6001600160a01b0381165f9081526020819052604081205461068b565b816001600160a01b0316836001600160a01b03161415801561157b57505f81115b15610c5b576001600160a01b03831615611622576001600160a01b0383165f90815260096020526040812081906115bd90611bcd6115b886611bd8565b611c0b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611617929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610c5b576001600160a01b0382165f908152600960205260408120819061165a90611c436115b886611bd8565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516116b4929190918252602082015260400190565b60405180910390a25050505050565b5f65ffffffffffff8211156116f5576040516306dfcc6560e41b815260306004820152602481018390526044016105d8565b5090565b5f60018211611706575090565b816001600160801b821061171f5760809190911c9060401b5b600160401b82106117355760409190911c9060201b5b640100000000821061174c5760209190911c9060101b5b6201000082106117615760109190911c9060081b5b61010082106117755760089190911c9060041b5b601082106117885760049190911c9060021b5b600482106117945760011b5b600302600190811c908185816117ac576117ac612315565b048201901c905060018185816117c4576117c4612315565b048201901c905060018185816117dc576117dc612315565b048201901c905060018185816117f4576117f4612315565b048201901c9050600181858161180c5761180c612315565b048201901c9050600181858161182457611824612315565b048201901c905061184381858161183d5761183d612315565b04821190565b90039392505050565b5f5b818310156118a3575f6118618484611c4e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561188f5780925061189d565b61189a8160016122c6565b93505b5061184e565b509392505050565b5f63ffffffff8211156116f5576040516306dfcc6560e41b815260206004820152602481018390526044016105d8565b606060ff83146118f5576118ee83611c68565b905061068b565b81805461190190612267565b80601f016020809104026020016040519081016040528092919081815260200182805461192d90612267565b80156119785780601f1061194f57610100808354040283529160200191611978565b820191905f5260205f20905b81548152906001019060200180831161195b57829003601f168201915b5050505050905061068b565b5f80806fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411156119b357505f91506003905082611a38565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a04573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a2f57505f925060019150829050611a38565b92505f91508190505b9450945094915050565b5f826003811115611a5557611a55612329565b03611a5e575050565b6001826003811115611a7257611a72612329565b03611a905760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611aa457611aa4612329565b03611ac55760405163fce698f760e01b8152600481018290526024016105d8565b6003826003811115611ad957611ad9612329565b0361095d576040516335e2f38360e21b8152600481018290526024016105d8565b604080518082019091525f8082526020820152825f018263ffffffff1681548110611b2757611b2761233d565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b611b72838383611ca5565b6001600160a01b038316611bc2575f611b8a60025490565b90506001600160d01b0380821115611bbf57604051630e58ae9360e11b815260048101839052602481018290526044016105d8565b50505b610c5b838383611db8565b5f6106888284612351565b5f6001600160d01b038211156116f5576040516306dfcc6560e41b815260d06004820152602481018390526044016105d8565b5f5f611c36611c18610985565b611c2e611c24886112ef565b868863ffffffff16565b879190611e17565b915091505b935093915050565b5f6106888284612370565b5f611c5c600284841861238f565b610688908484166122c6565b60605f611c7483611e24565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038316611ccf578060025f828254611cc491906122c6565b90915550611d2c9050565b6001600160a01b0383165f9081526020819052604090205481811015611d0e5783818360405163391434e360e21b81526004016105d8939291906122d9565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611d4857600280548290039055611d66565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611dab91815260200190565b60405180910390a3505050565b6001600160a01b038316611dda57611dd7600a611c436115b884611bd8565b50505b6001600160a01b038216611dfc57611df9600a611bcd6115b884611bd8565b50505b610c5b611e08846107d8565b611e11846107d8565b8361155a565b5f80611c36858585611e4b565b5f60ff8216601f81111561068b57604051632cd44ac360e21b815260040160405180910390fd5b82545f9081908015611f41575f611e67876110fe6001856122b3565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115611eaa57604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603611ee357825465ffffffffffff16600160301b6001600160d01b03891602178355611f33565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b9450859350611c3b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b029190931617920191909155905081611c3b565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6106886020830184611f9b565b80356001600160a01b0381168114610efb575f5ffd5b5f5f60408385031215612002575f5ffd5b61200b83611fdb565b946020939093013593505050565b5f5f5f6060848603121561202b575f5ffd5b61203484611fdb565b925061204260208501611fdb565b929592945050506040919091013590565b5f60208284031215612063575f5ffd5b61068882611fdb565b6001600160a01b0391909116815260200190565b60ff60f81b8816815260e060208201525f61209e60e0830189611f9b565b82810360408401526120b08189611f9b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156121055783518352602093840193909201916001016120e7565b50909b9a5050505050505050505050565b5f60208284031215612126575f5ffd5b5035919050565b60ff81168114610bf9575f5ffd5b5f5f5f5f5f5f60c08789031215612150575f5ffd5b61215987611fdb565b9550602087013594506040870135935060608701356121778161212d565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a0312156121a7575f5ffd5b6121b088611fdb565b96506121be60208901611fdb565b9550604088013594506060880135935060808801356121dc8161212d565b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561220a575f5ffd5b61221383611fdb565b915061222160208401611fdb565b90509250929050565b5f5f6040838503121561223b575f5ffd5b61224483611fdb565b9150602083013563ffffffff8116811461225c575f5ffd5b809150509250929050565b600181811c9082168061227b57607f821691505b60208210810361229957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561068b5761068b61229f565b8082018082111561068b5761068b61229f565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561230a575f5ffd5b81516110778161212d565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b6001600160d01b03828116828216039081111561068b5761068b61229f565b6001600160d01b03818116838216019081111561068b5761068b61229f565b5f826123a957634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": { - "3415": [ + "2832": [ { "length": 32, - "start": 2115 + "start": 2182 }, { "length": 32, - "start": 3117 + "start": 3227 }, { "length": 32, - "start": 3422 + "start": 3532 }, { "length": 32, - "start": 3595 + "start": 3705 } ], - "6684": [ + "5819": [ { "length": 32, - "start": 3826 + "start": 3936 } ], - "6686": [ + "5821": [ { "length": 32, - "start": 3784 + "start": 3894 } ], - "6688": [ + "5823": [ { "length": 32, - "start": 3742 + "start": 3852 } ], - "6690": [ + "5825": [ { "length": 32, - "start": 3907 + "start": 4017 } ], - "6692": [ + "5827": [ { "length": 32, - "start": 3947 + "start": 4057 } ], - "6695": [ + "5830": [ { "length": 32, - "start": 4602 + "start": 4712 } ], - "6698": [ + "5833": [ { "length": 32, - "start": 4647 + "start": 4757 } ] }, "inputSourceName": "project/contracts/token/EnclaveTicketToken.sol", - "buildInfoId": "solc-0_8_28-67d7bf420ed8ac25001394841682e83cf4523ea2" + "buildInfoId": "solc-0_8_28-2705a75bc2d2d1f8b1e08ebca4cc37d76480abc8" } \ No newline at end of file diff --git a/packages/enclave-contracts/contracts/E3RefundManager.sol b/packages/enclave-contracts/contracts/E3RefundManager.sol index c01360da7c..96b06d294e 100644 --- a/packages/enclave-contracts/contracts/E3RefundManager.sol +++ b/packages/enclave-contracts/contracts/E3RefundManager.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -54,6 +54,9 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { mapping(uint256 e3Id => address[] nodes) internal _honestNodes; /// @notice Pending slashed funds awaiting E3 terminal state mapping(uint256 e3Id => uint256 amount) internal _pendingSlashedFunds; + + /// @notice Basis points denominator (100%) + uint16 internal constant BPS_BASE = 10000; //////////////////////////////////////////////////////////// // // // Modifiers // @@ -128,8 +131,10 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { ); // Calculate base distribution - uint256 honestNodeAmount = (originalPayment * workCompletedBps) / 10000; - uint256 requesterAmount = (originalPayment * workRemainingBps) / 10000; + uint256 honestNodeAmount = (originalPayment * workCompletedBps) / + BPS_BASE; + uint256 requesterAmount = (originalPayment * workRemainingBps) / + BPS_BASE; uint256 protocolAmount = originalPayment - honestNodeAmount - requesterAmount; @@ -236,7 +241,7 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { workCompletedBps = alloc.committeeFormationBps + alloc.dkgBps; } - workRemainingBps = 10000 - workCompletedBps - alloc.protocolBps; + workRemainingBps = BPS_BASE - workCompletedBps - alloc.protocolBps; } //////////////////////////////////////////////////////////// @@ -359,7 +364,7 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { require(address(paymentToken) != address(0), "Invalid fee token"); uint256 toNodes = (escrowed * _workAllocation.successSlashedNodeBps) / - 10000; + BPS_BASE; uint256 toProtocol = escrowed - toNodes; if (toProtocol > 0) { @@ -453,8 +458,8 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { uint256(allocation.dkgBps) + uint256(allocation.decryptionBps) + uint256(allocation.protocolBps); - require(total == 10000, "Must sum to 10000"); - require(allocation.successSlashedNodeBps <= 10000, "Invalid BPS"); + require(total == BPS_BASE, "Must sum to 10000"); + require(allocation.successSlashedNodeBps <= BPS_BASE, "Invalid BPS"); _workAllocation = allocation; @@ -466,6 +471,7 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { function setEnclave(address _enclave) external onlyOwner { require(_enclave != address(0), "Invalid enclave"); enclave = IEnclave(_enclave); + emit EnclaveSet(_enclave); } /// @notice Set the treasury address @@ -473,6 +479,7 @@ contract E3RefundManager is IE3RefundManager, OwnableUpgradeable { function setTreasury(address _treasury) external onlyOwner { require(_treasury != address(0), "Invalid treasury"); treasury = _treasury; + emit TreasurySet(_treasury); } /// @notice Recover orphaned slashed funds for an E3 that has already completed diff --git a/packages/enclave-contracts/contracts/Enclave.sol b/packages/enclave-contracts/contracts/Enclave.sol index 951780c643..b469cb097c 100644 --- a/packages/enclave-contracts/contracts/Enclave.sol +++ b/packages/enclave-contracts/contracts/Enclave.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IEnclave, E3, IE3Program } from "./interfaces/IEnclave.sol"; import { ICiphernodeRegistry } from "./interfaces/ICiphernodeRegistry.sol"; @@ -249,7 +249,7 @@ contract Enclave is IEnclave, OwnableUpgradeable { block.timestamp + _timeoutConfig.computeWindow + _timeoutConfig.decryptionWindow; - // TODO do we actually need a max duration? + // Validate total duration does not exceed maxDuration require(totalDuration < maxDuration, InvalidDuration(totalDuration)); require( @@ -261,6 +261,10 @@ contract Enclave is IEnclave, OwnableUpgradeable { e3Id = nexte3Id; nexte3Id++; + // Seed uses block.prevrandao combined with e3Id as additional entropy. + // While prevrandao is not cryptographically unpredictable (validator-controlled), + // the combination with the unique, incrementing e3Id mitigates manipulation. + // The seed is used solely for weighted sortition, not for cryptographic key generation. uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id))); e3Payments[e3Id] = e3Fee; @@ -290,8 +294,6 @@ contract Enclave is IEnclave, OwnableUpgradeable { e3.plaintextOutput = hex""; e3.requester = msg.sender; - feeToken.safeTransferFrom(msg.sender, address(this), e3Fee); - bytes memory e3ProgramParams = paramSetRegistry[requestParams.paramSet]; require(e3ProgramParams.length > 0, "BFV param set not registered"); @@ -321,8 +323,12 @@ contract Enclave is IEnclave, OwnableUpgradeable { e3.encryptionSchemeId = encryptionSchemeId; e3.decryptionVerifier = decryptionVerifier; e3.pkVerifier = pkVerifier; + // CEI: write all state before external calls below e3s[e3Id] = e3; + // Transfer fee after all validations and state changes + feeToken.safeTransferFrom(msg.sender, address(this), e3Fee); + require( ciphernodeRegistry.requestCommittee(e3Id, seed, threshold), CommitteeSelectionFailed() @@ -638,6 +644,7 @@ contract Enclave is IEnclave, OwnableUpgradeable { InvalidEncryptionScheme(encryptionSchemeId) ); pkVerifiers[encryptionSchemeId] = pkVerifier; + emit PkVerifierSet(encryptionSchemeId, address(pkVerifier)); } /// @inheritdoc IEnclave diff --git a/packages/enclave-contracts/contracts/interfaces/IBondingRegistry.sol b/packages/enclave-contracts/contracts/interfaces/IBondingRegistry.sol index 2fbd6551a6..b8334257d9 100644 --- a/packages/enclave-contracts/contracts/interfaces/IBondingRegistry.sol +++ b/packages/enclave-contracts/contracts/interfaces/IBondingRegistry.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ICiphernodeRegistry } from "./ICiphernodeRegistry.sol"; @@ -119,6 +119,36 @@ interface IBondingRegistry { uint256 licenseAmount ); + /** + * @notice Emitted when the slashed funds treasury address is set + * @param treasury Address of the slashed funds treasury + */ + event SlashedFundsTreasurySet(address indexed treasury); + + /** + * @notice Emitted when the ticket token is set + * @param ticketToken Address of the ticket token + */ + event TicketTokenSet(address indexed ticketToken); + + /** + * @notice Emitted when the license token is set + * @param licenseToken Address of the license token + */ + event LicenseTokenSet(address indexed licenseToken); + + /** + * @notice Emitted when the registry is set + * @param registry Address of the registry + */ + event RegistrySet(address indexed registry); + + /** + * @notice Emitted when the slashing manager is set + * @param slashingManager Address of the slashing manager + */ + event SlashingManagerSet(address indexed slashingManager); + // ====================== // View Functions // ====================== diff --git a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol index 2e629155bf..aa574cf1f5 100644 --- a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol +++ b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IEnclave } from "./IEnclave.sol"; import { IBondingRegistry } from "./IBondingRegistry.sol"; diff --git a/packages/enclave-contracts/contracts/interfaces/ICircuitVerifier.sol b/packages/enclave-contracts/contracts/interfaces/ICircuitVerifier.sol index a9b7a29d97..d3a228095e 100644 --- a/packages/enclave-contracts/contracts/interfaces/ICircuitVerifier.sol +++ b/packages/enclave-contracts/contracts/interfaces/ICircuitVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; /** * @title ICircuitVerifier diff --git a/packages/enclave-contracts/contracts/interfaces/IComputeProvider.sol b/packages/enclave-contracts/contracts/interfaces/IComputeProvider.sol index 2f2a625600..e73201dd2e 100644 --- a/packages/enclave-contracts/contracts/interfaces/IComputeProvider.sol +++ b/packages/enclave-contracts/contracts/interfaces/IComputeProvider.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IDecryptionVerifier } from "./IDecryptionVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/interfaces/IDecryptionVerifier.sol b/packages/enclave-contracts/contracts/interfaces/IDecryptionVerifier.sol index 8664408406..1519032e3e 100644 --- a/packages/enclave-contracts/contracts/interfaces/IDecryptionVerifier.sol +++ b/packages/enclave-contracts/contracts/interfaces/IDecryptionVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; /** * @title IDecryptionVerifier diff --git a/packages/enclave-contracts/contracts/interfaces/IE3.sol b/packages/enclave-contracts/contracts/interfaces/IE3.sol index a821787f39..f7fe3330c1 100644 --- a/packages/enclave-contracts/contracts/interfaces/IE3.sol +++ b/packages/enclave-contracts/contracts/interfaces/IE3.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IE3Program } from "./IE3Program.sol"; import { IDecryptionVerifier } from "./IDecryptionVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/interfaces/IE3Program.sol b/packages/enclave-contracts/contracts/interfaces/IE3Program.sol index 189f8a9f65..2405ea030e 100644 --- a/packages/enclave-contracts/contracts/interfaces/IE3Program.sol +++ b/packages/enclave-contracts/contracts/interfaces/IE3Program.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; /** * @title IE3Program diff --git a/packages/enclave-contracts/contracts/interfaces/IE3RefundManager.sol b/packages/enclave-contracts/contracts/interfaces/IE3RefundManager.sol index 05396b249c..0b829e752c 100644 --- a/packages/enclave-contracts/contracts/interfaces/IE3RefundManager.sol +++ b/packages/enclave-contracts/contracts/interfaces/IE3RefundManager.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IEnclave } from "./IEnclave.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -75,6 +75,10 @@ interface IE3RefundManager { event WorkAllocationUpdated(WorkValueAllocation allocation); /// @notice Emitted when orphaned slashed funds are withdrawn to treasury event OrphanedSlashedFundsWithdrawn(uint256 indexed e3Id, uint256 amount); + /// @notice Emitted when the Enclave address is set + event EnclaveSet(address indexed enclave); + /// @notice Emitted when the treasury address is set + event TreasurySet(address indexed treasury); //////////////////////////////////////////////////////////// // // // Errors // diff --git a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol index 50084d8318..3a154eac60 100644 --- a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol +++ b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { E3, IE3Program } from "./IE3.sol"; import { ICiphernodeRegistry } from "./ICiphernodeRegistry.sol"; @@ -198,6 +198,11 @@ interface IEnclave { /// @param slashingManager The address of the SlashingManager contract. event SlashingManagerSet(address indexed slashingManager); + /// @notice Emitted when the PkVerifier is set for an encryption scheme. + /// @param encryptionSchemeId The encryption scheme identifier. + /// @param pkVerifier The address of the PkVerifier contract. + event PkVerifierSet(bytes32 indexed encryptionSchemeId, address pkVerifier); + /// @notice Emitted when slashed funds are escrowed for an E3 /// @param e3Id The E3 ID. /// @param amount The amount of slashed funds escrowed. diff --git a/packages/enclave-contracts/contracts/interfaces/IPkVerifier.sol b/packages/enclave-contracts/contracts/interfaces/IPkVerifier.sol index 69c62c61bf..98c3c76671 100644 --- a/packages/enclave-contracts/contracts/interfaces/IPkVerifier.sol +++ b/packages/enclave-contracts/contracts/interfaces/IPkVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; /** * @title IPkVerifier diff --git a/packages/enclave-contracts/contracts/interfaces/ISlashingManager.sol b/packages/enclave-contracts/contracts/interfaces/ISlashingManager.sol index d5cfbfeb9f..4f1b08fc43 100644 --- a/packages/enclave-contracts/contracts/interfaces/ISlashingManager.sol +++ b/packages/enclave-contracts/contracts/interfaces/ISlashingManager.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IBondingRegistry } from "./IBondingRegistry.sol"; import { IE3RefundManager } from "./IE3RefundManager.sol"; @@ -289,6 +289,30 @@ interface ISlashingManager { */ event RoutingFailed(uint256 indexed e3Id, uint256 amount); + /** + * @notice Emitted when the bonding registry is set + * @param bondingRegistry Address of the bonding registry + */ + event BondingRegistrySet(address indexed bondingRegistry); + + /** + * @notice Emitted when the ciphernode registry is set + * @param ciphernodeRegistry Address of the ciphernode registry + */ + event CiphernodeRegistrySet(address indexed ciphernodeRegistry); + + /** + * @notice Emitted when the Enclave contract is set + * @param enclave Address of the Enclave contract + */ + event EnclaveSet(address indexed enclave); + + /** + * @notice Emitted when the E3 Refund Manager is set + * @param e3RefundManager Address of the E3 Refund Manager + */ + event E3RefundManagerSet(address indexed e3RefundManager); + // ====================== // View Functions // ====================== diff --git a/packages/enclave-contracts/contracts/lib/ExitQueueLib.sol b/packages/enclave-contracts/contracts/lib/ExitQueueLib.sol index 05579c6f8b..ee981d2760 100644 --- a/packages/enclave-contracts/contracts/lib/ExitQueueLib.sol +++ b/packages/enclave-contracts/contracts/lib/ExitQueueLib.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; /** * @title ExitQueueLib diff --git a/packages/enclave-contracts/contracts/registry/BondingRegistry.sol b/packages/enclave-contracts/contracts/registry/BondingRegistry.sol index 31363d03bf..6a34a56919 100644 --- a/packages/enclave-contracts/contracts/registry/BondingRegistry.sol +++ b/packages/enclave-contracts/contracts/registry/BondingRegistry.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { OwnableUpgradeable @@ -677,6 +677,7 @@ contract BondingRegistry is IBondingRegistry, OwnableUpgradeable { ) public onlyOwner { require(newSlashedFundsTreasury != address(0), ZeroAddress()); slashedFundsTreasury = newSlashedFundsTreasury; + emit SlashedFundsTreasurySet(newSlashedFundsTreasury); } /// @inheritdoc IBondingRegistry @@ -684,21 +685,25 @@ contract BondingRegistry is IBondingRegistry, OwnableUpgradeable { EnclaveTicketToken newTicketToken ) public onlyOwner { ticketToken = newTicketToken; + emit TicketTokenSet(address(newTicketToken)); } /// @inheritdoc IBondingRegistry function setLicenseToken(IERC20 newLicenseToken) public onlyOwner { licenseToken = newLicenseToken; + emit LicenseTokenSet(address(newLicenseToken)); } /// @inheritdoc IBondingRegistry function setRegistry(ICiphernodeRegistry newRegistry) public onlyOwner { registry = newRegistry; + emit RegistrySet(address(newRegistry)); } /// @inheritdoc IBondingRegistry function setSlashingManager(address newSlashingManager) public onlyOwner { slashingManager = newSlashingManager; + emit SlashingManagerSet(newSlashingManager); } /// @notice Authorizes an address to distribute rewards diff --git a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol index 82660aa28e..15fb028bba 100644 --- a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { ICiphernodeRegistry } from "../interfaces/ICiphernodeRegistry.sol"; import { IBondingRegistry } from "../interfaces/IBondingRegistry.sol"; @@ -36,6 +36,10 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { /// @param bondingRegistry Address of the bonding registry contract event BondingRegistrySet(address indexed bondingRegistry); + /// @notice Emitted when the slashing manager address is set + /// @param slashingManager Address of the slashing manager contract + event SlashingManagerSet(address indexed slashingManager); + //////////////////////////////////////////////////////////// // // // Storage Variables // @@ -387,6 +391,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { ) public onlyOwner { require(address(_slashingManager) != address(0), ZeroAddress()); slashingManager = _slashingManager; + emit SlashingManagerSet(address(_slashingManager)); } /// @inheritdoc ICiphernodeRegistry @@ -614,7 +619,8 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { /// @dev Uses snapshot of ticket balance at (requestBlock - 1) for deterministic validation. /// The -1 offset prevents same-block manipulation attacks where an operator could deposit /// tickets and submit in the same transaction. Deposits in the request block itself are - /// excluded. This is conservative but not fully settled — see TODO below. + /// excluded. This is conservative — deposits in the request block itself are + /// excluded to prevent same-block manipulation attacks. /// @param node Address of the ciphernode /// @param ticketNumber The ticket number being submitted /// @param e3Id ID of the E3 computation @@ -631,8 +637,9 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { Committee storage c = committees[e3Id]; - // @todo Ensure we check everywhere that we use the block before the request block - // to ensure cases where everything is done in the same block are handled correctly. + // Use ticket balance snapshot at (requestBlock - 1) for deterministic validation. + // The -1 offset prevents same-block manipulation attacks. All call sites must use + // the same snapshot convention for consistency. uint256 ticketBalance = bondingRegistry.getTicketBalanceAtBlock( node, c.requestBlock - 1 diff --git a/packages/enclave-contracts/contracts/slashing/SlashingManager.sol b/packages/enclave-contracts/contracts/slashing/SlashingManager.sol index 3e31a00777..949fab5aa4 100644 --- a/packages/enclave-contracts/contracts/slashing/SlashingManager.sol +++ b/packages/enclave-contracts/contracts/slashing/SlashingManager.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { AccessControl @@ -181,6 +181,7 @@ contract SlashingManager is ISlashingManager, AccessControl { ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(newBondingRegistry) != address(0), ZeroAddress()); bondingRegistry = newBondingRegistry; + emit BondingRegistrySet(address(newBondingRegistry)); } /// @notice Updates the ciphernode registry contract @@ -190,6 +191,7 @@ contract SlashingManager is ISlashingManager, AccessControl { ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(newCiphernodeRegistry) != address(0), ZeroAddress()); ciphernodeRegistry = newCiphernodeRegistry; + emit CiphernodeRegistrySet(address(newCiphernodeRegistry)); } /// @notice Updates the Enclave contract @@ -199,6 +201,7 @@ contract SlashingManager is ISlashingManager, AccessControl { ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(newEnclave) != address(0), ZeroAddress()); enclave = newEnclave; + emit EnclaveSet(address(newEnclave)); } /// @inheritdoc ISlashingManager @@ -207,6 +210,7 @@ contract SlashingManager is ISlashingManager, AccessControl { ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(newRefundManager) != address(0), ZeroAddress()); e3RefundManager = newRefundManager; + emit E3RefundManagerSet(address(newRefundManager)); } /// @inheritdoc ISlashingManager diff --git a/packages/enclave-contracts/contracts/test/MockCiphernodeRegistry.sol b/packages/enclave-contracts/contracts/test/MockCiphernodeRegistry.sol index 2eaf2377db..558927152d 100644 --- a/packages/enclave-contracts/contracts/test/MockCiphernodeRegistry.sol +++ b/packages/enclave-contracts/contracts/test/MockCiphernodeRegistry.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { ICiphernodeRegistry } from "../interfaces/ICiphernodeRegistry.sol"; import { IEnclave } from "../interfaces/IEnclave.sol"; diff --git a/packages/enclave-contracts/contracts/test/MockComputeProvider.sol b/packages/enclave-contracts/contracts/test/MockComputeProvider.sol index 9a759b97e6..c0704d479d 100644 --- a/packages/enclave-contracts/contracts/test/MockComputeProvider.sol +++ b/packages/enclave-contracts/contracts/test/MockComputeProvider.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IComputeProvider, diff --git a/packages/enclave-contracts/contracts/test/MockDecryptionVerifier.sol b/packages/enclave-contracts/contracts/test/MockDecryptionVerifier.sol index da5c5ff257..6b8ed8b999 100644 --- a/packages/enclave-contracts/contracts/test/MockDecryptionVerifier.sol +++ b/packages/enclave-contracts/contracts/test/MockDecryptionVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IDecryptionVerifier } from "../interfaces/IDecryptionVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/test/MockE3Program.sol b/packages/enclave-contracts/contracts/test/MockE3Program.sol index f356281d11..972298f229 100644 --- a/packages/enclave-contracts/contracts/test/MockE3Program.sol +++ b/packages/enclave-contracts/contracts/test/MockE3Program.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IE3Program } from "../interfaces/IE3Program.sol"; @@ -44,7 +44,7 @@ contract MockE3Program is IE3Program { bytes32, bytes memory data ) external pure returns (bool success) { - data; + // data parameter available for custom validation logic if (data.length > 0) success = true; } } diff --git a/packages/enclave-contracts/contracts/test/MockPkVerifier.sol b/packages/enclave-contracts/contracts/test/MockPkVerifier.sol index 0471c4116c..bd54d16ab4 100644 --- a/packages/enclave-contracts/contracts/test/MockPkVerifier.sol +++ b/packages/enclave-contracts/contracts/test/MockPkVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IPkVerifier } from "../interfaces/IPkVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/test/MockSlashingVerifier.sol b/packages/enclave-contracts/contracts/test/MockSlashingVerifier.sol index 5097d5eca8..b0f411b1e4 100644 --- a/packages/enclave-contracts/contracts/test/MockSlashingVerifier.sol +++ b/packages/enclave-contracts/contracts/test/MockSlashingVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { ICircuitVerifier } from "../interfaces/ICircuitVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/test/MockStableToken.sol b/packages/enclave-contracts/contracts/test/MockStableToken.sol index b23f7b6738..f324152e2f 100644 --- a/packages/enclave-contracts/contracts/test/MockStableToken.sol +++ b/packages/enclave-contracts/contracts/test/MockStableToken.sol @@ -3,13 +3,14 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; contract MockUSDC is ERC20, Ownable { - uint8 private _decimals; + // solhint-disable-next-line immutable-vars-naming + uint8 private immutable _decimals; constructor( uint256 initialSupply diff --git a/packages/enclave-contracts/contracts/token/EnclaveTicketToken.sol b/packages/enclave-contracts/contracts/token/EnclaveTicketToken.sol index b7be111ef8..86f6ccd3ab 100644 --- a/packages/enclave-contracts/contracts/token/EnclaveTicketToken.sol +++ b/packages/enclave-contracts/contracts/token/EnclaveTicketToken.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity ^0.8.27; +pragma solidity 0.8.28; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -61,6 +61,12 @@ contract EnclaveTicketToken is /// @dev Incremented by burnTickets, decremented by payout. Prevents payout exceeding slashed amount. uint256 public payableBalance; + /// @notice Emitted when the registry address is set + event RegistrySet(address indexed newRegistry); + + /// @notice Emitted when a payout is made + event Payout(address indexed to, uint256 amount); + /// @notice Restricts function access to only the registry contract /// @dev Reverts with NotRegistry if caller is not the registry address modifier onlyRegistry() { @@ -98,6 +104,7 @@ contract EnclaveTicketToken is function setRegistry(address newRegistry) public onlyOwner { require(newRegistry != address(0), ZeroAddress()); registry = newRegistry; + emit RegistrySet(newRegistry); } /** @@ -191,6 +198,7 @@ contract EnclaveTicketToken is require(amount <= payableBalance, "Exceeds payable balance"); payableBalance -= amount; SafeERC20.safeTransfer(IERC20(address(underlying())), to, amount); + emit Payout(to, amount); } /** diff --git a/packages/enclave-contracts/contracts/token/EnclaveToken.sol b/packages/enclave-contracts/contracts/token/EnclaveToken.sol index 0443d2d218..791421ec83 100644 --- a/packages/enclave-contracts/contracts/token/EnclaveToken.sol +++ b/packages/enclave-contracts/contracts/token/EnclaveToken.sol @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { @@ -93,21 +93,21 @@ contract EnclaveToken is * @notice Initializes the Enclave token with name "Enclave" and symbol "ENCL" * @dev Sets up the token with voting and permit functionality. Grants admin and minter * roles to the owner, enables transfer restrictions, and whitelists the owner. - * @param _owner Address that will own the contract and receive DEFAULT_ADMIN_ROLE and MINTER_ROLE + * @param initialOwner_ Address that will own the contract and receive DEFAULT_ADMIN_ROLE and MINTER_ROLE */ constructor( - address _owner - ) ERC20("Enclave", "ENCL") ERC20Permit("Enclave") Ownable(_owner) { + address initialOwner_ + ) ERC20("Enclave", "ENCL") ERC20Permit("Enclave") Ownable(initialOwner_) { // Grant the deployer all admin roles. - _grantRole(DEFAULT_ADMIN_ROLE, _owner); - _grantRole(MINTER_ROLE, _owner); + _grantRole(DEFAULT_ADMIN_ROLE, initialOwner_); + _grantRole(MINTER_ROLE, initialOwner_); // Initialise state variables. transfersRestricted = true; - transferWhitelisted[_owner] = true; + transferWhitelisted[initialOwner_] = true; emit TransferRestrictionUpdated(true); - emit TransferWhitelistUpdated(_owner, true); + emit TransferWhitelistUpdated(initialOwner_, true); } /** diff --git a/packages/enclave-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol b/packages/enclave-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol index 1520194ab3..7b9ee93640 100644 --- a/packages/enclave-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol +++ b/packages/enclave-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IDecryptionVerifier } from "../../interfaces/IDecryptionVerifier.sol"; import { ICircuitVerifier } from "../../interfaces/ICircuitVerifier.sol"; diff --git a/packages/enclave-contracts/contracts/verifiers/bfv/BfvPkVerifier.sol b/packages/enclave-contracts/contracts/verifiers/bfv/BfvPkVerifier.sol index 4b6e1ccf95..584edc2237 100644 --- a/packages/enclave-contracts/contracts/verifiers/bfv/BfvPkVerifier.sol +++ b/packages/enclave-contracts/contracts/verifiers/bfv/BfvPkVerifier.sol @@ -3,7 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pragma solidity >=0.8.27; +pragma solidity 0.8.28; import { IPkVerifier } from "../../interfaces/IPkVerifier.sol"; import { ICircuitVerifier } from "../../interfaces/ICircuitVerifier.sol";