erc20-demurrage-token

ERC20 token with redistributed continual demurrage
Log | Files | Refs | README

commit 75c16b7198964fdb4f8be28cbcc6ff72ae8fa2f1
parent 5d585fc2081174e4d6ee4228ab6156d639f4d3ec
Author: lash <dev@holbrook.no>
Date:   Sun, 19 Feb 2023 08:07:25 +0000

REinstate owner as minter by default

Diffstat:
Mpython/CHANGELOG | 2++
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 4++--
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json | 2+-
Mpython/erc20_demurrage_token/unittest/base.py | 6------
Mpython/setup.cfg | 2+-
Mpython/tests/test_mint.py | 28+++++++++++++++++++++++++++-
Msolidity/DemurrageTokenSingleNocap.sol | 13+++++++------
7 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/python/CHANGELOG b/python/CHANGELOG @@ -1,3 +1,5 @@ +- 0.3.6 + * Reinstate owner as minter by default - 0.3.0 * Smart contracts use abdk math libraries, all exponential operations are static gas cost * Add expiry features, after which balances are frozen and no more transfers or demurrage will occur diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b50604051620060ea380380620060ea833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002daf176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002dd5176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161538562000d656000396000818161115b0152818161148f015281816123570152612901015260008181611a220152818161231a0152818161285901528181612a9d0152612c85015260008181611a4e01528181612ac901528181612ca60152612ceb015260006114ed01526153856000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614739565b610c45565b6040516103cc9190614781565b60405180910390f35b6103dd610deb565b6040516103ea919061482c565b60405180910390f35b61040d600480360381019061040891906148e2565b610e79565b60405161041a9190614781565b60405180910390f35b61042b6110b5565b604051610438919061493e565b60405180910390f35b61045b60048036038101906104569190614985565b6110c8565b60405161046891906149d4565b60405180910390f35b610479611118565b60405161048691906149d4565b60405180910390f35b61049761112f565b6040516104a491906149d4565b60405180910390f35b6104b5611134565b6040516104c291906149d4565b60405180910390f35b6104e560048036038101906104e09190614b90565b611140565b6040516104f291906149d4565b60405180910390f35b610503611159565b604051610510919061493e565b60405180910390f35b610533600480360381019061052e9190614b90565b61117d565b6040516105409190614781565b60405180910390f35b610563600480360381019061055e9190614bbd565b6111e5565b6040516105709190614781565b60405180910390f35b610593600480360381019061058e9190614b90565b611403565b6040516105a0919061493e565b60405180910390f35b6105c360048036038101906105be9190614c10565b61143b565b6040516105d09190614781565b60405180910390f35b6105f360048036038101906105ee9190614c3d565b61146e565b60405161060091906149d4565b60405180910390f35b6106116114eb565b60405161061e91906149d4565b60405180910390f35b61062f61150f565b60405161063c91906149d4565b60405180910390f35b61065f600480360381019061065a91906148e2565b611515565b60405161066c9190614781565b60405180910390f35b61068f600480360381019061068a9190614c10565b6116ab565b60405161069e93929190614caa565b60405180910390f35b6106c160048036038101906106bc9190614c10565b61171a565b005b6106dd60048036038101906106d891906148e2565b611856565b6040516106ea9190614781565b60405180910390f35b61070d60048036038101906107089190614ce1565b6119d5565b60405161071a91906149d4565b60405180910390f35b61073d60048036038101906107389190614c10565b611a1e565b60405161074a91906149d4565b60405180910390f35b61076d60048036038101906107689190614c10565b611a7e565b60405161077a91906149d4565b60405180910390f35b61078b611a9f565b60405161079891906149d4565b60405180910390f35b6107bb60048036038101906107b69190614ce1565b611aa5565b6040516107c89190614781565b60405180910390f35b6107d9611baf565b6040516107e69190614d2a565b60405180910390f35b61080960048036038101906108049190614c10565b611c7c565b60405161081691906149d4565b60405180910390f35b61083960048036038101906108349190614c10565b611cbd565b60405161084691906149d4565b60405180910390f35b61086960048036038101906108649190614c10565b611cde565b005b61088560048036038101906108809190614ce1565b611da6565b60405161089291906149d4565b60405180910390f35b6108a3611e10565b6040516108b091906149d4565b60405180910390f35b6108c1611e21565b6040516108ce91906149d4565b60405180910390f35b6108f160048036038101906108ec9190614b90565b611e27565b6040516108fe91906149d4565b60405180910390f35b61090f611e55565b60405161091c91906149d4565b60405180910390f35b61092d611e5b565b60405161093a9190614781565b60405180910390f35b61094b612002565b6040516109589190614d54565b60405180910390f35b61097b60048036038101906109769190614c10565b612028565b60405161098891906149d4565b60405180910390f35b610999612107565b6040516109a69190614d54565b60405180910390f35b6109c960048036038101906109c49190614ce1565b61212d565b005b6109d36121e2565b6040516109e09190614781565b60405180910390f35b6109f16124a3565b6040516109fe919061482c565b60405180910390f35b610a216004803603810190610a1c91906148e2565b612531565b604051610a2e9190614781565b60405180910390f35b610a516004803603810190610a4c91906148e2565b612750565b604051610a5e9190614781565b60405180910390f35b610a6f612851565b604051610a7c91906149d4565b60405180910390f35b610a8d612857565b604051610a9a91906149d4565b60405180910390f35b610abd6004803603810190610ab89190614c10565b61287b565b604051610aca91906149d4565b60405180910390f35b610adb612a02565b604051610ae891906149d4565b60405180910390f35b610af9612a08565b604051610b0691906149d4565b60405180910390f35b610b296004803603810190610b249190614c10565b612a0e565b005b610b33612b0d565b604051610b4091906149d4565b60405180910390f35b610b636004803603810190610b5e9190614ce1565b612b17565b604051610b709190614781565b60405180910390f35b610b936004803603810190610b8e9190614b90565b612beb565b604051610ba091906149d4565b60405180910390f35b610bc36004803603810190610bbe9190614d6f565b612bff565b604051610bd09190614e45565b60405180910390f35b610be1612c7f565b604051610bee9190614e8b565b60405180910390f35b610bff612ce9565b604051610c0c91906149d4565b60405180910390f35b610c2f6004803603810190610c2a9190614ce1565b612d0d565b604051610c3c9190614781565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614ed5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614ed5565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611baf565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614f52565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614fbe565b60405180910390fd5b5b610fb66121e2565b50610fc084611c7c565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a091906149d4565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612daf565b6110ea6110e46001612daf565b86612e17565b612e7e565b90506110fa81612efd565b67ffffffffffffffff168461110f919061500d565b91505092915050565b6000600b5460085461112a919061500d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611baf565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614f52565b60405180910390fd5b61125b6121e2565b5061126585611c7c565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061500d565b9250508190555061138e878785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed91906149d4565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612daf565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612daf565b925061148885612daf565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612e7e565b90506114bf81612f57565b90506114cb8382612e7e565b90506114d681612efd565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115206121e2565b5061152a83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b89190615041565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161169891906149d4565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611baf565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611c7c565b90506117ea3382612fe4565b5081600b60008282546117fd9190615041565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a91906149d4565b60405180910390a25050565b6000806000611863611baf565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906150c1565b60405180910390fd5b6119046121e2565b506000601154111561192d57601154836008546119219190615041565b111561192c57600080fd5b5b826008600082825461193f9190615041565b9250508190555061194f83611c7c565b905061195b84826130eb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119b991906149d4565b60405180910390a36119c96131af565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a4c91906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000611a779190615041565b9050919050565b6000603c8242611a8e919061500d565b611a989190615152565b9050919050565b60035481565b6000611ab4600160ff1661143b565b15611abe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b4557503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611b4e57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611bcf5760019050611c79565b6000600f5403611be25760009050611c79565b600f544210611c7457611c0f603c600354611bfd9190615152565b600f54611c0a919061500d565b61287b565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c5a91906149d4565b60405180910390a1611c6a6121e2565b5060029050611c79565b600090505b90565b600080611ca0611c8b84612daf565b600260009054906101000a9004600f0b613373565b9050611cab81612efd565b67ffffffffffffffff16915050919050565b6000603c8242611ccd919061500d565b611cd79190615152565b9050919050565b611ceb600860ff1661143b565b15611cf557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d4f57600080fd5b611d57611118565b8111611d6257600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d9491906149d4565b60405180910390a28060118190555050565b6000806000806000611dbf611dba876119d5565b612daf565b9350611dcc600354611a7e565b9150611de784600260009054906101000a9004600f0b612e7e565b9250611e05611df584612efd565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e1c600061287b565b905090565b600b5481565b6000806000611e3584611140565b9150611e4084611403565b9050611e4c82826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010821061206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906151cf565b60405180910390fd5b60006012548316146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061523b565b60405180910390fd5b816012600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416012546040516120f591906149d4565b60405180910390a16012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61213a600260ff1661143b565b1561214457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461219e57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121ec614696565b6121f4614696565b6121fc614696565b600080600080600061220c611e10565b506122156133ff565b97506122208861117d565b15612236576000985050505050505050506124a0565b60006009548154811061224c5761224b61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122f988612beb565b94506001856123089190615041565b905061231386611403565b9350603c857f000000000000000000000000000000000000000000000000000000000000000061234391906150e1565b61234d9190615152565b91506123896123847f000000000000000000000000000000000000000000000000000000000000000061237f85612daf565b612e7e565b612f57565b925061239f600084612399611118565b84612bff565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061245b87613595565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161248b91906149d4565b60405180910390a16001985050505050505050505b90565b600780546124b090614ed5565b80601f01602080910402602001604051908101604052809291908181526020018280546124dc90614ed5565b80156125295780601f106124fe57610100808354040283529160200191612529565b820191906000526020600020905b81548152906001019060200180831161250c57829003601f168201915b505050505081565b60008061253d83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156125c857600080fd5b6125d06121e2565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265d919061500d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161273d91906149d4565b60405180910390a3600191505092915050565b60008060008061275e611baf565b905060028160ff1603612777576000935050505061284b565b60008160ff1611156127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590614f52565b60405180910390fd5b6127c66121e2565b506127d085611c7c565b92506127dd338785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161283c91906149d4565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156128a55760009450505050506129fd565b6128b0600354611a7e565b9250600083036128c75760009450505050506129fd565b600260009054906101000a9004600f0b90506000861180156128e857508286105b156128f1578592505b6128fa83612daf565b91506129267f000000000000000000000000000000000000000000000000000000000000000083612e7e565b935061293184612f57565b935061294c600260009054906101000a9004600f0b85612e7e565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361299491906150e1565b6003546129a19190615041565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129ed919061493e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a1d600460ff1661143b565b15612a2757600080fd5b601060009054906101000a900460ff1615612a4157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a9b57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612ac791906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000612af29190615041565b9050600f548111612b0257600080fd5b80600f819055505050565b6000600b54905090565b6000612b26600160ff1661143b565b15612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c07614696565b612c0f614696565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612cd0919061500d565b612cda9190615152565b612ce49190615041565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d6957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612dc657600080fd5b6040829060020a029050919050565b60008082600f0b13612de657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e02846136b4565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e6b57506f7fffffffffffffffffffffffffffffff600f0b8113155b612e7457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612eea57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ef357600080fd5b8091505092915050565b60008082600f0b1215612f0f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f3f8584612fe4565b50612f4a84846130eb565b5060019150509392505050565b60006840000000000000000082600f0b12612f7157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612fa55760009050612fdf565b612fdc6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061387a565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361304057600093505050506130e5565b613049866119d5565b92508483101561308e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613085906152d6565b60405180910390fd5b848361309a919061500d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361314757600093505050506131a9565b613150866119d5565b9250848361315e9190615041565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006131b9614696565b60006131c3611118565b9050600060016000805490506131d9919061500d565b815481106131ea576131e961525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506132c5919061500d565b815481106132d6576132d561525b565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361338457600080fd5b600082600f0b604085600f0b9060020a02816133a3576133a2615123565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156133ec57506f7fffffffffffffffffffffffffffffff600f0b8113155b6133f557600080fd5b8091505092915050565b613407614696565b61340f614696565b613417614696565b6000806009548154811061342e5761342d61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355d9190615322565b6fffffffffffffffffffffffffffffffff16905061357a83612beb565b811161358b57819350505050613592565b8293505050505b90565b60008060006135a384611e27565b6135ab611118565b6135b5919061500d565b9150600a546135c383611c7c565b6135cd919061500d565b90506135fb600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826130eb565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161366f91906149d4565b60405180910390a360016009600082825461368a9190615041565b9250508190555080600a60008282546136a39190615041565b925050819055508192505050919050565b60008082600f0b136136c557600080fd5b60008083600f0b9050680100000000000000008112613700576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261372e576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261375a576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613785576008819060008212600003808260020a82851804189250505090506008820191505b601081126137af576004819060008212600003808260020a82851804189250505090506004820191505b600481126137d9576002819060008212600003808260020a82851804189250505090506002820191505b600281126137e8576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561386d578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613815565b5081945050505050919050565b60006840000000000000000082600f0b1261389457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156138c85760009050614691565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561391657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561394f5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139885760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156139c157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139fa5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a33576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a6c57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613aa5576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613add57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b155760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613b4d576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b855760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613bbd576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613bf557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c2d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613c6557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c9c5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613cd3576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d0a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613d41576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d7857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613daf5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613de6576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e1d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613e53576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e8957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ebf5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613ef557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f2b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613f61576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f9757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613fcd576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561400257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140375760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561406c576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156140a15760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156140d6576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561410b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141405760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561417557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141a95760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156141dd576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561421157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614245576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561427957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156142ad5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156142e1576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143155760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614348576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561437b57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156143ae5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156143e157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144145760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614447576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561447a57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156144ad576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156144df57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145115760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614543576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145755760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156145a7576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156145d957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561460b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561463d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561468c57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614716816146e1565b811461472157600080fd5b50565b6000813590506147338161470d565b92915050565b60006020828403121561474f5761474e6146dc565b5b600061475d84828501614724565b91505092915050565b60008115159050919050565b61477b81614766565b82525050565b60006020820190506147966000830184614772565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147d65780820151818401526020810190506147bb565b60008484015250505050565b6000601f19601f8301169050919050565b60006147fe8261479c565b61480881856147a7565b93506148188185602086016147b8565b614821816147e2565b840191505092915050565b6000602082019050818103600083015261484681846147f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148798261484e565b9050919050565b6148898161486e565b811461489457600080fd5b50565b6000813590506148a681614880565b92915050565b6000819050919050565b6148bf816148ac565b81146148ca57600080fd5b50565b6000813590506148dc816148b6565b92915050565b600080604083850312156148f9576148f86146dc565b5b600061490785828601614897565b9250506020614918858286016148cd565b9150509250929050565b600081600f0b9050919050565b61493881614922565b82525050565b6000602082019050614953600083018461492f565b92915050565b61496281614922565b811461496d57600080fd5b50565b60008135905061497f81614959565b92915050565b6000806040838503121561499c5761499b6146dc565b5b60006149aa858286016148cd565b92505060206149bb85828601614970565b9150509250929050565b6149ce816148ac565b82525050565b60006020820190506149e960008301846149c5565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a2c826147e2565b810181811067ffffffffffffffff82111715614a4b57614a4a6149f4565b5b80604052505050565b6000614a5e6146d2565b9050614a6a8282614a23565b919050565b600063ffffffff82169050919050565b614a8881614a6f565b8114614a9357600080fd5b50565b600081359050614aa581614a7f565b92915050565b600068ffffffffffffffffff82169050919050565b614ac981614aab565b8114614ad457600080fd5b50565b600081359050614ae681614ac0565b92915050565b600067ffffffffffffffff82169050919050565b614b0981614aec565b8114614b1457600080fd5b50565b600081359050614b2681614b00565b92915050565b600060608284031215614b4257614b416149ef565b5b614b4c6060614a54565b90506000614b5c84828501614a96565b6000830152506020614b7084828501614ad7565b6020830152506040614b8484828501614b17565b60408301525092915050565b600060608284031215614ba657614ba56146dc565b5b6000614bb484828501614b2c565b91505092915050565b600080600060608486031215614bd657614bd56146dc565b5b6000614be486828701614897565b9350506020614bf586828701614897565b9250506040614c06868287016148cd565b9150509250925092565b600060208284031215614c2657614c256146dc565b5b6000614c34848285016148cd565b91505092915050565b60008060408385031215614c5457614c536146dc565b5b6000614c62858286016148cd565b9250506020614c73858286016148cd565b9150509250929050565b614c8681614a6f565b82525050565b614c9581614aab565b82525050565b614ca481614aec565b82525050565b6000606082019050614cbf6000830186614c7d565b614ccc6020830185614c8c565b614cd96040830184614c9b565b949350505050565b600060208284031215614cf757614cf66146dc565b5b6000614d0584828501614897565b91505092915050565b600060ff82169050919050565b614d2481614d0e565b82525050565b6000602082019050614d3f6000830184614d1b565b92915050565b614d4e8161486e565b82525050565b6000602082019050614d696000830184614d45565b92915050565b60008060008060808587031215614d8957614d886146dc565b5b6000614d97878288016148cd565b9450506020614da887828801614970565b9350506040614db9878288016148cd565b9250506060614dca878288016148cd565b91505092959194509250565b614ddf81614a6f565b82525050565b614dee81614aab565b82525050565b614dfd81614aec565b82525050565b606082016000820151614e196000850182614dd6565b506020820151614e2c6020850182614de5565b506040820151614e3f6040850182614df4565b50505050565b6000606082019050614e5a6000830184614e03565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e8581614e60565b82525050565b6000602082019050614ea06000830184614e7c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614eed57607f821691505b602082108103614f0057614eff614ea6565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f3c6007836147a7565b9150614f4782614f06565b602082019050919050565b60006020820190508181036000830152614f6b81614f2f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614fa8600a836147a7565b9150614fb382614f72565b602082019050919050565b60006020820190508181036000830152614fd781614f9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615018826148ac565b9150615023836148ac565b925082820390508181111561503b5761503a614fde565b5b92915050565b600061504c826148ac565b9150615057836148ac565b925082820190508082111561506f5761506e614fde565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150ab600a836147a7565b91506150b682615075565b602082019050919050565b600060208201905081810360008301526150da8161509e565b9050919050565b60006150ec826148ac565b91506150f7836148ac565b9250828202615105816148ac565b9150828204841483151761511c5761511b614fde565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061515d826148ac565b9150615168836148ac565b92508261517857615177615123565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006151b96011836147a7565b91506151c482615183565b602082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006152256012836147a7565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006152c0600d836147a7565b91506152cb8261528a565b602082019050919050565b600060208201905081810360008301526152ef816152b3565b9050919050565b6152ff81614e60565b811461530a57600080fd5b50565b60008151905061531c816152f6565b92915050565b600060208284031215615338576153376146dc565b5b60006153468482850161530d565b9150509291505056fea2646970667358221220c1f9d7d0a78f33fa80a4cedd3716f7ce66fd86bb2bab9cbeea3a9c3110f2399e64736f6c63430008110033 -\ No newline at end of file +6101006040523480156200001257600080fd5b506040516200614a3803806200614a833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e0f176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e35176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516153e562000d656000396000818161115b0152818161148f015281816123b70152612961015260008181611a7a0152818161237a015281816128b901528181612afd0152612ce5015260008181611aa601528181612b2901528181612d060152612d4b015260006114ed01526153e56000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614799565b610c45565b6040516103cc91906147e1565b60405180910390f35b6103dd610deb565b6040516103ea919061488c565b60405180910390f35b61040d60048036038101906104089190614942565b610e79565b60405161041a91906147e1565b60405180910390f35b61042b6110b5565b604051610438919061499e565b60405180910390f35b61045b600480360381019061045691906149e5565b6110c8565b6040516104689190614a34565b60405180910390f35b610479611118565b6040516104869190614a34565b60405180910390f35b61049761112f565b6040516104a49190614a34565b60405180910390f35b6104b5611134565b6040516104c29190614a34565b60405180910390f35b6104e560048036038101906104e09190614bf0565b611140565b6040516104f29190614a34565b60405180910390f35b610503611159565b604051610510919061499e565b60405180910390f35b610533600480360381019061052e9190614bf0565b61117d565b60405161054091906147e1565b60405180910390f35b610563600480360381019061055e9190614c1d565b6111e5565b60405161057091906147e1565b60405180910390f35b610593600480360381019061058e9190614bf0565b611403565b6040516105a0919061499e565b60405180910390f35b6105c360048036038101906105be9190614c70565b61143b565b6040516105d091906147e1565b60405180910390f35b6105f360048036038101906105ee9190614c9d565b61146e565b6040516106009190614a34565b60405180910390f35b6106116114eb565b60405161061e9190614a34565b60405180910390f35b61062f61150f565b60405161063c9190614a34565b60405180910390f35b61065f600480360381019061065a9190614942565b611515565b60405161066c91906147e1565b60405180910390f35b61068f600480360381019061068a9190614c70565b6116ab565b60405161069e93929190614d0a565b60405180910390f35b6106c160048036038101906106bc9190614c70565b61171a565b005b6106dd60048036038101906106d89190614942565b611856565b6040516106ea91906147e1565b60405180910390f35b61070d60048036038101906107089190614d41565b611a2d565b60405161071a9190614a34565b60405180910390f35b61073d60048036038101906107389190614c70565b611a76565b60405161074a9190614a34565b60405180910390f35b61076d60048036038101906107689190614c70565b611ad6565b60405161077a9190614a34565b60405180910390f35b61078b611af7565b6040516107989190614a34565b60405180910390f35b6107bb60048036038101906107b69190614d41565b611afd565b6040516107c891906147e1565b60405180910390f35b6107d9611c07565b6040516107e69190614d8a565b60405180910390f35b61080960048036038101906108049190614c70565b611cd4565b6040516108169190614a34565b60405180910390f35b61083960048036038101906108349190614c70565b611d15565b6040516108469190614a34565b60405180910390f35b61086960048036038101906108649190614c70565b611d36565b005b61088560048036038101906108809190614d41565b611dfe565b6040516108929190614a34565b60405180910390f35b6108a3611e68565b6040516108b09190614a34565b60405180910390f35b6108c1611e79565b6040516108ce9190614a34565b60405180910390f35b6108f160048036038101906108ec9190614bf0565b611e7f565b6040516108fe9190614a34565b60405180910390f35b61090f611ead565b60405161091c9190614a34565b60405180910390f35b61092d611eb3565b60405161093a91906147e1565b60405180910390f35b61094b61205a565b6040516109589190614db4565b60405180910390f35b61097b60048036038101906109769190614c70565b612080565b6040516109889190614a34565b60405180910390f35b610999612167565b6040516109a69190614db4565b60405180910390f35b6109c960048036038101906109c49190614d41565b61218d565b005b6109d3612242565b6040516109e091906147e1565b60405180910390f35b6109f1612503565b6040516109fe919061488c565b60405180910390f35b610a216004803603810190610a1c9190614942565b612591565b604051610a2e91906147e1565b60405180910390f35b610a516004803603810190610a4c9190614942565b6127b0565b604051610a5e91906147e1565b60405180910390f35b610a6f6128b1565b604051610a7c9190614a34565b60405180910390f35b610a8d6128b7565b604051610a9a9190614a34565b60405180910390f35b610abd6004803603810190610ab89190614c70565b6128db565b604051610aca9190614a34565b60405180910390f35b610adb612a62565b604051610ae89190614a34565b60405180910390f35b610af9612a68565b604051610b069190614a34565b60405180910390f35b610b296004803603810190610b249190614c70565b612a6e565b005b610b33612b6d565b604051610b409190614a34565b60405180910390f35b610b636004803603810190610b5e9190614d41565b612b77565b604051610b7091906147e1565b60405180910390f35b610b936004803603810190610b8e9190614bf0565b612c4b565b604051610ba09190614a34565b60405180910390f35b610bc36004803603810190610bbe9190614dcf565b612c5f565b604051610bd09190614ea5565b60405180910390f35b610be1612cdf565b604051610bee9190614eeb565b60405180910390f35b610bff612d49565b604051610c0c9190614a34565b60405180910390f35b610c2f6004803603810190610c2a9190614d41565b612d6d565b604051610c3c91906147e1565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614f35565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614f35565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611c07565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614fb2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa49061501e565b60405180910390fd5b5b610fb6612242565b50610fc084611cd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614a34565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612e0f565b6110ea6110e46001612e0f565b86612e77565b612ede565b90506110fa81612f5d565b67ffffffffffffffff168461110f919061506d565b91505092915050565b6000600b5460085461112a919061506d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611c07565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614fb2565b60405180910390fd5b61125b612242565b5061126585611cd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061506d565b9250508190555061138e878785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed9190614a34565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612e0f565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612e0f565b925061148885612e0f565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612ede565b90506114bf81612fb7565b90506114cb8382612ede565b90506114d681612f5d565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611520612242565b5061152a83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b891906150a1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516116989190614a34565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611c07565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611cd4565b90506117ea3382613044565b5081600b60008282546117fd91906150a1565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a9190614a34565b60405180910390a25050565b6000806000611863611c07565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90615121565b60405180910390fd5b61195c612242565b5060006011541115611985576011548360085461197991906150a1565b111561198457600080fd5b5b826008600082825461199791906150a1565b925050819055506119a783611cd4565b90506119b3848261314b565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a119190614a34565b60405180910390a3611a2161320f565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611aa49190615141565b7f0000000000000000000000000000000000000000000000000000000000000000611acf91906150a1565b9050919050565b6000603c8242611ae6919061506d565b611af091906151b2565b9050919050565b60035481565b6000611b0c600160ff1661143b565b15611b1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ba657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611c275760019050611cd1565b6000600f5403611c3a5760009050611cd1565b600f544210611ccc57611c67603c600354611c5591906151b2565b600f54611c62919061506d565b6128db565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611cb29190614a34565b60405180910390a1611cc2612242565b5060029050611cd1565b600090505b90565b600080611cf8611ce384612e0f565b600260009054906101000a9004600f0b6133d3565b9050611d0381612f5d565b67ffffffffffffffff16915050919050565b6000603c8242611d25919061506d565b611d2f91906151b2565b9050919050565b611d43600860ff1661143b565b15611d4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da757600080fd5b611daf611118565b8111611dba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611dec9190614a34565b60405180910390a28060118190555050565b6000806000806000611e17611e1287611a2d565b612e0f565b9350611e24600354611ad6565b9150611e3f84600260009054906101000a9004600f0b612ede565b9250611e5d611e4d84612f5d565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e7460006128db565b905090565b600b5481565b6000806000611e8d84611140565b9150611e9884611403565b9050611ea482826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061522f565b60405180910390fd5b600060125483161461210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061529b565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516121559190614a34565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61219a600260ff1661143b565b156121a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061224c6146f6565b6122546146f6565b61225c6146f6565b600080600080600061226c611e68565b5061227561345f565b97506122808861117d565b1561229657600098505050505050505050612500565b6000600954815481106122ac576122ab6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061235988612c4b565b945060018561236891906150a1565b905061237386611403565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123a39190615141565b6123ad91906151b2565b91506123e96123e47f00000000000000000000000000000000000000000000000000000000000000006123df85612e0f565b612ede565b612fb7565b92506123ff6000846123f9611118565b84612c5f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124bb876135f5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516124eb9190614a34565b60405180910390a16001985050505050505050505b90565b6007805461251090614f35565b80601f016020809104026020016040519081016040528092919081815260200182805461253c90614f35565b80156125895780601f1061255e57610100808354040283529160200191612589565b820191906000526020600020905b81548152906001019060200180831161256c57829003601f168201915b505050505081565b60008061259d83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561262857600080fd5b612630612242565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061506d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161279d9190614a34565b60405180910390a3600191505092915050565b6000806000806127be611c07565b905060028160ff16036127d757600093505050506128ab565b60008160ff16111561281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281590614fb2565b60405180910390fd5b612826612242565b5061283085611cd4565b925061283d338785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161289c9190614a34565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612905576000945050505050612a5d565b612910600354611ad6565b925060008303612927576000945050505050612a5d565b600260009054906101000a9004600f0b905060008611801561294857508286105b15612951578592505b61295a83612e0f565b91506129867f000000000000000000000000000000000000000000000000000000000000000083612ede565b935061299184612fb7565b93506129ac600260009054906101000a9004600f0b85612ede565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836129f49190615141565b600354612a0191906150a1565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a4d919061499e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a7d600460ff1661143b565b15612a8757600080fd5b601060009054906101000a900460ff1615612aa157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612afb57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b279190615141565b7f0000000000000000000000000000000000000000000000000000000000000000612b5291906150a1565b9050600f548111612b6257600080fd5b80600f819055505050565b6000600b54905090565b6000612b86600160ff1661143b565b15612b9057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bea57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c676146f6565b612c6f6146f6565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d30919061506d565b612d3a91906151b2565b612d4491906150a1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e2657600080fd5b6040829060020a029050919050565b60008082600f0b13612e4657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e6284613714565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ecb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ed457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f4a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612f5357600080fd5b8091505092915050565b60008082600f0b1215612f6f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f9f8584613044565b50612faa848461314b565b5060019150509392505050565b60006840000000000000000082600f0b12612fd157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613005576000905061303f565b61303c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506138da565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130a05760009350505050613145565b6130a986611a2d565b9250848310156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590615336565b60405180910390fd5b84836130fa919061506d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131a75760009350505050613209565b6131b086611a2d565b925084836131be91906150a1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132196146f6565b6000613223611118565b905060006001600080549050613239919061506d565b8154811061324a576132496152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050613325919061506d565b81548110613336576133356152bb565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036133e457600080fd5b600082600f0b604085600f0b9060020a028161340357613402615183565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561344c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61345557600080fd5b8091505092915050565b6134676146f6565b61346f6146f6565b6134776146f6565b6000806009548154811061348e5761348d6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190615382565b6fffffffffffffffffffffffffffffffff1690506135da83612c4b565b81116135eb578193505050506135f2565b8293505050505b90565b600080600061360384611e7f565b61360b611118565b613615919061506d565b9150600a5461362383611cd4565b61362d919061506d565b905061365b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261314b565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516136cf9190614a34565b60405180910390a36001600960008282546136ea91906150a1565b9250508190555080600a600082825461370391906150a1565b925050819055508192505050919050565b60008082600f0b1361372557600080fd5b60008083600f0b9050680100000000000000008112613760576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261378e576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137ba576010819060008212600003808260020a82851804189250505090506010820191505b61010081126137e5576008819060008212600003808260020a82851804189250505090506008820191505b6010811261380f576004819060008212600003808260020a82851804189250505090506004820191505b60048112613839576002819060008212600003808260020a82851804189250505090506002820191505b60028112613848576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156138cd578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613875565b5081945050505050919050565b60006840000000000000000082600f0b126138f457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561392857600090506146f1565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561397657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139af5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139e85760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a2157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a5a5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a93576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613acc57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b05576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b3d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b755760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613bad576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613be55760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c1d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c5557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c8d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cc557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613cfc5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d33576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d6a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613da1576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613dd857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e0f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e46576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e7d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eb3576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613ee957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f1f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f5557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f8b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613fc1576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613ff757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561402d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561406257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140975760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156140cc576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141015760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614136576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561416b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141a05760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156141d557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142095760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561423d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561427157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142a5576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156142d957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561430d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614341576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143755760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143a8576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156143db57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561440e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561444157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144745760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144a7576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156144da57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561450d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561453f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145715760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145a3576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145d55760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614607576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561463957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561466b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561469d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156146ec57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61477681614741565b811461478157600080fd5b50565b6000813590506147938161476d565b92915050565b6000602082840312156147af576147ae61473c565b5b60006147bd84828501614784565b91505092915050565b60008115159050919050565b6147db816147c6565b82525050565b60006020820190506147f660008301846147d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561483657808201518184015260208101905061481b565b60008484015250505050565b6000601f19601f8301169050919050565b600061485e826147fc565b6148688185614807565b9350614878818560208601614818565b61488181614842565b840191505092915050565b600060208201905081810360008301526148a68184614853565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148d9826148ae565b9050919050565b6148e9816148ce565b81146148f457600080fd5b50565b600081359050614906816148e0565b92915050565b6000819050919050565b61491f8161490c565b811461492a57600080fd5b50565b60008135905061493c81614916565b92915050565b600080604083850312156149595761495861473c565b5b6000614967858286016148f7565b92505060206149788582860161492d565b9150509250929050565b600081600f0b9050919050565b61499881614982565b82525050565b60006020820190506149b3600083018461498f565b92915050565b6149c281614982565b81146149cd57600080fd5b50565b6000813590506149df816149b9565b92915050565b600080604083850312156149fc576149fb61473c565b5b6000614a0a8582860161492d565b9250506020614a1b858286016149d0565b9150509250929050565b614a2e8161490c565b82525050565b6000602082019050614a496000830184614a25565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a8c82614842565b810181811067ffffffffffffffff82111715614aab57614aaa614a54565b5b80604052505050565b6000614abe614732565b9050614aca8282614a83565b919050565b600063ffffffff82169050919050565b614ae881614acf565b8114614af357600080fd5b50565b600081359050614b0581614adf565b92915050565b600068ffffffffffffffffff82169050919050565b614b2981614b0b565b8114614b3457600080fd5b50565b600081359050614b4681614b20565b92915050565b600067ffffffffffffffff82169050919050565b614b6981614b4c565b8114614b7457600080fd5b50565b600081359050614b8681614b60565b92915050565b600060608284031215614ba257614ba1614a4f565b5b614bac6060614ab4565b90506000614bbc84828501614af6565b6000830152506020614bd084828501614b37565b6020830152506040614be484828501614b77565b60408301525092915050565b600060608284031215614c0657614c0561473c565b5b6000614c1484828501614b8c565b91505092915050565b600080600060608486031215614c3657614c3561473c565b5b6000614c44868287016148f7565b9350506020614c55868287016148f7565b9250506040614c668682870161492d565b9150509250925092565b600060208284031215614c8657614c8561473c565b5b6000614c948482850161492d565b91505092915050565b60008060408385031215614cb457614cb361473c565b5b6000614cc28582860161492d565b9250506020614cd38582860161492d565b9150509250929050565b614ce681614acf565b82525050565b614cf581614b0b565b82525050565b614d0481614b4c565b82525050565b6000606082019050614d1f6000830186614cdd565b614d2c6020830185614cec565b614d396040830184614cfb565b949350505050565b600060208284031215614d5757614d5661473c565b5b6000614d65848285016148f7565b91505092915050565b600060ff82169050919050565b614d8481614d6e565b82525050565b6000602082019050614d9f6000830184614d7b565b92915050565b614dae816148ce565b82525050565b6000602082019050614dc96000830184614da5565b92915050565b60008060008060808587031215614de957614de861473c565b5b6000614df78782880161492d565b9450506020614e08878288016149d0565b9350506040614e198782880161492d565b9250506060614e2a8782880161492d565b91505092959194509250565b614e3f81614acf565b82525050565b614e4e81614b0b565b82525050565b614e5d81614b4c565b82525050565b606082016000820151614e796000850182614e36565b506020820151614e8c6020850182614e45565b506040820151614e9f6040850182614e54565b50505050565b6000606082019050614eba6000830184614e63565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ee581614ec0565b82525050565b6000602082019050614f006000830184614edc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f4d57607f821691505b602082108103614f6057614f5f614f06565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f9c600783614807565b9150614fa782614f66565b602082019050919050565b60006020820190508181036000830152614fcb81614f8f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615008600a83614807565b915061501382614fd2565b602082019050919050565b6000602082019050818103600083015261503781614ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150788261490c565b91506150838361490c565b925082820390508181111561509b5761509a61503e565b5b92915050565b60006150ac8261490c565b91506150b78361490c565b92508282019050808211156150cf576150ce61503e565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061510b600a83614807565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b600061514c8261490c565b91506151578361490c565b92508282026151658161490c565b9150828204841483151761517c5761517b61503e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151bd8261490c565b91506151c88361490c565b9250826151d8576151d7615183565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615219601183614807565b9150615224826151e3565b602082019050919050565b600060208201905081810360008301526152488161520c565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615285601283614807565b91506152908261524f565b602082019050919050565b600060208201905081810360008301526152b481615278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615320600d83614807565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b61535f81614ec0565b811461536a57600080fd5b50565b60008151905061537c81615356565b92915050565b6000602082840312156153985761539761473c565b5b60006153a68482850161536d565b9150509291505056fea2646970667358221220bdad8b7651c658121a07388a22a62150eafd0f38a872cf057ef212005a607df764736f6c63430008110033 +\ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py @@ -77,12 +77,6 @@ class TestTokenDeploy: r = rpc.do(o) self.start_time = r['timestamp'] - (tx_hash, o) = interface.add_writer(self.address, deployer_address, deployer_address) - r = rpc.do(o) - o = receipt(tx_hash) - r = rpc.do(o) - assert r['status'] == 1 - return self.address diff --git a/python/setup.cfg b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.5 +version = 0.3.6 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_mint.py b/python/tests/test_mint.py @@ -36,7 +36,6 @@ class TestAmounts(TestDemurrageDefault): o = block_by_number(r) r = self.rpc.do(o) ta = r['timestamp'] - logg.info('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< {} {} {}'.format(tb, ta, ta-tb)) nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -47,5 +46,32 @@ class TestAmounts(TestDemurrageDefault): self.assertEqual(r['status'], 1) + def test_writer(self): + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[1], 1000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.add_writer(self.address, self.accounts[0], self.accounts[1]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[1], 1000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + if __name__ == '__main__': unittest.main() diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol @@ -115,19 +115,18 @@ contract DemurrageTokenSingleNocap { // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - event SealStateChange(uint256 _sealState); - event Expired(uint256 _timestamp); event Cap(uint256 indexed _oldCap, uint256 _newCap); - // property sealing + // Implements Sealer uint256 public sealState; uint8 constant MINTER_STATE = 1; uint8 constant SINK_STATE = 2; uint8 constant EXPIRY_STATE = 4; uint8 constant CAP_STATE = 8; uint256 constant public maxSealState = 15; + event SealStateChange(bool indexed _final, uint256 _sealState); constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { @@ -158,15 +157,17 @@ contract DemurrageTokenSingleNocap { sinkAddress = _defaultSinkAddress; } + // Implements Sealer function seal(uint256 _state) public returns(uint256) { require(_state < 16, 'ERR_INVALID_STATE'); require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); sealState |= _state; - emit SealStateChange(sealState); + emit SealStateChange(sealState == maxSealState, sealState); return uint256(sealState); } - function isSealed(uint256 _state) public returns(bool) { + // Implements Sealer + function isSealed(uint256 _state) public view returns(bool) { require(_state < maxSealState); if (_state == 0) { return sealState == maxSealState; @@ -297,7 +298,7 @@ contract DemurrageTokenSingleNocap { uint256 baseAmount; require(applyExpiry() == 0); - require(minter[msg.sender], 'ERR_ACCESS'); + require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS'); changePeriod(); if (maxSupply > 0) {