craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Log | Files | Refs | README

commit ce63038cf2e88ea42056d67af57c0ed16e0d7fc1
parent 0dfad1abb4bd8def7bb5b85c3a35f902aa72daa6
Author: lash <dev@holbrook.no>
Date:   Tue, 21 Feb 2023 13:22:16 +0000

Implement contract writer checks

Diffstat:
Mjs/contract/CraftNFT.bin | 4++--
Mjs/contract/CraftNFT.json | 2+-
Mjs/qrread.js | 157++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mjs/qrread_ui.js | 5++++-
Mpython/craft_nft/data/CraftNFT.bin | 4++--
Mpython/craft_nft/data/CraftNFT.json | 2+-
Msolidity/CraftNFT.sol | 13+++++++++----
7 files changed, 115 insertions(+), 72 deletions(-)

diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200480d3803806200480d833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6141b2806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a981eb4f116100ee578063a981eb4f146105f3578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806370a08231146105375780638da5cb5b1461057457806395d89b411461059f578063a22cb465146105ca57610200565b806342842e0e11610197578063559f5dc911610166578063559f5dc9146104555780635ae06f7e146104945780636352211e146104bd57806369e85c71146104fa57610200565b806342842e0e1461039657806349f2553a146103b25780634d03546a146103db5780634f64b2be1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780633fd2f5931461032e57806340c84b0e1461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906132a0565b610888565b60405161023991906132e8565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b6040516102649190613393565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f91906133eb565b610a6a565b6040516102a19190613459565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc9190613483565b60405180910390f35b6102ef60048036038101906102ea91906134ca565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613553565b610b1c565b604051610325919061358f565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613553565b610b34565b60405161036291906135ff565b60405180910390f35b34801561037757600080fd5b50610380610e93565b60405161038d91906135ff565b60405180910390f35b6103b060048036038101906103ab91906134ca565b610f21565b005b3480156103be57600080fd5b506103d960048036038101906103d49190613756565b610f8c565b005b3480156103e757600080fd5b5061040260048036038101906103fd91906137dd565b6112a4565b60405161040f91906132e8565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a91906133eb565b611582565b60405161044c919061358f565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061381d565b6115a6565b60405161048b9392919061386c565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b691906138a3565b61161a565b005b3480156104c957600080fd5b506104e460048036038101906104df91906133eb565b611739565b6040516104f19190613459565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613553565b611775565b60405161052e9190613393565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906138a3565b61198e565b60405161056b9190613483565b60405180910390f35b34801561058057600080fd5b506105896119d7565b6040516105969190613459565b60405180910390f35b3480156105ab57600080fd5b506105b46119fb565b6040516105c19190613393565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906138fc565b611a89565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906138a3565b611d2b565b60405161062791906132e8565b60405180910390f35b34801561063c57600080fd5b506106576004803603810190610652919061393c565b611d4b565b604051610664919061358f565b60405180910390f35b34801561067957600080fd5b50610682611fbd565b60405161068f919061358f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba91906138fc565b611fc3565b6040516106cc91906132e8565b60405180910390f35b6106ef60048036038101906106ea9190613a1d565b6120a4565b005b3480156106fd57600080fd5b50610718600480360381019061071391906133eb565b61217f565b6040516107259190613393565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613553565b6121f1565b6040516107629190613393565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613ada565b6125eb565b60405161079f919061358f565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906138a3565b6127f2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613b2d565b6128da565b60405161080591906132e8565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613b6d565b612972565b604051610842919061358f565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613553565b612acb565b60405161087f919061358f565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c03565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610b5557610b5461362b565b5b6040519080825280601f01601f191660200182016040528015610b875781602001600182028036833780820191505090505b5092506000905060005b6020811015610e8757600460f0878360208110610bb157610bb0613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610c8957603083610c209190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c5557610c54613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610cfb565b605783610c969190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ccb57610cca613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610d1057610d0f613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610de757603083610d729190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610da29190613cd4565b81518110610db357610db2613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610e65565b605783610df49190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e249190613cd4565b81518110610e3557610e34613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610e729190613cd4565b91508080610e7f90613d08565b915050610b91565b50829350505050919050565b600c8054610ea090613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90613c03565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b505050505081565b610f2c838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fe957600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110229190613d50565b8151811061103357611032613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110b35780806110af90613d08565b9150505b8067ffffffffffffffff8111156110cd576110cc61362b565b5b6040519080825280601f01601f1916602001820160405280156110ff5781602001600182028036833780820191505090505b50600c908161110e9190613f36565b5060005b82518110156111ff5782818151811061112e5761112d613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461118690613c03565b811061119557611194613c34565b5b8154600116156111b45790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111f790613d08565b915050611112565b508151811461129f577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461123890613c03565b811061124757611246613c34565b5b8154600116156112665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134a5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61135357600080fd5b61135b613201565b6004600086815260200190815260200160002080549050915060008211156113d8576000600460008781526020019081526020016000206000815481106113a5576113a4613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116113d757600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036114fd576001600a60008282546114f19190613cd4565b9250508190555061151f565b8365ffffffffffff16600a60008282546115179190613cd4565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161156e919061358f565b60405180910390a360019250505092915050565b6003818154811061159257600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106115c257600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061169f575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614054565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061178585610b34565b9150600c805461179490613c03565b905090508082516117a59190613cd4565b67ffffffffffffffff8111156117be576117bd61362b565b5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b50925060005b818110156118b557600c81815461180c90613c03565b811061181b5761181a613c34565b5b81546001161561183a5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061187357611872613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118ad90613d08565b9150506117f6565b5060005b8251811015611982578281815181106118d5576118d4613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061193257611931613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061196c90613d08565b925050808061197a90613d08565b9150506118b9565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611a0890613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490613c03565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b8015611baa57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2757600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611cc2565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c4257600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1f91906132e8565b60405180910390a35050565b60016020528060005260406000206000915054906101000a900460ff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611df15750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611dfa57600080fd5b6001600460008581526020019081526020016000208054905014611e1d57600080fd5b600060046000858152602001908152602001600020600081548110611e4557611e44613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611e7757600080fd5b6000600102600560008581526020019081526020016000205414611e9a57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613cd4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611fab9190613483565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201e57600080fd5b600260009054906101000a900460ff161561203857600080fd5b811561205a576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b6120af848484612b77565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461216490614099565b604051612171919061358f565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036121ba576121b081612acb565b9050806001900492505b60006004600083815260200190815260200160002080549050116121dd57600080fd5b6121e983600102611775565b915050919050565b6060806060600061220185610b34565b9150604767ffffffffffffffff81111561221e5761221d61362b565b5b6040519080825280601f01601f1916602001820160405280156122505781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061228857612287613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122ec576122eb613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123505761234f613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106123b4576123b3613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061241857612417613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061247c5761247b613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106124e0576124df613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156125df5782818151811061253257612531613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061258f5761258e613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806125c990613d08565b92505080806125d790613d08565b915050612516565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061261757612616613c34565b5b90600052602060002001905080600001600c9054906101000a900460ff161561263f57600080fd5b60008361ffff16148015612671575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156126d05760018160000160068282829054906101000a900465ffffffffffff1661269c9190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506126c88585611d4b565b9150506127eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127735750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61277c57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127c457600080fd5b6127e78585858460000160069054906101000a900465ffffffffffff1685612e8e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614054565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061299e5761299d613c34565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a5657600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612a8157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612ab357600080fd5b612ac08686868685612e8e565b915050949350505050565b60008060056000848152602001908152602001600020549050612aed8161310c565b612af657600080fd5b612aff8161313e565b15612b0d5782915050612b72565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612bce9190613483565b602060405180830381865afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f919061414f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c4957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d7d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612d7357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612d7c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612dda8284613170565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190613d50565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e819190613cd4565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612f2157600080fd5b84600001600c9054906101000a900460ff16612f83578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612f8257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166130049190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130919190613cd4565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516130f59190613483565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036131a057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61327d81613248565b811461328857600080fd5b50565b60008135905061329a81613274565b92915050565b6000602082840312156132b6576132b561323e565b5b60006132c48482850161328b565b91505092915050565b60008115159050919050565b6132e2816132cd565b82525050565b60006020820190506132fd60008301846132d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b60008484015250505050565b6000601f19601f8301169050919050565b600061336582613303565b61336f818561330e565b935061337f81856020860161331f565b61338881613349565b840191505092915050565b600060208201905081810360008301526133ad818461335a565b905092915050565b6000819050919050565b6133c8816133b5565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000602082840312156134015761340061323e565b5b600061340f848285016133d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344382613418565b9050919050565b61345381613438565b82525050565b600060208201905061346e600083018461344a565b92915050565b61347d816133b5565b82525050565b60006020820190506134986000830184613474565b92915050565b6134a781613438565b81146134b257600080fd5b50565b6000813590506134c48161349e565b92915050565b6000806000606084860312156134e3576134e261323e565b5b60006134f1868287016134b5565b9350506020613502868287016134b5565b9250506040613513868287016133d6565b9150509250925092565b6000819050919050565b6135308161351d565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b6000602082840312156135695761356861323e565b5b60006135778482850161353e565b91505092915050565b6135898161351d565b82525050565b60006020820190506135a46000830184613580565b92915050565b600081519050919050565b600082825260208201905092915050565b60006135d1826135aa565b6135db81856135b5565b93506135eb81856020860161331f565b6135f481613349565b840191505092915050565b6000602082019050818103600083015261361981846135c6565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366382613349565b810181811067ffffffffffffffff821117156136825761368161362b565b5b80604052505050565b6000613695613234565b90506136a1828261365a565b919050565b600067ffffffffffffffff8211156136c1576136c061362b565b5b6136ca82613349565b9050602081019050919050565b82818337600083830152505050565b60006136f96136f4846136a6565b61368b565b90508281526020810184848401111561371557613714613626565b5b6137208482856136d7565b509392505050565b600082601f83011261373d5761373c613621565b5b813561374d8482602086016136e6565b91505092915050565b60006020828403121561376c5761376b61323e565b5b600082013567ffffffffffffffff81111561378a57613789613243565b5b61379684828501613728565b91505092915050565b600065ffffffffffff82169050919050565b6137ba8161379f565b81146137c557600080fd5b50565b6000813590506137d7816137b1565b92915050565b600080604083850312156137f4576137f361323e565b5b60006138028582860161353e565b9250506020613813858286016137c8565b9150509250929050565b600080604083850312156138345761383361323e565b5b60006138428582860161353e565b9250506020613853858286016133d6565b9150509250929050565b6138668161379f565b82525050565b6000606082019050613881600083018661385d565b61388e602083018561385d565b61389b60408301846132d9565b949350505050565b6000602082840312156138b9576138b861323e565b5b60006138c7848285016134b5565b91505092915050565b6138d9816132cd565b81146138e457600080fd5b50565b6000813590506138f6816138d0565b92915050565b600080604083850312156139135761391261323e565b5b6000613921858286016134b5565b9250506020613932858286016138e7565b9150509250929050565b600080604083850312156139535761395261323e565b5b6000613961858286016134b5565b92505060206139728582860161353e565b9150509250929050565b600067ffffffffffffffff8211156139975761399661362b565b5b6139a082613349565b9050602081019050919050565b60006139c06139bb8461397c565b61368b565b9050828152602081018484840111156139dc576139db613626565b5b6139e78482856136d7565b509392505050565b600082601f830112613a0457613a03613621565b5b8135613a148482602086016139ad565b91505092915050565b60008060008060808587031215613a3757613a3661323e565b5b6000613a45878288016134b5565b9450506020613a56878288016134b5565b9350506040613a67878288016133d6565b925050606085013567ffffffffffffffff811115613a8857613a87613243565b5b613a94878288016139ef565b91505092959194509250565b600061ffff82169050919050565b613ab781613aa0565b8114613ac257600080fd5b50565b600081359050613ad481613aae565b92915050565b600080600060608486031215613af357613af261323e565b5b6000613b01868287016134b5565b9350506020613b128682870161353e565b9250506040613b2386828701613ac5565b9150509250925092565b60008060408385031215613b4457613b4361323e565b5b6000613b52858286016134b5565b9250506020613b63858286016134b5565b9150509250929050565b60008060008060808587031215613b8757613b8661323e565b5b6000613b95878288016134b5565b9450506020613ba68782880161353e565b9350506040613bb787828801613ac5565b9250506060613bc8878288016137c8565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613c63565b9150613cb583613c63565b9250828201905060ff811115613cce57613ccd613c70565b5b92915050565b6000613cdf826133b5565b9150613cea836133b5565b9250828201905080821115613d0257613d01613c70565b5b92915050565b6000613d13826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4557613d44613c70565b5b600182019050919050565b6000613d5b826133b5565b9150613d66836133b5565b9250828203905081811115613d7e57613d7d613c70565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613de97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613da9565b613df38683613da9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e30613e2b613e26846133b5565b613e0b565b6133b5565b9050919050565b6000819050919050565b613e4a83613e15565b613e5e613e5682613e37565b848454613db9565b825550505050565b600090565b613e73613e66565b613e7e818484613e41565b505050565b5b81811015613ea257613e97600082613e6b565b600181019050613e84565b5050565b601f821115613ee757613eb881613d84565b613ec184613d99565b81016020851015613ed0578190505b613ee4613edc85613d99565b830182613e83565b50505b505050565b60008160020a8304905092915050565b6000613f0d60001984600802613eec565b1980831691505092915050565b6000613f268383613efc565b9150826002028217905092915050565b613f3f826135aa565b67ffffffffffffffff811115613f5857613f5761362b565b5b613f628254613c03565b613f6d828285613ea6565b600060209050601f831160018114613fa05760008415613f8e578287015190505b613f988582613f1a565b865550614000565b601f198416613fae86613d84565b60005b82811015613fd657848901518255600182019150602085019450602081019050613fb1565b86831015613ff35784890151613fef601f891682613efc565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061403e600a8361330e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b6000819050602082019050919050565b6000614090825161351d565b80915050919050565b60006140a4826135aa565b826140ae84614074565b90506140b981614084565b925060208210156140f9576140f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613da9565b831692505b5050919050565b600061410b8261379f565b91506141168361379f565b9250828201905065ffffffffffff81111561413457614133613c70565b5b92915050565b6000815190506141498161349e565b92915050565b6000602082840312156141655761416461323e565b5b60006141738482850161413a565b9150509291505056fea264697066735822122016c5775db036c021867f0c38ab4a57d2665c32f2760c28648d23663e38656ea464736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b506040516200489938038062004899833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61423e806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c6004803603810190610227919061332c565b610888565b6040516102399190613374565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b604051610264919061341f565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613477565b610a6a565b6040516102a191906134e5565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc919061350f565b60405180910390f35b6102ef60048036038101906102ea9190613556565b610ab1565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135df565b610b1c565b604051610325919061361b565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613636565b610b34565b6040516103629190613374565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906135df565b610be0565b60405161039f91906136b8565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca91906136b8565b60405180910390f35b6103ed60048036038101906103e89190613556565b610fcd565b005b3480156103fb57600080fd5b506104166004803603810190610411919061380f565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613896565b611350565b60405161044c9190613374565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613477565b61162e565b604051610489919061361b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906138d6565b611652565b6040516104c893929190613925565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613636565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613477565b6117e5565b60405161052e91906134e5565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906135df565b611821565b60405161056b919061341f565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613636565b611a3a565b6040516105a8919061350f565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d391906134e5565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe919061341f565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613988565b611b35565b005b34801561063c57600080fd5b50610657600480360381019061065291906139c8565b611dd7565b604051610664919061361b565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f919061361b565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613988565b61204f565b6040516106cc9190613374565b60405180910390f35b6106ef60048036038101906106ea9190613aa9565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613477565b61220b565b604051610725919061341f565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906135df565b61227d565b604051610762919061341f565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613b66565b612677565b60405161079f919061361b565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613636565b61287e565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613bb9565b612966565b6040516108059190613374565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613bf9565b6129fe565b604051610842919061361b565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d91906135df565b612b57565b60405161087f919061361b565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c8f565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c006136e4565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613d60565b81518110610e5f57610e5e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613d60565b81518110610ee157610ee0613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613d60565b91508080610f2b90613d94565b915050610c3d565b50829350505050919050565b600c8054610f4c90613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613c8f565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613ddc565b815181106110df576110de613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613d94565b9150505b8067ffffffffffffffff811115611179576111786136e4565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190613fc2565b5060005b82518110156112ab578281815181106111da576111d9613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613c8f565b811061124157611240613cc0565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613d94565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613c8f565b81106112f3576112f2613cc0565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761328d565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613d60565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613d60565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a919061361b565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906140e0565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613c8f565b905090508082516118519190613d60565b67ffffffffffffffff81111561186a576118696136e4565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613c8f565b81106118c7576118c6613cc0565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613d94565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613d94565b9250508080611a2690613d94565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613c8f565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613374565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613d60565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612037919061350f565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612c03565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f090614125565b6040516121fd919061361b565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612b57565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a96136e4565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613d94565b925050808061266390613d94565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613cc0565b5b90600052602060002001905080600001600c9054906101000a900460ff16156126cb57600080fd5b60008361ffff161480156126fd575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561275c5760018160000160068282829054906101000a900465ffffffffffff16612728919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506127548585611dd7565b915050612877565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ff5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61280857600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061285057600080fd5b6128738585858460000160069054906101000a900465ffffffffffff1685612f1a565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612903906140e0565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a2a57612a29613cc0565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ad95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612ae257600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612b0d57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b3f57600080fd5b612b4c8686868685612f1a565b915050949350505050565b60008060056000848152602001908152602001600020549050612b7981613198565b612b8257600080fd5b612b8b816131ca565b15612b995782915050612bfe565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5a919061350f565b602060405180830381865afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b91906141db565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612e09573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612dff57503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612e0857600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612e6682846131fc565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb69190613ddc565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190613d60565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612fad57600080fd5b84600001600c9054906101000a900460ff1661300f578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461300e57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613090919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d9190613d60565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613181919061350f565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361322c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613309816132d4565b811461331457600080fd5b50565b60008135905061332681613300565b92915050565b600060208284031215613342576133416132ca565b5b600061335084828501613317565b91505092915050565b60008115159050919050565b61336e81613359565b82525050565b60006020820190506133896000830184613365565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133c95780820151818401526020810190506133ae565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f18261338f565b6133fb818561339a565b935061340b8185602086016133ab565b613414816133d5565b840191505092915050565b6000602082019050818103600083015261343981846133e6565b905092915050565b6000819050919050565b61345481613441565b811461345f57600080fd5b50565b6000813590506134718161344b565b92915050565b60006020828403121561348d5761348c6132ca565b5b600061349b84828501613462565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134cf826134a4565b9050919050565b6134df816134c4565b82525050565b60006020820190506134fa60008301846134d6565b92915050565b61350981613441565b82525050565b60006020820190506135246000830184613500565b92915050565b613533816134c4565b811461353e57600080fd5b50565b6000813590506135508161352a565b92915050565b60008060006060848603121561356f5761356e6132ca565b5b600061357d86828701613541565b935050602061358e86828701613541565b925050604061359f86828701613462565b9150509250925092565b6000819050919050565b6135bc816135a9565b81146135c757600080fd5b50565b6000813590506135d9816135b3565b92915050565b6000602082840312156135f5576135f46132ca565b5b6000613603848285016135ca565b91505092915050565b613615816135a9565b82525050565b6000602082019050613630600083018461360c565b92915050565b60006020828403121561364c5761364b6132ca565b5b600061365a84828501613541565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061368a82613663565b613694818561366e565b93506136a48185602086016133ab565b6136ad816133d5565b840191505092915050565b600060208201905081810360008301526136d2818461367f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371c826133d5565b810181811067ffffffffffffffff8211171561373b5761373a6136e4565b5b80604052505050565b600061374e6132c0565b905061375a8282613713565b919050565b600067ffffffffffffffff82111561377a576137796136e4565b5b613783826133d5565b9050602081019050919050565b82818337600083830152505050565b60006137b26137ad8461375f565b613744565b9050828152602081018484840111156137ce576137cd6136df565b5b6137d9848285613790565b509392505050565b600082601f8301126137f6576137f56136da565b5b813561380684826020860161379f565b91505092915050565b600060208284031215613825576138246132ca565b5b600082013567ffffffffffffffff811115613843576138426132cf565b5b61384f848285016137e1565b91505092915050565b600065ffffffffffff82169050919050565b61387381613858565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac6132ca565b5b60006138bb858286016135ca565b92505060206138cc85828601613881565b9150509250929050565b600080604083850312156138ed576138ec6132ca565b5b60006138fb858286016135ca565b925050602061390c85828601613462565b9150509250929050565b61391f81613858565b82525050565b600060608201905061393a6000830186613916565b6139476020830185613916565b6139546040830184613365565b949350505050565b61396581613359565b811461397057600080fd5b50565b6000813590506139828161395c565b92915050565b6000806040838503121561399f5761399e6132ca565b5b60006139ad85828601613541565b92505060206139be85828601613973565b9150509250929050565b600080604083850312156139df576139de6132ca565b5b60006139ed85828601613541565b92505060206139fe858286016135ca565b9150509250929050565b600067ffffffffffffffff821115613a2357613a226136e4565b5b613a2c826133d5565b9050602081019050919050565b6000613a4c613a4784613a08565b613744565b905082815260208101848484011115613a6857613a676136df565b5b613a73848285613790565b509392505050565b600082601f830112613a9057613a8f6136da565b5b8135613aa0848260208601613a39565b91505092915050565b60008060008060808587031215613ac357613ac26132ca565b5b6000613ad187828801613541565b9450506020613ae287828801613541565b9350506040613af387828801613462565b925050606085013567ffffffffffffffff811115613b1457613b136132cf565b5b613b2087828801613a7b565b91505092959194509250565b600061ffff82169050919050565b613b4381613b2c565b8114613b4e57600080fd5b50565b600081359050613b6081613b3a565b92915050565b600080600060608486031215613b7f57613b7e6132ca565b5b6000613b8d86828701613541565b9350506020613b9e868287016135ca565b9250506040613baf86828701613b51565b9150509250925092565b60008060408385031215613bd057613bcf6132ca565b5b6000613bde85828601613541565b9250506020613bef85828601613541565b9150509250929050565b60008060008060808587031215613c1357613c126132ca565b5b6000613c2187828801613541565b9450506020613c32878288016135ca565b9350506040613c4387828801613b51565b9250506060613c5487828801613881565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ca757607f821691505b602082108103613cba57613cb9613c60565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3682613cef565b9150613d4183613cef565b9250828201905060ff811115613d5a57613d59613cfc565b5b92915050565b6000613d6b82613441565b9150613d7683613441565b9250828201905080821115613d8e57613d8d613cfc565b5b92915050565b6000613d9f82613441565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dd157613dd0613cfc565b5b600182019050919050565b6000613de782613441565b9150613df283613441565b9250828203905081811115613e0a57613e09613cfc565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e35565b613e7f8683613e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ebc613eb7613eb284613441565b613e97565b613441565b9050919050565b6000819050919050565b613ed683613ea1565b613eea613ee282613ec3565b848454613e45565b825550505050565b600090565b613eff613ef2565b613f0a818484613ecd565b505050565b5b81811015613f2e57613f23600082613ef7565b600181019050613f10565b5050565b601f821115613f7357613f4481613e10565b613f4d84613e25565b81016020851015613f5c578190505b613f70613f6885613e25565b830182613f0f565b50505b505050565b60008160020a8304905092915050565b6000613f9960001984600802613f78565b1980831691505092915050565b6000613fb28383613f88565b9150826002028217905092915050565b613fcb82613663565b67ffffffffffffffff811115613fe457613fe36136e4565b5b613fee8254613c8f565b613ff9828285613f32565b600060209050601f83116001811461402c576000841561401a578287015190505b6140248582613fa6565b86555061408c565b601f19841661403a86613e10565b60005b828110156140625784890151825560018201915060208501945060208101905061403d565b8683101561407f578489015161407b601f891682613f88565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006140ca600a8361339a565b91506140d582614094565b602082019050919050565b600060208201905081810360008301526140f9816140bd565b9050919050565b6000819050602082019050919050565b600061411c82516135a9565b80915050919050565b600061413082613663565b8261413a84614100565b905061414581614110565b92506020821015614185576141807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613e35565b831692505b5050919050565b600061419782613858565b91506141a283613858565b9250828201905065ffffffffffff8111156141c0576141bf613cfc565b5b92915050565b6000815190506141d58161352a565b92915050565b6000602082840312156141f1576141f06132ca565b5b60006141ff848285016141c6565b9150509291505056fea2646970667358221220a4af5fe38235e6966c14266548b35f81299d92794a1448e534de90d1ab82258264736f6c63430008120033 +\ No newline at end of file diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"writer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/js/qrread.js b/js/qrread.js @@ -9,6 +9,7 @@ const STATE = { SCAN_STOP: 64, SCAN_CONFIRM: 128, SCAN_DONE: 256, + AIEE: 512, }; var settings = { @@ -27,7 +28,7 @@ var settings = { }; const txBase = { - to: "0xb7cf275e96d3d0ea54aaa8f60133aa5dd3a6e3af", + to: undefined, gasLimit: 200000, gasPrice: 1, data: "0xd824ee4f", // mintFromBatchTo(address,bytes32,uint16) @@ -54,6 +55,10 @@ async function signAndSend() { let addr = settings.recipient; console.info('found recipient address', addr); let tx = txBase; + tx.to = settings.tokenAddress; + if (tx.to.substring(0, 2) != '0x') { + tx.to = '0x' + tx.to; + } let nonce = await settings.wallet.getTransactionCount(); addr = addressPrePad + addr; tx.data += addr; @@ -81,6 +86,7 @@ async function signAndSend() { console.debug(txr); nonce++; } + setStatus('verifying transactions...', STATUS_BUSY); } async function keyFileHandler(v, passphrase) { @@ -132,63 +138,14 @@ async function chainHandler(rpc, chainId) { return true; } -async function contractHandler(contractAddress) { - checkState(STATE.WALLET_SETTINGS | STATE.NETWORK_SETTINGS, true); - setStatus('scanning contract for tokens...', STATUS_BUSY); - setTimeout(async () => { - const contract = new ethers.Contract(contractAddress, nftAbi, settings.provider); - let i = 0; - let tokens = []; - while (true) { - try { - const tokenId = await contract.tokens(i); - tokens.push(tokenId); - } catch(e) { - break; - } - i++; - } - - let c = 0; - for (let i = 0; i < tokens.length; i++) { - const tokenId = tokens[i]; - const uri = await contract.tokenURI(ethers.BigNumber.from(tokenId)); - let j = 0; - while (true) { - try { - const batch = await contract.token(tokenId, j); - if (batch.count == 0) { - console.debug('skipping unique token', tokenId); - break; - } else if (batch.sparse) { - console.debug('skip sparse token', tokenId); - j++; - continue; - } - const e = new CustomEvent('token', { - detail: { - tokenId: tokenId, - batch: j, - }, - bubbles: true, - cancelable: true, - composed: false, - }); - window.dispatchEvent(e); - c++; - } catch { - break; - } - j++; - } - } - - - settings.tokenAddress = contractAddress; - state |= STATE.CONTRACT_SETTINGS; +async function checkContractOwner(addr) { + const contract = new ethers.Contract(addr, nftAbi, settings.provider); + const r = await contract.isWriter(settings.wallet.address); + if (!r) { + setStatus('address ' + settings.wallet.address + ' does not have mint access to contract. plesae start over.', STATUS_ERROR); const e = new CustomEvent('uistate', { detail: { - delta: STATE.CONTRACT_SETTINGS, + delta: STATE.AIEE, settings: settings, }, bubbles: true, @@ -196,9 +153,88 @@ async function contractHandler(contractAddress) { composed: false, }); window.dispatchEvent(e); - setStatus('found ' + c + ' available token batches in contract', STATUS_OK); - }, 0); - return true; + return; + } + setStatus('scanning contract...', STATUS_BUSY); + setTimeout(scanContract, 0, addr); +} + +async function scanContract(addr) { + const contract = new ethers.Contract(addr, nftAbi, settings.provider); + settings.tokenName = await contract.name(); + settings.tokenSymbol = await contract.symbol(); + setStatus('scanning contract for tokens...', STATUS_BUSY); + setTimeout(scanContractTokens, 0, addr); +} + +function contractHandler(addr) { + checkState(STATE.WALLET_SETTINGS | STATE.NETWORK_SETTINGS, true); + setStatus('check if wallet can mint...', STATUS_BUSY); + setTimeout(checkContractOwner, 0, addr); + +} + +async function scanContractTokens(contractAddress) { + const contract = new ethers.Contract(contractAddress, nftAbi, settings.provider); + let i = 0; + let tokens = []; + while (true) { + try { + const tokenId = await contract.tokens(i); + tokens.push(tokenId); + } catch(e) { + break; + } + i++; + } + + let c = 0; + for (let i = 0; i < tokens.length; i++) { + const tokenId = tokens[i]; + const uri = await contract.tokenURI(ethers.BigNumber.from(tokenId)); + let j = 0; + while (true) { + try { + const batch = await contract.token(tokenId, j); + if (batch.count == 0) { + console.debug('skipping unique token', tokenId); + break; + } else if (batch.sparse) { + console.debug('skip sparse token', tokenId); + j++; + continue; + } + const e = new CustomEvent('token', { + detail: { + tokenId: tokenId, + batch: j, + }, + bubbles: true, + cancelable: true, + composed: false, + }); + window.dispatchEvent(e); + c++; + } catch { + break; + } + j++; + } + } + + settings.tokenAddress = contractAddress; + state |= STATE.CONTRACT_SETTINGS; + const e = new CustomEvent('uistate', { + detail: { + delta: STATE.CONTRACT_SETTINGS, + settings: settings, + }, + bubbles: true, + cancelable: true, + composed: false, + }); + window.dispatchEvent(e); + setStatus('found ' + c + ' available token batches in contract', STATUS_OK); } function requestHandler(tokenBatch, amount) { @@ -225,5 +261,4 @@ function requestHandler(tokenBatch, amount) { - -const nftAbi = [{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]; +const nftAbi = [{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]; diff --git a/js/qrread_ui.js b/js/qrread_ui.js @@ -52,6 +52,8 @@ window.addEventListener('uistate', (e) => { break; case STATE.CONTRACT_SETTINGS: updateSettingsView('NFT contract address', e.detail.settings.tokenAddress); + updateSettingsView('NFT name', e.detail.settings.tokenName); + updateSettingsView('NFT symbol', e.detail.settings.tokenSymbol); document.getElementById("contract").style.display = "none"; document.getElementById("product").style.display = "block"; break; @@ -85,7 +87,8 @@ window.addEventListener('uistate', (e) => { document.getElementById("scanAbort").style.display = "none"; document.getElementById("scanReturn").style.display = "block"; break; - + case STATE.AIEE: + throw 'execution terminated'; default: throw 'invalid state ' + e.detail.delta; } diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200480d3803806200480d833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6141b2806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a981eb4f116100ee578063a981eb4f146105f3578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806370a08231146105375780638da5cb5b1461057457806395d89b411461059f578063a22cb465146105ca57610200565b806342842e0e11610197578063559f5dc911610166578063559f5dc9146104555780635ae06f7e146104945780636352211e146104bd57806369e85c71146104fa57610200565b806342842e0e1461039657806349f2553a146103b25780634d03546a146103db5780634f64b2be1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780633fd2f5931461032e57806340c84b0e1461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906132a0565b610888565b60405161023991906132e8565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b6040516102649190613393565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f91906133eb565b610a6a565b6040516102a19190613459565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc9190613483565b60405180910390f35b6102ef60048036038101906102ea91906134ca565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613553565b610b1c565b604051610325919061358f565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613553565b610b34565b60405161036291906135ff565b60405180910390f35b34801561037757600080fd5b50610380610e93565b60405161038d91906135ff565b60405180910390f35b6103b060048036038101906103ab91906134ca565b610f21565b005b3480156103be57600080fd5b506103d960048036038101906103d49190613756565b610f8c565b005b3480156103e757600080fd5b5061040260048036038101906103fd91906137dd565b6112a4565b60405161040f91906132e8565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a91906133eb565b611582565b60405161044c919061358f565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061381d565b6115a6565b60405161048b9392919061386c565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b691906138a3565b61161a565b005b3480156104c957600080fd5b506104e460048036038101906104df91906133eb565b611739565b6040516104f19190613459565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613553565b611775565b60405161052e9190613393565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906138a3565b61198e565b60405161056b9190613483565b60405180910390f35b34801561058057600080fd5b506105896119d7565b6040516105969190613459565b60405180910390f35b3480156105ab57600080fd5b506105b46119fb565b6040516105c19190613393565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906138fc565b611a89565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906138a3565b611d2b565b60405161062791906132e8565b60405180910390f35b34801561063c57600080fd5b506106576004803603810190610652919061393c565b611d4b565b604051610664919061358f565b60405180910390f35b34801561067957600080fd5b50610682611fbd565b60405161068f919061358f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba91906138fc565b611fc3565b6040516106cc91906132e8565b60405180910390f35b6106ef60048036038101906106ea9190613a1d565b6120a4565b005b3480156106fd57600080fd5b50610718600480360381019061071391906133eb565b61217f565b6040516107259190613393565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613553565b6121f1565b6040516107629190613393565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613ada565b6125eb565b60405161079f919061358f565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906138a3565b6127f2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613b2d565b6128da565b60405161080591906132e8565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613b6d565b612972565b604051610842919061358f565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613553565b612acb565b60405161087f919061358f565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c03565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610b5557610b5461362b565b5b6040519080825280601f01601f191660200182016040528015610b875781602001600182028036833780820191505090505b5092506000905060005b6020811015610e8757600460f0878360208110610bb157610bb0613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610c8957603083610c209190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c5557610c54613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610cfb565b605783610c969190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ccb57610cca613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610d1057610d0f613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610de757603083610d729190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610da29190613cd4565b81518110610db357610db2613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610e65565b605783610df49190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e249190613cd4565b81518110610e3557610e34613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610e729190613cd4565b91508080610e7f90613d08565b915050610b91565b50829350505050919050565b600c8054610ea090613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90613c03565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b505050505081565b610f2c838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fe957600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110229190613d50565b8151811061103357611032613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110b35780806110af90613d08565b9150505b8067ffffffffffffffff8111156110cd576110cc61362b565b5b6040519080825280601f01601f1916602001820160405280156110ff5781602001600182028036833780820191505090505b50600c908161110e9190613f36565b5060005b82518110156111ff5782818151811061112e5761112d613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461118690613c03565b811061119557611194613c34565b5b8154600116156111b45790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111f790613d08565b915050611112565b508151811461129f577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461123890613c03565b811061124757611246613c34565b5b8154600116156112665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134a5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61135357600080fd5b61135b613201565b6004600086815260200190815260200160002080549050915060008211156113d8576000600460008781526020019081526020016000206000815481106113a5576113a4613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116113d757600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036114fd576001600a60008282546114f19190613cd4565b9250508190555061151f565b8365ffffffffffff16600a60008282546115179190613cd4565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161156e919061358f565b60405180910390a360019250505092915050565b6003818154811061159257600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106115c257600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061169f575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614054565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061178585610b34565b9150600c805461179490613c03565b905090508082516117a59190613cd4565b67ffffffffffffffff8111156117be576117bd61362b565b5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b50925060005b818110156118b557600c81815461180c90613c03565b811061181b5761181a613c34565b5b81546001161561183a5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061187357611872613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118ad90613d08565b9150506117f6565b5060005b8251811015611982578281815181106118d5576118d4613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061193257611931613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061196c90613d08565b925050808061197a90613d08565b9150506118b9565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611a0890613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490613c03565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b8015611baa57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2757600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611cc2565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c4257600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1f91906132e8565b60405180910390a35050565b60016020528060005260406000206000915054906101000a900460ff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611df15750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611dfa57600080fd5b6001600460008581526020019081526020016000208054905014611e1d57600080fd5b600060046000858152602001908152602001600020600081548110611e4557611e44613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611e7757600080fd5b6000600102600560008581526020019081526020016000205414611e9a57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613cd4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611fab9190613483565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201e57600080fd5b600260009054906101000a900460ff161561203857600080fd5b811561205a576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b6120af848484612b77565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461216490614099565b604051612171919061358f565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036121ba576121b081612acb565b9050806001900492505b60006004600083815260200190815260200160002080549050116121dd57600080fd5b6121e983600102611775565b915050919050565b6060806060600061220185610b34565b9150604767ffffffffffffffff81111561221e5761221d61362b565b5b6040519080825280601f01601f1916602001820160405280156122505781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061228857612287613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122ec576122eb613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123505761234f613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106123b4576123b3613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061241857612417613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061247c5761247b613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106124e0576124df613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156125df5782818151811061253257612531613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061258f5761258e613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806125c990613d08565b92505080806125d790613d08565b915050612516565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061261757612616613c34565b5b90600052602060002001905080600001600c9054906101000a900460ff161561263f57600080fd5b60008361ffff16148015612671575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156126d05760018160000160068282829054906101000a900465ffffffffffff1661269c9190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506126c88585611d4b565b9150506127eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127735750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61277c57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127c457600080fd5b6127e78585858460000160069054906101000a900465ffffffffffff1685612e8e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614054565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061299e5761299d613c34565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a5657600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612a8157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612ab357600080fd5b612ac08686868685612e8e565b915050949350505050565b60008060056000848152602001908152602001600020549050612aed8161310c565b612af657600080fd5b612aff8161313e565b15612b0d5782915050612b72565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612bce9190613483565b602060405180830381865afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f919061414f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c4957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d7d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612d7357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612d7c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612dda8284613170565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190613d50565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e819190613cd4565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612f2157600080fd5b84600001600c9054906101000a900460ff16612f83578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612f8257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166130049190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130919190613cd4565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516130f59190613483565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036131a057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61327d81613248565b811461328857600080fd5b50565b60008135905061329a81613274565b92915050565b6000602082840312156132b6576132b561323e565b5b60006132c48482850161328b565b91505092915050565b60008115159050919050565b6132e2816132cd565b82525050565b60006020820190506132fd60008301846132d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b60008484015250505050565b6000601f19601f8301169050919050565b600061336582613303565b61336f818561330e565b935061337f81856020860161331f565b61338881613349565b840191505092915050565b600060208201905081810360008301526133ad818461335a565b905092915050565b6000819050919050565b6133c8816133b5565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000602082840312156134015761340061323e565b5b600061340f848285016133d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344382613418565b9050919050565b61345381613438565b82525050565b600060208201905061346e600083018461344a565b92915050565b61347d816133b5565b82525050565b60006020820190506134986000830184613474565b92915050565b6134a781613438565b81146134b257600080fd5b50565b6000813590506134c48161349e565b92915050565b6000806000606084860312156134e3576134e261323e565b5b60006134f1868287016134b5565b9350506020613502868287016134b5565b9250506040613513868287016133d6565b9150509250925092565b6000819050919050565b6135308161351d565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b6000602082840312156135695761356861323e565b5b60006135778482850161353e565b91505092915050565b6135898161351d565b82525050565b60006020820190506135a46000830184613580565b92915050565b600081519050919050565b600082825260208201905092915050565b60006135d1826135aa565b6135db81856135b5565b93506135eb81856020860161331f565b6135f481613349565b840191505092915050565b6000602082019050818103600083015261361981846135c6565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366382613349565b810181811067ffffffffffffffff821117156136825761368161362b565b5b80604052505050565b6000613695613234565b90506136a1828261365a565b919050565b600067ffffffffffffffff8211156136c1576136c061362b565b5b6136ca82613349565b9050602081019050919050565b82818337600083830152505050565b60006136f96136f4846136a6565b61368b565b90508281526020810184848401111561371557613714613626565b5b6137208482856136d7565b509392505050565b600082601f83011261373d5761373c613621565b5b813561374d8482602086016136e6565b91505092915050565b60006020828403121561376c5761376b61323e565b5b600082013567ffffffffffffffff81111561378a57613789613243565b5b61379684828501613728565b91505092915050565b600065ffffffffffff82169050919050565b6137ba8161379f565b81146137c557600080fd5b50565b6000813590506137d7816137b1565b92915050565b600080604083850312156137f4576137f361323e565b5b60006138028582860161353e565b9250506020613813858286016137c8565b9150509250929050565b600080604083850312156138345761383361323e565b5b60006138428582860161353e565b9250506020613853858286016133d6565b9150509250929050565b6138668161379f565b82525050565b6000606082019050613881600083018661385d565b61388e602083018561385d565b61389b60408301846132d9565b949350505050565b6000602082840312156138b9576138b861323e565b5b60006138c7848285016134b5565b91505092915050565b6138d9816132cd565b81146138e457600080fd5b50565b6000813590506138f6816138d0565b92915050565b600080604083850312156139135761391261323e565b5b6000613921858286016134b5565b9250506020613932858286016138e7565b9150509250929050565b600080604083850312156139535761395261323e565b5b6000613961858286016134b5565b92505060206139728582860161353e565b9150509250929050565b600067ffffffffffffffff8211156139975761399661362b565b5b6139a082613349565b9050602081019050919050565b60006139c06139bb8461397c565b61368b565b9050828152602081018484840111156139dc576139db613626565b5b6139e78482856136d7565b509392505050565b600082601f830112613a0457613a03613621565b5b8135613a148482602086016139ad565b91505092915050565b60008060008060808587031215613a3757613a3661323e565b5b6000613a45878288016134b5565b9450506020613a56878288016134b5565b9350506040613a67878288016133d6565b925050606085013567ffffffffffffffff811115613a8857613a87613243565b5b613a94878288016139ef565b91505092959194509250565b600061ffff82169050919050565b613ab781613aa0565b8114613ac257600080fd5b50565b600081359050613ad481613aae565b92915050565b600080600060608486031215613af357613af261323e565b5b6000613b01868287016134b5565b9350506020613b128682870161353e565b9250506040613b2386828701613ac5565b9150509250925092565b60008060408385031215613b4457613b4361323e565b5b6000613b52858286016134b5565b9250506020613b63858286016134b5565b9150509250929050565b60008060008060808587031215613b8757613b8661323e565b5b6000613b95878288016134b5565b9450506020613ba68782880161353e565b9350506040613bb787828801613ac5565b9250506060613bc8878288016137c8565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613c63565b9150613cb583613c63565b9250828201905060ff811115613cce57613ccd613c70565b5b92915050565b6000613cdf826133b5565b9150613cea836133b5565b9250828201905080821115613d0257613d01613c70565b5b92915050565b6000613d13826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4557613d44613c70565b5b600182019050919050565b6000613d5b826133b5565b9150613d66836133b5565b9250828203905081811115613d7e57613d7d613c70565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613de97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613da9565b613df38683613da9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e30613e2b613e26846133b5565b613e0b565b6133b5565b9050919050565b6000819050919050565b613e4a83613e15565b613e5e613e5682613e37565b848454613db9565b825550505050565b600090565b613e73613e66565b613e7e818484613e41565b505050565b5b81811015613ea257613e97600082613e6b565b600181019050613e84565b5050565b601f821115613ee757613eb881613d84565b613ec184613d99565b81016020851015613ed0578190505b613ee4613edc85613d99565b830182613e83565b50505b505050565b60008160020a8304905092915050565b6000613f0d60001984600802613eec565b1980831691505092915050565b6000613f268383613efc565b9150826002028217905092915050565b613f3f826135aa565b67ffffffffffffffff811115613f5857613f5761362b565b5b613f628254613c03565b613f6d828285613ea6565b600060209050601f831160018114613fa05760008415613f8e578287015190505b613f988582613f1a565b865550614000565b601f198416613fae86613d84565b60005b82811015613fd657848901518255600182019150602085019450602081019050613fb1565b86831015613ff35784890151613fef601f891682613efc565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061403e600a8361330e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b6000819050602082019050919050565b6000614090825161351d565b80915050919050565b60006140a4826135aa565b826140ae84614074565b90506140b981614084565b925060208210156140f9576140f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613da9565b831692505b5050919050565b600061410b8261379f565b91506141168361379f565b9250828201905065ffffffffffff81111561413457614133613c70565b5b92915050565b6000815190506141498161349e565b92915050565b6000602082840312156141655761416461323e565b5b60006141738482850161413a565b9150509291505056fea264697066735822122016c5775db036c021867f0c38ab4a57d2665c32f2760c28648d23663e38656ea464736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b506040516200489938038062004899833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61423e806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c6004803603810190610227919061332c565b610888565b6040516102399190613374565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b604051610264919061341f565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613477565b610a6a565b6040516102a191906134e5565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc919061350f565b60405180910390f35b6102ef60048036038101906102ea9190613556565b610ab1565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135df565b610b1c565b604051610325919061361b565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613636565b610b34565b6040516103629190613374565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906135df565b610be0565b60405161039f91906136b8565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca91906136b8565b60405180910390f35b6103ed60048036038101906103e89190613556565b610fcd565b005b3480156103fb57600080fd5b506104166004803603810190610411919061380f565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613896565b611350565b60405161044c9190613374565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613477565b61162e565b604051610489919061361b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906138d6565b611652565b6040516104c893929190613925565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613636565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613477565b6117e5565b60405161052e91906134e5565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906135df565b611821565b60405161056b919061341f565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613636565b611a3a565b6040516105a8919061350f565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d391906134e5565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe919061341f565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613988565b611b35565b005b34801561063c57600080fd5b50610657600480360381019061065291906139c8565b611dd7565b604051610664919061361b565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f919061361b565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613988565b61204f565b6040516106cc9190613374565b60405180910390f35b6106ef60048036038101906106ea9190613aa9565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613477565b61220b565b604051610725919061341f565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906135df565b61227d565b604051610762919061341f565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613b66565b612677565b60405161079f919061361b565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613636565b61287e565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613bb9565b612966565b6040516108059190613374565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613bf9565b6129fe565b604051610842919061361b565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d91906135df565b612b57565b60405161087f919061361b565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c8f565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c006136e4565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613d60565b81518110610e5f57610e5e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613d60565b81518110610ee157610ee0613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613d60565b91508080610f2b90613d94565b915050610c3d565b50829350505050919050565b600c8054610f4c90613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613c8f565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613ddc565b815181106110df576110de613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613d94565b9150505b8067ffffffffffffffff811115611179576111786136e4565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190613fc2565b5060005b82518110156112ab578281815181106111da576111d9613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613c8f565b811061124157611240613cc0565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613d94565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613c8f565b81106112f3576112f2613cc0565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761328d565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613d60565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613d60565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a919061361b565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906140e0565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613c8f565b905090508082516118519190613d60565b67ffffffffffffffff81111561186a576118696136e4565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613c8f565b81106118c7576118c6613cc0565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613d94565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613d94565b9250508080611a2690613d94565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613c8f565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613374565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613d60565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612037919061350f565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612c03565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f090614125565b6040516121fd919061361b565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612b57565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a96136e4565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613d94565b925050808061266390613d94565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613cc0565b5b90600052602060002001905080600001600c9054906101000a900460ff16156126cb57600080fd5b60008361ffff161480156126fd575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561275c5760018160000160068282829054906101000a900465ffffffffffff16612728919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506127548585611dd7565b915050612877565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ff5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61280857600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061285057600080fd5b6128738585858460000160069054906101000a900465ffffffffffff1685612f1a565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612903906140e0565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a2a57612a29613cc0565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ad95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612ae257600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612b0d57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b3f57600080fd5b612b4c8686868685612f1a565b915050949350505050565b60008060056000848152602001908152602001600020549050612b7981613198565b612b8257600080fd5b612b8b816131ca565b15612b995782915050612bfe565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5a919061350f565b602060405180830381865afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b91906141db565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612e09573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612dff57503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612e0857600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612e6682846131fc565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb69190613ddc565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190613d60565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612fad57600080fd5b84600001600c9054906101000a900460ff1661300f578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461300e57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613090919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d9190613d60565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613181919061350f565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361322c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613309816132d4565b811461331457600080fd5b50565b60008135905061332681613300565b92915050565b600060208284031215613342576133416132ca565b5b600061335084828501613317565b91505092915050565b60008115159050919050565b61336e81613359565b82525050565b60006020820190506133896000830184613365565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133c95780820151818401526020810190506133ae565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f18261338f565b6133fb818561339a565b935061340b8185602086016133ab565b613414816133d5565b840191505092915050565b6000602082019050818103600083015261343981846133e6565b905092915050565b6000819050919050565b61345481613441565b811461345f57600080fd5b50565b6000813590506134718161344b565b92915050565b60006020828403121561348d5761348c6132ca565b5b600061349b84828501613462565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134cf826134a4565b9050919050565b6134df816134c4565b82525050565b60006020820190506134fa60008301846134d6565b92915050565b61350981613441565b82525050565b60006020820190506135246000830184613500565b92915050565b613533816134c4565b811461353e57600080fd5b50565b6000813590506135508161352a565b92915050565b60008060006060848603121561356f5761356e6132ca565b5b600061357d86828701613541565b935050602061358e86828701613541565b925050604061359f86828701613462565b9150509250925092565b6000819050919050565b6135bc816135a9565b81146135c757600080fd5b50565b6000813590506135d9816135b3565b92915050565b6000602082840312156135f5576135f46132ca565b5b6000613603848285016135ca565b91505092915050565b613615816135a9565b82525050565b6000602082019050613630600083018461360c565b92915050565b60006020828403121561364c5761364b6132ca565b5b600061365a84828501613541565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061368a82613663565b613694818561366e565b93506136a48185602086016133ab565b6136ad816133d5565b840191505092915050565b600060208201905081810360008301526136d2818461367f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371c826133d5565b810181811067ffffffffffffffff8211171561373b5761373a6136e4565b5b80604052505050565b600061374e6132c0565b905061375a8282613713565b919050565b600067ffffffffffffffff82111561377a576137796136e4565b5b613783826133d5565b9050602081019050919050565b82818337600083830152505050565b60006137b26137ad8461375f565b613744565b9050828152602081018484840111156137ce576137cd6136df565b5b6137d9848285613790565b509392505050565b600082601f8301126137f6576137f56136da565b5b813561380684826020860161379f565b91505092915050565b600060208284031215613825576138246132ca565b5b600082013567ffffffffffffffff811115613843576138426132cf565b5b61384f848285016137e1565b91505092915050565b600065ffffffffffff82169050919050565b61387381613858565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac6132ca565b5b60006138bb858286016135ca565b92505060206138cc85828601613881565b9150509250929050565b600080604083850312156138ed576138ec6132ca565b5b60006138fb858286016135ca565b925050602061390c85828601613462565b9150509250929050565b61391f81613858565b82525050565b600060608201905061393a6000830186613916565b6139476020830185613916565b6139546040830184613365565b949350505050565b61396581613359565b811461397057600080fd5b50565b6000813590506139828161395c565b92915050565b6000806040838503121561399f5761399e6132ca565b5b60006139ad85828601613541565b92505060206139be85828601613973565b9150509250929050565b600080604083850312156139df576139de6132ca565b5b60006139ed85828601613541565b92505060206139fe858286016135ca565b9150509250929050565b600067ffffffffffffffff821115613a2357613a226136e4565b5b613a2c826133d5565b9050602081019050919050565b6000613a4c613a4784613a08565b613744565b905082815260208101848484011115613a6857613a676136df565b5b613a73848285613790565b509392505050565b600082601f830112613a9057613a8f6136da565b5b8135613aa0848260208601613a39565b91505092915050565b60008060008060808587031215613ac357613ac26132ca565b5b6000613ad187828801613541565b9450506020613ae287828801613541565b9350506040613af387828801613462565b925050606085013567ffffffffffffffff811115613b1457613b136132cf565b5b613b2087828801613a7b565b91505092959194509250565b600061ffff82169050919050565b613b4381613b2c565b8114613b4e57600080fd5b50565b600081359050613b6081613b3a565b92915050565b600080600060608486031215613b7f57613b7e6132ca565b5b6000613b8d86828701613541565b9350506020613b9e868287016135ca565b9250506040613baf86828701613b51565b9150509250925092565b60008060408385031215613bd057613bcf6132ca565b5b6000613bde85828601613541565b9250506020613bef85828601613541565b9150509250929050565b60008060008060808587031215613c1357613c126132ca565b5b6000613c2187828801613541565b9450506020613c32878288016135ca565b9350506040613c4387828801613b51565b9250506060613c5487828801613881565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ca757607f821691505b602082108103613cba57613cb9613c60565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3682613cef565b9150613d4183613cef565b9250828201905060ff811115613d5a57613d59613cfc565b5b92915050565b6000613d6b82613441565b9150613d7683613441565b9250828201905080821115613d8e57613d8d613cfc565b5b92915050565b6000613d9f82613441565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dd157613dd0613cfc565b5b600182019050919050565b6000613de782613441565b9150613df283613441565b9250828203905081811115613e0a57613e09613cfc565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e35565b613e7f8683613e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ebc613eb7613eb284613441565b613e97565b613441565b9050919050565b6000819050919050565b613ed683613ea1565b613eea613ee282613ec3565b848454613e45565b825550505050565b600090565b613eff613ef2565b613f0a818484613ecd565b505050565b5b81811015613f2e57613f23600082613ef7565b600181019050613f10565b5050565b601f821115613f7357613f4481613e10565b613f4d84613e25565b81016020851015613f5c578190505b613f70613f6885613e25565b830182613f0f565b50505b505050565b60008160020a8304905092915050565b6000613f9960001984600802613f78565b1980831691505092915050565b6000613fb28383613f88565b9150826002028217905092915050565b613fcb82613663565b67ffffffffffffffff811115613fe457613fe36136e4565b5b613fee8254613c8f565b613ff9828285613f32565b600060209050601f83116001811461402c576000841561401a578287015190505b6140248582613fa6565b86555061408c565b601f19841661403a86613e10565b60005b828110156140625784890151825560018201915060208501945060208101905061403d565b8683101561407f578489015161407b601f891682613f88565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006140ca600a8361339a565b91506140d582614094565b602082019050919050565b600060208201905081810360008301526140f9816140bd565b9050919050565b6000819050602082019050919050565b600061411c82516135a9565b80915050919050565b600061413082613663565b8261413a84614100565b905061414581614110565b92506020821015614185576141807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613e35565b831692505b5050919050565b600061419782613858565b91506141a283613858565b9250828201905065ffffffffffff8111156141c0576141bf613cfc565b5b92915050565b6000815190506141d58161352a565b92915050565b6000602082840312156141f1576141f06132ca565b5b60006141ff848285016141c6565b9150509291505056fea2646970667358221220a4af5fe38235e6966c14266548b35f81299d92794a1448e534de90d1ab82258264736f6c63430008120033 +\ No newline at end of file diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"writer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol @@ -23,7 +23,7 @@ contract CraftNFT { address public owner; // Addresses with access to allocate and mint tokens.. - mapping ( address => bool ) public writer; + mapping ( address => bool ) writer; // If set, ownership of the token contract cannot change. bool ownerFinal; @@ -108,6 +108,11 @@ contract CraftNFT { writer[_writer] = false; } + // implements Writer + function isWriter(address _writer) public view returns(bool) { + return writer[_writer] || _writer == owner; + } + // Check bit that is always set on the content data when a token has been minted. function isActive(bytes32 _tokenContent) private pure returns(bool) { return uint256(_tokenContent) & 0x8000000000000000000000000000000000000000000000000000000000000000 > 0; @@ -219,12 +224,12 @@ contract CraftNFT { spec = token[_content][uint256(_batch)]; - require(!spec.sparse); + require(!spec.sparse, 'ERR_SPARSE'); if (_batch == 0 && spec.count == 0) { spec.cursor += 1; return mintTo(_recipient, _content); } - require(msg.sender == owner || writer[msg.sender]); + require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS'); require(spec.cursor < spec.count); return mintBatchCore(_recipient, _content, _batch, spec.cursor, spec); } @@ -239,7 +244,7 @@ contract CraftNFT { tokenSpec storage spec; spec = token[_content][_batch]; - require(msg.sender == owner || writer[msg.sender]); + require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS'); require(spec.count > 0); require(_index < spec.count); return mintBatchCore(_recipient, _content, _batch, _index, spec);