commit 2717e29d91dd2b5f4a7efd14e28a44a11f14c66d
parent 23de062ab92d89872db82861482368bb9b4adf29
Author: lash <dev@holbrook.no>
Date: Fri, 10 Feb 2023 13:44:35 +0000
Freeze accounts balances at expiry
Diffstat:
3 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin
@@ -1 +1 @@
-60c06040523480156200001157600080fd5b5060405162005ed238038062005ed2833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b94176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bba176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516150fe62000dd4600039600081816119ab01528181612158015281816126ef01526129d50152600081816119d7015281816129f60152612a3b01526150fe6000f3fe608060405234801561001057600080fd5b5060043610610395576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101f0578063a457c2d711610121578063d89135cd116100bf578063e809529511610099578063e809529514610ba8578063eda4e6d614610bc6578063f2fde38b14610be4578063f629620b14610c1457610395565b8063d89135cd14610b2a578063e54063a614610b48578063e69571af14610b7857610395565b8063b470aade116100fb578063b470aade14610a8e578063bb8a357414610aac578063c0ab707714610adc578063d340ef8a14610b0c57610395565b8063a457c2d714610a10578063a9059cbb14610a40578063b1cb0db314610a7057610395565b806384dde4af1161018e5780638f0b2d5d116101685780638f0b2d5d146109885780638f1df6bc146109a457806395d89b41146109c2578063983b2d56146109e057610395565b806384dde4af1461091c57806386fe212d1461093a5780638da5cb5b1461096a57610395565b806373f42561116101ca57806373f42561146108925780637445e33a146108b057806374bedb95146108e057806379ba5097146108fe57610395565b80636a2d094e1461081457806370a0823114610844578063731f237c1461087457610395565b80633092afd5116102ca578063449a52f81161026857806351b4541c1161024257806351b4541c1461077857806358b2833b146107a85780635f408c04146107c65780636787a9be146107e457610395565b8063449a52f8146106e857806347a50517146107185780634abfbba21461074857610395565b806331a5995d116102a457806331a5995d1461064c578063395093511461066a57806340452d911461069a57806342966c68146106cc57610395565b80633092afd5146105ce57806331333487146105fe578063313ce5671461062e57610395565b80631989c6a81161033757806323a859441161031157806323a859441461050e57806323b872dd1461053e5780632a7aec091461056e5780632c1758c11461059e57610395565b80631989c6a8146104a2578063213d1e1e146104c0578063229ba197146104f057610395565b806309f28f3c1161037357806309f28f3c1461041857806311c566151461043657806318160ddd1461046657806318cbbcfc1461048457610395565b806301ffc9a71461039a57806306fdde03146103ca578063095ea7b3146103e8575b600080fd5b6103b460048036038101906103af919061451e565b610c30565b6040516103c19190614566565b60405180910390f35b6103d2610dd6565b6040516103df9190614611565b60405180910390f35b61040260048036038101906103fd91906146c7565b610e64565b60405161040f9190614566565b60405180910390f35b610420611035565b60405161042d9190614723565b60405180910390f35b610450600480360381019061044b919061476a565b611048565b60405161045d91906147b9565b60405180910390f35b61046e611098565b60405161047b91906147b9565b60405180910390f35b61048c6110af565b60405161049991906147b9565b60405180910390f35b6104aa6110b4565b6040516104b791906147b9565b60405180910390f35b6104da60048036038101906104d59190614975565b6110c0565b6040516104e791906147b9565b60405180910390f35b6104f86110d9565b6040516105059190614723565b60405180910390f35b61052860048036038101906105239190614975565b6110ec565b6040516105359190614566565b60405180910390f35b610558600480360381019061055391906149a2565b611154565b6040516105659190614566565b60405180910390f35b61058860048036038101906105839190614975565b611307565b6040516105959190614723565b60405180910390f35b6105b860048036038101906105b391906149f5565b61133f565b6040516105c59190614566565b60405180910390f35b6105e860048036038101906105e39190614a22565b611372565b6040516105f59190614566565b60405180910390f35b61061860048036038101906106139190614a4f565b61147c565b60405161062591906147b9565b60405180910390f35b6106366114e8565b60405161064391906147b9565b60405180910390f35b6106546114ee565b60405161066191906147b9565b60405180910390f35b610684600480360381019061067f91906146c7565b6114f4565b6040516106919190614566565b60405180910390f35b6106b460048036038101906106af91906149f5565b61168a565b6040516106c393929190614abc565b60405180910390f35b6106e660048036038101906106e191906149f5565b6116f9565b005b61070260048036038101906106fd91906146c7565b61181e565b60405161070f9190614566565b60405180910390f35b610732600480360381019061072d9190614a22565b61195e565b60405161073f91906147b9565b60405180910390f35b610762600480360381019061075d91906149f5565b6119a7565b60405161076f91906147b9565b60405180910390f35b610792600480360381019061078d91906149f5565b611a07565b60405161079f91906147b9565b60405180910390f35b6107b0611a28565b6040516107bd91906147b9565b60405180910390f35b6107ce611a2e565b6040516107db9190614566565b60405180910390f35b6107fe60048036038101906107f991906149f5565b611b40565b60405161080b91906147b9565b60405180910390f35b61082e600480360381019061082991906149f5565b611b81565b60405161083b91906147b9565b60405180910390f35b61085e60048036038101906108599190614a22565b611ba2565b60405161086b91906147b9565b60405180910390f35b61087c611c4e565b6040516108899190614566565b60405180910390f35b61089a611c5f565b6040516108a791906147b9565b60405180910390f35b6108ca60048036038101906108c59190614975565b611c65565b6040516108d791906147b9565b60405180910390f35b6108e8611c93565b6040516108f591906147b9565b60405180910390f35b610906611c99565b6040516109139190614566565b60405180910390f35b610924611e40565b6040516109319190614b02565b60405180910390f35b610954600480360381019061094f91906149f5565b611e66565b60405161096191906147b9565b60405180910390f35b610972611f45565b60405161097f9190614b02565b60405180910390f35b6109a2600480360381019061099d9190614a22565b611f6b565b005b6109ac612020565b6040516109b99190614566565b60405180910390f35b6109ca6122d0565b6040516109d79190614611565b60405180910390f35b6109fa60048036038101906109f59190614a22565b61235e565b604051610a079190614566565b60405180910390f35b610a2a6004803603810190610a2591906146c7565b612432565b604051610a379190614566565b60405180910390f35b610a5a6004803603810190610a5591906146c7565b612651565b604051610a679190614566565b60405180910390f35b610a786126e7565b604051610a8591906147b9565b60405180910390f35b610a966126ed565b604051610aa391906147b9565b60405180910390f35b610ac66004803603810190610ac19190614a22565b612711565b604051610ad39190614b39565b60405180910390f35b610af66004803603810190610af191906149f5565b6127c4565b604051610b039190614566565b60405180910390f35b610b1461292b565b604051610b2191906147b9565b60405180910390f35b610b32612931565b604051610b3f91906147b9565b60405180910390f35b610b626004803603810190610b5d9190614975565b61293b565b604051610b6f91906147b9565b60405180910390f35b610b926004803603810190610b8d9190614b54565b61294f565b604051610b9f9190614c2a565b60405180910390f35b610bb06129cf565b604051610bbd9190614c70565b60405180910390f35b610bce612a39565b604051610bdb91906147b9565b60405180910390f35b610bfe6004803603810190610bf99190614a22565b612a5d565b604051610c0b9190614566565b60405180910390f35b610c2e6004803603810190610c2991906149f5565b612aff565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c845760019050610dd1565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cd65760019050610dd1565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d285760019050610dd1565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d7a5760019050610dd1565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dcc5760019050610dd1565b600090505b919050565b60068054610de390614cba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f90614cba565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f305760008314610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614d37565b60405180910390fd5b5b610f38612020565b50610f4283611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161102291906147b9565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b60008061106f61105785612b94565b61106a6110646001612b94565b86612bfc565b612c63565b905061107a81612ce2565b67ffffffffffffffff168461108f9190614d86565b91505092915050565b6000600c546009546110aa9190614d86565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611109576000905061114f565b6000826020015168ffffffffffffffffff16111561112a576000905061114f565b6000826040015167ffffffffffffffff16111561114a576000905061114f565b600190505b919050565b6000806000611161612020565b5061116b84611b40565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111f657600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112829190614d86565b92505081905550611294868684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112f391906147b9565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611336576113336001612b94565b90505b80915050919050565b6000600f821061134e57600080fd5b6000820361136357600f60135414905061136d565b8160135483161490505b919050565b6000611381600160ff1661133f565b1561138b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061141257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61141b57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061148b86612b94565b925061149685612b94565b91506114b1600d60009054906101000a9004600f0b83612c63565b90506114bc81612d3c565b90506114c88382612c63565b90506114d381612ce2565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b6000806114ff612020565b5061150983611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115979190614dba565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161167791906147b9565b60405180910390a3600191505092915050565b6000818154811061169a57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174f57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561179b57600080fd5b60006117a682611b40565b90506117b23382612dc9565b5081600c60008282546117c59190614dba565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161181291906147b9565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614e3a565b60405180910390fd5b6118b5612020565b506118bf83611b40565b905082600960008282546118d39190614dba565b925050819055506118e48482612ed0565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161194291906147b9565b60405180910390a3611952612f94565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826119d59190614e5a565b7f0000000000000000000000000000000000000000000000000000000000000000611a009190614dba565b9050919050565b6000603c8242611a179190614d86565b611a219190614ecb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611a4e5760019050611b3d565b600060115403611a615760009050611b3d565b6011544210611b2a57611a72611098565b60016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b2191906147b9565b60405180910390a15b601260009054906101000a900460ff1690505b90565b600080611b64611b4f84612b94565b600260009054906101000a9004600f0b613158565b9050611b6f81612ce2565b67ffffffffffffffff16915050919050565b6000603c8242611b919190614d86565b611b9b9190614ecb565b9050919050565b6000806000806000611bb386612711565b905060018160ff1603611bcd576000945050505050611c49565b60028160ff1603611beb57611be0611098565b945050505050611c49565b611bfc611bf78761195e565b612b94565b9350611c09600354611a07565b9150611c2484600260009054906101000a9004600f0b612c63565b9250611c42611c3284612ce2565b67ffffffffffffffff168361147c565b9450505050505b919050565b6000611c5a60006127c4565b905090565b600c5481565b6000806000611c73846110c0565b9150611c7e84611307565b9050611c8a8282611048565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614f48565b60405180910390fd5b6000601354831614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614fb4565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f3391906147b9565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f78600260ff1661133f565b15611f8257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061202a61447b565b61203261447b565b61203a61447b565b600080600080600061204a611c4e565b506120536131e4565b975061205e886110ec565b15612074576000985050505050505050506122cd565b6000600a548154811061208a57612089614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506121378861293b565b94506001856121469190614dba565b905061215186611307565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121819190614e5a565b61218b9190614ecb565b91506121b66121b1600d60009054906101000a9004600f0b6121ac85612b94565b612c63565b612d3c565b92506121cc6000846121c6611098565b8461294f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122888761337a565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122b891906147b9565b60405180910390a16001985050505050505050505b90565b600780546122dd90614cba565b80601f016020809104026020016040519081016040528092919081815260200182805461230990614cba565b80156123565780601f1061232b57610100808354040283529160200191612356565b820191906000526020600020905b81548152906001019060200180831161233957829003601f168201915b505050505081565b600061236d600160ff1661133f565b1561237757600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d157600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061243e83611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124c957600080fd5b6124d1612020565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255e9190614d86565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161263e91906147b9565b60405180910390a3600191505092915050565b600080600061265e612020565b5061266884611b40565b9150612675338684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126d491906147b9565b60405180910390a3809250505092915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080601260009054906101000a900460ff16156127325760019050612751565b600060115411801561274657506011544210155b1561275057600190505b5b60008160ff161180156127b15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156127bb57600290505b80915050919050565b60008060008060006127d4611a2e565b156127de57600080fd5b6127e9600354611a07565b925060008303612800576000945050505050612926565b600260009054906101000a9004600f0b905060008611801561282157508286105b1561282a578592505b61283383612b94565b915061284e600d60009054906101000a9004600f0b83612c63565b935061285984612d3c565b9350612874600260009054906101000a9004600f0b85612c63565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128bc9190614e5a565b6003546128c99190614dba565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129159190614723565b60405180910390a460009450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b61295761447b565b61295f61447b565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a209190614d86565b612a2a9190614ecb565b612a349190614dba565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b0c600460ff1661133f565b15612b1657600080fd5b601260009054906101000a900460ff1615612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b8060118190555050565b6000677fffffffffffffff821115612bab57600080fd5b6040829060020a029050919050565b60008082600f0b13612bcb57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be784613499565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c5057506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5957600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ccf57506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd857600080fd5b8091505092915050565b60008082600f0b1215612cf457600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d248584612dc9565b50612d2f8484612ed0565b5060019150509392505050565b60006840000000000000000082600f0b12612d5657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d8a5760009050612dc4565b612dc16080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061365f565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e255760009350505050612eca565b612e2e8661195e565b925084831015612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a9061504f565b60405180910390fd5b8483612e7f9190614d86565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f2c5760009350505050612f8e565b612f358661195e565b92508483612f439190614dba565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f9e61447b565b6000612fa8611098565b905060006001600080549050612fbe9190614d86565b81548110612fcf57612fce614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130aa9190614d86565b815481106130bb576130ba614fd4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316957600080fd5b600082600f0b604085600f0b9060020a028161318857613187614e9c565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131d157506f7fffffffffffffffffffffffffffffff600f0b8113155b6131da57600080fd5b8091505092915050565b6131ec61447b565b6131f461447b565b6131fc61447b565b600080600a548154811061321357613212614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613342919061509b565b6fffffffffffffffffffffffffffffffff16905061335f8361293b565b811161337057819350505050613377565b8293505050505b90565b600080600061338884611c65565b613390611098565b61339a9190614d86565b9150600b546133a883611b40565b6133b29190614d86565b90506133e0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ed0565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161345491906147b9565b60405180910390a36001600a600082825461346f9190614dba565b9250508190555080600b60008282546134889190614dba565b925050819055508192505050919050565b60008082600f0b136134aa57600080fd5b60008083600f0b90506801000000000000000081126134e5576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613513576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261353f576010819060008212600003808260020a82851804189250505090506010820191505b610100811261356a576008819060008212600003808260020a82851804189250505090506008820191505b60108112613594576004819060008212600003808260020a82851804189250505090506004820191505b600481126135be576002819060008212600003808260020a82851804189250505090506002820191505b600281126135cd576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613652578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135fa565b5081945050505050919050565b60006840000000000000000082600f0b1261367957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136ad5760009050614476565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136fb57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137345760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561376d5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137a657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137df5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613818576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561385157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b131561388a576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138c257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138fa5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613932576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561396a5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139a2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139da57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a125760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a815760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613aef57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b26576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b945760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bcb576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c025760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c38576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6e57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ca45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cda57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d105760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d46576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7c57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613db2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e1c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e51576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e865760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613ebb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ef057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f255760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f8e5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fc2576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613ff657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561402a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140925760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140c6576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140fa5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561412d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561416057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141935760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141c657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f95760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561422c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614292576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142c457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142f65760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614328576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561435a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561438c576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143be57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143f05760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561442257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561447157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144fb816144c6565b811461450657600080fd5b50565b600081359050614518816144f2565b92915050565b600060208284031215614534576145336144c1565b5b600061454284828501614509565b91505092915050565b60008115159050919050565b6145608161454b565b82525050565b600060208201905061457b6000830184614557565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145bb5780820151818401526020810190506145a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006145e382614581565b6145ed818561458c565b93506145fd81856020860161459d565b614606816145c7565b840191505092915050565b6000602082019050818103600083015261462b81846145d8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061465e82614633565b9050919050565b61466e81614653565b811461467957600080fd5b50565b60008135905061468b81614665565b92915050565b6000819050919050565b6146a481614691565b81146146af57600080fd5b50565b6000813590506146c18161469b565b92915050565b600080604083850312156146de576146dd6144c1565b5b60006146ec8582860161467c565b92505060206146fd858286016146b2565b9150509250929050565b600081600f0b9050919050565b61471d81614707565b82525050565b60006020820190506147386000830184614714565b92915050565b61474781614707565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b60008060408385031215614781576147806144c1565b5b600061478f858286016146b2565b92505060206147a085828601614755565b9150509250929050565b6147b381614691565b82525050565b60006020820190506147ce60008301846147aa565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614811826145c7565b810181811067ffffffffffffffff821117156148305761482f6147d9565b5b80604052505050565b60006148436144b7565b905061484f8282614808565b919050565b600063ffffffff82169050919050565b61486d81614854565b811461487857600080fd5b50565b60008135905061488a81614864565b92915050565b600068ffffffffffffffffff82169050919050565b6148ae81614890565b81146148b957600080fd5b50565b6000813590506148cb816148a5565b92915050565b600067ffffffffffffffff82169050919050565b6148ee816148d1565b81146148f957600080fd5b50565b60008135905061490b816148e5565b92915050565b600060608284031215614927576149266147d4565b5b6149316060614839565b905060006149418482850161487b565b6000830152506020614955848285016148bc565b6020830152506040614969848285016148fc565b60408301525092915050565b60006060828403121561498b5761498a6144c1565b5b600061499984828501614911565b91505092915050565b6000806000606084860312156149bb576149ba6144c1565b5b60006149c98682870161467c565b93505060206149da8682870161467c565b92505060406149eb868287016146b2565b9150509250925092565b600060208284031215614a0b57614a0a6144c1565b5b6000614a19848285016146b2565b91505092915050565b600060208284031215614a3857614a376144c1565b5b6000614a468482850161467c565b91505092915050565b60008060408385031215614a6657614a656144c1565b5b6000614a74858286016146b2565b9250506020614a85858286016146b2565b9150509250929050565b614a9881614854565b82525050565b614aa781614890565b82525050565b614ab6816148d1565b82525050565b6000606082019050614ad16000830186614a8f565b614ade6020830185614a9e565b614aeb6040830184614aad565b949350505050565b614afc81614653565b82525050565b6000602082019050614b176000830184614af3565b92915050565b600060ff82169050919050565b614b3381614b1d565b82525050565b6000602082019050614b4e6000830184614b2a565b92915050565b60008060008060808587031215614b6e57614b6d6144c1565b5b6000614b7c878288016146b2565b9450506020614b8d87828801614755565b9350506040614b9e878288016146b2565b9250506060614baf878288016146b2565b91505092959194509250565b614bc481614854565b82525050565b614bd381614890565b82525050565b614be2816148d1565b82525050565b606082016000820151614bfe6000850182614bbb565b506020820151614c116020850182614bca565b506040820151614c246040850182614bd9565b50505050565b6000606082019050614c3f6000830184614be8565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6a81614c45565b82525050565b6000602082019050614c856000830184614c61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cd257607f821691505b602082108103614ce557614ce4614c8b565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d21600a8361458c565b9150614d2c82614ceb565b602082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9182614691565b9150614d9c83614691565b9250828203905081811115614db457614db3614d57565b5b92915050565b6000614dc582614691565b9150614dd083614691565b9250828201905080821115614de857614de7614d57565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e24600a8361458c565b9150614e2f82614dee565b602082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b6000614e6582614691565b9150614e7083614691565b9250828202614e7e81614691565b91508282048414831517614e9557614e94614d57565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed682614691565b9150614ee183614691565b925082614ef157614ef0614e9c565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f3260118361458c565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000614f9e60128361458c565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615039600d8361458c565b915061504482615003565b602082019050919050565b600060208201905081810360008301526150688161502c565b9050919050565b61507881614c45565b811461508357600080fd5b50565b6000815190506150958161506f565b92915050565b6000602082840312156150b1576150b06144c1565b5b60006150bf84828501615086565b9150509291505056fea2646970667358221220deb9ffdd6f8295131fcadbe267d10dc29511296956a3a18e1f86da744d4481d464736f6c63430008110033
-\ No newline at end of file
+60c06040523480156200001157600080fd5b5060405162005f3738038062005f37833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b8d176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bb3176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161516362000dd460003960008181611a640152818161218a0152818161278c01526129ce015260008181611a90015281816129ef0152612a3401526151636000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d89135cd116100bf578063e809529511610099578063e809529514610b5d578063eda4e6d614610b7b578063f2fde38b14610b99578063f629620b14610bc95761037a565b8063d89135cd14610adf578063e54063a614610afd578063e69571af14610b2d5761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b61039960048036038101906103949190614517565b610be5565b6040516103a6919061455f565b60405180910390f35b6103b7610d8b565b6040516103c4919061460a565b60405180910390f35b6103e760048036038101906103e291906146c0565b610e19565b6040516103f4919061455f565b60405180910390f35b610405611055565b604051610412919061471c565b60405180910390f35b61043560048036038101906104309190614763565b611068565b60405161044291906147b2565b60405180910390f35b6104536110b8565b60405161046091906147b2565b60405180910390f35b6104716110cf565b60405161047e91906147b2565b60405180910390f35b61048f6110d4565b60405161049c91906147b2565b60405180910390f35b6104bf60048036038101906104ba919061496e565b6110e0565b6040516104cc91906147b2565b60405180910390f35b6104dd6110f9565b6040516104ea919061471c565b60405180910390f35b61050d6004803603810190610508919061496e565b61110c565b60405161051a919061455f565b60405180910390f35b61053d6004803603810190610538919061499b565b611174565b60405161054a919061455f565b60405180910390f35b61056d6004803603810190610568919061496e565b611392565b60405161057a919061471c565b60405180910390f35b61059d600480360381019061059891906149ee565b6113ca565b6040516105aa919061455f565b60405180910390f35b6105cd60048036038101906105c89190614a1b565b6113fd565b6040516105da919061455f565b60405180910390f35b6105fd60048036038101906105f89190614a48565b611507565b60405161060a91906147b2565b60405180910390f35b61061b611573565b60405161062891906147b2565b60405180910390f35b610639611579565b60405161064691906147b2565b60405180910390f35b610669600480360381019061066491906146c0565b61157f565b604051610676919061455f565b60405180910390f35b610699600480360381019061069491906149ee565b611715565b6040516106a893929190614ab5565b60405180910390f35b6106cb60048036038101906106c691906149ee565b611784565b005b6106e760048036038101906106e291906146c0565b6118c0565b6040516106f4919061455f565b60405180910390f35b61071760048036038101906107129190614a1b565b611a17565b60405161072491906147b2565b60405180910390f35b610747600480360381019061074291906149ee565b611a60565b60405161075491906147b2565b60405180910390f35b610777600480360381019061077291906149ee565b611ac0565b60405161078491906147b2565b60405180910390f35b610795611ae1565b6040516107a291906147b2565b60405180910390f35b6107b3611ae7565b6040516107c09190614b08565b60405180910390f35b6107e360048036038101906107de91906149ee565b611bb4565b6040516107f091906147b2565b60405180910390f35b610813600480360381019061080e91906149ee565b611bf5565b60405161082091906147b2565b60405180910390f35b610843600480360381019061083e9190614a1b565b611c16565b60405161085091906147b2565b60405180910390f35b610861611c80565b60405161086e91906147b2565b60405180910390f35b61087f611c91565b60405161088c91906147b2565b60405180910390f35b6108af60048036038101906108aa919061496e565b611c97565b6040516108bc91906147b2565b60405180910390f35b6108cd611cc5565b6040516108da91906147b2565b60405180910390f35b6108eb611ccb565b6040516108f8919061455f565b60405180910390f35b610909611e72565b6040516109169190614b32565b60405180910390f35b610939600480360381019061093491906149ee565b611e98565b60405161094691906147b2565b60405180910390f35b610957611f77565b6040516109649190614b32565b60405180910390f35b61098760048036038101906109829190614a1b565b611f9d565b005b610991612052565b60405161099e919061455f565b60405180910390f35b6109af612302565b6040516109bc919061460a565b60405180910390f35b6109df60048036038101906109da9190614a1b565b612390565b6040516109ec919061455f565b60405180910390f35b610a0f6004803603810190610a0a91906146c0565b612464565b604051610a1c919061455f565b60405180910390f35b610a3f6004803603810190610a3a91906146c0565b612683565b604051610a4c919061455f565b60405180910390f35b610a5d612784565b604051610a6a91906147b2565b60405180910390f35b610a7b61278a565b604051610a8891906147b2565b60405180910390f35b610aab6004803603810190610aa691906149ee565b6127ae565b604051610ab891906147b2565b60405180910390f35b610ac9612924565b604051610ad691906147b2565b60405180910390f35b610ae761292a565b604051610af491906147b2565b60405180910390f35b610b176004803603810190610b12919061496e565b612934565b604051610b2491906147b2565b60405180910390f35b610b476004803603810190610b429190614b4d565b612948565b604051610b549190614c23565b60405180910390f35b610b656129c8565b604051610b729190614c69565b60405180910390f35b610b83612a32565b604051610b9091906147b2565b60405180910390f35b610bb36004803603810190610bae9190614a1b565b612a56565b604051610bc0919061455f565b60405180910390f35b610be36004803603810190610bde91906149ee565b612af8565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614cb3565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d30565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614d9c565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161104091906147b2565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612b8d565b61108a6110846001612b8d565b86612bf5565b612c5c565b905061109a81612cdb565b67ffffffffffffffff16846110af9190614deb565b91505092915050565b6000600c546009546110ca9190614deb565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d30565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614deb565b9250508190555061131d878785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c91906147b2565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612b8d565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612b8d565b925061152185612b8d565b915061153c600d60009054906101000a9004600f0b83612c5c565b905061154781612d35565b90506115538382612c5c565b905061155e81612cdb565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e1f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161170291906147b2565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612dc2565b5081600c60008282546118679190614e1f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b491906147b2565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614e9f565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e1f565b9250508190555061199d8482612ec9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb91906147b2565b60405180910390a3611a0b612f8d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614ebf565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e1f565b9050919050565b6000603c8242611ad09190614deb565b611ada9190614f30565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f30565b601154611b429190614deb565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b9291906147b2565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612b8d565b600260009054906101000a9004600f0b613151565b9050611be381612cdb565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614deb565b611c0f9190614f30565b9050919050565b6000806000806000611c2f611c2a87611a17565b612b8d565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612c5c565b9250611c75611c6584612cdb565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490614fad565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b90615019565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f6591906147b2565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c614474565b612064614474565b61206c614474565b600080600080600061207c611c80565b506120856131dd565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612934565b94506001856121789190614e1f565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614ebf565b6121bd9190614f30565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612b8d565b612c5c565b612d35565b92506121fe6000846121f86110b8565b84612948565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba87613373565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea91906147b2565b60405180910390a16001985050505050505050505b90565b6007805461230f90614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614cb3565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614deb565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161267091906147b2565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d30565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f91906147b2565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612b8d565b9150612848600d60009054906101000a9004600f0b83612c5c565b935061285384612d35565b935061286e600260009054906101000a9004600f0b85612c5c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614ebf565b6003546128c39190614e1f565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f919061471c565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b612950614474565b612958614474565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a199190614deb565b612a239190614f30565b612a2d9190614e1f565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab257600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b05600460ff166113ca565b15612b0f57600080fd5b601260009054906101000a900460ff1615612b2957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8357600080fd5b8060118190555050565b6000677fffffffffffffff821115612ba457600080fd5b6040829060020a029050919050565b60008082600f0b13612bc457600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be084613492565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c4957506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5257600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612cc857506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd157600080fd5b8091505092915050565b60008082600f0b1215612ced57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d1d8584612dc2565b50612d288484612ec9565b5060019150509392505050565b60006840000000000000000082600f0b12612d4f57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d835760009050612dbd565b612dba6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613658565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e1e5760009350505050612ec3565b612e2786611a17565b925084831015612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e63906150b4565b60405180910390fd5b8483612e789190614deb565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f255760009350505050612f87565b612f2e86611a17565b92508483612f3c9190614e1f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f97614474565b6000612fa16110b8565b905060006001600080549050612fb79190614deb565b81548110612fc857612fc7615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130a39190614deb565b815481106130b4576130b3615039565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316257600080fd5b600082600f0b604085600f0b9060020a028161318157613180614f01565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131ca57506f7fffffffffffffffffffffffffffffff600f0b8113155b6131d357600080fd5b8091505092915050565b6131e5614474565b6131ed614474565b6131f5614474565b600080600a548154811061320c5761320b615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333b9190615100565b6fffffffffffffffffffffffffffffffff16905061335883612934565b811161336957819350505050613370565b8293505050505b90565b600080600061338184611c97565b6133896110b8565b6133939190614deb565b9150600b546133a183611bb4565b6133ab9190614deb565b90506133d9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ec9565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161344d91906147b2565b60405180910390a36001600a60008282546134689190614e1f565b9250508190555080600b60008282546134819190614e1f565b925050819055508192505050919050565b60008082600f0b136134a357600080fd5b60008083600f0b90506801000000000000000081126134de576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261350c576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613538576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613563576008819060008212600003808260020a82851804189250505090506008820191505b6010811261358d576004819060008212600003808260020a82851804189250505090506004820191505b600481126135b7576002819060008212600003808260020a82851804189250505090506002820191505b600281126135c6576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561364b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135f3565b5081945050505050919050565b60006840000000000000000082600f0b1261367257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136a6576000905061446f565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136f457608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561372d5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137665760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561379f57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137d85760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613811576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561384a57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613883576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138bb57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138f35760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561392b576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139635760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561399b576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139d357608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a0b5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4357608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a7a5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab1576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ae857608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b1f576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5657608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b8d5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bc4576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613bfb5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c31576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6757608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613c9d5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cd357608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d095760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d3f576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7557608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613dab576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de057608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e155760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e4a576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e7f5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613eb4576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ee957608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f1e5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5357608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f875760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fbb576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613fef57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614023576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405757608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561408b5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140bf576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140f35760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614126576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561415957608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561418c5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141bf57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f25760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614225576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425857608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561428b576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142bd57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142ef5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614321576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143535760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614385576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143b757608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143e95760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561441b57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561446a57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144f4816144bf565b81146144ff57600080fd5b50565b600081359050614511816144eb565b92915050565b60006020828403121561452d5761452c6144ba565b5b600061453b84828501614502565b91505092915050565b60008115159050919050565b61455981614544565b82525050565b60006020820190506145746000830184614550565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145b4578082015181840152602081019050614599565b60008484015250505050565b6000601f19601f8301169050919050565b60006145dc8261457a565b6145e68185614585565b93506145f6818560208601614596565b6145ff816145c0565b840191505092915050565b6000602082019050818103600083015261462481846145d1565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146578261462c565b9050919050565b6146678161464c565b811461467257600080fd5b50565b6000813590506146848161465e565b92915050565b6000819050919050565b61469d8161468a565b81146146a857600080fd5b50565b6000813590506146ba81614694565b92915050565b600080604083850312156146d7576146d66144ba565b5b60006146e585828601614675565b92505060206146f6858286016146ab565b9150509250929050565b600081600f0b9050919050565b61471681614700565b82525050565b6000602082019050614731600083018461470d565b92915050565b61474081614700565b811461474b57600080fd5b50565b60008135905061475d81614737565b92915050565b6000806040838503121561477a576147796144ba565b5b6000614788858286016146ab565b92505060206147998582860161474e565b9150509250929050565b6147ac8161468a565b82525050565b60006020820190506147c760008301846147a3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61480a826145c0565b810181811067ffffffffffffffff82111715614829576148286147d2565b5b80604052505050565b600061483c6144b0565b90506148488282614801565b919050565b600063ffffffff82169050919050565b6148668161484d565b811461487157600080fd5b50565b6000813590506148838161485d565b92915050565b600068ffffffffffffffffff82169050919050565b6148a781614889565b81146148b257600080fd5b50565b6000813590506148c48161489e565b92915050565b600067ffffffffffffffff82169050919050565b6148e7816148ca565b81146148f257600080fd5b50565b600081359050614904816148de565b92915050565b6000606082840312156149205761491f6147cd565b5b61492a6060614832565b9050600061493a84828501614874565b600083015250602061494e848285016148b5565b6020830152506040614962848285016148f5565b60408301525092915050565b600060608284031215614984576149836144ba565b5b60006149928482850161490a565b91505092915050565b6000806000606084860312156149b4576149b36144ba565b5b60006149c286828701614675565b93505060206149d386828701614675565b92505060406149e4868287016146ab565b9150509250925092565b600060208284031215614a0457614a036144ba565b5b6000614a12848285016146ab565b91505092915050565b600060208284031215614a3157614a306144ba565b5b6000614a3f84828501614675565b91505092915050565b60008060408385031215614a5f57614a5e6144ba565b5b6000614a6d858286016146ab565b9250506020614a7e858286016146ab565b9150509250929050565b614a918161484d565b82525050565b614aa081614889565b82525050565b614aaf816148ca565b82525050565b6000606082019050614aca6000830186614a88565b614ad76020830185614a97565b614ae46040830184614aa6565b949350505050565b600060ff82169050919050565b614b0281614aec565b82525050565b6000602082019050614b1d6000830184614af9565b92915050565b614b2c8161464c565b82525050565b6000602082019050614b476000830184614b23565b92915050565b60008060008060808587031215614b6757614b666144ba565b5b6000614b75878288016146ab565b9450506020614b868782880161474e565b9350506040614b97878288016146ab565b9250506060614ba8878288016146ab565b91505092959194509250565b614bbd8161484d565b82525050565b614bcc81614889565b82525050565b614bdb816148ca565b82525050565b606082016000820151614bf76000850182614bb4565b506020820151614c0a6020850182614bc3565b506040820151614c1d6040850182614bd2565b50505050565b6000606082019050614c386000830184614be1565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6381614c3e565b82525050565b6000602082019050614c7e6000830184614c5a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ccb57607f821691505b602082108103614cde57614cdd614c84565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d1a600783614585565b9150614d2582614ce4565b602082019050919050565b60006020820190508181036000830152614d4981614d0d565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d86600a83614585565b9150614d9182614d50565b602082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614df68261468a565b9150614e018361468a565b9250828203905081811115614e1957614e18614dbc565b5b92915050565b6000614e2a8261468a565b9150614e358361468a565b9250828201905080821115614e4d57614e4c614dbc565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e89600a83614585565b9150614e9482614e53565b602082019050919050565b60006020820190508181036000830152614eb881614e7c565b9050919050565b6000614eca8261468a565b9150614ed58361468a565b9250828202614ee38161468a565b91508282048414831517614efa57614ef9614dbc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f3b8261468a565b9150614f468361468a565b925082614f5657614f55614f01565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f97601183614585565b9150614fa282614f61565b602082019050919050565b60006020820190508181036000830152614fc681614f8a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615003601283614585565b915061500e82614fcd565b602082019050919050565b6000602082019050818103600083015261503281614ff6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061509e600d83614585565b91506150a982615068565b602082019050919050565b600060208201905081810360008301526150cd81615091565b9050919050565b6150dd81614c3e565b81146150e857600080fd5b50565b6000815190506150fa816150d4565b92915050565b600060208284031215615116576151156144ba565b5b6000615124848285016150eb565b9150509291505056fea2646970667358221220e422c3c470e47ae50507101b474be1ed8c967783e71873a857dca314e06454ff64736f6c63430008110033
+\ 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":"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":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExpiredAccount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":[{"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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"_expires","type":"uint256"}],"name":"setExpires","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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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":"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":"addMinter","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":[],"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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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":[{"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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"_expires","type":"uint256"}],"name":"setExpires","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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -185,33 +185,21 @@ contract DemurrageTokenSingleCap {
sinkAddress = _sinkAddress;
}
- function applyExpiry() public returns(bool) {
+ function applyExpiry() public returns(uint8) {
if (expired) {
- return true;
+ return 1;
}
if (expires == 0) {
- return false;
+ return 0;
}
if (block.timestamp >= expires) {
- account[sinkAddress] = totalSupply();
+ applyDemurrageLimited(expires - demurrageTimestamp / 60);
expired = true;
emit Expired(block.timestamp);
+ changePeriod();
+ return 2;
}
- return expired;
- }
-
- function isExpiredAccount(address _account) public view returns(uint8) {
- uint8 expiry_state;
-
- if (expired) {
- expiry_state = 1;
- } else if (expires > 0 && block.timestamp >= expires) {
- expiry_state = 1;
- }
- if (expiry_state > 0 && _account == sinkAddress) {
- expiry_state = 2;
- }
- return expiry_state;
+ return 0;
}
// Given address will be allowed to call the mintTo() function
@@ -237,13 +225,6 @@ contract DemurrageTokenSingleCap {
uint256 periodCount;
uint8 expiryState;
- expiryState = isExpiredAccount(_account);
- if (expiryState == 1) {
- return 0;
- } else if (expiryState == 2) {
- return totalSupply();
- }
-
baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account));
periodCount = getMinutesDelta(demurrageTimestamp);
@@ -297,6 +278,7 @@ contract DemurrageTokenSingleCap {
function mintTo(address _beneficiary, uint256 _amount) external returns (bool) {
uint256 baseAmount;
+ require(applyExpiry() == 0);
require(minter[msg.sender], 'ERR_ACCESS');
changePeriod();
@@ -340,7 +322,6 @@ contract DemurrageTokenSingleCap {
return r;
}
-
// Client accessor to the redistributions array length
function redistributionCount() public view returns (uint256) {
return redistributions.length;
@@ -449,22 +430,24 @@ contract DemurrageTokenSingleCap {
}
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
- function applyDemurrage() public returns (bool) {
+ function applyDemurrage() public returns (uint256) {
return applyDemurrageLimited(0);
}
// returns true if expired
- function applyDemurrageLimited(uint256 _rounds) public returns (bool) {
+ function applyDemurrageLimited(uint256 _rounds) public returns (uint256) {
int128 v;
uint256 periodCount;
int128 periodPoint;
int128 lastDemurrageAmount;
- require(!applyExpiry());
+ if (expired) {
+ return 0;
+ }
periodCount = getMinutesDelta(demurrageTimestamp);
if (periodCount == 0) {
- return false;
+ return 0;
}
lastDemurrageAmount = demurrageAmount;
@@ -481,7 +464,7 @@ contract DemurrageTokenSingleCap {
demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount);
- return false;
+ return periodCount;
}
// Return timestamp of start of period threshold
@@ -534,7 +517,14 @@ contract DemurrageTokenSingleCap {
// Implements ERC20, triggers tax and/or redistribution
function approve(address _spender, uint256 _value) public returns (bool) {
uint256 baseValue;
+ uint8 ex;
+ ex = applyExpiry();
+ if (ex == 2) {
+ return false;
+ } else if (ex > 0) {
+ revert('EXPIRED');
+ }
if (allowance[msg.sender][_spender] > 0) {
require(_value == 0, 'ZERO_FIRST');
}
@@ -578,7 +568,14 @@ contract DemurrageTokenSingleCap {
function transfer(address _to, uint256 _value) public returns (bool) {
uint256 baseValue;
bool result;
+ uint8 ex;
+ ex = applyExpiry();
+ if (ex == 2) {
+ return false;
+ } else if (ex > 0) {
+ revert('EXPIRED');
+ }
changePeriod();
baseValue = toBaseAmount(_value);
@@ -591,7 +588,14 @@ contract DemurrageTokenSingleCap {
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 baseValue;
bool result;
+ uint8 ex;
+ ex = applyExpiry();
+ if (ex == 2) {
+ return false;
+ } else if (ex > 0) {
+ revert('EXPIRED');
+ }
changePeriod();
baseValue = toBaseAmount(_value);
@@ -634,6 +638,7 @@ contract DemurrageTokenSingleCap {
// Explicitly and irretrievably burn tokens
// Only token minters can burn tokens
function burn(uint256 _value) public {
+ require(applyExpiry() == 0);
require(minter[msg.sender]);
require(_value <= account[msg.sender]);
uint256 _delta = toBaseAmount(_value);