{"contractName":"GnosisSafe","abi":[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AddedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvedHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ApproveHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"masterCopy","type":"address"}],"name":"ChangedMasterCopy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"ChangedThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract Module","name":"module","type":"address"}],"name":"DisabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract Module","name":"module","type":"address"}],"name":"EnabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"RemovedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"}],"name":"SignMsg","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addOwnerWithThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"approvedHashes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_masterCopy","type":"address"}],"name":"changeMasterCopy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"changeThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract Module","name":"prevModule","type":"address"},{"internalType":"contract Module","name":"module","type":"address"}],"name":"disableModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract Module","name":"module","type":"address"}],"name":"enableModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModule","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModuleReturnData","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getModules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"start","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getModulesPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"handler","type":"address"}],"name":"setFallbackHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"signedMessages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"swapOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"fallbackHandler","type":"address"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"payment","type":"uint256"},{"internalType":"address payable","name":"paymentReceiver","type":"address"}],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address payable","name":"refundReceiver","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"execTransaction","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"requiredTxGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"hashToApprove","type":"bytes32"}],"name":"approveHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"signMessage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"message","type":"bytes"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"encodeTransactionData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506001600481905550615e4b80620000296000396000f3fe6080604052600436106101cd5760003560e01c8063affed0e0116100f7578063e009cfde11610095578063f08a032311610064578063f08a032314611504578063f698da2514611555578063f8dc5dd914611580578063ffa1ad74146115fb576101cd565b8063e009cfde146111f6578063e318b52b14611267578063e75235b8146112f8578063e86637db14611323576101cd565b8063c4ca3a9c116100d1578063c4ca3a9c14610e8b578063cc2f845214610f5c578063d4d9bdcd1461103f578063d8d11f781461107a576101cd565b8063affed0e014610c84578063b2494df314610caf578063b63e800d14610d1b576101cd565b8063610b59251161016f5780637de7edef1161013e5780637de7edef14610ab157806385a5affe14610b02578063a0e67e2b14610b88578063a3f4df7e14610bf4576101cd565b8063610b59251461082d578063694e80c31461087e5780636a761202146108b95780637d83297414610a42576101cd565b80632f54bf6e116101ab5780632f54bf6e146104db578063468721a7146105445780635229073f1461065b5780635ae6bd37146107de576101cd565b80630a1028c4146102775780630d582f131461035357806320c13b0b146103ae575b60003411806101df5750600080369050145b156101e957610275565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461027257366000803760008036600080855af13d6000803e600081141561026d573d6000fd5b3d6000f35b50505b005b34801561028357600080fd5b5061033d6004803603602081101561029a57600080fd5b81019080803590602001906401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460018302840111640100000000831117156102eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061168b565b6040518082815260200191505060405180910390f35b34801561035f57600080fd5b506103ac6004803603604081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c2565b005b3480156103ba57600080fd5b50610487600480360360408110156103d157600080fd5b81019080803590602001906401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b90919293919293908035906020019064010000000081111561044357600080fd5b82018360208201111561045557600080fd5b8035906020019184600183028401116401000000008311171561047757600080fd5b9091929391929390505050611c0c565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156104e757600080fd5b5061052a600480360360208110156104fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da2565b604051808215151515815260200191505060405180910390f35b34801561055057600080fd5b506106416004803603608081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460018302840111640100000000831117156105e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611e74565b604051808215151515815260200191505060405180910390f35b34801561066757600080fd5b506107586004803603608081101561067e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106c557600080fd5b8201836020820111156106d757600080fd5b803590602001918460018302840111640100000000831117156106f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919050505061203d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107a2578082015181840152602081019050610787565b50505050905090810190601f1680156107cf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156107ea57600080fd5b506108176004803603602081101561080157600080fd5b8101908080359060200190929190505050612073565b6040518082815260200191505060405180910390f35b34801561083957600080fd5b5061087c6004803603602081101561085057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b005b34801561088a57600080fd5b506108b7600480360360208110156108a157600080fd5b81019080803590602001909291905050506124af565b005b3480156108c557600080fd5b50610a2860048036036101408110156108dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109e457600080fd5b8201836020820111156109f657600080fd5b80359060200191846001830284011164010000000083111715610a1857600080fd5b909192939192939050505061262b565b604051808215151515815260200191505060405180910390f35b348015610a4e57600080fd5b50610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b348015610abd57600080fd5b50610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128b9565b005b348015610b0e57600080fd5b50610b8660048036036020811015610b2557600080fd5b8101908080359060200190640100000000811115610b4257600080fd5b820183602082011115610b5457600080fd5b80359060200191846001830284011164010000000083111715610b7657600080fd5b9091929391929390505050612a69565b005b348015610b9457600080fd5b50610b9d612b89565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610be0578082015181840152602081019050610bc5565b505050509050019250505060405180910390f35b348015610c0057600080fd5b50610c09612d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c49578082015181840152602081019050610c2e565b50505050905090810190601f168015610c765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c9057600080fd5b50610c99612d57565b6040518082815260200191505060405180910390f35b348015610cbb57600080fd5b50610cc4612d5d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d07578082015181840152602081019050610cec565b505050509050019250505060405180910390f35b348015610d2757600080fd5b50610e896004803603610100811015610d3f57600080fd5b8101908080359060200190640100000000811115610d5c57600080fd5b820183602082011115610d6e57600080fd5b80359060200191846020830284011164010000000083111715610d9057600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d76565b005b348015610e9757600080fd5b50610f4660048036036080811015610eae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610ef557600080fd5b820183602082011115610f0757600080fd5b80359060200191846001830284011164010000000083111715610f2957600080fd5b9091929391929390803560ff169060200190929190505050612f71565b6040518082815260200191505060405180910390f35b348015610f6857600080fd5b50610fb560048036036040811015610f7f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061311e565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561102a57808201518184015260208101905061100f565b50505050905001935050505060405180910390f35b34801561104b57600080fd5b506110786004803603602081101561106257600080fd5b81019080803590602001909291905050506132fd565b005b34801561108657600080fd5b506111e0600480360361014081101561109e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110e557600080fd5b8201836020820111156110f757600080fd5b8035906020019184600183028401116401000000008311171561111957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061349c565b6040518082815260200191505060405180910390f35b34801561120257600080fd5b506112656004803603604081101561121957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134c7565b005b34801561127357600080fd5b506112f66004803603606081101561128a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138cd565b005b34801561130457600080fd5b5061130d613f92565b6040518082815260200191505060405180910390f35b34801561132f57600080fd5b50611489600480360361014081101561134757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561138e57600080fd5b8201836020820111156113a057600080fd5b803590602001918460018302840111640100000000831117156113c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613f9c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114c95780820151818401526020810190506114ae565b50505050905090810190601f1680156114f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561151057600080fd5b506115536004803603602081101561152757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141b0565b005b34801561156157600080fd5b5061156a614240565b6040518082815260200191505060405180910390f35b34801561158c57600080fd5b506115f9600480360360608110156115a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614246565b005b34801561160757600080fd5b506116106146d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611650578082015181840152602081019050611635565b50505050905090810190601f16801561167d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118b05750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611c0857611c07816124af565b5b5050565b600080611c5c86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b90506000848490501415611cf957600060076000838152602001908152602001600020541415611cf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611d8f565b611d8e8187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600061470a565b5b6320c13b0b60e01b915050949350505050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611e6d5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611f3f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615d646030913960400191505060405180910390fd5b611fa1858585855a615038565b90508015611ff1573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2612035565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000606061204d86868686611e74565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60076020528060005260406000206000915090505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156121795750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6f64756c652068617320616c7265616479206265656e20616464656400000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b60035481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615c076023913960400191505060405180910390fd5b60018110156125e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615cdd6024913960400191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b60008060606126888f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8e8e8e8e600554613f9c565b9050600560008154809291906001019190505550808051906020012091506126f7828287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600161470a565b50885a1015612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615ded602a913960400191505060405180910390fd5b60005a90506127c28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008f1480156127b1575060008d145b6127bb578e6127bd565b5a5b615038565b92506127d75a826150aa90919063ffffffff16565b9050600080905060008911156127f7576127f4828b8b8b8b6150ca565b90505b8315612841577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8382604051808381526020018281526020019250505060405180910390a1612881565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238382604051808381526020018281526020019250505060405180910390a15b5050509c9b505050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615b736024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b6000612b3c83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a2505050565b606080600354604051908082528060200260200182016040528015612bbd5781602001602082028038833980820191505090505b5090506000809050600060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d155780838381518110612c6c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612c2b565b82935050505090565b6040518060400160405280600b81526020017f476e6f736973205361666500000000000000000000000000000000000000000081525081565b60055481565b606080612d6c6001600a61311e565b5090508091505090565b6000801b60065414612df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f446f6d61696e20536570617261746f7220616c7265616479207365742100000081525060200191505060405180910390fd5b7f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d474960001b30604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405160208183030381529060405280519060200120600681905550612ebf8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505089615296565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612efd57612efc84615752565b5b612f4b8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615781565b6000821115612f6557612f63826000600186856150ca565b505b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b60005a905061304d878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615038565b61305657600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130e35780820151818401526020810190506130c8565b50505050905090810190601f1680156131105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606000826040519080825280602002602001820160405280156131515781602001602082028038833980820191505090505b50915060008090506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156132285750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561323357508482105b156132ee578084838151811061324557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506131be565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c79206f776e6572732063616e20617070726f766520612068617368000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006134b08b8b8b8b8b8b8b8b8b8b613f9c565b8051906020012090509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135b55750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461370a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bdf6028913960400191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156139bb5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613b985750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8c8c8c805190602001208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561402c57fe5b60ff1681526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b61423d81615752565b50565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b806001600354031015614328576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615c2a6035913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143925750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600454146146cc576146cb816124af565b5b505050565b6040518060400160405280600581526020017f312e312e3100000000000000000000000000000000000000000000000000000081525081565b6000600454905060008111614787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5468726573686f6c64206e6565647320746f20626520646566696e656421000081525060200191505060405180910390fd5b61479b60418261599b90919063ffffffff16565b83511015614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5369676e617475726573206461746120746f6f2073686f72740000000000000081525060200191505060405180910390fd5b600080905060008060008060008090505b8681101561502b5761483489826159d5565b80945081955082965050505060008460ff161415614bc9578260001c945061486660418861599b90919063ffffffff16565b8260001c10156148c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d016037913960400191505060405180910390fd5b88516148da60208460001c615a0490919063ffffffff16565b1115614931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d946037913960400191505060405180910390fd5b60006020838b010151905089516149678261495960208760001c615a0490919063ffffffff16565b615a0490919063ffffffff16565b11156149be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615ca76036913960400191505060405180910390fd5b60606020848c010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8e846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015614a60578082015181840152602081019050614a45565b50505050905090810190601f168015614a8d5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614ac6578082015181840152602081019050614aab565b50505050905090810190601f168015614af35780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614b1257600080fd5b505afa158015614b26573d6000803e3d6000fd5b505050506040513d6020811015614b3c57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bbc6023913960400191505060405180910390fd5b5050614ea9565b60018460ff161415614d72578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c6657506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d81526020019081526020016000205414155b614cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4861736820686173206e6f74206265656e20617070726f76656400000000000081525060200191505060405180910390fd5b878015614d1157508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15614d6d576000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020819055505b614ea8565b601e8460ff161115614e3d5760018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e2c573d6000803e3d6000fd5b505050602060405103519450614ea7565b60018b85858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e9a573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015614f705750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015614fa95750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61501b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f496e76616c6964206f776e65722070726f76696465640000000000000000000081525060200191505060405180910390fd5b8495508080600101915050614822565b5050505050505050505050565b600080600181111561504657fe5b83600181111561505257fe5b141561506b5761506486868685615a23565b90506150a1565b60018081111561507757fe5b83600181111561508357fe5b141561509b57615094868584615a3c565b90506150a0565b600090505b5b95945050505050565b6000828211156150b957600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146151075782615109565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615204576151733a8610615150573a615152565b855b615165888a615a0490919063ffffffff16565b61599b90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506151ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615dcb6022913960400191505060405180910390fd5b61528c565b6152298561521b888a615a0490919063ffffffff16565b61599b90919063ffffffff16565b9150615236848284615a53565b61528b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c5f6022913960400191505060405180910390fd5b5b5095945050505050565b60006004541461530e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f776e657273206861766520616c7265616479206265656e207365747570000081525060200191505060405180910390fd5b8151811115615368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615c076023913960400191505060405180910390fd5b60018110156153c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615cdd6024913960400191505060405180910390fd5b60006001905060008090505b83518110156156be5760008482815181106153e557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156154595750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6154cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4475706c6963617465206f776e657220616464726573732070726f766964656481525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15080806001019150506153ce565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615866576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b976025913960400191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146159975761592482825a615a3c565b615996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f742066696e69736820696e697469616c697a6174696f6e0081525060200191505060405180910390fd5b5b5050565b6000808314156159ae57600090506159cf565b60008284029050828482816159bf57fe5b04146159ca57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015615a1957600080fd5b8091505092915050565b6000806000845160208601878987f19050949350505050565b60008060008451602086018786f490509392505050565b600060608383604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808251602084016000896127105a03f16040513d81016040523d6000823e3d60008114615b555760208114615b5d5760009450615b67565b829450615b67565b8151158315171594505b50505050939250505056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6f64756c6573206861766520616c7265616479206265656e20696e697469616c697a6564496e76616c696420636f6e7472616374207369676e61747572652070726f7669646564496e76616c696420707265764d6f64756c652c206d6f64756c6520706169722070726f76696465645468726573686f6c642063616e6e6f7420657863656564206f776e657220636f756e744e6577206f776e657220636f756e74206e6565647320746f206265206c6172676572207468616e206e6577207468726573686f6c64436f756c64206e6f74207061792067617320636f737473207769746820746f6b656e496e76616c696420707265764f776e65722c206f776e657220706169722070726f7669646564496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a2064617461206e6f7420636f6d706c6574655468726573686f6c64206e6565647320746f2062652067726561746572207468616e2030496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a20696e736964652073746174696320706172744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207468697320636f6e74726163744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d20616e20656e61626c6564206d6f64756c65496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a206c656e677468206e6f742070726573656e74436f756c64206e6f74207061792067617320636f73747320776974682065746865724e6f7420656e6f7567682067617320746f20657865637574652073616665207472616e73616374696f6ea265627a7a72315820701ab545ad8420c6d9f3f5bdce31db4b64dee59ebd72dbd0cef595d66a31f78164736f6c634300050e0032","deployedBytecode":"0x6080604052600436106101cd5760003560e01c8063affed0e0116100f7578063e009cfde11610095578063f08a032311610064578063f08a032314611504578063f698da2514611555578063f8dc5dd914611580578063ffa1ad74146115fb576101cd565b8063e009cfde146111f6578063e318b52b14611267578063e75235b8146112f8578063e86637db14611323576101cd565b8063c4ca3a9c116100d1578063c4ca3a9c14610e8b578063cc2f845214610f5c578063d4d9bdcd1461103f578063d8d11f781461107a576101cd565b8063affed0e014610c84578063b2494df314610caf578063b63e800d14610d1b576101cd565b8063610b59251161016f5780637de7edef1161013e5780637de7edef14610ab157806385a5affe14610b02578063a0e67e2b14610b88578063a3f4df7e14610bf4576101cd565b8063610b59251461082d578063694e80c31461087e5780636a761202146108b95780637d83297414610a42576101cd565b80632f54bf6e116101ab5780632f54bf6e146104db578063468721a7146105445780635229073f1461065b5780635ae6bd37146107de576101cd565b80630a1028c4146102775780630d582f131461035357806320c13b0b146103ae575b60003411806101df5750600080369050145b156101e957610275565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461027257366000803760008036600080855af13d6000803e600081141561026d573d6000fd5b3d6000f35b50505b005b34801561028357600080fd5b5061033d6004803603602081101561029a57600080fd5b81019080803590602001906401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460018302840111640100000000831117156102eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061168b565b6040518082815260200191505060405180910390f35b34801561035f57600080fd5b506103ac6004803603604081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c2565b005b3480156103ba57600080fd5b50610487600480360360408110156103d157600080fd5b81019080803590602001906401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b90919293919293908035906020019064010000000081111561044357600080fd5b82018360208201111561045557600080fd5b8035906020019184600183028401116401000000008311171561047757600080fd5b9091929391929390505050611c0c565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156104e757600080fd5b5061052a600480360360208110156104fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da2565b604051808215151515815260200191505060405180910390f35b34801561055057600080fd5b506106416004803603608081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460018302840111640100000000831117156105e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611e74565b604051808215151515815260200191505060405180910390f35b34801561066757600080fd5b506107586004803603608081101561067e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106c557600080fd5b8201836020820111156106d757600080fd5b803590602001918460018302840111640100000000831117156106f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919050505061203d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107a2578082015181840152602081019050610787565b50505050905090810190601f1680156107cf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156107ea57600080fd5b506108176004803603602081101561080157600080fd5b8101908080359060200190929190505050612073565b6040518082815260200191505060405180910390f35b34801561083957600080fd5b5061087c6004803603602081101561085057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b005b34801561088a57600080fd5b506108b7600480360360208110156108a157600080fd5b81019080803590602001909291905050506124af565b005b3480156108c557600080fd5b50610a2860048036036101408110156108dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109e457600080fd5b8201836020820111156109f657600080fd5b80359060200191846001830284011164010000000083111715610a1857600080fd5b909192939192939050505061262b565b604051808215151515815260200191505060405180910390f35b348015610a4e57600080fd5b50610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b348015610abd57600080fd5b50610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128b9565b005b348015610b0e57600080fd5b50610b8660048036036020811015610b2557600080fd5b8101908080359060200190640100000000811115610b4257600080fd5b820183602082011115610b5457600080fd5b80359060200191846001830284011164010000000083111715610b7657600080fd5b9091929391929390505050612a69565b005b348015610b9457600080fd5b50610b9d612b89565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610be0578082015181840152602081019050610bc5565b505050509050019250505060405180910390f35b348015610c0057600080fd5b50610c09612d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c49578082015181840152602081019050610c2e565b50505050905090810190601f168015610c765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c9057600080fd5b50610c99612d57565b6040518082815260200191505060405180910390f35b348015610cbb57600080fd5b50610cc4612d5d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d07578082015181840152602081019050610cec565b505050509050019250505060405180910390f35b348015610d2757600080fd5b50610e896004803603610100811015610d3f57600080fd5b8101908080359060200190640100000000811115610d5c57600080fd5b820183602082011115610d6e57600080fd5b80359060200191846020830284011164010000000083111715610d9057600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d76565b005b348015610e9757600080fd5b50610f4660048036036080811015610eae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610ef557600080fd5b820183602082011115610f0757600080fd5b80359060200191846001830284011164010000000083111715610f2957600080fd5b9091929391929390803560ff169060200190929190505050612f71565b6040518082815260200191505060405180910390f35b348015610f6857600080fd5b50610fb560048036036040811015610f7f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061311e565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561102a57808201518184015260208101905061100f565b50505050905001935050505060405180910390f35b34801561104b57600080fd5b506110786004803603602081101561106257600080fd5b81019080803590602001909291905050506132fd565b005b34801561108657600080fd5b506111e0600480360361014081101561109e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110e557600080fd5b8201836020820111156110f757600080fd5b8035906020019184600183028401116401000000008311171561111957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061349c565b6040518082815260200191505060405180910390f35b34801561120257600080fd5b506112656004803603604081101561121957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134c7565b005b34801561127357600080fd5b506112f66004803603606081101561128a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138cd565b005b34801561130457600080fd5b5061130d613f92565b6040518082815260200191505060405180910390f35b34801561132f57600080fd5b50611489600480360361014081101561134757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561138e57600080fd5b8201836020820111156113a057600080fd5b803590602001918460018302840111640100000000831117156113c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613f9c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114c95780820151818401526020810190506114ae565b50505050905090810190601f1680156114f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561151057600080fd5b506115536004803603602081101561152757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141b0565b005b34801561156157600080fd5b5061156a614240565b6040518082815260200191505060405180910390f35b34801561158c57600080fd5b506115f9600480360360608110156115a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614246565b005b34801561160757600080fd5b506116106146d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611650578082015181840152602081019050611635565b50505050905090810190601f16801561167d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118b05750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611c0857611c07816124af565b5b5050565b600080611c5c86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b90506000848490501415611cf957600060076000838152602001908152602001600020541415611cf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611d8f565b611d8e8187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600061470a565b5b6320c13b0b60e01b915050949350505050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611e6d5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611f3f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615d646030913960400191505060405180910390fd5b611fa1858585855a615038565b90508015611ff1573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2612035565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000606061204d86868686611e74565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60076020528060005260406000206000915090505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156121795750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6f64756c652068617320616c7265616479206265656e20616464656400000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b60035481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615c076023913960400191505060405180910390fd5b60018110156125e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615cdd6024913960400191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b60008060606126888f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8e8e8e8e600554613f9c565b9050600560008154809291906001019190505550808051906020012091506126f7828287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600161470a565b50885a1015612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615ded602a913960400191505060405180910390fd5b60005a90506127c28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008f1480156127b1575060008d145b6127bb578e6127bd565b5a5b615038565b92506127d75a826150aa90919063ffffffff16565b9050600080905060008911156127f7576127f4828b8b8b8b6150ca565b90505b8315612841577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8382604051808381526020018281526020019250505060405180910390a1612881565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238382604051808381526020018281526020019250505060405180910390a15b5050509c9b505050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615b736024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b6000612b3c83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a2505050565b606080600354604051908082528060200260200182016040528015612bbd5781602001602082028038833980820191505090505b5090506000809050600060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d155780838381518110612c6c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612c2b565b82935050505090565b6040518060400160405280600b81526020017f476e6f736973205361666500000000000000000000000000000000000000000081525081565b60055481565b606080612d6c6001600a61311e565b5090508091505090565b6000801b60065414612df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f446f6d61696e20536570617261746f7220616c7265616479207365742100000081525060200191505060405180910390fd5b7f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d474960001b30604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405160208183030381529060405280519060200120600681905550612ebf8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505089615296565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612efd57612efc84615752565b5b612f4b8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615781565b6000821115612f6557612f63826000600186856150ca565b505b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b60005a905061304d878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615038565b61305657600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130e35780820151818401526020810190506130c8565b50505050905090810190601f1680156131105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606000826040519080825280602002602001820160405280156131515781602001602082028038833980820191505090505b50915060008090506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156132285750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561323357508482105b156132ee578084838151811061324557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506131be565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c79206f776e6572732063616e20617070726f766520612068617368000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006134b08b8b8b8b8b8b8b8b8b8b613f9c565b8051906020012090509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135b55750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461370a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bdf6028913960400191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156139bb5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613b985750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8c8c8c805190602001208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561402c57fe5b60ff1681526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b61423d81615752565b50565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615d38602c913960400191505060405180910390fd5b806001600354031015614328576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615c2a6035913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143925750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600454146146cc576146cb816124af565b5b505050565b6040518060400160405280600581526020017f312e312e3100000000000000000000000000000000000000000000000000000081525081565b6000600454905060008111614787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5468726573686f6c64206e6565647320746f20626520646566696e656421000081525060200191505060405180910390fd5b61479b60418261599b90919063ffffffff16565b83511015614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5369676e617475726573206461746120746f6f2073686f72740000000000000081525060200191505060405180910390fd5b600080905060008060008060008090505b8681101561502b5761483489826159d5565b80945081955082965050505060008460ff161415614bc9578260001c945061486660418861599b90919063ffffffff16565b8260001c10156148c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d016037913960400191505060405180910390fd5b88516148da60208460001c615a0490919063ffffffff16565b1115614931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d946037913960400191505060405180910390fd5b60006020838b010151905089516149678261495960208760001c615a0490919063ffffffff16565b615a0490919063ffffffff16565b11156149be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615ca76036913960400191505060405180910390fd5b60606020848c010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8e846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015614a60578082015181840152602081019050614a45565b50505050905090810190601f168015614a8d5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614ac6578082015181840152602081019050614aab565b50505050905090810190601f168015614af35780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614b1257600080fd5b505afa158015614b26573d6000803e3d6000fd5b505050506040513d6020811015614b3c57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bbc6023913960400191505060405180910390fd5b5050614ea9565b60018460ff161415614d72578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c6657506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d81526020019081526020016000205414155b614cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4861736820686173206e6f74206265656e20617070726f76656400000000000081525060200191505060405180910390fd5b878015614d1157508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15614d6d576000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020819055505b614ea8565b601e8460ff161115614e3d5760018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e2c573d6000803e3d6000fd5b505050602060405103519450614ea7565b60018b85858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e9a573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015614f705750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015614fa95750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61501b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f496e76616c6964206f776e65722070726f76696465640000000000000000000081525060200191505060405180910390fd5b8495508080600101915050614822565b5050505050505050505050565b600080600181111561504657fe5b83600181111561505257fe5b141561506b5761506486868685615a23565b90506150a1565b60018081111561507757fe5b83600181111561508357fe5b141561509b57615094868584615a3c565b90506150a0565b600090505b5b95945050505050565b6000828211156150b957600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146151075782615109565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615204576151733a8610615150573a615152565b855b615165888a615a0490919063ffffffff16565b61599b90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506151ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615dcb6022913960400191505060405180910390fd5b61528c565b6152298561521b888a615a0490919063ffffffff16565b61599b90919063ffffffff16565b9150615236848284615a53565b61528b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c5f6022913960400191505060405180910390fd5b5b5095945050505050565b60006004541461530e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f776e657273206861766520616c7265616479206265656e207365747570000081525060200191505060405180910390fd5b8151811115615368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615c076023913960400191505060405180910390fd5b60018110156153c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615cdd6024913960400191505060405180910390fd5b60006001905060008090505b83518110156156be5760008482815181106153e557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156154595750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6154cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4475706c6963617465206f776e657220616464726573732070726f766964656481525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15080806001019150506153ce565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615866576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b976025913960400191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146159975761592482825a615a3c565b615996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f742066696e69736820696e697469616c697a6174696f6e0081525060200191505060405180910390fd5b5b5050565b6000808314156159ae57600090506159cf565b60008284029050828482816159bf57fe5b04146159ca57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015615a1957600080fd5b8091505092915050565b6000806000845160208601878987f19050949350505050565b60008060008451602086018786f490509392505050565b600060608383604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808251602084016000896127105a03f16040513d81016040523d6000823e3d60008114615b555760208114615b5d5760009450615b67565b829450615b67565b8151158315171594505b50505050939250505056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6f64756c6573206861766520616c7265616479206265656e20696e697469616c697a6564496e76616c696420636f6e7472616374207369676e61747572652070726f7669646564496e76616c696420707265764d6f64756c652c206d6f64756c6520706169722070726f76696465645468726573686f6c642063616e6e6f7420657863656564206f776e657220636f756e744e6577206f776e657220636f756e74206e6565647320746f206265206c6172676572207468616e206e6577207468726573686f6c64436f756c64206e6f74207061792067617320636f737473207769746820746f6b656e496e76616c696420707265764f776e65722c206f776e657220706169722070726f7669646564496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a2064617461206e6f7420636f6d706c6574655468726573686f6c64206e6565647320746f2062652067726561746572207468616e2030496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a20696e736964652073746174696320706172744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207468697320636f6e74726163744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d20616e20656e61626c6564206d6f64756c65496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a206c656e677468206e6f742070726573656e74436f756c64206e6f74207061792067617320636f73747320776974682065746865724e6f7420656e6f7567682067617320746f20657865637574652073616665207472616e73616374696f6ea265627a7a72315820701ab545ad8420c6d9f3f5bdce31db4b64dee59ebd72dbd0cef595d66a31f78164736f6c634300050e0032","sourceMap":"652:19113:0:-;;;2456:255;8:9:-1;5:2;;;30:1;27;20:12;5:2;2456:255:0;2703:1;2691:9;:13;;;;652:19113;;;;;;","deployedSourceMap":"652:19113:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1251:1:3;1239:9;:13;:37;;;;1275:1;1256:8;;:15;;:20;1239:37;1235:74;;;1292:7;;1235:74;1318:12;376:66;1333:29;;1318:44;;1372:15;1501:4;1495:11;1484:22;;1549:1;1530:21;;:7;:21;;;1526:437;;1681:14;1678:1;1675;1662:34;1772:1;1769;1753:14;1750:1;1747;1738:7;1733:3;1728:46;1812:16;1809:1;1806;1791:38;1861:1;1852:7;1849:14;1846:2;;;1876:16;1873:1;1866:27;1846:2;1922:16;1919:1;1912:27;1644:309;1108:861;;;652:19113:0;16841:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16841:367:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16841:367:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16841:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16841:367:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16841:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16841:367:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2296:645:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2296:645:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2296:645:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16176:507:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16176:507:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16176:507:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16176:507:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16176:507:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16176:507:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16176:507:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16176:507:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16176:507:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6068:166:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6068:166:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6068:166:6;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3039:603:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3039:603:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3039:603:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3039:603:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3993:949;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3993:949:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3993:949:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3993:949:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2115:49:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2115:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2115:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1337:540:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1337:540:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1337:540:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;5500:441:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5500:441:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5500:441:6;;;;;;;;;;;;;;;;;:::i;:::-;;5479:1886:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5479:1886:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;5479:1886:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5479:1886:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5479:1886:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5479:1886:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5479:1886:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5479:1886:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5479:1886:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2275:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2275:69:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2275:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;794:302:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;794:302:9;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;794:302:9;;;;;;;;;;;;;;;;;;;:::i;:::-;;15353:207:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15353:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15353:207:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15353:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15353:207:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15353:207:0;;;;;;;;;;;;:::i;:::-;;6316:465:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6316:465:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6316:465:6;;;;;;;;;;;;;;;;;846:43:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;846:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;846:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1956:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1956:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5030:197:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5030:197:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5030:197:5;;;;;;;;;;;;;;;;;3327:1122:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3327:1122:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3327:1122:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3327:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3327:1122:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3327:1122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3327:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3327:1122:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3327:1122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14099:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14099:583:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14099:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14099:583:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14099:583:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14099:583:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5421:808:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5421:808:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5421:808:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5421:808:5;;;;;;;;;;;;;;;;;;14926:265:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14926:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14926:265:0;;;;;;;;;;;;;;;;;:::i;:::-;;19259:504;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19259:504:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19259:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19259:504:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19259:504:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19259:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19259:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2138:565:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2138:565:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2138:565:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4452:859:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4452:859:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4452:859:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5947:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5947:115:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17921:652:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17921:652:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;17921:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17921:652:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17921:652:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17921:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17921:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17921:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:135:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;967:135:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;967:135:3;;;;;;;;;;;;;;;;;;;:::i;:::-;;1982:30:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1982:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3283:835:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3283:835:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3283:835:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;895:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;895:40:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;895:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16841:367;16946:7;16969:23;1576:66;17029:17;;17058:7;17048:18;;;;;;17018:49;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17018::0;;;16995:82;;;;;;16969:108;;17139:4;17134:10;;17151:4;17146:10;;17158:15;;17175;17117:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17117:74:0;;;17094:107;;;;;;17087:114;;;16841:367;;;:::o;2296:645:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2476:1:6;2459:19;;:5;:19;;;;:47;;;;;479:3;2482:24;;:5;:24;;;;2459:47;2451:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2624:1;2599:27;;:6;:13;2606:5;2599:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;2591:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2684:6;:23;479:3;2684:23;;;;;;;;;;;;;;;;;;;;;;;;;2668:6;:13;2675:5;2668:13;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;2743:5;2717:6;:23;479:3;2717:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2758:10;;:12;;;;;;;;;;;;;2785:17;2796:5;2785:17;;;;;;;;;;;;;;;;;;;;;;2883:10;2870:9;;:23;2866:68;;2907:27;2923:10;2907:15;:27::i;:::-;2866:68;2296:645;;:::o;16176:507:0:-;16285:6;16307:19;16329:21;16344:5;;16329:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16329:21:0;;;;;;:14;:21::i;:::-;16307:43;;16385:1;16364:10;;:17;;:22;16360:281;;;16441:1;16410:14;:27;16425:11;16410:27;;;;;;;;;;;;:32;;16402:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16360:281;;;16576:54;16592:11;16605:5;;16576:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16576:54:0;;;;;;16612:10;;16576:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16576:54:0;;;;;;16624:5;16576:15;:54::i;:::-;16360:281;181:10:18;16657:19:0;;16650:26;;;16176:507;;;;;;:::o;6068:166:6:-;6145:4;479:3;6172:24;;:5;:24;;;;:55;;;;;6225:1;6200:27;;:6;:13;6207:5;6200:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;6172:55;6165:62;;6068:166;;;:::o;3039:603:5:-;3178:12;673:3;3263:30;;:10;:30;;;;:67;;;;;3328:1;3297:33;;:7;:19;3305:10;3297:19;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;3263:67;3255:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3465:46;3473:2;3477:5;3484:4;3490:9;3501;3465:7;:46::i;:::-;3455:56;;3525:7;3521:114;;;3566:10;3539:38;;;;;;;;;;;;3521:114;;;3624:10;3597:38;;;;;;;;;;;;3521:114;3039:603;;;;;;:::o;3993:949::-;4142:12;4156:23;4205:53;4231:2;4235:5;4242:4;4248:9;4205:25;:53::i;:::-;4195:63;;4413:4;4407:11;4655:4;4637:16;4633:27;4628:3;4624:37;4618:4;4611:51;4717:16;4712:3;4705:29;4811:16;4808:1;4801:4;4796:3;4792:14;4777:51;4923:3;4909:17;;4341:595;;;;;;;;:::o;2115:49:0:-;;;;;;;;;;;;;;;;;:::o;1337:540:5:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1511:1:5;1484:29;;1492:6;1484:29;;;;:68;;;;;673:3;1517:35;;1525:6;1517:35;;;;1484:68;1476:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1683:1;1647:38;;:7;:24;1663:6;1647:24;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;1639:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:7;:25;673:3;1756:25;;;;;;;;;;;;;;;;;;;;;;;;;1729:7;:24;1745:6;1729:24;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;1827:6;1791:7;:25;673:3;1791:25;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1849:21;1863:6;1849:21;;;;;;;;;;;;;;;;;;;;;;1337:540;:::o;5500:441:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5684:10:6;;5670;:24;;5662:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5818:1;5804:10;:15;;5796:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5882:10;5870:9;:22;;;;5907:27;5924:9;;5907:27;;;;;;;;;;;;;;;;;;5500:441;:::o;5479:1886:0:-;5829:12;5857:14;5984:23;6010:210;6049:2;6053:5;6060:4;;6010:210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6010:210:0;;;;;;6066:9;6113;6124:7;6133:8;6143;6153:14;6201:5;;6010:21;:210::i;:::-;5984:236;;6289:5;;:7;;;;;;;;;;;;;6329:10;6319:21;;;;;;6310:30;;6354:53;6370:6;6378:10;6390;;6354:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6354:53:0;;;;;;6402:4;6354:15;:53::i;:::-;5479:1886;6448:9;6435;:22;;6427:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6617:15;6635:9;6617:27;;6779:92;6787:2;6791:5;6798:4;;6779:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6779:92:0;;;;;;6804:9;6828:1;6815:9;:14;:31;;;;;6845:1;6833:8;:13;6815:31;:55;;6861:9;6815:55;;;6849:9;6815:55;6779:7;:92::i;:::-;6769:102;;6895:22;6907:9;6895:7;:11;;:22;;;;:::i;:::-;6885:32;;7066:15;7084:1;7066:19;;7114:1;7103:8;:12;7099:128;;;7145:67;7159:7;7168;7177:8;7187;7197:14;7145:13;:67::i;:::-;7135:77;;7099:128;7244:7;7240:108;;;7258:33;7275:6;7283:7;7258:33;;;;;;;;;;;;;;;;;;;;;;;;7240:108;;;7315:33;7332:6;7340:7;7315:33;;;;;;;;;;;;;;;;;;;;;;;;7240:108;5479:1886;;;;;;;;;;;;;;;;;:::o;2275:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;794:302:9:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:1:9;944:25;;:11;:25;;;;936:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1033:11;1020:10;;:24;;;;;;;;;;;;;;;;;;1059:30;1077:11;1059:30;;;;;;;;;;;;;;;;;;;;;;794:302;:::o;15353:207:0:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15446:15:0;15464:21;15479:5;;15464:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15464:21:0;;;;;;:14;:21::i;:::-;15446:39;;15521:1;15495:14;:23;15510:7;15495:23;;;;;;;;;;;:27;;;;15545:7;15537:16;;;;;;;;;;316:1:11;15353:207:0;;:::o;6316:465:6:-;6382:16;6414:22;6453:10;;6439:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;6439:25:6;;;;6414:50;;6508:13;6524:1;6508:17;;6535:20;6558:6;:23;479:3;6558:23;;;;;;;;;;;;;;;;;;;;;;;;;6535:46;;6591:162;479:3;6597:31;;:12;:31;;;6591:162;;6659:12;6644:5;6650;6644:12;;;;;;;;;;;;;:27;;;;;;;;;;;6700:6;:20;6707:12;6700:20;;;;;;;;;;;;;;;;;;;;;;;;;6685:35;;6734:8;;;;;;;6591:162;;;6769:5;6762:12;;;;;6316:465;:::o;846:43:0:-;;;;;;;;;;;;;;;;;;;:::o;1956:20::-;;;;:::o;5030:197:5:-;5097:16;5130:22;5157:41;673:3;5195:2;5157:19;:41::i;:::-;5129:69;;;5215:5;5208:12;;;5030:197;:::o;3327:1122:0:-;3648:1;3629:20;;:15;;:20;3621:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1073:66;3732:25;;3759:4;3721:43;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3721:43:0;;;3711:54;;;;;;3693:15;:72;;;;3775:32;3787:7;;3775:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3775:32:0;;;;;;3796:10;3775:11;:32::i;:::-;3848:1;3821:29;;:15;:29;;;3817:78;;3852:43;3879:15;3852:26;:43::i;:::-;3817:78;4030:22;4043:2;4047:4;;4030:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4030:22:0;;;;;;:12;:22::i;:::-;4077:1;4067:7;:11;4063:380;;;4373:59;4387:7;4396:1;4399;4402:12;4416:15;4373:13;:59::i;:::-;;4063:380;3327:1122;;;;;;;;;;:::o;14099:583::-;14249:7;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14272:16:0;14291:9;14272:28;;14454:46;14462:2;14466:5;14473:4;;14454:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14454:46:0;;;;;;14479:9;14490;14454:7;:46::i;:::-;14446:55;;;;;;14511:19;14544:9;14533:8;:20;14511:42;;14661:11;14644:29;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14644:29:0;;;14630:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14630:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5421:808:5;5528:22;5552:12;5643:8;5629:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5629:23:5;;;;5621:31;;5696:19;5718:1;5696:23;;5729:21;5753:7;:14;5761:5;5753:14;;;;;;;;;;;;;;;;;;;;;;;;;5729:38;;5777:238;5808:3;5783:29;;:13;:29;;;;:66;;;;;673:3;5816:33;;:13;:33;;;;5783:66;:92;;;;;5867:8;5853:11;:22;5783:92;5777:238;;;5912:13;5891:5;5897:11;5891:18;;;;;;;;;;;;;:34;;;;;;;;;;;5955:7;:22;5963:13;5955:22;;;;;;;;;;;;;;;;;;;;;;;;;5939:38;;5991:13;;;;;;;5777:238;;;6031:13;6024:20;;6201:11;6194:5;6187:26;6173:50;;;;;;;:::o;14926:265:0:-;15039:1;15009:32;;:6;:18;15016:10;15009:18;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;15001:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15130:1;15086:14;:26;15101:10;15086:26;;;;;;;;;;;;;;;:41;15113:13;15086:41;;;;;;;;;;;:45;;;;15173:10;15146:38;;15158:13;15146:38;;;;;;;;;;14926:265;:::o;19259:504::-;19602:7;19642:113;19664:2;19668:5;19675:4;19681:9;19692;19703:7;19712:8;19722;19732:14;19748:6;19642:21;:113::i;:::-;19632:124;;;;;;19625:131;;19259:504;;;;;;;;;;;;:::o;2138:565:5:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:1:5;2333:29;;2341:6;2333:29;;;;:68;;;;;673:3;2366:35;;2374:6;2366:35;;;;2333:68;2325:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2495:6;2455:47;;:7;:28;2471:10;2455:28;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;2447:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:7;:24;2604:6;2588:24;;;;;;;;;;;;;;;;;;;;;;;;;2557:7;:28;2573:10;2557:28;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;2657:1;2622:7;:24;2638:6;2622:24;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;2674:22;2689:6;2674:22;;;;;;;;;;;;;;;;;;;;;;2138:565;;:::o;4452:859:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4643:1:6;4623:22;;:8;:22;;;;:53;;;;;479:3;4649:27;;:8;:27;;;;4623:53;4615:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4797:1;4769:30;;:6;:16;4776:8;4769:16;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;4761:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:1;4932:22;;:8;:22;;;;:53;;;;;479:3;4958:27;;:8;:27;;;;4932:53;4924:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5059:8;5038:29;;:6;:17;5045:9;5038:17;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;5030:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5139:6;:16;5146:8;5139:16;;;;;;;;;;;;;;;;;;;;;;;;;5120:6;:16;5127:8;5120:16;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;5185:8;5165:6;:17;5172:9;5165:17;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;5230:1;5203:6;:16;5210:8;5203:16;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;5247:22;5260:8;5247:22;;;;;;;;;;;;;;;;;;;;;;5284:20;5295:8;5284:20;;;;;;;;;;;;;;;;;;;;;;4452:859;;;:::o;5947:115::-;6016:7;6046:9;;6039:16;;5947:115;:::o;17921:652:0:-;18267:12;18295:18;1393:66;18350:16;;18368:2;18372:5;18389:4;18379:15;;;;;;18396:9;18407;18418:7;18427:8;18437;18447:14;18463:6;18339:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18339:131:0;;;18316:164;;;;;;18295:185;;18519:4;18514:10;;18531:4;18526:10;;18538:15;;18555:10;18497:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18497:69:0;;;18490:76;;;17921:652;;;;;;;;;;;;:::o;967:135:3:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1060:35:3;1087:7;1060:26;:35::i;:::-;967:135;:::o;1982:30:0:-;;;;:::o;3283:835:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3509:10:6;3504:1;3491:10;;:14;:28;;3483:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3692:1;3675:19;;:5;:19;;;;:47;;;;;479:3;3698:24;;:5;:24;;;;3675:47;3667:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3796:5;3775:26;;:6;:17;3782:9;3775:17;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;3767:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3874:6;:13;3881:5;3874:13;;;;;;;;;;;;;;;;;;;;;;;;;3854:6;:17;3861:9;3854:17;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;3921:1;3897:6;:13;3904:5;3897:13;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3933:10;;:12;;;;;;;;;;;;;;3960:19;3973:5;3960:19;;;;;;;;;;;;;;;;;;;;;;4060:10;4047:9;;:23;4043:68;;4084:27;4100:10;4084:15;:27::i;:::-;4043:68;3283:835;;;:::o;895:40:0:-;;;;;;;;;;;;;;;;;;;:::o;8878:4309::-;9072:18;9093:9;;9072:30;;9174:1;9161:10;:14;9153:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9316:18;9331:2;9316:10;:14;;:18;;;;:::i;:::-;9295:10;:17;:39;;9287:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9426:17;9454:1;9426:30;;9466:20;9496:7;9513:9;9532;9551;9579:1;9575:5;;9570:3611;9586:10;9582:1;:14;9570:3611;;;9629:29;9644:10;9656:1;9629:14;:29::i;:::-;9617:41;;;;;;;;;;;;9738:1;9733;:6;;;9729:3211;;;9889:1;9881:10;;9858:34;;10293:18;10308:2;10293:10;:14;;:18;;;;:::i;:::-;10287:1;10279:10;;:32;;10271:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10533:10;:17;10511:18;10526:2;10519:1;10511:10;;:14;;:18;;;;:::i;:::-;:39;;10503:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10754:28;10957:4;10953:1;10941:10;10937:18;10933:29;10927:36;10903:60;;11054:10;:17;11006:44;11029:20;11006:18;11021:2;11014:1;11006:10;;:14;;:18;;;;:::i;:::-;:22;;:44;;;;:::i;:::-;:65;;10998:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11184:30;11519:4;11515:1;11503:10;11499:18;11495:29;11474:50;;181:10:18;11646:19:0;;11567:98;;;11587:12;11567:50;;;11618:4;11624:17;11567:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11567:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11567:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11567:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11567:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11567:75:0;;;;;;;;;;;;;;;;:98;;;;11559:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9729:3211;;;;;11788:1;11783;:6;;;11779:1161;;;11935:1;11927:10;;11904:34;;12123:12;12109:26;;:10;:26;;;:73;;;;12181:1;12139:14;:28;12154:12;12139:28;;;;;;;;;;;;;;;:38;12168:8;12139:38;;;;;;;;;;;;:43;;12109:73;12101:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12335:11;:41;;;;;12364:12;12350:26;;:10;:26;;;;12335:41;12331:130;;;12441:1;12400:14;:28;12415:12;12400:28;;;;;;;;;;;;;;;:38;12429:8;12400:38;;;;;;;;;;;:42;;;;12331:130;11779:1161;;;12489:2;12485:1;:6;;;12481:459;;;12673:97;12746:8;12693:62;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12693:62:0;;;12683:73;;;;;;12762:1;12758;:5;12765:1;12768;12673:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12673:97:0;;;;;;;;12658:112;;12481:459;;;12897:28;12907:8;12917:1;12920;12923;12897:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12897:28:0;;;;;;;;12882:43;;12481:459;11779:1161;9729:3211;12994:9;12979:24;;:12;:24;;;:62;;;;;13039:1;13007:34;;:6;:20;13014:12;13007:20;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;12979:62;:97;;;;;479:3:6;13045:31:0;;:12;:31;;;;12979:97;12953:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13158:12;13146:24;;9598:3;;;;;;;9570:3611;;;8878:4309;;;;;;;;;;;:::o;202:429:2:-;340:12;385:19;372:32;;;;;;;;:9;:32;;;;;;;;;368:256;;;428:35;440:2;444:5;451:4;457:5;428:11;:35::i;:::-;418:45;;368:256;;;495:27;482:40;;;;;;;;:9;:40;;;;;;;;;478:146;;;546:36;566:2;570:4;576:5;546:19;:36::i;:::-;536:46;;478:146;;;619:5;609:15;;478:146;368:256;202:429;;;;;;;:::o;1141:131:13:-;1199:7;1227:1;1222;:6;;1214:15;;;;;;1235:9;1251:1;1247;:5;1235:17;;1266:1;1259:8;;;1141:131;;;;:::o;7371:952:0:-;7575:15;7664:24;7717:1;7691:28;;:14;:28;;;:57;;7734:14;7691:57;;;7722:9;7691:57;7664:84;;7782:1;7762:22;;:8;:22;;;7758:559;;;7915:73;7951:11;7940:8;:22;:47;;7976:11;7940:47;;;7965:8;7940:47;7915:20;7927:7;7915;:11;;:20;;;;:::i;:::-;:24;;:73;;;;:::i;:::-;7905:83;;8067:8;:13;;:22;8081:7;8067:22;;;;;;;;;;;;;;;;;;;;;;;8059:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7758:559;;;8169:34;8194:8;8169:20;8181:7;8169;:11;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;8159:44;;8225:42;8239:8;8249;8259:7;8225:13;:42::i;:::-;8217:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7758:559;7371:952;;;;;;;;:::o;785:1271:6:-;1028:1;1015:9;;:14;1007:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1171:7;:14;1157:10;:28;;1149:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1309:1;1295:10;:15;;1287:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:20;479:3;1398:38;;1451:9;1463:1;1451:13;;1446:487;1470:7;:14;1466:1;:18;1446:487;;;1550:13;1566:7;1574:1;1566:10;;;;;;;;;;;;;;1550:26;;1615:1;1598:19;;:5;:19;;;;:47;;;;;479:3;1621:24;;:5;:24;;;;1598:47;1590:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1771:1;1746:27;;:6;:13;1753:5;1746:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;1738:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1847:5;1824:6;:20;1831:12;1824:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;1881:5;1866:20;;1905:17;1916:5;1905:17;;;;;;;;;;;;;;;;;;;;;;1446:487;1486:3;;;;;;;1446:487;;;;479:3;1942:6;:20;1949:12;1942:20;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;2003:7;:14;1990:10;:27;;;;2039:10;2027:9;:22;;;;785:1271;;;:::o;449:250:3:-;521:12;376:66;536:29;;521:44;;675:7;669:4;662:21;648:45;;:::o;736:434:5:-;865:1;828:39;;:7;:25;673:3;828:25;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;820:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;673:3;919:7;:25;673:3;919:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;991:1;977:16;;:2;:16;;;973:190;;1087:40;1107:2;1111:4;1117:9;1087:19;:40::i;:::-;1079:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;973:190;736:434;;:::o;267:381:13:-;325:7;554:1;549;:6;545:35;;;572:1;565:8;;;;545:35;586:9;602:1;598;:5;586:17;;626:1;621;617;:5;;;;;;:10;609:19;;;;;;642:1;635:8;;;267:381;;;;;:::o;1223:921:12:-;1332:7;1341:9;1352;1652:3;1646:4;1642:14;1714:4;1700:12;1696:23;1684:10;1680:40;1674:47;1669:52;;1779:4;1765:12;1761:23;1749:10;1745:40;1739:47;1734:52;;2123:4;2114;2100:12;2096:23;2084:10;2080:40;2074:47;2070:58;2065:63;;1608:530;;;;;;:::o;1335:131:13:-;1393:7;1408:9;1424:1;1420;:5;1408:17;;1444:1;1439;:6;;1431:15;;;;;;1460:1;1453:8;;;1335:131;;;;:::o;637:316:2:-;753:12;935:1;932;925:4;919:11;912:4;906;902:15;895:5;891:2;884:5;879:58;868:69;;854:93;;;;;;:::o;959:310::-;1068:12;1251:1;1248;1241:4;1235:11;1228:4;1222;1218:15;1214:2;1207:5;1194:59;1183:70;;1169:94;;;;;:::o;438:807:10:-;575:16;607:17;680:8;690:6;627:70;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;627:70:10;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;627:70:10;607:90;;874:1;871;864:4;858:11;851:4;845;841:15;838:1;831:5;823;818:3;814:15;809:67;906:4;900:11;946:16;941:3;937:26;931:4;924:40;1000:16;997:1;992:3;977:40;1037:16;1071:1;1066:33;;;;1117:4;1112:76;;;;1226:1;1211:16;;1030:199;;1066:33;1090:7;1075:22;;1066:33;;1112:76;1179:3;1173:10;1166:18;1156:7;1149:15;1146:39;1139:47;1124:62;;1030:199;;780:459;;;;;;;;:::o","source":"pragma solidity >=0.5.0 <0.7.0;\nimport \"./base/ModuleManager.sol\";\nimport \"./base/OwnerManager.sol\";\nimport \"./base/FallbackManager.sol\";\nimport \"./common/MasterCopy.sol\";\nimport \"./common/SignatureDecoder.sol\";\nimport \"./common/SecuredTokenTransfer.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./external/SafeMath.sol\";\n\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\n/// @author Stefan George - <stefan@gnosis.io>\n/// @author Richard Meissner - <richard@gnosis.io>\n/// @author Ricardo Guilherme Schmidt - (Status Research & Development GmbH) - Gas Token Payment\ncontract GnosisSafe\n    is MasterCopy, ModuleManager, OwnerManager, SignatureDecoder, SecuredTokenTransfer, ISignatureValidatorConstants, FallbackManager {\n\n    using SafeMath for uint256;\n\n    string public constant NAME = \"Gnosis Safe\";\n    string public constant VERSION = \"1.1.1\";\n\n    //keccak256(\n    //    \"EIP712Domain(address verifyingContract)\"\n    //);\n    bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749;\n\n    //keccak256(\n    //    \"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\"\n    //);\n    bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\n\n    //keccak256(\n    //    \"SafeMessage(bytes message)\"\n    //);\n    bytes32 private constant SAFE_MSG_TYPEHASH = 0x60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca;\n\n    event ApproveHash(\n        bytes32 indexed approvedHash,\n        address indexed owner\n    );\n    event SignMsg(\n        bytes32 indexed msgHash\n    );\n    event ExecutionFailure(\n        bytes32 txHash, uint256 payment\n    );\n    event ExecutionSuccess(\n        bytes32 txHash, uint256 payment\n    );\n\n    uint256 public nonce;\n    bytes32 public domainSeparator;\n    // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\n    mapping(bytes32 => uint256) public signedMessages;\n    // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\n    mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\n\n    // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\n    constructor() public {\n        // By setting the threshold it is not possible to call setup anymore,\n        // so we create a Safe with 0 owners and threshold 1.\n        // This is an unusable Safe, perfect for the mastercopy\n        threshold = 1;\n    }\n\n    /// @dev Setup function sets initial storage of contract.\n    /// @param _owners List of Safe owners.\n    /// @param _threshold Number of required confirmations for a Safe transaction.\n    /// @param to Contract address for optional delegate call.\n    /// @param data Data payload for optional delegate call.\n    /// @param fallbackHandler Handler for fallback calls to this contract\n    /// @param paymentToken Token that should be used for the payment (0 is ETH)\n    /// @param payment Value that should be paid\n    /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\n    function setup(\n        address[] calldata _owners,\n        uint256 _threshold,\n        address to,\n        bytes calldata data,\n        address fallbackHandler,\n        address paymentToken,\n        uint256 payment,\n        address payable paymentReceiver\n    )\n        external\n    {\n        require(domainSeparator == 0, \"Domain Separator already set!\");\n        domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, this));\n        setupOwners(_owners, _threshold);\n        if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\n        // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\n        setupModules(to, data);\n\n        if (payment > 0) {\n            // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\n            // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\n            handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\n        }\n    }\n\n    /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\n    ///      Note: The fees are always transfered, even if the user transaction fails.\n    /// @param to Destination address of Safe transaction.\n    /// @param value Ether value of Safe transaction.\n    /// @param data Data payload of Safe transaction.\n    /// @param operation Operation type of Safe transaction.\n    /// @param safeTxGas Gas that should be used for the Safe transaction.\n    /// @param baseGas Gas costs for that are indipendent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n    /// @param gasPrice Gas price that should be used for the payment calculation.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\n    function execTransaction(\n        address to,\n        uint256 value,\n        bytes calldata data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address payable refundReceiver,\n        bytes calldata signatures\n    )\n        external\n        returns (bool success)\n    {\n        bytes32 txHash;\n        // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n        {\n            bytes memory txHashData = encodeTransactionData(\n                to, value, data, operation, // Transaction info\n                safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, // Payment info\n                nonce\n            );\n            // Increase nonce and execute transaction.\n            nonce++;\n            txHash = keccak256(txHashData);\n            checkSignatures(txHash, txHashData, signatures, true);\n        }\n        require(gasleft() >= safeTxGas, \"Not enough gas to execute safe transaction\");\n        // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n        {\n            uint256 gasUsed = gasleft();\n            // If no safeTxGas has been set and the gasPrice is 0 we assume that all available gas can be used\n            success = execute(to, value, data, operation, safeTxGas == 0 && gasPrice == 0 ? gasleft() : safeTxGas);\n            gasUsed = gasUsed.sub(gasleft());\n            // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\n            uint256 payment = 0;\n            if (gasPrice > 0) {\n                payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\n            }\n            if (success) emit ExecutionSuccess(txHash, payment);\n            else emit ExecutionFailure(txHash, payment);\n        }\n    }\n\n    function handlePayment(\n        uint256 gasUsed,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address payable refundReceiver\n    )\n        private\n        returns (uint256 payment)\n    {\n        // solium-disable-next-line security/no-tx-origin\n        address payable receiver = refundReceiver == address(0) ? tx.origin : refundReceiver;\n        if (gasToken == address(0)) {\n            // For ETH we will only adjust the gas price to not be higher than the actual used gas price\n            payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\n            // solium-disable-next-line security/no-send\n            require(receiver.send(payment), \"Could not pay gas costs with ether\");\n        } else {\n            payment = gasUsed.add(baseGas).mul(gasPrice);\n            require(transferToken(gasToken, receiver, payment), \"Could not pay gas costs with token\");\n        }\n    }\n\n    /**\n    * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n    * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n    * @param data That should be signed (this is passed to an external validator contract)\n    * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n    * @param consumeHash Indicates that in case of an approved hash the storage can be freed to save gas\n    */\n    function checkSignatures(bytes32 dataHash, bytes memory data, bytes memory signatures, bool consumeHash)\n        internal\n    {\n        // Load threshold to avoid multiple storage loads\n        uint256 _threshold = threshold;\n        // Check that a threshold is set\n        require(_threshold > 0, \"Threshold needs to be defined!\");\n        // Check that the provided signature data is not too short\n        require(signatures.length >= _threshold.mul(65), \"Signatures data too short\");\n        // There cannot be an owner with address 0.\n        address lastOwner = address(0);\n        address currentOwner;\n        uint8 v;\n        bytes32 r;\n        bytes32 s;\n        uint256 i;\n        for (i = 0; i < _threshold; i++) {\n            (v, r, s) = signatureSplit(signatures, i);\n            // If v is 0 then it is a contract signature\n            if (v == 0) {\n                // When handling contract signatures the address of the contract is encoded into r\n                currentOwner = address(uint256(r));\n\n                // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\n                // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\n                // Here we only check that the pointer is not pointing inside the part that is being processed\n                require(uint256(s) >= _threshold.mul(65), \"Invalid contract signature location: inside static part\");\n\n                // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\n                require(uint256(s).add(32) <= signatures.length, \"Invalid contract signature location: length not present\");\n\n                // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\n                uint256 contractSignatureLen;\n                // solium-disable-next-line security/no-inline-assembly\n                assembly {\n                    contractSignatureLen := mload(add(add(signatures, s), 0x20))\n                }\n                require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \"Invalid contract signature location: data not complete\");\n\n                // Check signature\n                bytes memory contractSignature;\n                // solium-disable-next-line security/no-inline-assembly\n                assembly {\n                    // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\n                    contractSignature := add(add(signatures, s), 0x20)\n                }\n                require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \"Invalid contract signature provided\");\n            // If v is 1 then it is an approved hash\n            } else if (v == 1) {\n                // When handling approved hashes the address of the approver is encoded into r\n                currentOwner = address(uint256(r));\n                // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\n                require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \"Hash has not been approved\");\n                // Hash has been marked for consumption. If this hash was pre-approved free storage\n                if (consumeHash && msg.sender != currentOwner) {\n                    approvedHashes[currentOwner][dataHash] = 0;\n                }\n            } else if (v > 30) {\n                // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\n                currentOwner = ecrecover(keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", dataHash)), v - 4, r, s);\n            } else {\n                // Use ecrecover with the messageHash for EOA signatures\n                currentOwner = ecrecover(dataHash, v, r, s);\n            }\n            require (\n                currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS,\n                \"Invalid owner provided\"\n            );\n            lastOwner = currentOwner;\n        }\n    }\n\n    /// @dev Allows to estimate a Safe transaction.\n    ///      This method is only meant for estimation purpose, therefore two different protection mechanism against execution in a transaction have been made:\n    ///      1.) The method can only be called from the safe itself\n    ///      2.) The response is returned with a revert\n    ///      When estimating set `from` to the address of the safe.\n    ///      Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\n    /// @param to Destination address of Safe transaction.\n    /// @param value Ether value of Safe transaction.\n    /// @param data Data payload of Safe transaction.\n    /// @param operation Operation type of Safe transaction.\n    /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\n    function requiredTxGas(address to, uint256 value, bytes calldata data, Enum.Operation operation)\n        external\n        authorized\n        returns (uint256)\n    {\n        uint256 startGas = gasleft();\n        // We don't provide an error message here, as we use it to return the estimate\n        // solium-disable-next-line error-reason\n        require(execute(to, value, data, operation, gasleft()));\n        uint256 requiredGas = startGas - gasleft();\n        // Convert response to string and return via error message\n        revert(string(abi.encodePacked(requiredGas)));\n    }\n\n    /**\n    * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\n    * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\n    */\n    function approveHash(bytes32 hashToApprove)\n        external\n    {\n        require(owners[msg.sender] != address(0), \"Only owners can approve a hash\");\n        approvedHashes[msg.sender][hashToApprove] = 1;\n        emit ApproveHash(hashToApprove, msg.sender);\n    }\n\n    /**\n    * @dev Marks a message as signed\n    * @param _data Arbitrary length data that should be marked as signed on the behalf of address(this)\n    */\n    function signMessage(bytes calldata _data)\n        external\n        authorized\n    {\n        bytes32 msgHash = getMessageHash(_data);\n        signedMessages[msgHash] = 1;\n        emit SignMsg(msgHash);\n    }\n\n    /**\n    * Implementation of ISignatureValidator (see `interfaces/ISignatureValidator.sol`)\n    * @dev Should return whether the signature provided is valid for the provided data.\n    *       The save does not implement the interface since `checkSignatures` is not a view method.\n    *       The method will not perform any state changes (see parameters of `checkSignatures`)\n    * @param _data Arbitrary length data signed on the behalf of address(this)\n    * @param _signature Signature byte array associated with _data\n    * @return a bool upon valid or invalid signature with corresponding _data\n    */\n    function isValidSignature(bytes calldata _data, bytes calldata _signature)\n        external\n        returns (bytes4)\n    {\n        bytes32 messageHash = getMessageHash(_data);\n        if (_signature.length == 0) {\n            require(signedMessages[messageHash] != 0, \"Hash not approved\");\n        } else {\n            // consumeHash needs to be false, as the state should not be changed\n            checkSignatures(messageHash, _data, _signature, false);\n        }\n        return EIP1271_MAGIC_VALUE;\n    }\n\n    /// @dev Returns hash of a message that can be signed by owners.\n    /// @param message Message that should be hashed\n    /// @return Message hash.\n    function getMessageHash(\n        bytes memory message\n    )\n        public\n        view\n        returns (bytes32)\n    {\n        bytes32 safeMessageHash = keccak256(\n            abi.encode(SAFE_MSG_TYPEHASH, keccak256(message))\n        );\n        return keccak256(\n            abi.encodePacked(byte(0x19), byte(0x01), domainSeparator, safeMessageHash)\n        );\n    }\n\n    /// @dev Returns the bytes that are hashed to be signed by owners.\n    /// @param to Destination address.\n    /// @param value Ether value.\n    /// @param data Data payload.\n    /// @param operation Operation type.\n    /// @param safeTxGas Fas that should be used for the safe transaction.\n    /// @param baseGas Gas costs for data used to trigger the safe transaction.\n    /// @param gasPrice Maximum gas price that should be used for this transaction.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param _nonce Transaction nonce.\n    /// @return Transaction hash bytes.\n    function encodeTransactionData(\n        address to,\n        uint256 value,\n        bytes memory data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address refundReceiver,\n        uint256 _nonce\n    )\n        public\n        view\n        returns (bytes memory)\n    {\n        bytes32 safeTxHash = keccak256(\n            abi.encode(SAFE_TX_TYPEHASH, to, value, keccak256(data), operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce)\n        );\n        return abi.encodePacked(byte(0x19), byte(0x01), domainSeparator, safeTxHash);\n    }\n\n    /// @dev Returns hash to be signed by owners.\n    /// @param to Destination address.\n    /// @param value Ether value.\n    /// @param data Data payload.\n    /// @param operation Operation type.\n    /// @param safeTxGas Fas that should be used for the safe transaction.\n    /// @param baseGas Gas costs for data used to trigger the safe transaction.\n    /// @param gasPrice Maximum gas price that should be used for this transaction.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param _nonce Transaction nonce.\n    /// @return Transaction hash.\n    function getTransactionHash(\n        address to,\n        uint256 value,\n        bytes memory data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address refundReceiver,\n        uint256 _nonce\n    )\n        public\n        view\n        returns (bytes32)\n    {\n        return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\n    }\n}\n","compiler":{"name":"solc","version":"0.5.14+commit.01f1aaa4.Emscripten.clang"},"networks":{"1":{"links":{},"events":{},"address":"0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F","updated_at":1668154855211},"4":{"links":{},"events":{},"address":"0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F","updated_at":1668154855251},"5":{"links":{},"events":{},"address":"0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F","updated_at":1668154855313},"42":{"links":{},"events":{},"address":"0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F","updated_at":1668154855283},"100":{"links":{},"events":{},"address":"0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F","updated_at":1668154855341}},"schemaVersion":"2.0.3","updatedAt":"2022-11-11T08:20:54.722Z"}