Commit d29775ec authored by refcell.eth's avatar refcell.eth Committed by GitHub

Inline-comment documentation for MIPS.sol and styling. (#6276)

parent c3977fc6
......@@ -31,7 +31,7 @@ var (
// MIPSMetaData contains all meta data concerning the MIPS contract.
var MIPSMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[],\"name\":\"BRK_START\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"internalType\":\"contractIPreimageOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x608060405234801561001057600080fd5b50611b21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a67565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e6565b63ffffffff16901b610959565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e6565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c4565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e6565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b4d565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b89610959565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611213565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611213565b8063ffffffff16600c1415610659576105ed6112f8565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611775565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee84600184611959565b6106fa85836001611213565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f5565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f8516601c0360031b1c63ffffffff1691505092915050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610943576000610945565b815b90861663ffffffff16179250505092915050565b6000610963611a67565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b357806008018261016001518663ffffffff16602081106109a257fe5b63ffffffff90921660209290920201525b6109bb610710565b95945050505050565b60006109ce611a67565b5060806000600463ffffffff881614806109ee57508663ffffffff166005145b15610a645760008261016001518663ffffffff1660208110610a0c57fe5b602002015190508063ffffffff168563ffffffff16148015610a3457508763ffffffff166004145b80610a5c57508063ffffffff168563ffffffff1614158015610a5c57508763ffffffff166005145b915050610ae1565b8663ffffffff1660061415610a825760008460030b13159050610ae1565b8663ffffffff1660071415610a9f5760008460030b139050610ae1565b8663ffffffff1660011415610ae157601f601087901c1680610ac55760008560030b1291505b8063ffffffff1660011415610adf5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b27576002610b0c8861ffff1660106108e6565b63ffffffff90811690911b8201600401166080840152610b39565b60808301805160040163ffffffff1690525b610b41610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f215760088263ffffffff1610158015610b815750600f8263ffffffff16105b15610c28578163ffffffff1660081415610b9d57506020610c23565b8163ffffffff1660091415610bb457506021610c23565b8163ffffffff16600a1415610bcb5750602a610c23565b8163ffffffff16600b1415610be25750602b610c23565b8163ffffffff16600c1415610bf957506024610c23565b8163ffffffff16600d1415610c1057506025610c23565b8163ffffffff16600e1415610c23575060265b600091505b63ffffffff8216610e7157601f600688901c16602063ffffffff83161015610d455760088263ffffffff1610610c6357869350505050610708565b63ffffffff8216610c835763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610ca75763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd2576103788163ffffffff168763ffffffff16901c826020036108e6565b8163ffffffff1660041415610cf6575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1a575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d45576103788763ffffffff168763ffffffff16901c886020036108e6565b8163ffffffff1660201480610d6057508163ffffffff166021145b15610d72578587019350505050610708565b8163ffffffff1660221480610d8d57508163ffffffff166023145b15610d9f578587039350505050610708565b8163ffffffff1660241415610dbb578587169350505050610708565b8163ffffffff1660251415610dd7578587179350505050610708565b8163ffffffff1660261415610df3578587189350505050610708565b8163ffffffff1660271415610e0f575050505082821719610708565b8163ffffffff16602a1415610e42578560030b8760030b12610e32576000610e35565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6b578563ffffffff168763ffffffff1610610e32576000610e35565b50610f1c565b8163ffffffff16600f1415610e945760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1c578063ffffffff1660021415610ebd57505050828202610708565b8063ffffffff1660201480610ed857508063ffffffff166021145b15610f1c578063ffffffff1660201415610ef0579419945b60005b6380000000871615610f12576401fffffffe600197881b169601610ef3565b9250610708915050565b6111ac565b60288263ffffffff16101561108b578163ffffffff1660201415610f6e57610f658660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e6565b92505050610708565b8163ffffffff1660211415610fa457610f658660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e6565b8163ffffffff1660221415610fd55750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610fee578392505050610708565b8163ffffffff1660241415611022578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff1660251415611057578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1c5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c35750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110fc5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a141561112d5750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611146578492505050610708565b8163ffffffff16602e141561117a5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611193578392505050610708565b8163ffffffff16603814156111ac578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b600061121d611a67565b506080602063ffffffff86161061129557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112a75750825b156112d557838161016001518663ffffffff16602081106112c457fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109bb610710565b6000611302611a67565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137a5781610fff81161561134c57610fff811661100003015b63ffffffff84166113705760e08801805163ffffffff838201169091529550611374565b8395505b50611728565b8563ffffffff16610fcd14156113965763400000009450611728565b8563ffffffff1661101814156113af5760019450611728565b8563ffffffff1661109614156113e757600161012088015260ff83166101008801526113d9610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a65763ffffffff8316611407576115a1565b63ffffffff83166005141561157e5760006114298363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d60408110156114dd57600080fd5b508051602090910151909250905060038516600481900382811015611500578092505b508185101561150d578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115648563fffffffc16600185611959565b60408a018051820163ffffffff16905296506115a1915050565b63ffffffff831660031415611595578094506115a1565b63ffffffff9450600993505b611728565b8563ffffffff16610fa4141561167a5763ffffffff8316600114806115d1575063ffffffff83166002145b806115e2575063ffffffff83166004145b156115ef578094506115a1565b63ffffffff8316600614156115955760006116118363fffffffc16600161081e565b6020890151909150600384166004038381101561162c578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a1565b8563ffffffff16610fd71415611728578163ffffffff166003141561171c5763ffffffff831615806116b2575063ffffffff83166005145b806116c3575063ffffffff83166003145b156116d157600094506115a1565b63ffffffff8316600114806116ec575063ffffffff83166002145b806116fd575063ffffffff83166006145b8061170e575063ffffffff83166004145b1561159557600194506115a1565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b01526004019091169052611769610710565b97505050505050505090565b600061177f611a67565b5060806000601063ffffffff8816141561179e575060c08101516118f6565b8663ffffffff16601114156117be5763ffffffff861660c08301526118f6565b8663ffffffff16601214156117d8575060a08101516118f6565b8663ffffffff16601314156117f85763ffffffff861660a08301526118f6565b8663ffffffff166018141561182d5763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f6565b8663ffffffff166019141561185f5763ffffffff86811681871602602081901c821660c08501521660a08301526118f6565b8663ffffffff16601a14156118aa578460030b8660030b8161187d57fe5b0763ffffffff1660c0830152600385810b9087900b8161189957fe5b0563ffffffff1660a08301526118f6565b8663ffffffff16601b14156118f6578463ffffffff168663ffffffff16816118ce57fe5b0663ffffffff90811660c0840152858116908716816118e957fe5b0463ffffffff1660a08301525b63ffffffff84161561192b57808261016001518563ffffffff166020811061191a57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff8082166060860152600490910116905261194e610710565b979650505050505050565b6000611964836119f5565b9050600384161561197457600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ea5760208401933582821c60011680156119c257600181146119d3576119e0565b6119cc8286610845565b94506119e0565b6119dd8583610845565b94505b505060010161199a565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af26023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611acd611ad2565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a",
Bin: "0x608060405234801561001057600080fd5b50611b24806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a6a565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e9565b63ffffffff16901b61095c565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e9565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c7565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e9565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b50565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b8961095c565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611216565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611216565b8063ffffffff16600c1415610659576105ed6112fb565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611778565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee8460018461195c565b6106fa85836001611216565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f8565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610946576000610948565b815b90861663ffffffff16179250505092915050565b6000610966611a6a565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b657806008018261016001518663ffffffff16602081106109a557fe5b63ffffffff90921660209290920201525b6109be610710565b95945050505050565b60006109d1611a6a565b5060806000600463ffffffff881614806109f157508663ffffffff166005145b15610a675760008261016001518663ffffffff1660208110610a0f57fe5b602002015190508063ffffffff168563ffffffff16148015610a3757508763ffffffff166004145b80610a5f57508063ffffffff168563ffffffff1614158015610a5f57508763ffffffff166005145b915050610ae4565b8663ffffffff1660061415610a855760008460030b13159050610ae4565b8663ffffffff1660071415610aa25760008460030b139050610ae4565b8663ffffffff1660011415610ae457601f601087901c1680610ac85760008560030b1291505b8063ffffffff1660011415610ae25760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b2a576002610b0f8861ffff1660106108e9565b63ffffffff90811690911b8201600401166080840152610b3c565b60808301805160040163ffffffff1690525b610b44610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f245760088263ffffffff1610158015610b845750600f8263ffffffff16105b15610c2b578163ffffffff1660081415610ba057506020610c26565b8163ffffffff1660091415610bb757506021610c26565b8163ffffffff16600a1415610bce5750602a610c26565b8163ffffffff16600b1415610be55750602b610c26565b8163ffffffff16600c1415610bfc57506024610c26565b8163ffffffff16600d1415610c1357506025610c26565b8163ffffffff16600e1415610c26575060265b600091505b63ffffffff8216610e7457601f600688901c16602063ffffffff83161015610d485760088263ffffffff1610610c6657869350505050610708565b63ffffffff8216610c865763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610caa5763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd5576103788163ffffffff168763ffffffff16901c826020036108e9565b8163ffffffff1660041415610cf9575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1d575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d48576103788763ffffffff168763ffffffff16901c886020036108e9565b8163ffffffff1660201480610d6357508163ffffffff166021145b15610d75578587019350505050610708565b8163ffffffff1660221480610d9057508163ffffffff166023145b15610da2578587039350505050610708565b8163ffffffff1660241415610dbe578587169350505050610708565b8163ffffffff1660251415610dda578587179350505050610708565b8163ffffffff1660261415610df6578587189350505050610708565b8163ffffffff1660271415610e12575050505082821719610708565b8163ffffffff16602a1415610e45578560030b8760030b12610e35576000610e38565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6e578563ffffffff168763ffffffff1610610e35576000610e38565b50610f1f565b8163ffffffff16600f1415610e975760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1f578063ffffffff1660021415610ec057505050828202610708565b8063ffffffff1660201480610edb57508063ffffffff166021145b15610f1f578063ffffffff1660201415610ef3579419945b60005b6380000000871615610f15576401fffffffe600197881b169601610ef6565b9250610708915050565b6111af565b60288263ffffffff16101561108e578163ffffffff1660201415610f7157610f688660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e9565b92505050610708565b8163ffffffff1660211415610fa757610f688660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e9565b8163ffffffff1660221415610fd85750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610ff1578392505050610708565b8163ffffffff1660241415611025578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff166025141561105a578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1f5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c65750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110ff5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a14156111305750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611149578492505050610708565b8163ffffffff16602e141561117d5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611196578392505050610708565b8163ffffffff16603814156111af578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b6000611220611a6a565b506080602063ffffffff86161061129857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112aa5750825b156112d857838161016001518663ffffffff16602081106112c757fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109be610710565b6000611305611a6a565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137d5781610fff81161561134f57610fff811661100003015b63ffffffff84166113735760e08801805163ffffffff838201169091529550611377565b8395505b5061172b565b8563ffffffff16610fcd1415611399576340000000945061172b565b8563ffffffff1661101814156113b2576001945061172b565b8563ffffffff1661109614156113ea57600161012088015260ff83166101008801526113dc610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a95763ffffffff831661140a576115a4565b63ffffffff83166005141561158157600061142c8363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b657600080fd5b505afa1580156114ca573d6000803e3d6000fd5b505050506040513d60408110156114e057600080fd5b508051602090910151909250905060038516600481900382811015611503578092505b5081851015611510578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115678563fffffffc1660018561195c565b60408a018051820163ffffffff16905296506115a4915050565b63ffffffff831660031415611598578094506115a4565b63ffffffff9450600993505b61172b565b8563ffffffff16610fa4141561167d5763ffffffff8316600114806115d4575063ffffffff83166002145b806115e5575063ffffffff83166004145b156115f2578094506115a4565b63ffffffff8316600614156115985760006116148363fffffffc16600161081e565b6020890151909150600384166004038381101561162f578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a4565b8563ffffffff16610fd7141561172b578163ffffffff166003141561171f5763ffffffff831615806116b5575063ffffffff83166005145b806116c6575063ffffffff83166003145b156116d457600094506115a4565b63ffffffff8316600114806116ef575063ffffffff83166002145b80611700575063ffffffff83166006145b80611711575063ffffffff83166004145b1561159857600194506115a4565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261176c610710565b97505050505050505090565b6000611782611a6a565b5060806000601063ffffffff881614156117a1575060c08101516118f9565b8663ffffffff16601114156117c15763ffffffff861660c08301526118f9565b8663ffffffff16601214156117db575060a08101516118f9565b8663ffffffff16601314156117fb5763ffffffff861660a08301526118f9565b8663ffffffff16601814156118305763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f9565b8663ffffffff16601914156118625763ffffffff86811681871602602081901c821660c08501521660a08301526118f9565b8663ffffffff16601a14156118ad578460030b8660030b8161188057fe5b0763ffffffff1660c0830152600385810b9087900b8161189c57fe5b0563ffffffff1660a08301526118f9565b8663ffffffff16601b14156118f9578463ffffffff168663ffffffff16816118d157fe5b0663ffffffff90811660c0840152858116908716816118ec57fe5b0463ffffffff1660a08301525b63ffffffff84161561192e57808261016001518563ffffffff166020811061191d57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611951610710565b979650505050505050565b6000611967836119f8565b9050600384161561197757600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ed5760208401933582821c60011680156119c557600181146119d6576119e3565b6119cf8286610845565b94506119e3565b6119e08583610845565b94505b505060010161199d565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af56023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611ad0611ad5565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a",
}
// MIPSABI is the input ABI used to generate the binding from.
......
......@@ -13,9 +13,9 @@ const MIPSStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"cont
var MIPSStorageLayout = new(solc.StorageLayout)
var MIPSDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a67565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e6565b63ffffffff16901b610959565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e6565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c4565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e6565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b4d565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b89610959565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611213565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611213565b8063ffffffff16600c1415610659576105ed6112f8565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611775565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee84600184611959565b6106fa85836001611213565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f5565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f8516601c0360031b1c63ffffffff1691505092915050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610943576000610945565b815b90861663ffffffff16179250505092915050565b6000610963611a67565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b357806008018261016001518663ffffffff16602081106109a257fe5b63ffffffff90921660209290920201525b6109bb610710565b95945050505050565b60006109ce611a67565b5060806000600463ffffffff881614806109ee57508663ffffffff166005145b15610a645760008261016001518663ffffffff1660208110610a0c57fe5b602002015190508063ffffffff168563ffffffff16148015610a3457508763ffffffff166004145b80610a5c57508063ffffffff168563ffffffff1614158015610a5c57508763ffffffff166005145b915050610ae1565b8663ffffffff1660061415610a825760008460030b13159050610ae1565b8663ffffffff1660071415610a9f5760008460030b139050610ae1565b8663ffffffff1660011415610ae157601f601087901c1680610ac55760008560030b1291505b8063ffffffff1660011415610adf5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b27576002610b0c8861ffff1660106108e6565b63ffffffff90811690911b8201600401166080840152610b39565b60808301805160040163ffffffff1690525b610b41610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f215760088263ffffffff1610158015610b815750600f8263ffffffff16105b15610c28578163ffffffff1660081415610b9d57506020610c23565b8163ffffffff1660091415610bb457506021610c23565b8163ffffffff16600a1415610bcb5750602a610c23565b8163ffffffff16600b1415610be25750602b610c23565b8163ffffffff16600c1415610bf957506024610c23565b8163ffffffff16600d1415610c1057506025610c23565b8163ffffffff16600e1415610c23575060265b600091505b63ffffffff8216610e7157601f600688901c16602063ffffffff83161015610d455760088263ffffffff1610610c6357869350505050610708565b63ffffffff8216610c835763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610ca75763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd2576103788163ffffffff168763ffffffff16901c826020036108e6565b8163ffffffff1660041415610cf6575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1a575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d45576103788763ffffffff168763ffffffff16901c886020036108e6565b8163ffffffff1660201480610d6057508163ffffffff166021145b15610d72578587019350505050610708565b8163ffffffff1660221480610d8d57508163ffffffff166023145b15610d9f578587039350505050610708565b8163ffffffff1660241415610dbb578587169350505050610708565b8163ffffffff1660251415610dd7578587179350505050610708565b8163ffffffff1660261415610df3578587189350505050610708565b8163ffffffff1660271415610e0f575050505082821719610708565b8163ffffffff16602a1415610e42578560030b8760030b12610e32576000610e35565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6b578563ffffffff168763ffffffff1610610e32576000610e35565b50610f1c565b8163ffffffff16600f1415610e945760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1c578063ffffffff1660021415610ebd57505050828202610708565b8063ffffffff1660201480610ed857508063ffffffff166021145b15610f1c578063ffffffff1660201415610ef0579419945b60005b6380000000871615610f12576401fffffffe600197881b169601610ef3565b9250610708915050565b6111ac565b60288263ffffffff16101561108b578163ffffffff1660201415610f6e57610f658660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e6565b92505050610708565b8163ffffffff1660211415610fa457610f658660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e6565b8163ffffffff1660221415610fd55750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610fee578392505050610708565b8163ffffffff1660241415611022578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff1660251415611057578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1c5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c35750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110fc5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a141561112d5750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611146578492505050610708565b8163ffffffff16602e141561117a5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611193578392505050610708565b8163ffffffff16603814156111ac578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b600061121d611a67565b506080602063ffffffff86161061129557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112a75750825b156112d557838161016001518663ffffffff16602081106112c457fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109bb610710565b6000611302611a67565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137a5781610fff81161561134c57610fff811661100003015b63ffffffff84166113705760e08801805163ffffffff838201169091529550611374565b8395505b50611728565b8563ffffffff16610fcd14156113965763400000009450611728565b8563ffffffff1661101814156113af5760019450611728565b8563ffffffff1661109614156113e757600161012088015260ff83166101008801526113d9610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a65763ffffffff8316611407576115a1565b63ffffffff83166005141561157e5760006114298363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d60408110156114dd57600080fd5b508051602090910151909250905060038516600481900382811015611500578092505b508185101561150d578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115648563fffffffc16600185611959565b60408a018051820163ffffffff16905296506115a1915050565b63ffffffff831660031415611595578094506115a1565b63ffffffff9450600993505b611728565b8563ffffffff16610fa4141561167a5763ffffffff8316600114806115d1575063ffffffff83166002145b806115e2575063ffffffff83166004145b156115ef578094506115a1565b63ffffffff8316600614156115955760006116118363fffffffc16600161081e565b6020890151909150600384166004038381101561162c578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a1565b8563ffffffff16610fd71415611728578163ffffffff166003141561171c5763ffffffff831615806116b2575063ffffffff83166005145b806116c3575063ffffffff83166003145b156116d157600094506115a1565b63ffffffff8316600114806116ec575063ffffffff83166002145b806116fd575063ffffffff83166006145b8061170e575063ffffffff83166004145b1561159557600194506115a1565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b01526004019091169052611769610710565b97505050505050505090565b600061177f611a67565b5060806000601063ffffffff8816141561179e575060c08101516118f6565b8663ffffffff16601114156117be5763ffffffff861660c08301526118f6565b8663ffffffff16601214156117d8575060a08101516118f6565b8663ffffffff16601314156117f85763ffffffff861660a08301526118f6565b8663ffffffff166018141561182d5763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f6565b8663ffffffff166019141561185f5763ffffffff86811681871602602081901c821660c08501521660a08301526118f6565b8663ffffffff16601a14156118aa578460030b8660030b8161187d57fe5b0763ffffffff1660c0830152600385810b9087900b8161189957fe5b0563ffffffff1660a08301526118f6565b8663ffffffff16601b14156118f6578463ffffffff168663ffffffff16816118ce57fe5b0663ffffffff90811660c0840152858116908716816118e957fe5b0463ffffffff1660a08301525b63ffffffff84161561192b57808261016001518563ffffffff166020811061191a57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff8082166060860152600490910116905261194e610710565b979650505050505050565b6000611964836119f5565b9050600384161561197457600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ea5760208401933582821c60011680156119c257600181146119d3576119e0565b6119cc8286610845565b94506119e0565b6119dd8583610845565b94505b505060010161199a565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af26023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611acd611ad2565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
var MIPSDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a6a565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e9565b63ffffffff16901b61095c565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e9565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c7565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e9565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b50565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b8961095c565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611216565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611216565b8063ffffffff16600c1415610659576105ed6112fb565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611778565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee8460018461195c565b6106fa85836001611216565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f8565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610946576000610948565b815b90861663ffffffff16179250505092915050565b6000610966611a6a565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b657806008018261016001518663ffffffff16602081106109a557fe5b63ffffffff90921660209290920201525b6109be610710565b95945050505050565b60006109d1611a6a565b5060806000600463ffffffff881614806109f157508663ffffffff166005145b15610a675760008261016001518663ffffffff1660208110610a0f57fe5b602002015190508063ffffffff168563ffffffff16148015610a3757508763ffffffff166004145b80610a5f57508063ffffffff168563ffffffff1614158015610a5f57508763ffffffff166005145b915050610ae4565b8663ffffffff1660061415610a855760008460030b13159050610ae4565b8663ffffffff1660071415610aa25760008460030b139050610ae4565b8663ffffffff1660011415610ae457601f601087901c1680610ac85760008560030b1291505b8063ffffffff1660011415610ae25760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b2a576002610b0f8861ffff1660106108e9565b63ffffffff90811690911b8201600401166080840152610b3c565b60808301805160040163ffffffff1690525b610b44610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f245760088263ffffffff1610158015610b845750600f8263ffffffff16105b15610c2b578163ffffffff1660081415610ba057506020610c26565b8163ffffffff1660091415610bb757506021610c26565b8163ffffffff16600a1415610bce5750602a610c26565b8163ffffffff16600b1415610be55750602b610c26565b8163ffffffff16600c1415610bfc57506024610c26565b8163ffffffff16600d1415610c1357506025610c26565b8163ffffffff16600e1415610c26575060265b600091505b63ffffffff8216610e7457601f600688901c16602063ffffffff83161015610d485760088263ffffffff1610610c6657869350505050610708565b63ffffffff8216610c865763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610caa5763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd5576103788163ffffffff168763ffffffff16901c826020036108e9565b8163ffffffff1660041415610cf9575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1d575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d48576103788763ffffffff168763ffffffff16901c886020036108e9565b8163ffffffff1660201480610d6357508163ffffffff166021145b15610d75578587019350505050610708565b8163ffffffff1660221480610d9057508163ffffffff166023145b15610da2578587039350505050610708565b8163ffffffff1660241415610dbe578587169350505050610708565b8163ffffffff1660251415610dda578587179350505050610708565b8163ffffffff1660261415610df6578587189350505050610708565b8163ffffffff1660271415610e12575050505082821719610708565b8163ffffffff16602a1415610e45578560030b8760030b12610e35576000610e38565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6e578563ffffffff168763ffffffff1610610e35576000610e38565b50610f1f565b8163ffffffff16600f1415610e975760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1f578063ffffffff1660021415610ec057505050828202610708565b8063ffffffff1660201480610edb57508063ffffffff166021145b15610f1f578063ffffffff1660201415610ef3579419945b60005b6380000000871615610f15576401fffffffe600197881b169601610ef6565b9250610708915050565b6111af565b60288263ffffffff16101561108e578163ffffffff1660201415610f7157610f688660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e9565b92505050610708565b8163ffffffff1660211415610fa757610f688660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e9565b8163ffffffff1660221415610fd85750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610ff1578392505050610708565b8163ffffffff1660241415611025578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff166025141561105a578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1f5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c65750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110ff5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a14156111305750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611149578492505050610708565b8163ffffffff16602e141561117d5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611196578392505050610708565b8163ffffffff16603814156111af578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b6000611220611a6a565b506080602063ffffffff86161061129857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112aa5750825b156112d857838161016001518663ffffffff16602081106112c757fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109be610710565b6000611305611a6a565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137d5781610fff81161561134f57610fff811661100003015b63ffffffff84166113735760e08801805163ffffffff838201169091529550611377565b8395505b5061172b565b8563ffffffff16610fcd1415611399576340000000945061172b565b8563ffffffff1661101814156113b2576001945061172b565b8563ffffffff1661109614156113ea57600161012088015260ff83166101008801526113dc610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a95763ffffffff831661140a576115a4565b63ffffffff83166005141561158157600061142c8363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b657600080fd5b505afa1580156114ca573d6000803e3d6000fd5b505050506040513d60408110156114e057600080fd5b508051602090910151909250905060038516600481900382811015611503578092505b5081851015611510578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115678563fffffffc1660018561195c565b60408a018051820163ffffffff16905296506115a4915050565b63ffffffff831660031415611598578094506115a4565b63ffffffff9450600993505b61172b565b8563ffffffff16610fa4141561167d5763ffffffff8316600114806115d4575063ffffffff83166002145b806115e5575063ffffffff83166004145b156115f2578094506115a4565b63ffffffff8316600614156115985760006116148363fffffffc16600161081e565b6020890151909150600384166004038381101561162f578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a4565b8563ffffffff16610fd7141561172b578163ffffffff166003141561171f5763ffffffff831615806116b5575063ffffffff83166005145b806116c6575063ffffffff83166003145b156116d457600094506115a4565b63ffffffff8316600114806116ef575063ffffffff83166002145b80611700575063ffffffff83166006145b80611711575063ffffffff83166004145b1561159857600194506115a4565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261176c610710565b97505050505050505090565b6000611782611a6a565b5060806000601063ffffffff881614156117a1575060c08101516118f9565b8663ffffffff16601114156117c15763ffffffff861660c08301526118f9565b8663ffffffff16601214156117db575060a08101516118f9565b8663ffffffff16601314156117fb5763ffffffff861660a08301526118f9565b8663ffffffff16601814156118305763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f9565b8663ffffffff16601914156118625763ffffffff86811681871602602081901c821660c08501521660a08301526118f9565b8663ffffffff16601a14156118ad578460030b8660030b8161188057fe5b0763ffffffff1660c0830152600385810b9087900b8161189c57fe5b0563ffffffff1660a08301526118f9565b8663ffffffff16601b14156118f9578463ffffffff168663ffffffff16816118d157fe5b0663ffffffff90811660c0840152858116908716816118ec57fe5b0463ffffffff1660a08301525b63ffffffff84161561192e57808261016001518563ffffffff166020811061191d57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611951610710565b979650505050505050565b6000611967836119f8565b9050600384161561197757600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ed5760208401933582821c60011680156119c557600181146119d6576119e3565b6119cf8286610845565b94506119e3565b6119e08583610845565b94505b505060010161199d565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af56023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611ad0611ad5565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
var MIPSDeployedSourceMap = "957:22415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1355:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1723:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14308:4789;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14308:4789:0;;-1:-1:-1;14308:4789:0;-1:-1:-1;14308:4789:0;:::i;:::-;;;;;;;;;;;;;;;;1355:45;1390:10;1355:45;:::o;1723:29::-;;;;;;:::o;14308:4789::-;14386:7;14401:18;;:::i;:::-;14501:4;14494:5;14491:15;14481:2;;14562:1;14560;14553:11;14481:2;14598:4;14592:11;14605;14589:28;14579:2;;14663:1;14661;14654:11;14579:2;14711:3;14693:16;14690:25;14680:2;;14777:1;14775;14768:11;14680:2;14821:3;14807:12;14804:21;14794:2;;14886:1;14884;14877:11;14794:2;14903:370;;;15121:24;;15109:2;15105:13;;;15102:1;15098:21;15094:52;;;;15155:20;;15201:21;;;15247:18;;;14981:292::o;:::-;15289:16;15340:4;15373:18;15388:2;15385:1;15382;15373:18;:::i;:::-;15365:26;;;;15417:18;15432:2;15429:1;15426;15417:18;:::i;:::-;15409:26;;;;15465:17;15480:1;15477;15474;15465:17;:::i;:::-;15457:25;;;;15515:17;15530:1;15527;15524;15515:17;:::i;:::-;15507:25;;;;15553:17;15568:1;15565;15562;15553:17;:::i;:::-;15545:25;;;;15595:17;15610:1;15607;15604;15595:17;:::i;:::-;15587:25;;;;15633:17;15648:1;15645;15642;15633:17;:::i;:::-;15625:25;;;;15671:17;15686:1;15683;15680;15671:17;:::i;:::-;15663:25;;;;15711:17;15726:1;15723;15720;15711:17;:::i;:::-;15703:25;;;;15755:17;15770:1;15767;15764;15755:17;:::i;:::-;15747:25;;;;15797:17;15812:1;15809;15806;15797:17;:::i;:::-;15846:2;15839:10;;15829:21;;;;15789:25;;-1:-1:-1;15839:10:0;-1:-1:-1;15917:1:0;15902:77;15927:2;15924:1;15921:9;15902:77;;;15960:17;15975:1;15972;15969;15960:17;:::i;:::-;15952:25;;-1:-1:-1;15952:25:0;-1:-1:-1;15945:1:0;15938:9;15902:77;;;15906:14;;;16006:5;:12;;;16003:86;;;16069:13;:11;:13::i;:::-;16062:20;;;;;16003:86;16094:10;;;:15;;16108:1;16094:15;;;;;16163:8;;;;-1:-1:-1;;16155:20:0;;-1:-1:-1;16155:7:0;:20::i;:::-;16141:34;-1:-1:-1;16198:10:0;16206:2;16198:10;;;;16259:1;16249:11;;;:26;;;16264:6;:11;;16274:1;16264:11;16249:26;16245:308;;;16484:62;16495:6;:11;;16505:1;16495:11;:20;;16513:2;16495:20;;;16509:1;16495:20;16484:62;;16544:1;16517:23;16520:4;16525:10;16520:15;16537:2;16517;:23::i;:::-;:28;;;;16484:10;:62::i;:::-;16477:69;;;;;;;16245:308;16754:15;;;;16581:9;;;;16702:4;16696:2;16688:10;;;16687:19;;;16754:15;16779:2;16771:10;;;16770:19;16754:36;;;;;;;;;;;;-1:-1:-1;16811:5:0;16826:11;;;;;:29;;;16841:6;:14;;16851:4;16841:14;16826:29;16822:636;;;16898:5;:15;;;16914:5;16898:22;;;;;;;;;;;;;;-1:-1:-1;;16951:4:0;16945:2;16937:10;;;16936:19;16822:636;;;16981:4;16972:6;:13;;;16968:490;;;17072:6;:13;;17082:3;17072:13;:30;;;;17089:6;:13;;17099:3;17089:13;17072:30;:47;;;;17106:6;:13;;17116:3;17106:13;17072:47;17068:181;;;17158:4;17163:6;17158:11;17153:16;;17068:181;;;17221:19;17224:4;17229:6;17224:11;17237:2;17221;:19::i;:::-;17216:24;;17068:181;16968:490;;;17275:4;17265:6;:14;;;;:32;;;;17283:6;:14;;17293:4;17283:14;17265:32;:50;;;;17301:6;:14;;17311:4;17301:14;17265:50;17261:197;;;17365:5;:15;;;17381:5;17365:22;;;;;;;;;;;;;17360:27;;17446:5;17438:13;;17261:197;17479:1;17469:6;:11;;;;:25;;;;;17493:1;17484:6;:10;;;17469:25;17468:42;;;;17499:6;:11;;17509:1;17499:11;17468:42;17464:107;;;17527:37;17540:6;17548:4;17554:5;17561:2;17527:12;:37::i;:::-;17520:44;;;;;;;;;;;17464:107;17596:13;17577:16;17716:4;17706:14;;;;17702:328;;17765:19;17768:4;17773:6;17768:11;17781:2;17765;:19::i;:::-;17759:25;;;;17811:10;17806:15;;17835:16;17806:15;17849:1;17835:7;:16::i;:::-;17829:22;;17873:4;17863:6;:14;;;;:32;;;;;17881:6;:14;;17891:4;17881:14;;17863:32;17859:165;;;17936:4;17924:16;;18014:1;18006:9;;17859:165;17702:328;;18047:10;18060:26;18068:4;18074:2;18078;18082:3;18060:7;:26::i;:::-;18089:10;18060:39;;;;-1:-1:-1;18177:4:0;18170:11;;;18201;;;:24;;;;;18224:1;18216:4;:9;;;;18201:24;:39;;;;;18236:4;18229;:11;;;18201:39;18197:589;;;18254:4;:9;;18262:1;18254:9;:22;;;;18267:4;:9;;18275:1;18267:9;18254:22;18250:102;;;18306:37;18317:4;:9;;18325:1;18317:9;:21;;18333:5;18317:21;;;18329:1;18317:21;18340:2;18306:10;:37::i;:::-;18299:44;;;;;;;;;;;;;;;18250:102;18364:4;:11;;18372:3;18364:11;18360:79;;;18402:28;18411:5;18418:2;18422:7;;;;18402:8;:28::i;18360:79::-;18450:4;:11;;18458:3;18450:11;18446:79;;;18488:28;18497:5;18504:2;18508:7;;;;;18488:8;:28::i;18446:79::-;18575:4;:11;;18583:3;18575:11;18571:58;;;18605:15;:13;:15::i;18571:58::-;18702:4;18694;:12;;;;:27;;;;;18717:4;18710;:11;;;18694:27;18690:90;;;18740:31;18751:4;18757:2;18761;18765:5;18740:10;:31::i;18690:90::-;18830:6;:14;;18840:4;18830:14;:28;;;;-1:-1:-1;18848:10:0;;;;;18830:28;18826:75;;;18893:1;18868:5;:15;;;18884:5;18868:22;;;;;;;;;:26;;;;:22;;;;;;:26;18826:75;18931:9;:26;;18944:13;18931:26;18927:74;;18967:27;18976:9;18987:1;18990:3;18967:8;:27::i;:::-;19066:26;19075:5;19082:3;19087:4;19066:8;:26::i;:::-;19059:33;;;;;;;;;;;;;14308:4789;;;;;;;:::o;2017:1331::-;2058:11;2186:176;;;2278:2;2274:13;;;2264:24;;2258:31;2247:43;;2310:13;;2341;;;2237:125::o;:::-;2381:4;2420;2414:11;2458:5;2482:21;2500:2;2496;2490:4;2482:21;:::i;:::-;2470:33;;;;2533:21;2551:2;2547;2541:4;2533:21;:::i;:::-;2521:33;;;;2588:20;2606:1;2602:2;2596:4;2588:20;:::i;:::-;2576:32;;;;2645:20;2663:1;2659:2;2653:4;2645:20;:::i;:::-;2633:32;;;;2690:20;2708:1;2704:2;2698:4;2690:20;:::i;:::-;2678:32;;;;2739:20;2757:1;2753:2;2747:4;2739:20;:::i;:::-;2727:32;;;;2784:20;2802:1;2798:2;2792:4;2784:20;:::i;:::-;2772:32;;;;2829:20;2847:1;2843:2;2837:4;2829:20;:::i;:::-;2817:32;;;;2876:20;2894:1;2890:2;2884:4;2876:20;:::i;:::-;2864:32;;;;2927:20;2945:1;2941:2;2935:4;2927:20;:::i;:::-;2915:32;;;;2976:20;2994:1;2990:2;2984:4;2976:20;:::i;:::-;3029:2;3019:13;;;;-1:-1:-1;2964:32:0;-1:-1:-1;3077:1:0;3062:84;3087:2;3084:1;3081:9;3062:84;;;3124:20;3142:1;3138:2;3132:4;3124:20;:::i;:::-;3112:32;;-1:-1:-1;3112:32:0;-1:-1:-1;3105:1:0;3098:9;3062:84;;;3066:14;3177:1;3173:2;3166:13;3222:5;3218:2;3214:14;3207:5;3202:27;3307:14;;;3290:32;;;-1:-1:-1;;2017:1331:0;;:::o;11710:1270::-;11781:10;11799:14;11816:23;11828:10;11816:11;:23::i;:::-;11799:40;;11875:1;11869:4;11865:12;11862:2;;;11890:1;11887;11880:12;11862:2;11992;11980:15;;;11943:20;12002:169;;;;12041:12;;;12127:2;12120:13;;;;12160:2;12147:16;;;12031:140::o;:::-;12197:4;12194:1;12190:12;12221:4;12344:1;12329:273;12354:2;12351:1;12348:9;12329:273;;;12453:2;12441:15;;;12402:20;12476:12;;;12490:1;12472:20;12501:42;;;;12557:1;12552:42;;;;12465:129;;12501:42;12518:23;12533:7;12527:4;12518:23;:::i;:::-;12510:31;;12501:42;;12552;12569:23;12587:4;12578:7;12569:23;:::i;:::-;12561:31;;12465:129;-1:-1:-1;;12372:1:0;12365:9;12329:273;;;12333:14;12630:4;12624:11;12609:26;;12699:7;12693:4;12690:17;12680:2;;12756:10;12753:1;12746:21;12786:2;12783:1;12776:13;12680:2;-1:-1:-1;;12902:2:0;12892:13;;12880:10;12876:30;12873:1;12869:38;12925:16;12943:10;12921:33;;-1:-1:-1;;11710:1270:0;;;;:::o;1757:256::-;1816:6;1847:14;;;;1855:5;;;;1847:14;;;;;;1846:21;;;;;1859:1;1898:2;:6;;;1892:13;;;;;1891:19;;1890:28;;;;;;;1940:8;;1939:14;1846:21;1985;;2005:1;1985:21;;;1996:6;1985:21;1973:8;;;;;:34;;-1:-1:-1;;;1757:256:0;;;;:::o;10382:401::-;10449:7;10464:18;;:::i;:::-;-1:-1:-1;10545:8:0;;;10570:12;;;10559:23;;;;;;;10588:19;;;;;10514:4;;10617:12;;;10613:140;;10666:6;10673:1;10666:8;10639:5;:15;;;10655:7;10639:24;;;;;;;;;:35;;;;:24;;;;;;:35;10613:140;10765:13;:11;:13::i;:::-;10758:20;10382:401;-1:-1:-1;;;;;10382:401:0:o;8224:1063::-;8317:7;8332:18;;:::i;:::-;-1:-1:-1;8382:4:0;8397:17;8443:1;8433:11;;;;;:26;;;8448:6;:11;;8458:1;8448:11;8433:26;8429:514;;;8482:9;8494:5;:15;;;8510:5;8494:22;;;;;;;;;;;;;8482:34;;8546:2;8540:8;;:2;:8;;;:23;;;;;8552:6;:11;;8562:1;8552:11;8540:23;8539:54;;;;8575:2;8569:8;;:2;:8;;;;:23;;;;;8581:6;:11;;8591:1;8581:11;8569:23;8524:69;;8429:514;;;;8610:6;:11;;8620:1;8610:11;8606:337;;;8653:1;8646:2;8640:14;;;;8625:29;;8606:337;;;8679:6;:11;;8689:1;8679:11;8675:268;;;8721:1;8715:2;8709:13;;;8694:28;;8675:268;;;8747:6;:11;;8757:1;8747:11;8743:200;;;8813:4;8807:2;8799:10;;;8798:19;8830:8;8826:42;;8867:1;8861:2;8855:13;;;8840:28;;8826:42;8889:3;:8;;8896:1;8889:8;8885:43;;;8927:1;8920:2;8914:14;;;;8899:29;;8885:43;8743:200;;8965:8;;;;;8990:12;;;;8979:23;;;;;9040:216;;;;9116:1;9095:19;9098:4;9103:6;9098:11;9111:2;9095;:19::i;:::-;:22;;;;;;;9081:37;;9090:1;9081:37;9066:52;:12;;;:52;9040:216;;;9213:12;;;;;9228:1;9213:16;9198:31;;;;9040:216;9269:13;:11;:13::i;:::-;9262:20;8224:1063;-1:-1:-1;;;;;;;;8224:1063:0:o;19101:4269::-;19188:6;19218:10;19226:2;19218:10;;;;;;19261:11;;19357:4;19348:13;;19344:3986;;;19458:1;19448:6;:11;;;;:27;;;;;19472:3;19463:6;:12;;;19448:27;19444:462;;;19491:6;:11;;19501:1;19491:11;19487:383;;;-1:-1:-1;19513:4:0;19487:383;;;19553:6;:11;;19563:1;19553:11;19549:321;;;-1:-1:-1;19575:4:0;19549:321;;;19611:6;:13;;19621:3;19611:13;19607:263;;;-1:-1:-1;19635:4:0;19607:263;;;19668:6;:13;;19678:3;19668:13;19664:206;;;-1:-1:-1;19692:4:0;19664:206;;;19726:6;:13;;19736:3;19726:13;19722:148;;;-1:-1:-1;19750:4:0;19722:148;;;19783:6;:13;;19793:3;19783:13;19779:91;;;-1:-1:-1;19807:4:0;19779:91;;;19839:6;:13;;19849:3;19839:13;19835:35;;;-1:-1:-1;19863:4:0;19835:35;19896:1;19887:10;;19444:462;19947:11;;;19943:1701;;19999:4;19994:1;19986:9;;;19985:18;20024:4;19986:9;20017:11;;;20013:588;;;20054:4;20046;:12;;;20042:549;;20069:2;20062:9;;;;;;;20042:549;20149:12;;;20145:446;;20172:11;;;;;;;;-1:-1:-1;20165:18:0;;-1:-1:-1;;20165:18:0;20145:446;20218:4;:12;;20226:4;20218:12;20214:377;;;20241:11;;;;;;;;-1:-1:-1;20234:18:0;;-1:-1:-1;;20234:18:0;20214:377;20287:4;:12;;20295:4;20287:12;20283:308;;;20310:25;20319:5;20313:11;;:2;:11;;;;20329:5;20326:2;:8;20310:2;:25::i;20283:308::-;20370:4;:12;;20378:4;20370:12;20366:225;;;-1:-1:-1;;;;20393:15:0;;;20403:4;20400:7;;20393:15;20386:22;;20366:225;20447:4;:12;;20455:4;20447:12;20443:148;;;-1:-1:-1;;;;20470:15:0;;;20480:4;20477:7;;20470:15;20463:22;;20443:148;20524:4;:12;;20532:4;20524:12;20520:71;;;20547:19;20556:2;20550:8;;:2;:8;;;;20563:2;20560;:5;20547:2;:19::i;20520:71::-;20689:4;:12;;20697:4;20689:12;:28;;;;20705:4;:12;;20713:4;20705:12;20689:28;20685:602;;;20731:2;20728;:5;20721:12;;;;;;;20685:602;20771:4;:12;;20779:4;20771:12;:28;;;;20787:4;:12;;20795:4;20787:12;20771:28;20767:520;;;20813:2;20810;:5;20803:12;;;;;;;20767:520;20853:4;:12;;20861:4;20853:12;20849:438;;;20879:2;20876;:5;20869:12;;;;;;;20849:438;20920:4;:12;;20928:4;20920:12;20916:371;;;20947:2;20944;:5;20936:14;;;;;;;20916:371;20986:4;:12;;20994:4;20986:12;20982:305;;;21013:2;21010;:5;21002:14;;;;;;;20982:305;21053:4;:12;;21061:4;21053:12;21049:238;;;-1:-1:-1;;;;21078:5:0;;;21076:8;21069:15;;21049:238;21120:4;:12;;21128:4;21120:12;21116:171;;;21169:2;21153:19;;21159:2;21153:19;;;:27;;21179:1;21153:27;;;21175:1;21153:27;21146:34;;;;;;;;;21116:171;21208:4;:12;;21216:4;21208:12;21204:83;;;21244:2;21241:5;;:2;:5;;;:13;;21253:1;21241:13;;21204:83;19943:1701;;;;21305:6;:13;;21315:3;21305:13;21301:343;;;21333:2;21329;:6;;;;21322:13;;;;;;21301:343;21361:6;:14;;21371:4;21361:14;21357:287;;;21404:4;:9;;21412:1;21404:9;21400:49;;;-1:-1:-1;;;21429:19:0;;;21415:34;;21400:49;21470:4;:12;;21478:4;21470:12;:28;;;;21486:4;:12;;21494:4;21486:12;21470:28;21466:170;;;21523:4;:12;;21531:4;21523:12;21519:26;;;21542:3;;;21519:26;21557:8;21571:45;21581:10;21578:13;;:18;21571:45;;21605:8;21600:3;21605:8;;;;;21600:3;21571:45;;;21624:1;-1:-1:-1;21617:8:0;;-1:-1:-1;;21617:8:0;21466:170;19344:3986;;;21669:4;21660:6;:13;;;21656:1674;;;21687:6;:14;;21697:4;21687:14;21683:776;;;21727:36;21743:2;21746:1;21743:4;21749:1;21742:8;21739:2;:11;21731:20;;:3;:20;;;;21755:4;21730:29;21761:1;21727:2;:36::i;:::-;21720:43;;;;;;21683:776;21782:6;:14;;21792:4;21782:14;21778:681;;;21822:39;21838:2;21841:1;21838:4;21844:1;21837:8;21834:2;:11;21826:20;;:3;:20;;;;21850:6;21825:31;21858:2;21822;:39::i;21778:681::-;21880:6;:14;;21890:4;21880:14;21876:583;;;-1:-1:-1;;;21927:17:0;21942:1;21939;21936:4;;21935:8;21927:17;;21968:32;;;22023:5;22018:10;;21927:17;;;;;22017:18;22010:25;;21876:583;22054:6;:14;;22064:4;22054:14;22050:409;;;22079:3;22072:10;;;;;;22050:409;22109:6;:14;;22119:4;22109:14;22105:354;;;22163:2;22166:1;22163:4;22169:1;22162:8;22159:2;:11;22151:20;;:3;:20;;;;22175:4;22150:29;22143:36;;;;;;22105:354;22198:6;:14;;22208:4;22198:14;22194:265;;;22252:2;22255:1;22252:4;22258:1;22251:8;22248:2;:11;22240:20;;:3;:20;;;;22264:6;22239:31;22232:38;;;;;;22194:265;22289:6;:14;;22299:4;22289:14;22285:174;;;-1:-1:-1;;;22336:20:0;22354:1;22351;22348:4;;22347:8;22344:2;:11;22336:20;;22380:35;;;22438:5;22433:10;;22336:20;;;;;22432:18;22425:25;;21656:1674;22475:6;:14;;22485:4;22475:14;22471:859;;;-1:-1:-1;;;22522:4:0;22518:26;22542:1;22539;22536:4;;22535:8;22532:2;:11;22518:26;;22586:21;;;22566:42;;;22624:10;;22519:7;;;22518:26;;22623:18;22616:25;;22471:859;22658:6;:14;;22668:4;22658:14;22654:676;;;-1:-1:-1;;;22705:6:0;22701:28;22727:1;22724;22721:4;;22720:8;22717:2;:11;22701:28;;22771:23;;;22751:44;;;22811:10;;22702:9;;;22701:28;;22810:18;22803:25;;22654:676;22845:6;:14;;22855:4;22845:14;22841:489;;;-1:-1:-1;;;22890:16:0;22904:1;22901;22898:4;;22897:8;22890:16;;22928:32;;;22982:5;22976:11;;22890:16;;;;;22975:19;22968:26;;22841:489;23011:6;:14;;23021:4;23011:14;23007:323;;;23048:2;23041:9;;;;;;23007:323;23067:6;:14;;23077:4;23067:14;23063:267;;;-1:-1:-1;;;23112:19:0;23129:1;23126;23123:4;;23122:8;23119:2;:11;23112:19;;23153:35;;;23210:5;23204:11;;23112:19;;;;;23203;23196:26;;23063:267;23239:6;:14;;23249:4;23239:14;23235:95;;;23264:3;23257:10;;;;;;23235:95;23290:6;:14;;23300:4;23290:14;23286:44;;;23315:2;23308:9;;;;;;23286:44;23336:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10787:455;10870:7;10885:18;;:::i;:::-;-1:-1:-1;10935:4:0;10969:2;10958:13;;;;10950:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11068:13;;;;;;;:28;;;11085:11;11068:28;11064:80;;;11134:3;11106:5;:15;;;11122:8;11106:25;;;;;;;;;:31;;;;:25;;;;;;:31;11064:80;11161:12;;;;;11150:23;;;;:8;;;:23;11209:1;11194:16;;;11179:31;;;11224:13;:11;:13::i;3352:4868::-;3395:7;3410:18;;:::i;:::-;-1:-1:-1;3495:15:0;;:18;;;;3460:4;3570:18;;;;3606;;;;3642;;;;;3460:4;;3475:17;;;;3570:18;3606;3671;;;3685:4;3671:18;3667:4396;;;3725:2;3742:4;3739:7;;:12;3735:98;;3819:4;3816:7;;3808:4;:16;3802:22;3735:98;3844:7;;;3840:105;;3868:10;;;;;3888:16;;;;;;;;3868:10;-1:-1:-1;3840:105:0;;;3934:2;3929:7;;3840:105;3667:4396;;;;3961:10;:18;;3975:4;3961:18;3957:4106;;;1390:10;4002:14;;3957:4106;;;4033:10;:18;;4047:4;4033:18;4029:4034;;;4097:1;4092:6;;4029:4034;;;4115:10;:18;;4129:4;4115:18;4111:3952;;;4178:4;4163:12;;;:19;4190:26;;;:14;;;:26;4231:13;:11;:13::i;:::-;4224:20;;;;;;;;;;;4111:3952;4261:10;:18;;4275:4;4261:18;4257:3806;;;4390:14;;;4386:1789;;;;;4481:22;;;1611:1;4481:22;4477:1698;;;4602:10;4615:27;4623:2;4628:10;4623:15;4640:1;4615:7;:27::i;:::-;4693:11;4724:6;;4744:17;;;;4763:20;;;;;4724:60;;;;;;;;;;;;;;;;;;;;4602:40;;-1:-1:-1;4693:11:0;;;;4724:6;;;;;:19;;:60;;;;;;;;;;;:6;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4724:60:0;;;;;;;;;-1:-1:-1;4724:60:0;-1:-1:-1;4897:1:0;4889:10;;4977:1;4973:17;;;5038;;;5035:2;;;5068:5;5058:15;;5035:2;;5137:6;5133:2;5130:14;5127:2;;;5157;5147:12;;5127:2;5249:3;5244:1;5236:6;5232:14;5227:3;5223:24;5219:34;5212:41;;5335:3;5331:1;5319:9;5310:6;5307:1;5303:14;5299:30;5295:38;5291:48;5284:55;;5445:1;5441;5437;5425:9;5422:1;5418:17;5414:25;5410:33;5406:41;5558:1;5554;5550;5541:6;5529:9;5526:1;5522:17;5518:30;5514:38;5510:46;5506:54;5488:72;;5644:10;5640:15;5634:4;5630:26;5622:34;;5746:3;5738:4;5734:9;5729:3;5725:19;5722:28;5715:35;;;;5826:33;5835:2;5840:10;5835:15;5852:1;5855:3;5826:8;:33::i;:::-;5869:20;;;:38;;;;;;;;;-1:-1:-1;4477:1698:0;;-1:-1:-1;;4477:1698:0;;5955:18;;;1534:1;5955:18;5951:224;;;6104:2;6099:7;;5951:224;;;6136:10;6131:15;;1682:3;6156:10;;5951:224;4257:3806;;;6191:10;:18;;6205:4;6191:18;6187:1876;;;6324:15;;;1465:1;6324:15;;:34;;-1:-1:-1;6343:15:0;;;1498:1;6343:15;6324:34;:57;;;-1:-1:-1;6362:19:0;;;1571:1;6362:19;6324:57;6320:1172;;;6398:2;6393:7;;6320:1172;;;6462:23;;;1652:1;6462:23;6458:1034;;;6517:10;6530:27;6538:2;6543:10;6538:15;6555:1;6530:7;:27::i;:::-;6621:17;;;;6517:40;;-1:-1:-1;6751:1:0;6743:10;;6831:1;6827:17;6892:13;;;6889:2;;;6914:5;6908:11;;6889:2;7158:14;;;6992:1;7154:22;;;7150:32;;;;7061:26;7085:1;6984:10;;;7065:18;;;7061:26;7146:43;6980:20;;7240:12;7290:17;;;:23;7346:1;7323:20;;;:24;6988:2;-1:-1:-1;6988:2:0;6458:1034;;6187:1876;7508:10;:18;;7522:4;7508:18;7504:559;;;7582:2;:7;;7588:1;7582:7;7578:479;;;7643:14;;;;;:40;;-1:-1:-1;7661:22:0;;;1611:1;7661:22;7643:40;:62;;;-1:-1:-1;7687:18:0;;;1534:1;7687:18;7643:62;7639:312;;;7724:1;7719:6;;7639:312;;;7758:15;;;1465:1;7758:15;;:34;;-1:-1:-1;7777:15:0;;;1498:1;7777:15;7758:34;:61;;;-1:-1:-1;7796:23:0;;;1652:1;7796:23;7758:61;:84;;;-1:-1:-1;7823:19:0;;;1571:1;7823:19;7758:84;7754:197;;;7861:1;7856:6;;7754:197;;7578:479;7980:10;7975:15;;1714:4;8000:11;;7578:479;8069:15;;;;;:23;;;;:18;;;;:23;;;;8098:15;;:23;;;:18;;;;:23;-1:-1:-1;8139:12:0;;;;8128:23;;;:8;;;:23;8187:1;8172:16;8157:31;;;;;8202:13;:11;:13::i;:::-;8195:20;;;;;;;;;3352:4868;:::o;9291:1087::-;9381:7;9396:18;;:::i;:::-;-1:-1:-1;9446:4:0;9461:10;9489:4;9481:12;;;;9477:732;;;-1:-1:-1;9501:8:0;;;;9477:732;;;9532:4;:12;;9540:4;9532:12;9528:681;;;9546:13;;;:8;;;:13;9528:681;;;9582:4;:12;;9590:4;9582:12;9578:631;;;-1:-1:-1;9602:8:0;;;;9578:631;;;9633:4;:12;;9641:4;9633:12;9629:580;;;9647:13;;;:8;;;:13;9629:580;;;9683:4;:12;;9691:4;9683:12;9679:530;;;9793:7;9750:16;9733;;;9750;;;;9733:33;9798:2;9793:7;;;;;9775:8;;;:26;9809:22;:8;;;:22;9679:530;;;9848:4;:12;;9856:4;9848:12;9844:365;;;9910:10;9899;;;9910;;;9899:21;9952:2;9947:7;;;;;9929:8;;;:26;9963:22;:8;;;:22;9844:365;;;10002:4;:12;;10010:4;10002:12;9998:211;;;10065:2;10049:19;;10055:2;10049:19;;;;;;;;10031:38;;:8;;;:38;10095:19;;;;;;;;;;;;;;10077:38;;:8;;;:38;9998:211;;;10132:4;:12;;10140:4;10132:12;10128:81;;;10176:2;10173:5;;:2;:5;;;;;;;;10162:16;;;;:8;;;:16;10197:5;;;;;;;;;;;;10186:16;;:8;;;:16;10128:81;10219:13;;;;10215:65;;10270:3;10242:5;:15;;;10258:8;10242:25;;;;;;;;;:31;;;;:25;;;;;;:31;10215:65;10297:12;;;;;10286:23;;;;:8;;;:23;10345:1;10330:16;;;10315:31;;;10360:13;:11;:13::i;:::-;10353:20;9291:1087;-1:-1:-1;;;;;;;9291:1087:0:o;13103:1145::-;13186:14;13203:23;13215:10;13203:11;:23::i;:::-;13186:40;;13262:1;13256:4;13252:12;13249:2;;;13277:1;13274;13267:12;13249:2;13385;13548:15;;;13403:2;13393:13;;13381:10;13377:30;13374:1;13370:38;13513:17;;;13330:20;;13498:10;13487:22;;;13483:27;13473:38;13470:61;13765:4;13762:1;13758:12;13912:1;13897:273;13922:2;13919:1;13916:9;13897:273;;;14021:2;14009:15;;;13970:20;14044:12;;;14058:1;14040:20;14069:42;;;;14125:1;14120:42;;;;14033:129;;14069:42;14086:23;14101:7;14095:4;14086:23;:::i;:::-;14078:31;;14069:42;;14120;14137:23;14155:4;14146:7;14137:23;:::i;:::-;14129:31;;14033:129;-1:-1:-1;;13940:1:0;13933:9;13897:273;;;-1:-1:-1;;14184:4:0;14177:18;-1:-1:-1;;;;13241:1003:0:o;11246:460::-;11521:19;;;11544:5;11521:29;11514:3;:37;;;11592:14;;11627;;11621:21;;;11613:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11688:13;11246:460;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
var MIPSDeployedSourceMap = "1075:32558:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1655:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2081:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21344:5721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21344:5721:0;;-1:-1:-1;21344:5721:0;-1:-1:-1;21344:5721:0;:::i;:::-;;;;;;;;;;;;;;;;1655:45;1690:10;1655:45;:::o;2081:29::-;;;;;;:::o;21344:5721::-;21422:7;21441:18;;:::i;:::-;21576:4;21569:5;21566:15;21556:2;;21645:1;21643;21636:11;21556:2;21693:4;21687:11;21700;21684:28;21674:2;;21766:1;21764;21757:11;21674:2;21826:3;21808:16;21805:25;21795:2;;21900:1;21898;21891:11;21795:2;21956:3;21942:12;21939:21;21929:2;;22029:1;22027;22020:11;21929:2;22059:416;;;22293:24;;22281:2;22277:13;;;22274:1;22270:21;22266:52;;;;22335:20;;22389:21;;;22443:18;;;22137:338::o;:::-;22552:16;22610:4;22662:18;22677:2;22674:1;22671;22662:18;:::i;:::-;22654:26;;;;22712:18;22727:2;22724:1;22721;22712:18;:::i;:::-;22704:26;;;;22766:17;22781:1;22778;22775;22766:17;:::i;:::-;22758:25;;;;22823:17;22838:1;22835;22832;22823:17;:::i;:::-;22815:25;;;;22868:17;22883:1;22880;22877;22868:17;:::i;:::-;22860:25;;;;22917:17;22932:1;22929;22926;22917:17;:::i;:::-;22909:25;;;;22962:17;22977:1;22974;22971;22962:17;:::i;:::-;22954:25;;;;23007:17;23022:1;23019;23016;23007:17;:::i;:::-;22999:25;;;;23054:17;23069:1;23066;23063;23054:17;:::i;:::-;23046:25;;;;23105:17;23120:1;23117;23114;23105:17;:::i;:::-;23097:25;;;;23154:17;23169:1;23166;23163;23154:17;:::i;:::-;23263:2;23256:10;;23246:21;;;;23146:25;;-1:-1:-1;23256:10:0;-1:-1:-1;23351:1:0;23336:105;23361:2;23358:1;23355:9;23336:105;;;23410:17;23425:1;23422;23419;23410:17;:::i;:::-;23402:25;;-1:-1:-1;23402:25:0;-1:-1:-1;23379:1:0;23372:9;23336:105;;;23340:14;;;23507:5;:12;;;23503:63;;;23542:13;:11;:13::i;:::-;23535:20;;;;;23503:63;23576:10;;;:15;;23590:1;23576:15;;;;;23653:8;;;;-1:-1:-1;;23645:20:0;;-1:-1:-1;23645:7:0;:20::i;:::-;23631:34;-1:-1:-1;23691:10:0;23699:2;23691:10;;;;23760:1;23750:11;;;:26;;;23765:6;:11;;23775:1;23765:11;23750:26;23746:332;;;24003:64;24014:6;:11;;24024:1;24014:11;:20;;24032:2;24014:20;;;24028:1;24014:20;24003:64;;24065:1;24036:25;24039:4;24046:10;24039:17;24058:2;24036;:25::i;:::-;:30;;;;24003:10;:64::i;:::-;23996:71;;;;;;;23746:332;24303:15;;;;24114:9;;;;24243:4;24237:2;24229:10;;;24228:19;;;24303:15;24328:2;24320:10;;;24319:19;24303:36;;;;;;;;;;;;-1:-1:-1;24364:5:0;24384:11;;;;;:29;;;24399:6;:14;;24409:4;24399:14;24384:29;24380:756;;;24468:5;:15;;;24484:5;24468:22;;;;;;;;;;;;;;-1:-1:-1;;24527:4:0;24521:2;24513:10;;;24512:19;24380:756;;;24561:4;24552:6;:13;;;24548:588;;;24670:6;:13;;24680:3;24670:13;:30;;;;24687:6;:13;;24697:3;24687:13;24670:30;:47;;;;24704:6;:13;;24714:3;24704:13;24670:47;24666:229;;;24772:4;24779:6;24772:13;24767:18;;24666:229;;;24859:21;24862:4;24869:6;24862:13;24877:2;24859;:21::i;:::-;24854:26;;24666:229;24548:588;;;24925:4;24915:6;:14;;;;:32;;;;24933:6;:14;;24943:4;24933:14;24915:32;:50;;;;24951:6;:14;;24961:4;24951:14;24915:50;24911:225;;;25027:5;:15;;;25043:5;25027:22;;;;;;;;;;;;;25022:27;;25120:5;25112:13;;24911:225;25161:1;25151:6;:11;;;;:25;;;;;25175:1;25166:6;:10;;;25151:25;25150:42;;;;25181:6;:11;;25191:1;25181:11;25150:42;25146:117;;;25215:37;25228:6;25236:4;25242:5;25249:2;25215:12;:37::i;:::-;25208:44;;;;;;;;;;;25146:117;25292:13;25273:16;25428:4;25418:14;;;;25414:400;;25489:19;25492:4;25497:6;25492:11;25505:2;25489;:19::i;:::-;25483:25;;;;25541:10;25536:15;;25571:16;25536:15;25585:1;25571:7;:16::i;:::-;25565:22;;25615:4;25605:6;:14;;;;:32;;;;;25623:6;:14;;25633:4;25623:14;;25605:32;25601:203;;;25694:4;25682:16;;25788:1;25780:9;;25601:203;25414:400;;25839:10;25852:26;25860:4;25866:2;25870;25874:3;25852:7;:26::i;:::-;25881:10;25852:39;;;;-1:-1:-1;25973:4:0;25966:11;;;26001;;;:24;;;;;26024:1;26016:4;:9;;;;26001:24;:39;;;;;26036:4;26029;:11;;;26001:39;25997:711;;;26060:4;:9;;26068:1;26060:9;:22;;;;26073:4;:9;;26081:1;26073:9;26060:22;26056:116;;;26120:37;26131:4;:9;;26139:1;26131:9;:21;;26147:5;26131:21;;;26143:1;26131:21;26154:2;26120:10;:37::i;:::-;26113:44;;;;;;;;;;;;;;;26056:116;26190:4;:11;;26198:3;26190:11;26186:93;;;26236:28;26245:5;26252:2;26256:7;;;;26236:8;:28::i;26186:93::-;26296:4;:11;;26304:3;26296:11;26292:93;;;26342:28;26351:5;26358:2;26362:7;;;;;26342:8;:28::i;26292:93::-;26447:4;:11;;26455:3;26447:11;26443:72;;;26485:15;:13;:15::i;26443:72::-;26606:4;26598;:12;;;;:27;;;;;26621:4;26614;:11;;;26598:27;26594:104;;;26652:31;26663:4;26669:2;26673;26677:5;26652:10;:31::i;26594:104::-;26760:6;:14;;26770:4;26760:14;:28;;;;-1:-1:-1;26778:10:0;;;;;26760:28;26756:85;;;26829:1;26804:5;:15;;;26820:5;26804:22;;;;;;;;;:26;;;;:22;;;;;;:26;26756:85;26879:9;:26;;26892:13;26879:26;26875:84;;26921:27;26930:9;26941:1;26944:3;26921:8;:27::i;:::-;27032:26;27041:5;27048:3;27053:4;27032:8;:26::i;:::-;27025:33;;;;;;;;;;;;;21344:5721;;;;;;;:::o;2597:1791::-;2638:12;2783:206;;;2883:2;2879:13;;;2869:24;;2863:31;2852:43;;2923:13;;2962;;;2834:155::o;:::-;3060:4;3144;3138:11;3172:5;3244:21;3262:2;3258;3252:4;3244:21;:::i;:::-;3232:33;;;;3302:21;3320:2;3316;3310:4;3302:21;:::i;:::-;3290:33;;;;3364:20;3382:1;3378:2;3372:4;3364:20;:::i;:::-;3352:32;;;;3429:20;3447:1;3443:2;3437:4;3429:20;:::i;:::-;3417:32;;;;3482:20;3500:1;3496:2;3490:4;3482:20;:::i;:::-;3470:32;;;;3539:20;3557:1;3553:2;3547:4;3539:20;:::i;:::-;3527:32;;;;3592:20;3610:1;3606:2;3600:4;3592:20;:::i;:::-;3580:32;;;;3645:20;3663:1;3659:2;3653:4;3645:20;:::i;:::-;3633:32;;;;3700:20;3718:1;3714:2;3708:4;3700:20;:::i;:::-;3688:32;;;;3759:20;3777:1;3773:2;3767:4;3759:20;:::i;:::-;3747:32;;;;3816:20;3834:1;3830:2;3824:4;3816:20;:::i;:::-;3877:2;3867:13;;;;-1:-1:-1;3804:32:0;-1:-1:-1;3975:1:0;3960:112;3985:2;3982:1;3979:9;3960:112;;;4038:20;4056:1;4052:2;4046:4;4038:20;:::i;:::-;4026:32;;-1:-1:-1;4026:32:0;-1:-1:-1;4003:1:0;3996:9;3960:112;;;3964:14;4135:1;4131:2;4124:13;4230:5;4226:2;4222:14;4215:5;4210:27;4336:14;;;4319:32;;;-1:-1:-1;;2597:1791:0;;:::o;17559:1741::-;17632:11;17715:14;17732:24;17744:11;17732;:24::i;:::-;17715:41;;17852:1;17845:5;17841:13;17838:2;;;17883:1;17880;17873:12;17838:2;18016;18004:15;;;17961:20;18114:141;;;;18161:12;;;18197:2;18190:13;;;;18238:2;18225:16;;;18143:112::o;:::-;18410:5;18407:1;18403:13;18441:4;18473:1;18458:375;18483:2;18480:1;18477:9;18458:375;;;18598:2;18586:15;;;18539:20;18629:12;;;18643:1;18625:20;18662:78;;;;18746:1;18741:78;;;;18618:201;;18662:78;18699:23;18714:7;18708:4;18699:23;:::i;:::-;18691:31;;18662:78;;18741;18778:23;18796:4;18787:7;18778:23;:::i;:::-;18770:31;;18618:201;-1:-1:-1;;18501:1:0;18494:9;18458:375;;;18462:14;18935:4;18929:11;18914:26;;19013:7;19007:4;19004:17;18994:2;;19051:10;19048:1;19041:21;19089:2;19086:1;19079:13;18994:2;-1:-1:-1;;19225:2:0;19214:14;;;;19202:10;19198:31;19195:1;19191:39;19255:16;;;;19273:10;19251:33;;17776:1518;-1:-1:-1;;;17776:1518:0:o;2209:280::-;2268:6;2303:16;;;;2311:7;;;;2303:16;;;;;;2302:23;;;;;2317:1;2360:2;:8;;;2354:15;;;;;2353:21;;2352:30;;;;;;;2408:8;;2407:14;2302:23;2459:21;;2479:1;2459:21;;;2470:6;2459:21;2445:10;;;;;:36;;-1:-1:-1;;;2209:280:0;;;;:::o;15048:624::-;15117:12;15176:18;;:::i;:::-;-1:-1:-1;15331:8:0;;;15360:12;;;15349:23;;;;;;;15382:20;;;;;15236:4;;15506:13;;;15502:82;;15563:6;15572:1;15563:10;15535:5;:15;;;15551:8;15535:25;;;;;;;;;:38;;;;:25;;;;;;:38;15502:82;15652:13;:11;:13::i;:::-;15645:20;15048:624;-1:-1:-1;;;;;15048:624:0:o;10480:1713::-;10577:12;10635:18;;:::i;:::-;-1:-1:-1;10695:4:0;10719:17;10818:1;10807:12;;;;;:28;;;10823:7;:12;;10834:1;10823:12;10807:28;10803:859;;;10851:9;10863:5;:15;;;10879:6;10863:23;;;;;;;;;;;;;10851:35;;10923:2;10916:9;;:3;:9;;;:25;;;;;10929:7;:12;;10940:1;10929:12;10916:25;10915:58;;;;10954:2;10947:9;;:3;:9;;;;:25;;;;;10960:7;:12;;10971:1;10960:12;10947:25;10900:73;;10803:859;;;;11073:7;:12;;11084:1;11073:12;11069:593;;;11130:1;11122:3;11116:15;;;;11101:30;;11069:593;;;11222:7;:12;;11233:1;11222:12;11218:444;;;11278:1;11271:3;11265:14;;;11250:29;;11218:444;;;11387:7;:12;;11398:1;11387:12;11383:279;;;11467:4;11461:2;11452:11;;;11451:20;11490:8;11486:76;;11546:1;11539:3;11533:14;;;11518:29;;11486:76;11579:3;:8;;11586:1;11579:8;11575:77;;;11636:1;11628:3;11622:15;;;;11607:30;;11575:77;11383:279;;11730:8;;;;;11800:12;;;;11789:23;;;;;11944:162;;;;12031:1;12005:22;12008:5;12016:6;12008:14;12024:2;12005;:22::i;:::-;:27;;;;;;;11991:42;;12000:1;11991:42;11976:57;:12;;;:57;11944:162;;;12079:12;;;;;12094:1;12079:16;12064:31;;;;11944:162;12173:13;:11;:13::i;:::-;12166:20;10480:1713;-1:-1:-1;;;;;;;;10480:1713:0:o;27111:6520::-;27198:6;27232:10;27240:2;27232:10;;;;;;27279:11;;27383:4;27374:13;;27370:6215;;;27502:1;27492:6;:11;;;;:27;;;;;27516:3;27507:6;:12;;;27492:27;27488:532;;;27543:6;:11;;27553:1;27543:11;27539:431;;;-1:-1:-1;27565:4:0;27539:431;;;27613:6;:11;;27623:1;27613:11;27609:361;;;-1:-1:-1;27635:4:0;27609:361;;;27679:6;:13;;27689:3;27679:13;27675:295;;;-1:-1:-1;27703:4:0;27675:295;;;27744:6;:13;;27754:3;27744:13;27740:230;;;-1:-1:-1;27768:4:0;27740:230;;;27810:6;:13;;27820:3;27810:13;27806:164;;;-1:-1:-1;27834:4:0;27806:164;;;27875:6;:13;;27885:3;27875:13;27871:99;;;-1:-1:-1;27899:4:0;27871:99;;;27939:6;:13;;27949:3;27939:13;27935:35;;;-1:-1:-1;27963:4:0;27935:35;28004:1;27995:10;;27488:532;28073:11;;;28069:3190;;28133:4;28128:1;28120:9;;;28119:18;28166:4;28120:9;28159:11;;;28155:1203;;;28250:4;28242;:12;;;28238:1102;;28289:2;28282:9;;;;;;;28238:1102;28391:12;;;28387:953;;28438:11;;;;;;;;-1:-1:-1;28431:18:0;;-1:-1:-1;;28431:18:0;28387:953;28550:4;:12;;28558:4;28550:12;28546:794;;;28597:11;;;;;;;;-1:-1:-1;28590:18:0;;-1:-1:-1;;28590:18:0;28546:794;28712:4;:12;;28720:4;28712:12;28708:632;;;28759:27;28768:5;28762:11;;:2;:11;;;;28780:5;28775:2;:10;28759:2;:27::i;28708:632::-;28896:4;:12;;28904:4;28896:12;28892:448;;;-1:-1:-1;;;;28943:17:0;;;28955:4;28950:9;;28943:17;28936:24;;28892:448;29071:4;:12;;29079:4;29071:12;29067:273;;;-1:-1:-1;;;;29118:17:0;;;29130:4;29125:9;;29118:17;29111:24;;29067:273;29249:4;:12;;29257:4;29249:12;29245:95;;;29296:21;29305:2;29299:8;;:2;:8;;;;29314:2;29309;:7;29296:2;:21::i;29245:95::-;29502:4;:12;;29510:4;29502:12;:28;;;;29518:4;:12;;29526:4;29518:12;29502:28;29498:1025;;;29566:2;29561;:7;29554:14;;;;;;;29498:1025;29644:4;:12;;29652:4;29644:12;:28;;;;29660:4;:12;;29668:4;29660:12;29644:28;29640:883;;;29708:2;29703;:7;29696:14;;;;;;;29640:883;29778:4;:12;;29786:4;29778:12;29774:749;;;29826:2;29821;:7;29814:14;;;;;;;29774:749;29895:4;:12;;29903:4;29895:12;29891:632;;;29944:2;29939;:7;29931:16;;;;;;;29891:632;30015:4;:12;;30023:4;30015:12;30011:512;;;30064:2;30059;:7;30051:16;;;;;;;30011:512;30135:4;:12;;30143:4;30135:12;30131:392;;;-1:-1:-1;;;;30180:7:0;;;30178:10;30171:17;;30131:392;30279:4;:12;;30287:4;30279:12;30275:248;;;30338:2;30320:21;;30326:2;30320:21;;;:29;;30348:1;30320:29;;;30344:1;30320:29;30313:36;;;;;;;;;30275:248;30450:4;:12;;30458:4;30450:12;30446:77;;;30494:2;30491:5;;:2;:5;;;:13;;30503:1;30491:13;;30446:77;28069:3190;;;;30600:6;:13;;30610:3;30600:13;30596:663;;;30646:2;30640;:8;;;;30633:15;;;;;;30596:663;30709:6;:14;;30719:4;30709:14;30705:554;;;30770:4;:9;;30778:1;30770:9;30766:92;;;-1:-1:-1;;;30817:21:0;;;30803:36;;30766:92;30902:4;:12;;30910:4;30902:12;:28;;;;30918:4;:12;;30926:4;30918:12;30902:28;30898:347;;;30958:4;:12;;30966:4;30958:12;30954:75;;;31003:3;;;30954:75;31050:8;31084:113;31094:10;31091:13;;:18;31084:113;;31166:8;31137:3;31166:8;;;;;31137:3;31084:113;;;31225:1;-1:-1:-1;31218:8:0;;-1:-1:-1;;31218:8:0;30898:347;27370:6215;;;31296:4;31287:6;:13;;;31283:2302;;;31338:6;:14;;31348:4;31338:14;31334:1088;;;31379:42;31397:2;31402:1;31397:6;31407:1;31396:12;31391:2;:17;31383:26;;:3;:26;;;;31413:4;31382:35;31419:1;31379:2;:42::i;:::-;31372:49;;;;;;31334:1088;31476:6;:14;;31486:4;31476:14;31472:950;;;31517:45;31535:2;31540:1;31535:6;31545:1;31534:12;31529:2;:17;31521:26;;:3;:26;;;;31551:6;31520:37;31559:2;31517;:45::i;31472:950::-;31618:6;:14;;31628:4;31618:14;31614:808;;;-1:-1:-1;;;31665:21:0;31684:1;31679;31674:6;;31673:12;31665:21;;31718:36;;;31785:5;31780:10;;31665:21;;;;;31779:18;31772:25;;31614:808;31852:6;:14;;31862:4;31852:14;31848:574;;;31893:3;31886:10;;;;;;31848:574;31952:6;:14;;31962:4;31952:14;31948:474;;;32008:2;32013:1;32008:6;32018:1;32007:12;32002:2;:17;31994:26;;:3;:26;;;;32024:4;31993:35;31986:42;;;;;;31948:474;32084:6;:14;;32094:4;32084:14;32080:342;;;32140:2;32145:1;32140:6;32150:1;32139:12;32134:2;:17;32126:26;;:3;:26;;;;32156:6;32125:37;32118:44;;;;;;32080:342;32218:6;:14;;32228:4;32218:14;32214:208;;;-1:-1:-1;;;32265:26:0;32289:1;32284;32279:6;;32278:12;32273:2;:17;32265:26;;32323:41;;;32395:5;32390:10;;32265:26;;;;;32389:18;32382:25;;31283:2302;32464:6;:14;;32474:4;32464:14;32460:1125;;;-1:-1:-1;;;32513:4:0;32507:34;32539:1;32534;32529:6;;32528:12;32523:2;:17;32507:34;;32589:27;;;32569:48;;;32639:10;;32508:9;;;32507:34;;32638:18;32631:25;;32460:1125;32699:6;:14;;32709:4;32699:14;32695:890;;;-1:-1:-1;;;32748:6:0;32742:36;32776:1;32771;32766:6;;32765:12;32760:2;:17;32742:36;;32826:29;;;32806:50;;;32878:10;;32743:11;;;32742:36;;32877:18;32870:25;;32695:890;32939:6;:14;;32949:4;32939:14;32935:650;;;-1:-1:-1;;;32982:20:0;33000:1;32995;32990:6;;32989:12;32982:20;;33030:36;;;33094:5;33088:11;;32982:20;;;;;33087:19;33080:26;;32935:650;33149:6;:14;;33159:4;33149:14;33145:440;;;33186:2;33179:9;;;;;;33145:440;33232:6;:14;;33242:4;33232:14;33228:357;;;-1:-1:-1;;;33275:25:0;33298:1;33293;33288:6;;33287:12;33282:2;:17;33275:25;;33328:41;;;33397:5;33391:11;;33275:25;;;;;33390:19;33383:26;;33228:357;33452:6;:14;;33462:4;33452:14;33448:137;;;33489:3;33482:10;;;;;;33448:137;33535:6;:14;;33545:4;33535:14;33531:54;;;33572:2;33565:9;;;;;;33531:54;33595:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15953:688;16039:12;16098:18;;:::i;:::-;-1:-1:-1;16158:4:0;16253:2;16241:14;;;;16233:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16362:14;;;;;;;:30;;;16380:12;16362:30;16358:94;;;16437:4;16408:5;:15;;;16424:9;16408:26;;;;;;;;;:33;;;;:26;;;;;;:33;16358:94;16499:12;;;;;16488:23;;;;:8;;;:23;16551:1;16536:16;;;16521:31;;;16621:13;:11;:13::i;4429:5665::-;4472:7;4525:18;;:::i;:::-;-1:-1:-1;4629:15:0;;:18;;;;4585:4;4716:18;;;;4756;;;;4796;;;;;4585:4;;4609:17;;;;4716:18;4756;4829;;;4843:4;4829:18;4825:5090;;;4895:2;4918:4;4915:7;;:12;4911:112;;5003:4;5000:7;;4992:4;:16;4986:22;4911:112;5040:7;;;5036:141;;5072:10;;;;;5100:16;;;;;;;;5072:10;-1:-1:-1;5036:141:0;;;5160:2;5155:7;;5036:141;4825:5090;;;;5197:10;:18;;5211:4;5197:18;5193:4722;;;1690:10;5250:14;;5193:4722;;;5285:10;:18;;5299:4;5285:18;5281:4634;;;5361:1;5356:6;;5281:4634;;;5383:10;:18;;5397:4;5383:18;5379:4536;;;5458:4;5443:12;;;:19;5476:26;;;:14;;;:26;5523:13;:11;:13::i;:::-;5516:20;;;;;;;;;;;5379:4536;5557:10;:18;;5571:4;5557:18;5553:4362;;;5704:14;;;5700:2017;;;;;5809:22;;;1923:1;5809:22;5805:1912;;;5946:10;5959:27;5967:2;5972:10;5967:15;5984:1;5959:7;:27::i;:::-;6045:11;6076:6;;6096:17;;;;6115:20;;;;;6076:60;;;;;;;;;;;;;;;;;;;;5946:40;;-1:-1:-1;6045:11:0;;;;6076:6;;;;;:19;;:60;;;;;;;;;;;:6;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6076:60:0;;;;;;;;;-1:-1:-1;6076:60:0;-1:-1:-1;6267:1:0;6259:10;;6357:1;6353:17;;;6428;;;6425:2;;;6458:5;6448:15;;6425:2;;6537:6;6533:2;6530:14;6527:2;;;6557;6547:12;;6527:2;6659:3;6654:1;6646:6;6642:14;6637:3;6633:24;6629:34;6622:41;;6755:3;6751:1;6739:9;6730:6;6727:1;6723:14;6719:30;6715:38;6711:48;6704:55;;6875:1;6871;6867;6855:9;6852:1;6848:17;6844:25;6840:33;6836:41;6998:1;6994;6990;6981:6;6969:9;6966:1;6962:17;6958:30;6954:38;6950:46;6946:54;6928:72;;7094:10;7090:15;7084:4;7080:26;7072:34;;7206:3;7198:4;7194:9;7189:3;7185:19;7182:28;7175:35;;;;7302:33;7311:2;7316:10;7311:15;7328:1;7331:3;7302:8;:33::i;:::-;7353:20;;;:38;;;;;;;;;-1:-1:-1;5805:1912:0;;-1:-1:-1;;5805:1912:0;;7453:18;;;1842:1;7453:18;7449:268;;;7618:2;7613:7;;7449:268;;;7664:10;7659:15;;1998:3;7692:10;;7449:268;5553:4362;;;7737:10;:18;;7751:4;7737:18;7733:2182;;;7888:15;;;1769:1;7888:15;;:34;;-1:-1:-1;7907:15:0;;;1804:1;7907:15;7888:34;:57;;;-1:-1:-1;7926:19:0;;;1881:1;7926:19;7888:57;7884:1340;;;7970:2;7965:7;;7884:1340;;;8040:23;;;1966:1;8040:23;8036:1188;;;8103:10;8116:27;8124:2;8129:10;8124:15;8141:1;8116:7;:27::i;:::-;8215:17;;;;8103:40;;-1:-1:-1;8363:1:0;8355:10;;8453:1;8449:17;8524:13;;;8521:2;;;8546:5;8540:11;;8521:2;8820:14;;;8634:1;8816:22;;;8812:32;;;;8713:26;8737:1;8626:10;;;8717:18;;;8713:26;8808:43;8622:20;;8912:12;8978:17;;;:23;9042:1;9019:20;;;:24;8630:2;-1:-1:-1;8630:2:0;8036:1188;;7733:2182;9244:10;:18;;9258:4;9244:18;9240:675;;;9330:2;:7;;9336:1;9330:7;9326:579;;;9399:14;;;;;:40;;-1:-1:-1;9417:22:0;;;1923:1;9417:22;9399:40;:62;;;-1:-1:-1;9443:18:0;;;1842:1;9443:18;9399:62;9395:376;;;9490:1;9485:6;;9395:376;;;9532:15;;;1769:1;9532:15;;:34;;-1:-1:-1;9551:15:0;;;1804:1;9551:15;9532:34;:61;;;-1:-1:-1;9570:23:0;;;1966:1;9570:23;9532:61;:84;;;-1:-1:-1;9597:19:0;;;1881:1;9597:19;9532:84;9528:243;;;9645:1;9640:6;;9528:243;;9326:579;9814:10;9809:15;;2032:4;9842:11;;9326:579;9925:15;;;;;:23;;;;:18;;;;:23;;;;9958:15;;:23;;;:18;;;;:23;-1:-1:-1;10003:12:0;;;;9992:23;;;:8;;;:23;10055:1;10040:16;10025:31;;;;;10074:13;:11;:13::i;:::-;10067:20;;;;;;;;;4429:5665;:::o;12534:2222::-;12628:12;12686:18;;:::i;:::-;-1:-1:-1;12746:4:0;12770:10;12879:4;12870:13;;;;12866:1545;;;-1:-1:-1;12905:8:0;;;;12866:1545;;;13012:5;:13;;13021:4;13012:13;13008:1403;;;13041:14;;;:8;;;:14;13008:1403;;;13159:5;:13;;13168:4;13159:13;13155:1256;;;-1:-1:-1;13194:8:0;;;;13155:1256;;;13301:5;:13;;13310:4;13301:13;13297:1114;;;13330:14;;;:8;;;:14;13297:1114;;;13459:5;:13;;13468:4;13459:13;13455:956;;;13578:9;13528:17;13508;;;13528;;;;13508:37;13585:2;13578:9;;;;;13560:8;;;:28;13602:22;:8;;;:22;13455:956;;;13749:5;:13;;13758:4;13749:13;13745:666;;;13812:11;13798;;;13812;;;13798:25;13863:2;13856:9;;;;;13838:8;;;:28;13880:22;:8;;;:22;13745:666;;;14041:5;:13;;14050:4;14041:13;14037:374;;;14107:3;14088:23;;14094:3;14088:23;;;;;;;;14070:42;;:8;;;:42;14144:23;;;;;;;;;;;;;;14126:42;;:8;;;:42;14037:374;;;14317:5;:13;;14326:4;14317:13;14313:98;;;14363:3;14357:9;;:3;:9;;;;;;;;14346:20;;;;:8;;;:20;14391:9;;;;;;;;;;;;14380:20;;:8;;;:20;14313:98;14496:14;;;;14492:77;;14555:3;14526:5;:15;;;14542:9;14526:26;;;;;;;;;:32;;;;:26;;;;;;:32;14492:77;14615:12;;;;;14604:23;;;;:8;;;:23;14667:1;14652:16;;;14637:31;;;14736:13;:11;:13::i;:::-;14729:20;12534:2222;-1:-1:-1;;;;;;;12534:2222:0:o;19636:1584::-;19784:14;19801:24;19813:11;19801;:24::i;:::-;19784:41;;19921:1;19914:5;19910:13;19907:2;;;19952:1;19949;19942:12;19907:2;20091;20273:15;;;20110:2;20099:14;;20087:10;20083:31;20080:1;20076:39;20233:16;;;20030:20;;20218:10;20207:22;;;20203:27;20193:38;20190:60;20679:5;20676:1;20672:13;20742:1;20727:375;20752:2;20749:1;20746:9;20727:375;;;20867:2;20855:15;;;20808:20;20898:12;;;20912:1;20894:20;20931:78;;;;21015:1;21010:78;;;;20887:201;;20931:78;20968:23;20983:7;20977:4;20968:23;:::i;:::-;20960:31;;20931:78;;21010;21047:23;21065:4;21056:7;21047:23;:::i;:::-;21039:31;;20887:201;-1:-1:-1;;20770:1:0;20763:9;20727:375;;;-1:-1:-1;;21193:4:0;21186:18;-1:-1:-1;;;;19845:1369:0:o;16845:500::-;17135:20;;;17159:7;17135:32;17128:3;:40;;;17217:14;;17256:17;;17250:24;;;17242:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:14;16845:500;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
func init() {
if err := json.Unmarshal([]byte(MIPSStorageLayoutJSON), MIPSStorageLayout); err != nil {
......
......@@ -3,625 +3,883 @@ pragma solidity 0.7.6;
import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol";
// https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf
// https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf
// https://en.wikibooks.org/wiki/MIPS_Assembly/Instruction_Formats
// https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf
// page A-177
// MIPS linux kernel errors used by Go runtime:
// https://github.com/golang/go/blob/master/src/syscall/zerrors_linux_mips.go
// This MIPS contract emulates a single MIPS instruction.
//
// Note that delay slots are isolated instructions:
// the nextPC in the state pre-schedules where the VM jumps next.
//
// The Step input is a packed VM state, with binary-merkle-tree witness data for memory reads/writes.
// The Step outputs a keccak256 hash of the packed VM State, and logs the resulting state for offchain usage.
/// @title MIPS
/// @notice The MIPS contract emulates a single MIPS instruction.
/// Note that delay slots are isolated instructions:
/// the nextPC in the state pre-schedules where the VM jumps next.
/// The Step input is a packed VM state, with binary-merkle-tree
/// witness data for memory reads/writes.
/// The Step outputs a keccak256 hash of the packed VM State,
/// and logs the resulting state for offchain usage.
/// @dev https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf
/// @dev https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf
/// (page A-177)
/// @dev https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf
/// @dev https://en.wikibooks.org/wiki/MIPS_Assembly/Instruction_Formats
/// @dev https://github.com/golang/go/blob/master/src/syscall/zerrors_linux_mips.go
/// MIPS linux kernel errors used by Go runtime
contract MIPS {
struct State {
bytes32 memRoot;
bytes32 preimageKey;
uint32 preimageOffset;
uint32 pc;
uint32 nextPC; // State is executing a branch/jump delay slot if nextPC != pc+4
uint32 lo;
uint32 hi;
uint32 heap;
uint8 exitCode;
bool exited;
uint64 step;
uint32[32] registers;
}
// total State size: 32+32+6*4+1+1+8+32*4 = 226 bytes
uint32 constant public BRK_START = 0x40000000;
uint32 constant FD_STDIN = 0;
uint32 constant FD_STDOUT = 1;
uint32 constant FD_STDERR = 2;
uint32 constant FD_HINT_READ = 3;
uint32 constant FD_HINT_WRITE = 4;
uint32 constant FD_PREIMAGE_READ = 5;
uint32 constant FD_PREIMAGE_WRITE = 6;
uint32 constant EBADF = 0x9;
uint32 constant EINVAL = 0x16;
IPreimageOracle public oracle;
function SE(uint32 dat, uint32 idx) internal pure returns (uint32) {
bool isSigned = (dat >> (idx-1)) != 0;
uint256 signed = ((1 << (32-idx)) - 1) << idx;
uint256 mask = (1 << idx) - 1;
return uint32(dat&mask | (isSigned ? signed : 0));
}
function outputState() internal returns (bytes32 out) {
assembly {
// copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data
function copyMem(from, to, size) -> fromOut, toOut {
mstore(to, mload(add(from, sub(32, size))))
fromOut := add(from, 32)
toOut := add(to, size)
}
let from := 0x80 // state
let start := mload(0x40) // free mem ptr
let to := start
from, to := copyMem(from, to, 32) // memRoot
from, to := copyMem(from, to, 32) // preimageKey
from, to := copyMem(from, to, 4) // preimageOffset
from, to := copyMem(from, to, 4) // pc
from, to := copyMem(from, to, 4) // nextPC
from, to := copyMem(from, to, 4) // lo
from, to := copyMem(from, to, 4) // hi
from, to := copyMem(from, to, 4) // heap
from, to := copyMem(from, to, 1) // exitCode
from, to := copyMem(from, to, 1) // exited
from, to := copyMem(from, to, 8) // step
from := add(from, 32) // offset to registers
for { let i := 0 } lt(i, 32) { i := add(i, 1) } { from, to := copyMem(from, to, 4) } // registers
mstore(to, 0) // clean up end
log0(start, sub(to, start)) // log the resulting MIPS state, for debugging
out := keccak256(start, sub(to, start))
/// @notice Stores the VM state.
/// Total state size: 32 + 32 + 6 * 4 + 1 + 1 + 8 + 32 * 4 = 226 bytes
/// If nextPC != pc + 4, then the VM is executing a branch/jump delay slot.
struct State {
bytes32 memRoot;
bytes32 preimageKey;
uint32 preimageOffset;
uint32 pc;
uint32 nextPC;
uint32 lo;
uint32 hi;
uint32 heap;
uint8 exitCode;
bool exited;
uint64 step;
uint32[32] registers;
}
return out;
}
function handleSyscall() internal returns (bytes32) {
State memory state;
assembly {
state := 0x80
/// @notice Start of the data segment.
uint32 constant public BRK_START = 0x40000000;
uint32 constant FD_STDIN = 0;
uint32 constant FD_STDOUT = 1;
uint32 constant FD_STDERR = 2;
uint32 constant FD_HINT_READ = 3;
uint32 constant FD_HINT_WRITE = 4;
uint32 constant FD_PREIMAGE_READ = 5;
uint32 constant FD_PREIMAGE_WRITE = 6;
uint32 constant EBADF = 0x9;
uint32 constant EINVAL = 0x16;
/// @notice The pre-image oracle.
IPreimageOracle public oracle;
/// @notice Extends the value leftwards with its most significant bit (sign extension).
function SE(uint32 dat, uint32 idx) internal pure returns (uint32) {
bool isSigned = (dat >> (idx - 1)) != 0;
uint256 signed = ((1 << (32 - idx)) - 1) << idx;
uint256 mask = (1 << idx) - 1;
return uint32(dat & mask | (isSigned ? signed : 0));
}
uint32 syscall_no = state.registers[2];
uint32 v0 = 0;
uint32 v1 = 0;
uint32 a0 = state.registers[4];
uint32 a1 = state.registers[5];
uint32 a2 = state.registers[6];
if (syscall_no == 4090) {
// mmap
uint32 sz = a1;
if (sz&4095 != 0) { // adjust size to align with page size
sz += 4096 - (sz&4095);
}
if (a0 == 0) {
v0 = state.heap;
state.heap += sz;
} else {
v0 = a0;
}
} else if (syscall_no == 4045) {
// brk
v0 = BRK_START;
} else if (syscall_no == 4120) {
// clone (not supported)
v0 = 1;
} else if (syscall_no == 4246) {
// exit group
state.exited = true;
state.exitCode = uint8(a0);
return outputState();
} else if (syscall_no == 4003) { // read
// args: a0 = fd, a1 = addr, a2 = count
// returns: v0 = read, v1 = err code
if (a0 == FD_STDIN) {
// leave v0 and v1 zero: read nothing, no error
} else if (a0 == FD_PREIMAGE_READ) { // pre-image oracle
// verify proof 1 is correct, and get the existing memory.
uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes
(bytes32 dat, uint256 datLen) = oracle.readPreimage(state.preimageKey, state.preimageOffset);
assembly { // assembly for more precise ops, and no var count limit
let alignment := and(a1, 3) // the read might not start at an aligned address
let space := sub(4, alignment) // remaining space in memory word
if lt(space, datLen) { datLen := space } // if less space than data, shorten data
if lt(a2, datLen) { datLen := a2 } // if requested to read less, read less
dat := shr(sub(256, mul(datLen, 8)), dat) // right-align data
dat := shl(mul(add(sub(4, datLen), alignment), 8), dat) // position data to insert into memory word
let mask := sub(shl(mul(sub(4, alignment), 8), 1), 1) // mask all bytes after start
let suffixMask := sub(shl(mul(sub(sub(4, alignment), datLen), 8), 1), 1) // mask of all bytes starting from end, maybe none
mask := and(mask, not(suffixMask)) // reduce mask to just cover the data we insert
mem := or(and(mem, not(mask)), dat) // clear masked part of original memory, and insert data
}
writeMem(a1 & 0xFFffFFfc, 1, mem);
state.preimageOffset += uint32(datLen);
v0 = uint32(datLen);
} else if (a0 == FD_HINT_READ) { // hint response
// don't actually read into memory, just say we read it all, we ignore the result anyway
v0 = a2;
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
}
} else if (syscall_no == 4004) { // write
// args: a0 = fd, a1 = addr, a2 = count
// returns: v0 = written, v1 = err code
if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_HINT_WRITE) {
v0 = a2; // tell program we have written everything
} else if (a0 == FD_PREIMAGE_WRITE) { // pre-image oracle
uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes
bytes32 key = state.preimageKey;
assembly { // assembly for more precise ops, and no var count limit
let alignment := and(a1, 3) // the read might not start at an aligned address
let space := sub(4, alignment) // remaining space in memory word
if lt(space, a2) { a2 := space } // if less space than data, shorten data
key := shl(mul(a2, 8), key) // shift key, make space for new info
let mask := sub(shl(mul(a2, 8), 1), 1) // mask for extracting value from memory
mem := and(shr(mul(sub(space, a2), 8), mem), mask) // align value to right, mask it
key := or(key, mem) // insert into key
}
state.preimageKey = key;
state.preimageOffset = 0; // reset offset, to read new pre-image data from the start
v0 = a2;
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
}
} else if (syscall_no == 4055) { // fcntl
// args: a0 = fd, a1 = cmd
if (a1 == 3) { // F_GETFL: get file descriptor flags
if (a0 == FD_STDIN || a0 == FD_PREIMAGE_READ || a0 == FD_HINT_READ) {
v0 = 0; // O_RDONLY
} else if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_PREIMAGE_WRITE || a0 == FD_HINT_WRITE) {
v0 = 1; // O_WRONLY
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
/// @notice Computes the hash of the MIPS state.
/// @return out_ The hash of the MIPS state.
function outputState() internal returns (bytes32 out_) {
assembly {
// copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data
function copyMem(from, to, size) -> fromOut, toOut {
mstore(to, mload(add(from, sub(32, size))))
fromOut := add(from, 32)
toOut := add(to, size)
}
// From points to the MIPS State
let from := 0x80
// Copy to the free memory pointer
let start := mload(0x40)
let to := start
// Copy state to free memory
from, to := copyMem(from, to, 32) // memRoot
from, to := copyMem(from, to, 32) // preimageKey
from, to := copyMem(from, to, 4) // preimageOffset
from, to := copyMem(from, to, 4) // pc
from, to := copyMem(from, to, 4) // nextPC
from, to := copyMem(from, to, 4) // lo
from, to := copyMem(from, to, 4) // hi
from, to := copyMem(from, to, 4) // heap
from, to := copyMem(from, to, 1) // exitCode
from, to := copyMem(from, to, 1) // exited
from, to := copyMem(from, to, 8) // step
from := add(from, 32) // offset to registers
// Copy registers
for { let i := 0 } lt(i, 32) { i := add(i, 1) } {
from, to := copyMem(from, to, 4)
}
// Clean up end of memory
mstore(to, 0)
// Log the resulting MIPS state, for debugging
log0(start, sub(to, start))
// Compute the hash of the resulting MIPS state
out_ := keccak256(start, sub(to, start))
}
} else {
v0 = 0xFFffFFff;
v1 = EINVAL; // cmd not recognized by this kernel
}
return out_;
}
state.registers[2] = v0;
state.registers[7] = v1;
/// @notice Handles a syscall.
function handleSyscall() internal returns (bytes32) {
// Load state from memory
State memory state;
assembly {
state := 0x80
}
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
uint32 syscall_no = state.registers[2];
uint32 v0 = 0;
uint32 v1 = 0;
uint32 a0 = state.registers[4];
uint32 a1 = state.registers[5];
uint32 a2 = state.registers[6];
if (syscall_no == 4090) {
// mmap
uint32 sz = a1;
if (sz&4095 != 0) { // adjust size to align with page size
sz += 4096 - (sz&4095);
}
if (a0 == 0) {
v0 = state.heap;
state.heap += sz;
} else {
v0 = a0;
}
} else if (syscall_no == 4045) {
// brk
v0 = BRK_START;
} else if (syscall_no == 4120) {
// clone (not supported)
v0 = 1;
} else if (syscall_no == 4246) {
// exit group
state.exited = true;
state.exitCode = uint8(a0);
return outputState();
} else if (syscall_no == 4003) { // read
// args: a0 = fd, a1 = addr, a2 = count
// returns: v0 = read, v1 = err code
if (a0 == FD_STDIN) {
// leave v0 and v1 zero: read nothing, no error
} else if (a0 == FD_PREIMAGE_READ) { // pre-image oracle
// verify proof 1 is correct, and get the existing memory.
uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes
(bytes32 dat, uint256 datLen) = oracle.readPreimage(state.preimageKey, state.preimageOffset);
assembly { // assembly for more precise ops, and no var count limit
let alignment := and(a1, 3) // the read might not start at an aligned address
let space := sub(4, alignment) // remaining space in memory word
if lt(space, datLen) { datLen := space } // if less space than data, shorten data
if lt(a2, datLen) { datLen := a2 } // if requested to read less, read less
dat := shr(sub(256, mul(datLen, 8)), dat) // right-align data
dat := shl(mul(add(sub(4, datLen), alignment), 8), dat) // position data to insert into memory word
let mask := sub(shl(mul(sub(4, alignment), 8), 1), 1) // mask all bytes after start
let suffixMask := sub(shl(mul(sub(sub(4, alignment), datLen), 8), 1), 1) // mask of all bytes starting from end, maybe none
mask := and(mask, not(suffixMask)) // reduce mask to just cover the data we insert
mem := or(and(mem, not(mask)), dat) // clear masked part of original memory, and insert data
}
writeMem(a1 & 0xFFffFFfc, 1, mem);
state.preimageOffset += uint32(datLen);
v0 = uint32(datLen);
} else if (a0 == FD_HINT_READ) { // hint response
// don't actually read into memory, just say we read it all, we ignore the result anyway
v0 = a2;
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
}
} else if (syscall_no == 4004) { // write
// args: a0 = fd, a1 = addr, a2 = count
// returns: v0 = written, v1 = err code
if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_HINT_WRITE) {
v0 = a2; // tell program we have written everything
} else if (a0 == FD_PREIMAGE_WRITE) { // pre-image oracle
uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes
bytes32 key = state.preimageKey;
assembly { // assembly for more precise ops, and no var count limit
let alignment := and(a1, 3) // the read might not start at an aligned address
let space := sub(4, alignment) // remaining space in memory word
if lt(space, a2) { a2 := space } // if less space than data, shorten data
key := shl(mul(a2, 8), key) // shift key, make space for new info
let mask := sub(shl(mul(a2, 8), 1), 1) // mask for extracting value from memory
mem := and(shr(mul(sub(space, a2), 8), mem), mask) // align value to right, mask it
key := or(key, mem) // insert into key
}
state.preimageKey = key;
state.preimageOffset = 0; // reset offset, to read new pre-image data from the start
v0 = a2;
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
}
} else if (syscall_no == 4055) { // fcntl
// args: a0 = fd, a1 = cmd
if (a1 == 3) { // F_GETFL: get file descriptor flags
if (a0 == FD_STDIN || a0 == FD_PREIMAGE_READ || a0 == FD_HINT_READ) {
v0 = 0; // O_RDONLY
} else if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_PREIMAGE_WRITE || a0 == FD_HINT_WRITE) {
v0 = 1; // O_WRONLY
} else {
v0 = 0xFFffFFff;
v1 = EBADF;
}
} else {
v0 = 0xFFffFFff;
v1 = EINVAL; // cmd not recognized by this kernel
}
}
return outputState();
}
state.registers[2] = v0;
state.registers[7] = v1;
function handleBranch(uint32 opcode, uint32 insn, uint32 rtReg, uint32 rs) internal returns (bytes32) {
State memory state;
assembly {
state := 0x80
}
bool shouldBranch = false;
if (opcode == 4 || opcode == 5) { // beq/bne
uint32 rt = state.registers[rtReg];
shouldBranch = (rs == rt && opcode == 4) || (rs != rt && opcode == 5);
} else if (opcode == 6) { shouldBranch = int32(rs) <= 0; // blez
} else if (opcode == 7) { shouldBranch = int32(rs) > 0; // bgtz
} else if (opcode == 1) {
// regimm
uint32 rtv = ((insn >> 16) & 0x1F);
if (rtv == 0) shouldBranch = int32(rs) < 0; // bltz
if (rtv == 1) shouldBranch = int32(rs) >= 0; // bgez
}
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
uint32 prevPC = state.pc;
state.pc = state.nextPC; // execute the delay slot first
if (shouldBranch) {
state.nextPC = prevPC + 4 + (SE(insn&0xFFFF, 16)<<2); // then continue with the instruction the branch jumps to.
} else {
state.nextPC = state.nextPC + 4; // branch not taken
return outputState();
}
return outputState();
}
/// @notice Handles a branch instruction, updating the MIPS state PC where needed.
/// @param _opcode The opcode of the branch instruction.
/// @param _insn The instruction to be executed.
/// @param _rtReg The register to be used for the branch.
/// @param _rs The register to be compared with the branch register.
/// @return out_ The hashed MIPS state.
function handleBranch(uint32 _opcode, uint32 _insn, uint32 _rtReg, uint32 _rs) internal returns (bytes32 out_) {
// Load state from memory
State memory state;
assembly {
state := 0x80
}
function handleHiLo(uint32 func, uint32 rs, uint32 rt, uint32 storeReg) internal returns (bytes32) {
State memory state;
assembly {
state := 0x80
}
uint32 val;
if (func == 0x10) val = state.hi; // mfhi
else if (func == 0x11) state.hi = rs; // mthi
else if (func == 0x12) val = state.lo; // mflo
else if (func == 0x13) state.lo = rs; // mtlo
else if (func == 0x18) { // mult
uint64 acc = uint64(int64(int32(rs))*int64(int32(rt)));
state.hi = uint32(acc>>32);
state.lo = uint32(acc);
} else if (func == 0x19) { // multu
uint64 acc = uint64(uint64(rs)*uint64(rt));
state.hi = uint32(acc>>32);
state.lo = uint32(acc);
} else if (func == 0x1a) { // div
state.hi = uint32(int32(rs)%int32(rt));
state.lo = uint32(int32(rs)/int32(rt));
} else if (func == 0x1b) { // divu
state.hi = rs%rt;
state.lo = rs/rt;
}
bool shouldBranch = false;
if (storeReg != 0) {
state.registers[storeReg] = val;
}
// beq/bne: Branch on equal / not equal
if (_opcode == 4 || _opcode == 5) {
uint32 rt = state.registers[_rtReg];
shouldBranch = (_rs == rt && _opcode == 4) || (_rs != rt && _opcode == 5);
}
// blez: Branches if instruction is less than or equal to zero
else if (_opcode == 6) {
shouldBranch = int32(_rs) <= 0;
}
// bgtz: Branches if instruction is greater than zero
else if (_opcode == 7) {
shouldBranch = int32(_rs) > 0;
}
// bltz/bgez: Branch on less than zero / greater than or equal to zero
else if (_opcode == 1) {
// regimm
uint32 rtv = ((_insn >> 16) & 0x1F);
if (rtv == 0) {
shouldBranch = int32(_rs) < 0;
}
if (rtv == 1) {
shouldBranch = int32(_rs) >= 0;
}
}
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
// Update the state's previous PC
uint32 prevPC = state.pc;
return outputState();
}
// Execute the delay slot first
state.pc = state.nextPC;
function handleJump(uint32 linkReg, uint32 dest) internal returns (bytes32) {
State memory state;
assembly {
state := 0x80
}
uint32 prevPC = state.pc;
state.pc = state.nextPC;
state.nextPC = dest;
if (linkReg != 0) {
state.registers[linkReg] = prevPC+8; // set the link-register to the instr after the delay slot instruction.
}
return outputState();
}
// If we should branch, update the PC to the branch target
// Otherwise, proceed to the next instruction
if (shouldBranch) {
state.nextPC = prevPC + 4 + (SE(_insn & 0xFFFF, 16) << 2);
} else {
state.nextPC = state.nextPC + 4;
}
function handleRd(uint32 storeReg, uint32 val, bool conditional) internal returns (bytes32) {
State memory state;
assembly {
state := 0x80
}
require(storeReg < 32, "valid register");
// never write to reg 0, and it can be conditional (movz, movn)
if (storeReg != 0 && conditional) {
state.registers[storeReg] = val;
// Return the hash of the resulting state
out_ = outputState();
}
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
return outputState();
}
function proofOffset(uint8 proofIndex) internal pure returns (uint256 offset) {
// A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries.
// And the leaf value itself needs to be encoded as well. And proof.offset == 358
offset = 358 + (uint256(proofIndex) * (28*32));
uint256 s = 0;
assembly { s := calldatasize() }
require(s >= (offset + 28*32), "check that there is enough calldata");
return offset;
}
function readMem(uint32 addr, uint8 proofIndex) internal pure returns (uint32 out) {
uint256 offset = proofOffset(proofIndex);
assembly {
if and(addr, 3) { revert(0, 0) } // quick addr alignment check
let leaf := calldataload(offset)
offset := add(offset, 32)
function hashPair(a, b) -> h {
mstore(0, a) // use scratch space slots to hash the two nodes together
mstore(32, b)
h := keccak256(0, 64)
}
let path := shr(5, addr)
let node := leaf // starting from the leaf node, work back up by combining with siblings, to reconstruct the root
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
offset := add(offset, 32)
switch and(shr(i, path), 1)
case 0 { node := hashPair(node, sibling) }
case 1 { node := hashPair(sibling, node) }
}
let memRoot := mload(0x80) // load memRoot, first field of state
if iszero(eq(node, memRoot)) { // verify the root matches
mstore(0, 0x0badf00d)
revert(0, 32)
}
// bits to shift = (32 - 4 - (addr % 32)) * 8
let shamt := shl(3, sub(sub(32, 4), and(addr, 31)))
out := and(shr(shamt, leaf), 0xFFffFFff)
}
return out;
}
// writeMem writes the value by first overwriting the part of the leaf, and then recomputing the memory merkle root.
function writeMem(uint32 addr, uint8 proofIndex, uint32 value) internal pure {
uint256 offset = proofOffset(proofIndex);
assembly {
if and(addr, 3) { revert(0, 0) } // quick addr alignment check
let leaf := calldataload(offset)
let shamt := shl(3, sub(sub(32, 4), and(addr, 31)))
// mask out 4 bytes, and OR in the value
leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, value))
offset := add(offset, 32)
function hashPair(a, b) -> h {
mstore(0, a) // use scratch space slots to hash the two nodes together
mstore(32, b)
h := keccak256(0, 64)
}
let path := shr(5, addr)
let node := leaf // starting from the leaf node, work back up by combining with siblings, to reconstruct the root
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
offset := add(offset, 32)
switch and(shr(i, path), 1)
case 0 { node := hashPair(node, sibling) }
case 1 { node := hashPair(sibling, node) }
}
mstore(0x80, node) // store new memRoot, first field of state
}
}
// will revert if any required input state is missing
function step(bytes calldata stateData, bytes calldata proof) public returns (bytes32) {
State memory state;
// packed data is ~6 times smaller
assembly {
if iszero(eq(state, 0x80)) { // expected state mem offset check
revert(0,0)
}
if iszero(eq(mload(0x40), mul(32, 48))) { // expected memory check
revert(0,0)
}
if iszero(eq(stateData.offset, 100)) { // 32*3+4=100 expected state data offset
revert(0,0)
}
if iszero(eq(proof.offset, 358)) { // 100+32+226=358 expected proof offset
revert(0,0)
}
function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut {
// calldata is packed, thus starting left-aligned, shift-right to pad and right-align
let w := shr(shl(3, sub(32, size)), calldataload(callOffset))
mstore(memOffset, w)
callOffsetOut := add(callOffset, size)
memOffsetOut := add(memOffset, 32)
}
let c := stateData.offset // calldata offset
let m := 0x80 // mem offset
c, m := putField(c, m, 32) // memRoot
c, m := putField(c, m, 32) // preimageKey
c, m := putField(c, m, 4) // preimageOffset
c, m := putField(c, m, 4) // pc
c, m := putField(c, m, 4) // nextPC
c, m := putField(c, m, 4) // lo
c, m := putField(c, m, 4) // hi
c, m := putField(c, m, 4) // heap
c, m := putField(c, m, 1) // exitCode
c, m := putField(c, m, 1) // exited
c, m := putField(c, m, 8) // step
mstore(m, add(m, 32)) // offset to registers
m := add(m, 32)
for { let i := 0 } lt(i, 32) { i := add(i, 1) } { c, m := putField(c, m, 4) } // registers
}
if(state.exited) { // don't change state once exited
return outputState();
}
state.step += 1;
/// @notice Handles HI and LO register instructions.
/// @param _func The function code of the instruction.
/// @param _rs The value of the RS register.
/// @param _rt The value of the RT register.
/// @param _storeReg The register to store the result in.
/// @return out_ The hash of the resulting MIPS state.
function handleHiLo(uint32 _func, uint32 _rs, uint32 _rt, uint32 _storeReg) internal returns (bytes32 out_) {
// Load state from memory
State memory state;
assembly {
state := 0x80
}
uint32 val;
// mfhi: Move the contents of the HI register into the destination
if (_func == 0x10) {
val = state.hi;
}
// mthi: Move the contents of the source into the HI register
else if (_func == 0x11) {
state.hi = _rs;
}
// mflo: Move the contents of the LO register into the destination
else if (_func == 0x12) {
val = state.lo;
}
// mtlo: Move the contents of the source into the LO register
else if (_func == 0x13) {
state.lo = _rs;
}
// mult: Multiplies `rs` by `rt` and stores the result in HI and LO registers
else if (_func == 0x18) {
uint64 acc = uint64(int64(int32(_rs)) * int64(int32(_rt)));
state.hi = uint32(acc >> 32);
state.lo = uint32(acc);
}
// multu: Unsigned multiplies `rs` by `rt` and stores the result in HI and LO registers
else if (_func == 0x19) {
uint64 acc = uint64(uint64(_rs) * uint64(_rt));
state.hi = uint32(acc >> 32);
state.lo = uint32(acc);
}
// div: Divides `rs` by `rt`.
// Stores the quotient in LO
// And the remainder in HI
else if (_func == 0x1a) {
state.hi = uint32(int32(_rs) % int32(_rt));
state.lo = uint32(int32(_rs) / int32(_rt));
}
// divu: Unsigned divides `rs` by `rt`.
// Stores the quotient in LO
// And the remainder in HI
else if (_func == 0x1b) {
state.hi = _rs % _rt;
state.lo = _rs / _rt;
}
// instruction fetch
uint32 insn = readMem(state.pc, 0);
// Store the result in the destination register, if applicable
if (_storeReg != 0) {
state.registers[_storeReg] = val;
}
uint32 opcode = insn >> 26; // 6-bits
// Update the PC
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
// j-type j/jal
if (opcode == 2 || opcode == 3) {
// TODO(CLI-4136): likely bug in original code: MIPS spec says this should be in the "current" region;
// a 256 MB aligned region (i.e. use top 4 bits of branch delay slot (pc+4))
return handleJump(opcode == 2 ? 0 : 31, SE(insn&0x03FFFFFF, 26) << 2);
// Return the hash of the resulting state
out_ = outputState();
}
// register fetch
uint32 rs; // source register 1 value
uint32 rt; // source register 2 / temp value
uint32 rtReg = (insn >> 16) & 0x1F;
// R-type or I-type (stores rt)
rs = state.registers[(insn >> 21) & 0x1F];
uint32 rdReg = rtReg;
if (opcode == 0 || opcode == 0x1c) {
// R-type (stores rd)
rt = state.registers[rtReg];
rdReg = (insn >> 11) & 0x1F;
} else if (opcode < 0x20) {
// rt is SignExtImm
// don't sign extend for andi, ori, xori
if (opcode == 0xC || opcode == 0xD || opcode == 0xe) {
// ZeroExtImm
rt = insn&0xFFFF;
} else {
// SignExtImm
rt = SE(insn&0xFFFF, 16);
}
} else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) {
// store rt value with store
rt = state.registers[rtReg];
// store actual rt with lwl and lwr
rdReg = rtReg;
}
/// @notice Handles a jump instruction, updating the MIPS state PC where needed.
/// @param _linkReg The register to store the link to the instruction after the delay slot instruction.
/// @param _dest The destination to jump to.
/// @return out_ The hashed MIPS state.
function handleJump(uint32 _linkReg, uint32 _dest) internal returns (bytes32 out_) {
// Load state from memory.
State memory state;
assembly {
state := 0x80
}
// Update the next PC to the jump destination.
uint32 prevPC = state.pc;
state.pc = state.nextPC;
state.nextPC = _dest;
// Update the link-register to the instruction after the delay slot instruction.
if (_linkReg != 0) {
state.registers[_linkReg] = prevPC + 8;
}
if ((opcode >= 4 && opcode < 8) || opcode == 1) {
return handleBranch(opcode, insn, rtReg, rs);
// Return the hash of the resulting state.
out_ = outputState();
}
uint32 storeAddr = 0xFF_FF_FF_FF;
// memory fetch (all I-type)
// we do the load for stores also
uint32 mem;
if (opcode >= 0x20) {
// M[R[rs]+SignExtImm]
rs += SE(insn&0xFFFF, 16);
uint32 addr = rs & 0xFFFFFFFC;
mem = readMem(addr, 1);
if (opcode >= 0x28 && opcode != 0x30) {
// store
storeAddr = addr;
// store opcodes don't write back to a register
rdReg = 0;
}
/// @notice Handles a storing a value into a register.
/// @param _storeReg The register to store the value into.
/// @param _val The value to store.
/// @param _conditional Whether or not the store is conditional.
/// @return out_ The hashed MIPS state.
function handleRd(uint32 _storeReg, uint32 _val, bool _conditional) internal returns (bytes32 out_) {
// Load state from memory.
State memory state;
assembly {
state := 0x80
}
// The destination register must be valid.
require(_storeReg < 32, "valid register");
// Never write to reg 0, and it can be conditional (movz, movn).
if (_storeReg != 0 && _conditional) {
state.registers[_storeReg] = _val;
}
// Update the PC.
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
// Return the hash of the resulting state.
out_ = outputState();
}
// ALU
uint32 val = execute(insn, rs, rt, mem) & 0xffFFffFF; // swr outputs more than 4 bytes without the mask
uint32 func = insn & 0x3f; // 6-bits
if (opcode == 0 && func >= 8 && func < 0x1c) {
if (func == 8 || func == 9) { // jr/jalr
return handleJump(func == 8 ? 0 : rdReg, rs);
}
if (func == 0xa) { // movz
return handleRd(rdReg, rs, rt == 0);
}
if (func == 0xb) { // movn
return handleRd(rdReg, rs, rt != 0);
}
// syscall (can read and write)
if (func == 0xC) {
return handleSyscall();
}
// lo and hi registers
// can write back
if (func >= 0x10 && func < 0x1c) {
return handleHiLo(func, rs, rt, rdReg);
}
/// @notice Computes the offset of the proof in the calldata.
/// @param _proofIndex The index of the proof in the calldata.
/// @return offset_ The offset of the proof in the calldata.
function proofOffset(uint8 _proofIndex) internal pure returns (uint256 offset_) {
// A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries.
// And the leaf value itself needs to be encoded as well. And proof.offset == 358
offset_ = 358 + (uint256(_proofIndex) * (28 * 32));
uint256 s = 0;
assembly { s := calldatasize() }
require(s >= (offset_ + 28 * 32), "check that there is enough calldata");
return offset_;
}
// stupid sc, write a 1 to rt
if (opcode == 0x38 && rtReg != 0) {
state.registers[rtReg] = 1;
/// @notice Reads a 32-bit value from memory.
/// @param _addr The address to read from.
/// @param _proofIndex The index of the proof in the calldata.
/// @return out_ The hashed MIPS state.
function readMem(uint32 _addr, uint8 _proofIndex) internal pure returns (uint32 out_) {
// Compute the offset of the proof in the calldata.
uint256 offset = proofOffset(_proofIndex);
assembly {
// Validate the address alignement.
if and(_addr, 3) {
revert(0, 0)
}
// Load the leaf value.
let leaf := calldataload(offset)
offset := add(offset, 32)
// Convenience function to hash two nodes together in scratch space.
function hashPair(a, b) -> h {
mstore(0, a)
mstore(32, b)
h := keccak256(0, 64)
}
// Start with the leaf node.
// Work back up by combining with siblings, to reconstruct the root.
let path := shr(5, _addr)
let node := leaf
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
offset := add(offset, 32)
switch and(shr(i, path), 1)
case 0 {
node := hashPair(node, sibling)
} case 1 {
node := hashPair(sibling, node)
}
}
// Load the memory root from the first field of state.
let memRoot := mload(0x80)
// Verify the root matches.
if iszero(eq(node, memRoot)) {
mstore(0, 0x0badf00d)
revert(0, 32)
}
// Bits to shift = (32 - 4 - (addr % 32)) * 8
let shamt := shl(3, sub(sub(32, 4), and(_addr, 31)))
out_ := and(shr(shamt, leaf), 0xFFffFFff)
}
}
// write memory
if (storeAddr != 0xFF_FF_FF_FF) {
writeMem(storeAddr, 1, val);
/// @notice Writes a 32-bit value to memory.
/// This function first overwrites the part of the leaf.
/// Then it recomputes the memory merkle root.
/// @param _addr The address to write to.
/// @param _proofIndex The index of the proof in the calldata.
/// @param _val The value to write.
function writeMem(uint32 _addr, uint8 _proofIndex, uint32 _val) internal pure {
// Compute the offset of the proof in the calldata.
uint256 offset = proofOffset(_proofIndex);
assembly {
// Validate the address alignement.
if and(_addr, 3) {
revert(0, 0)
}
// Load the leaf value.
let leaf := calldataload(offset)
let shamt := shl(3, sub(sub(32, 4), and(_addr, 31)))
// Mask out 4 bytes, and OR in the value
leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, _val))
offset := add(offset, 32)
// Convenience function to hash two nodes together in scratch space.
function hashPair(a, b) -> h {
mstore(0, a)
mstore(32, b)
h := keccak256(0, 64)
}
// Start with the leaf node.
// Work back up by combining with siblings, to reconstruct the root.
let path := shr(5, _addr)
let node := leaf
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
offset := add(offset, 32)
switch and(shr(i, path), 1)
case 0 {
node := hashPair(node, sibling)
} case 1 {
node := hashPair(sibling, node)
}
}
// Store the new memory root in the first field of state.
mstore(0x80, node)
}
}
// write back the value to destination register
return handleRd(rdReg, val, true);
}
function execute(uint32 insn, uint32 rs, uint32 rt, uint32 mem) internal pure returns (uint32) {
uint32 opcode = insn >> 26; // 6-bits
uint32 func = insn & 0x3f; // 6-bits
// TODO(CLI-4136): deref the immed into a register
if (opcode < 0x20) {
// transform ArithLogI
// TODO(CLI-4136): replace with table
if (opcode >= 8 && opcode < 0xF) {
if (opcode == 8) { func = 0x20; } // addi
else if (opcode == 9) { func = 0x21; } // addiu
else if (opcode == 0xa) { func = 0x2a; } // slti
else if (opcode == 0xb) { func = 0x2B; } // sltiu
else if (opcode == 0xc) { func = 0x24; } // andi
else if (opcode == 0xd) { func = 0x25; } // ori
else if (opcode == 0xe) { func = 0x26; } // xori
opcode = 0;
}
// 0 is opcode SPECIAL
if (opcode == 0) {
uint32 shamt = (insn >> 6) & 0x1f;
if (func < 0x20) {
if (func >= 0x08) { return rs; // jr/jalr/div + others
// Shift and ShiftV
} else if (func == 0x00) { return rt << shamt; // sll
} else if (func == 0x02) { return rt >> shamt; // srl
} else if (func == 0x03) { return SE(rt >> shamt, 32-shamt); // sra
} else if (func == 0x04) { return rt << (rs&0x1F); // sllv
} else if (func == 0x06) { return rt >> (rs&0x1F); // srlv
} else if (func == 0x07) { return SE(rt >> rs, 32-rs); // srav
}
}
// 0x10-0x13 = mfhi, mthi, mflo, mtlo
// R-type (ArithLog)
if (func == 0x20 || func == 0x21) { return rs+rt; // add or addu
} else if (func == 0x22 || func == 0x23) { return rs-rt; // sub or subu
} else if (func == 0x24) { return rs&rt; // and
} else if (func == 0x25) { return (rs|rt); // or
} else if (func == 0x26) { return (rs^rt); // xor
} else if (func == 0x27) { return ~(rs|rt); // nor
} else if (func == 0x2a) {
return int32(rs)<int32(rt) ? 1 : 0; // slt
} else if (func == 0x2B) {
return rs<rt ? 1 : 0; // sltu
}
} else if (opcode == 0xf) { return rt<<16; // lui
} else if (opcode == 0x1c) { // SPECIAL2
if (func == 2) return uint32(int32(rs)*int32(rt)); // mul
if (func == 0x20 || func == 0x21) { // clo
if (func == 0x20) rs = ~rs;
uint32 i = 0; while (rs&0x80000000 != 0) { i++; rs <<= 1; } return i;
}
}
} else if (opcode < 0x28) {
if (opcode == 0x20) { // lb
return SE((mem >> (24-(rs&3)*8)) & 0xFF, 8);
} else if (opcode == 0x21) { // lh
return SE((mem >> (16-(rs&2)*8)) & 0xFFFF, 16);
} else if (opcode == 0x22) { // lwl
uint32 val = mem << ((rs&3)*8);
uint32 mask = uint32(0xFFFFFFFF) << ((rs&3)*8);
return (rt & ~mask) | val;
} else if (opcode == 0x23) { return mem; // lw
} else if (opcode == 0x24) { // lbu
return (mem >> (24-(rs&3)*8)) & 0xFF;
} else if (opcode == 0x25) { // lhu
return (mem >> (16-(rs&2)*8)) & 0xFFFF;
} else if (opcode == 0x26) { // lwr
uint32 val = mem >> (24-(rs&3)*8);
uint32 mask = uint32(0xFFFFFFFF) >> (24-(rs&3)*8);
return (rt & ~mask) | val;
}
} else if (opcode == 0x28) { // sb
uint32 val = (rt&0xFF) << (24-(rs&3)*8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24-(rs&3)*8));
return (mem & mask) | val;
} else if (opcode == 0x29) { // sh
uint32 val = (rt&0xFFFF) << (16-(rs&2)*8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16-(rs&2)*8));
return (mem & mask) | val;
} else if (opcode == 0x2a) { // swl
uint32 val = rt >> ((rs&3)*8);
uint32 mask = uint32(0xFFFFFFFF) >> ((rs&3)*8);
return (mem & ~mask) | val;
} else if (opcode == 0x2b) { // sw
return rt;
} else if (opcode == 0x2e) { // swr
uint32 val = rt << (24-(rs&3)*8);
uint32 mask = uint32(0xFFFFFFFF) << (24-(rs&3)*8);
return (mem & ~mask) | val;
} else if (opcode == 0x30) { return mem; // ll
} else if (opcode == 0x38) { return rt; // sc
/// @notice Executes a single step of the vm.
/// Will revert if any required input state is missing.
function step(bytes calldata stateData, bytes calldata proof) public returns (bytes32) {
State memory state;
// Packed calldata is ~6 times smaller than state size
assembly {
if iszero(eq(state, 0x80)) { // expected state mem offset check
revert(0,0)
}
if iszero(eq(mload(0x40), mul(32, 48))) { // expected memory check
revert(0,0)
}
if iszero(eq(stateData.offset, 100)) { // 32*3+4=100 expected state data offset
revert(0,0)
}
if iszero(eq(proof.offset, 358)) { // 100+32+226=358 expected proof offset
revert(0,0)
}
function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut {
// calldata is packed, thus starting left-aligned, shift-right to pad and right-align
let w := shr(shl(3, sub(32, size)), calldataload(callOffset))
mstore(memOffset, w)
callOffsetOut := add(callOffset, size)
memOffsetOut := add(memOffset, 32)
}
// Unpack state from calldata into memory
let c := stateData.offset // calldata offset
let m := 0x80 // mem offset
c, m := putField(c, m, 32) // memRoot
c, m := putField(c, m, 32) // preimageKey
c, m := putField(c, m, 4) // preimageOffset
c, m := putField(c, m, 4) // pc
c, m := putField(c, m, 4) // nextPC
c, m := putField(c, m, 4) // lo
c, m := putField(c, m, 4) // hi
c, m := putField(c, m, 4) // heap
c, m := putField(c, m, 1) // exitCode
c, m := putField(c, m, 1) // exited
c, m := putField(c, m, 8) // step
// Unpack register calldata into memory
mstore(m, add(m, 32)) // offset to registers
m := add(m, 32)
for { let i := 0 } lt(i, 32) { i := add(i, 1) } {
c, m := putField(c, m, 4)
}
}
// Don't change state once exited
if (state.exited) {
return outputState();
}
state.step += 1;
// instruction fetch
uint32 insn = readMem(state.pc, 0);
uint32 opcode = insn >> 26; // 6-bits
// j-type j/jal
if (opcode == 2 || opcode == 3) {
// TODO(CLI-4136): likely bug in original code: MIPS spec says this should be in the "current" region;
// a 256 MB aligned region (i.e. use top 4 bits of branch delay slot (pc+4))
return handleJump(opcode == 2 ? 0 : 31, SE(insn & 0x03FFFFFF, 26) << 2);
}
// register fetch
uint32 rs; // source register 1 value
uint32 rt; // source register 2 / temp value
uint32 rtReg = (insn >> 16) & 0x1F;
// R-type or I-type (stores rt)
rs = state.registers[(insn >> 21) & 0x1F];
uint32 rdReg = rtReg;
if (opcode == 0 || opcode == 0x1c) {
// R-type (stores rd)
rt = state.registers[rtReg];
rdReg = (insn >> 11) & 0x1F;
} else if (opcode < 0x20) {
// rt is SignExtImm
// don't sign extend for andi, ori, xori
if (opcode == 0xC || opcode == 0xD || opcode == 0xe) {
// ZeroExtImm
rt = insn & 0xFFFF;
} else {
// SignExtImm
rt = SE(insn & 0xFFFF, 16);
}
} else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) {
// store rt value with store
rt = state.registers[rtReg];
// store actual rt with lwl and lwr
rdReg = rtReg;
}
if ((opcode >= 4 && opcode < 8) || opcode == 1) {
return handleBranch(opcode, insn, rtReg, rs);
}
uint32 storeAddr = 0xFF_FF_FF_FF;
// memory fetch (all I-type)
// we do the load for stores also
uint32 mem;
if (opcode >= 0x20) {
// M[R[rs]+SignExtImm]
rs += SE(insn&0xFFFF, 16);
uint32 addr = rs & 0xFFFFFFFC;
mem = readMem(addr, 1);
if (opcode >= 0x28 && opcode != 0x30) {
// store
storeAddr = addr;
// store opcodes don't write back to a register
rdReg = 0;
}
}
// ALU
uint32 val = execute(insn, rs, rt, mem) & 0xffFFffFF; // swr outputs more than 4 bytes without the mask
uint32 func = insn & 0x3f; // 6-bits
if (opcode == 0 && func >= 8 && func < 0x1c) {
if (func == 8 || func == 9) { // jr/jalr
return handleJump(func == 8 ? 0 : rdReg, rs);
}
if (func == 0xa) { // movz
return handleRd(rdReg, rs, rt == 0);
}
if (func == 0xb) { // movn
return handleRd(rdReg, rs, rt != 0);
}
// syscall (can read and write)
if (func == 0xC) {
return handleSyscall();
}
// lo and hi registers
// can write back
if (func >= 0x10 && func < 0x1c) {
return handleHiLo(func, rs, rt, rdReg);
}
}
// stupid sc, write a 1 to rt
if (opcode == 0x38 && rtReg != 0) {
state.registers[rtReg] = 1;
}
// write memory
if (storeAddr != 0xFF_FF_FF_FF) {
writeMem(storeAddr, 1, val);
}
// write back the value to destination register
return handleRd(rdReg, val, true);
}
revert("invalid instruction");
}
/// @notice Execute an instruction.
function execute(uint32 insn, uint32 rs, uint32 rt, uint32 mem) internal pure returns (uint32) {
uint32 opcode = insn >> 26; // 6-bits
uint32 func = insn & 0x3f; // 6-bits
// TODO(CLI-4136): deref the immed into a register
if (opcode < 0x20) {
// transform ArithLogI
// TODO(CLI-4136): replace with table
if (opcode >= 8 && opcode < 0xF) {
if (opcode == 8) { func = 0x20; } // addi
else if (opcode == 9) { func = 0x21; } // addiu
else if (opcode == 0xa) { func = 0x2a; } // slti
else if (opcode == 0xb) { func = 0x2B; } // sltiu
else if (opcode == 0xc) { func = 0x24; } // andi
else if (opcode == 0xd) { func = 0x25; } // ori
else if (opcode == 0xe) { func = 0x26; } // xori
opcode = 0;
}
// 0 is opcode SPECIAL
if (opcode == 0) {
uint32 shamt = (insn >> 6) & 0x1f;
if (func < 0x20) {
// jr/jalr/div + others
if (func >= 0x08) {
return rs;
}
// sll: Logical Shift Left
else if (func == 0x00) {
return rt << shamt;
}
// srl: Logical Shift Right
else if (func == 0x02) {
return rt >> shamt;
}
// sra: Arithmetic Shift Right
else if (func == 0x03) {
return SE(rt >> shamt, 32 - shamt);
}
// sllv: Variable Logical Shift Left
else if (func == 0x04) {
return rt << (rs & 0x1F);
}
// srlv: Variable Logical Shift Right
else if (func == 0x06) {
return rt >> (rs & 0x1F);
}
// srav: Variable Arithmetic Shift Right
else if (func == 0x07) {
return SE(rt >> rs, 32 - rs);
}
}
// R-type (ArithLog)
// 0x10-0x13 = mfhi, mthi, mflo, mtlo
// add or addu
if (func == 0x20 || func == 0x21) {
return rs + rt;
}
// sub or subu
else if (func == 0x22 || func == 0x23) {
return rs - rt;
}
// and
else if (func == 0x24) {
return rs & rt;
}
// or
else if (func == 0x25) {
return (rs | rt);
}
// xor
else if (func == 0x26) {
return (rs ^ rt);
}
// nor
else if (func == 0x27) {
return ~(rs | rt);
}
// slt: Set to 1 if less than
else if (func == 0x2a) {
return int32(rs) < int32(rt) ? 1 : 0;
}
// sltu: Set to 1 if less than unsigned
else if (func == 0x2B) {
return rs<rt ? 1 : 0;
}
}
// lui: Load Upper Immediate
else if (opcode == 0xf) {
return rt << 16;
}
// SPECIAL2
else if (opcode == 0x1c) {
// mul
if (func == 2) {
return uint32(int32(rs) * int32(rt));
}
// clo
if (func == 0x20 || func == 0x21) {
if (func == 0x20) {
rs = ~rs;
}
uint32 i = 0;
while (rs&0x80000000 != 0) {
i++;
rs <<= 1;
}
return i;
}
}
}
else if (opcode < 0x28) {
// lb
if (opcode == 0x20) {
return SE((mem >> (24 - (rs & 3) * 8)) & 0xFF, 8);
}
// lh
else if (opcode == 0x21) {
return SE((mem >> (16 - (rs & 2) * 8)) & 0xFFFF, 16);
}
// lwl
else if (opcode == 0x22) {
uint32 val = mem << ((rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) << ((rs & 3) * 8);
return (rt & ~mask) | val;
}
// lw
else if (opcode == 0x23) {
return mem;
}
// lbu
else if (opcode == 0x24) {
return (mem >> (24 - (rs & 3) * 8)) & 0xFF;
}
// lhu
else if (opcode == 0x25) {
return (mem >> (16 - (rs & 2) * 8)) & 0xFFFF;
}
// lwr
else if (opcode == 0x26) {
uint32 val = mem >> (24 - (rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) >> (24 - (rs & 3) * 8);
return (rt & ~mask) | val;
}
}
// sb
else if (opcode == 0x28) {
uint32 val = (rt & 0xFF) << (24 - (rs & 3) * 8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24 - (rs & 3) * 8));
return (mem & mask) | val;
}
// sh
else if (opcode == 0x29) {
uint32 val = (rt & 0xFFFF) << (16 - (rs & 2) * 8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16 - (rs & 2) * 8));
return (mem & mask) | val;
}
// swl
else if (opcode == 0x2a) {
uint32 val = rt >> ((rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) >> ((rs & 3) * 8);
return (mem & ~mask) | val;
}
// sw
else if (opcode == 0x2b) {
return rt;
}
// swr
else if (opcode == 0x2e) {
uint32 val = rt << (24 - (rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) << (24 - (rs & 3) * 8);
return (mem & ~mask) | val;
}
// ll
else if (opcode == 0x30) {
return mem;
}
// sc
else if (opcode == 0x38) {
return rt;
}
revert("invalid instruction");
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment