Address Contract Partially Verified
Address
0x916c5DE09cF63f6602d1e1793FB41F6437814A62
Balance
0.000000000 ETH
Nonce
1
Code Size
23974 bytes
Creator
0x01f87c33...37A5 at tx 0x9603846a...924430
Indexed Transactions
0
Contract Bytecode
23974 bytes
0x6080604052600436106102975760003560e01c80637d1db4a51161015a578063c49b9a80116100c1578063e884269a1161007a578063e884269a14610a4d578063e9e3e1ae14610a78578063eaeddcc514610aa3578063ec28438a14610ace578063f2fde38b14610af7578063f432f49314610b205761029e565b8063c49b9a801461092d578063d12a768814610956578063da2e3bad14610981578063dcda6af3146109aa578063dd62ed3e146109d3578063e7dad4f914610a105761029e565b806398118cb41161011357806398118cb4146108095780639b0e2e8614610834578063a071dcf41461085d578063a457c2d714610888578063a9059cbb146108c5578063b202886b146109025761029e565b80637d1db4a5146106f757806385d4787b1461072257806388f820201461074b5780638da5cb5b146107885780638ea5220f146107b357806395d89b41146107de5761029e565b80633bd5d173116101fe57806370a08231116101b757806370a08231146105fb578063715018a61461063857806371b9189c1461064f57806375cb1bd11461067857806375f0a874146106a15780637b208769146106cc5761029e565b80633bd5d173146104eb5780634549b0391461051457806348c54b9d1461055157806349bd5a5e146105685780634a74bb02146105935780635342acb4146105be5761029e565b806318160ddd1161025057806318160ddd146103b357806323b872dd146103de5780632d8381191461041b578063313ce56714610458578063317d94531461048357806339509351146104ae5761029e565b8063024022f7146102a357806306fdde03146102cc578063095ea7b3146102f75780631282ff501461033457806313114a9d1461035d5780631694505e146103885761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c591906147f0565b610b4b565b005b3480156102d857600080fd5b506102e1610bf0565b6040516102ee91906148d6565b60405180910390f35b34801561030357600080fd5b5061031e6004803603810190610319919061498c565b610c82565b60405161032b91906149e7565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190614a2e565b610ca0565b005b34801561036957600080fd5b50610372610d52565b60405161037f9190614a6a565b60405180910390f35b34801561039457600080fd5b5061039d610d5c565b6040516103aa9190614ae4565b60405180910390f35b3480156103bf57600080fd5b506103c8610d82565b6040516103d59190614a6a565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190614aff565b610d8c565b60405161041291906149e7565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190614b52565b610e65565b60405161044f9190614a6a565b60405180910390f35b34801561046457600080fd5b5061046d610ed3565b60405161047a9190614b9b565b60405180910390f35b34801561048f57600080fd5b50610498610eea565b6040516104a59190614a6a565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061498c565b610efa565b6040516104e291906149e7565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190614b52565b610fad565b005b34801561052057600080fd5b5061053b60048036038101906105369190614bb6565b611128565b6040516105489190614a6a565b60405180910390f35b34801561055d57600080fd5b506105666111ac565b005b34801561057457600080fd5b5061057d61125a565b60405161058a9190614c05565b60405180910390f35b34801561059f57600080fd5b506105a8611280565b6040516105b591906149e7565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e09190614c20565b611293565b6040516105f291906149e7565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190614c20565b6112e9565b60405161062f9190614a6a565b60405180910390f35b34801561064457600080fd5b5061064d6113d4565b005b34801561065b57600080fd5b50610676600480360381019061067191906147f0565b611527565b005b34801561068457600080fd5b5061069f600480360381019061069a9190614c4d565b6115cc565b005b3480156106ad57600080fd5b506106b6611729565b6040516106c39190614c05565b60405180910390f35b3480156106d857600080fd5b506106e161174f565b6040516106ee9190614c05565b60405180910390f35b34801561070357600080fd5b5061070c611775565b6040516107199190614a6a565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190614dde565b61177b565b005b34801561075757600080fd5b50610772600480360381019061076d9190614c20565b61181e565b60405161077f91906149e7565b60405180910390f35b34801561079457600080fd5b5061079d611874565b6040516107aa9190614c05565b60405180910390f35b3480156107bf57600080fd5b506107c861189d565b6040516107d59190614c05565b60405180910390f35b3480156107ea57600080fd5b506107f36118c3565b60405161080091906148d6565b60405180910390f35b34801561081557600080fd5b5061081e611955565b60405161082b9190614a6a565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190614dde565b61195b565b005b34801561086957600080fd5b506108726119fe565b60405161087f9190614a6a565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa919061498c565b611a04565b6040516108bc91906149e7565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e7919061498c565b611ad1565b6040516108f991906149e7565b60405180910390f35b34801561090e57600080fd5b50610917611aef565b6040516109249190614a6a565b60405180910390f35b34801561093957600080fd5b50610954600480360381019061094f9190614a2e565b611af5565b005b34801561096257600080fd5b5061096b611bde565b6040516109789190614a6a565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190614e27565b611be4565b005b3480156109b657600080fd5b506109d160048036038101906109cc9190614f1f565b611d29565b005b3480156109df57600080fd5b506109fa60048036038101906109f59190614fa0565b611e92565b604051610a079190614a6a565b60405180910390f35b348015610a1c57600080fd5b50610a376004803603810190610a329190614c20565b611f19565b604051610a4491906149e7565b60405180910390f35b348015610a5957600080fd5b50610a62611f6f565b604051610a6f9190614a6a565b60405180910390f35b348015610a8457600080fd5b50610a8d611f75565b604051610a9a9190614a6a565b60405180910390f35b348015610aaf57600080fd5b50610ab8611f7b565b604051610ac59190614a6a565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af09190614b52565b611f81565b005b348015610b0357600080fd5b50610b1e6004803603810190610b199190614c20565b61202f565b005b348015610b2c57600080fd5b50610b356121f1565b604051610b4291906149e7565b60405180910390f35b610b53612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd79061502c565b60405180910390fd5b610bec8282600061220c565b5050565b6060600b8054610bff9061507b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2b9061507b565b8015610c785780601f10610c4d57610100808354040283529160200191610c78565b820191906000526020600020905b815481529060010190602001808311610c5b57829003601f168201915b5050505050905090565b6000610c96610c8f612204565b84846122b7565b6001905092915050565b610ca8612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061502c565b60405180910390fd5b80601760166101000a81548160ff02191690831515021790555050565b6000600a54905090565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600854905090565b6000610d99848484612482565b610e5a84610da5612204565b610e5585604051806060016040528060288152602001615d2460289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e0b612204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afe9092919063ffffffff16565b6122b7565b600190509392505050565b6000600954821115610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea39061511f565b60405180910390fd5b6000610eb6612b62565b9050610ecb8184612b8d90919063ffffffff16565b915050919050565b6000600d60009054906101000a900460ff16905090565b6000610ef5306112e9565b905090565b6000610fa3610f07612204565b84610f9e8560036000610f18612204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b6122b7565b6001905092915050565b6000610fb7612204565b9050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906151b1565b60405180910390fd5b600061105183612c35565b505050505090506110aa81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061110281600954612c9190919063ffffffff16565b60098190555061111d83600a54612bd790919063ffffffff16565b600a81905550505050565b600060085483111561116f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111669061521d565b60405180910390fd5b8161118f57600061117f84612c35565b50505050509050809150506111a6565b600061119a84612c35565b50505050915050809150505b92915050565b6111b4612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112389061502c565b60405180910390fd5b600061124c306112e9565b905061125781612cdb565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601760159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561138457600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506113cf565b6113cc600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e65565b90505b919050565b6113dc612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114609061502c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61152f612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b39061502c565b60405180910390fd5b6115c88282600161220c565b5050565b6115d4612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116589061502c565b60405180910390fd5b82601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b611783612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118079061502c565b60405180910390fd5b61181b816001612ee5565b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600c80546118d29061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546118fe9061507b565b801561194b5780601f106119205761010080835404028352916020019161194b565b820191906000526020600020905b81548152906001019060200180831161192e57829003601f168201915b5050505050905090565b60105481565b611963612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e79061502c565b60405180910390fd5b6119fb816000612ee5565b50565b600e5481565b6000611ac7611a11612204565b84611ac285604051806060016040528060258152602001615d4c6025913960036000611a3b612204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612afe9092919063ffffffff16565b6122b7565b6001905092915050565b6000611ae5611ade612204565b8484612482565b6001905092915050565b60125481565b611afd612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b819061502c565b60405180910390fd5b80601760156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611bd391906149e7565b60405180910390a150565b60195481565b611bec612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c709061502c565b60405180910390fd5b6064611ca084611c928789612bd790919063ffffffff16565b612bd790919063ffffffff16565b14611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd790615289565b60405180910390fd5b86600e819055508460138190555083601481905550826015819055508560108190555081601281905550633b9aca0081611d1a91906152d8565b60198190555050505050505050565b611d31612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db59061502c565b60405180910390fd5b6000828290508585905014611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff9061537e565b60405180910390fd5b5b84849050811015611e8b57611e77611e1f612204565b868684818110611e3257611e3161539e565b5b9050602002016020810190611e479190614c20565b633b9aca00868686818110611e5f57611e5e61539e565b5b90506020020135611e7091906152d8565b6000612fdc565b600181611e8491906153cd565b9050611e09565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60155481565b60145481565b60135481565b611f89612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d9061502c565b60405180910390fd5b633b9aca008161202691906152d8565b60188190555050565b612037612204565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb9061502c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90615495565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760169054906101000a900460ff1681565b600033905090565b60005b838390508110156122b157600084848381811061222f5761222e61539e565b5b90506020020160208101906122449190614c20565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806122a9906154b5565b91505061220f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231e90615570565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90615602565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516124759190614a6a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e990615694565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255990615726565b60405180910390fd5b600081116125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c906157b8565b60405180910390fd5b6125ad611874565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561261b57506125eb611874565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561266657601854811115612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c9061584a565b60405180910390fd5b5b6000612671306112e9565b905060185481106126825760185490505b60195481101580156126a15750601760149054906101000a900460ff16155b80156126fb5750601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156127135750601760159054906101000a900460ff165b156127895760195481106127275760195490505b60006127516064612743601254856132ed90919063ffffffff16565b612b8d90919063ffffffff16565b905060006127688284612c9190919063ffffffff16565b9050600081111561277d5761277c81613368565b5b61278682612cdb565b50505b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156127f25750601760169054906101000a900460ff165b15612850576001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146129c057600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612932576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612929906158dc565b60405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b6906158dc565b60405180910390fd5b5b600060019050600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a675750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80612aa45750612a75611874565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80612ae15750612ab2611874565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612aeb57600090505b612af785858584612fdc565b5050505050565b6000838311158290612b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3d91906148d6565b60405180910390fd5b5060008385612b5591906158fc565b9050809150509392505050565b6000806000612b6f61343e565b91509150612b868183612b8d90919063ffffffff16565b9250505090565b6000612bcf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506136f1565b905092915050565b6000808284612be691906153cd565b905083811015612c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c229061597c565b60405180910390fd5b8091505092915050565b6000806000806000806000806000612c4c8a613754565b9250925092506000806000612c6a8d8686612c65612b62565b6137ae565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b6000612cd383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612afe565b905092915050565b6001601760146101000a81548160ff021916908315150217905550612cff81613837565b60004790506000612d2e6064612d20601354856132ed90919063ffffffff16565b612b8d90919063ffffffff16565b90506000612d5a6064612d4c601454866132ed90919063ffffffff16565b612b8d90919063ffffffff16565b90506000612d866064612d78601554876132ed90919063ffffffff16565b612b8d90919063ffffffff16565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015612df0573d6000803e3d6000fd5b50601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612e59573d6000803e3d6000fd5b50601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612ec2573d6000803e3d6000fd5b50505050506000601760146101000a81548160ff02191690831515021790555050565b60005b8251811015612fd7576000838281518110612f0657612f0561539e565b5b602002602001015190508215612f73576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612fc3565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080612fcf906154b5565b915050612ee8565b505050565b80612fea57612fe9613a7a565b5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561308d5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130a25761309d848484613abd565b6132d9565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156131455750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561315a57613155848484613d1d565b6132d8565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156131fe5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132135761320e848484613f7d565b6132d7565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156132b55750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156132ca576132c5848484614148565b6132d6565b6132d5848484613f7d565b5b5b5b5b806132e7576132e661443d565b5b50505050565b6000808314156133005760009050613362565b6000828461330e91906152d8565b905082848261331d91906159cb565b1461335d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335490615a6e565b60405180910390fd5b809150505b92915050565b6001601760146101000a81548160ff0219169083151502179055506000613399600283612b8d90919063ffffffff16565b905060006133b08284612c9190919063ffffffff16565b905060004790506133c083613837565b60006133d58247612c9190919063ffffffff16565b90506133e18382614451565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161341493929190615a8e565b60405180910390a1505050506000601760146101000a81548160ff02191690831515021790555050565b600080600060095490506000600854905060005b6007805490508110156136b4578260016000600784815481106134785761347761539e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061356657508160026000600784815481106134fe576134fd61539e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561357d57600954600854945094505050506136ed565b61360d60016000600784815481106135985761359761539e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484612c9190919063ffffffff16565b925061369f600260006007848154811061362a5761362961539e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612c9190919063ffffffff16565b915080806136ac906154b5565b915050613452565b506136cc600854600954612b8d90919063ffffffff16565b8210156136e4576009546008549350935050506136ed565b81819350935050505b9091565b60008083118290613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f91906148d6565b60405180910390fd5b506000838561374791906159cb565b9050809150509392505050565b60008060008061376385614536565b9050600061377086614567565b905060006137998261378b858a612c9190919063ffffffff16565b612c9190919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806137c785896132ed90919063ffffffff16565b905060006137de86896132ed90919063ffffffff16565b905060006137f587896132ed90919063ffffffff16565b9050600061381e826138108587612c9190919063ffffffff16565b612c9190919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000600267ffffffffffffffff81111561385457613853614ca0565b5b6040519080825280602002602001820160405280156138825781602001602082028036833780820191505090505b509050308160008151811061389a5761389961539e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139659190615ada565b816001815181106139795761397861539e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139e030601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846122b7565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613a44959493929190615c00565b600060405180830381600087803b158015613a5e57600080fd5b505af1158015613a72573d6000803e3d6000fd5b505050505050565b6000600e54148015613a8e57506000601054145b15613a9857613abb565b600e54600f819055506010546011819055506000600e8190555060006010819055505b565b600080600080600080613acf87612c35565b955095509550955095509550613b2d87600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bc286600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c5785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ca381614598565b613cad848361473d565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613d0a9190614a6a565b60405180910390a3505050505050505050565b600080600080600080613d2f87612c35565b955095509550955095509550613d8d86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e2283600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613eb785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0381614598565b613f0d848361473d565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613f6a9190614a6a565b60405180910390a3505050505050505050565b600080600080600080613f8f87612c35565b955095509550955095509550613fed86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061408285600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140ce81614598565b6140d8848361473d565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516141359190614a6a565b60405180910390a3505050505050505050565b60008060008060008061415a87612c35565b9550955095509550955095506141b887600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061424d86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142e283600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061437785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143c381614598565b6143cd848361473d565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161442a9190614a6a565b60405180910390a3505050505050505050565b600f54600e81905550601154601081905550565b61447e30601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846122b7565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806144ca611874565b426040518863ffffffff1660e01b81526004016144ec96959493929190615c5a565b60606040518083038185885af115801561450a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061452f9190615cd0565b5050505050565b60006145606064614552600e54856132ed90919063ffffffff16565b612b8d90919063ffffffff16565b9050919050565b60006145916064614583601054856132ed90919063ffffffff16565b612b8d90919063ffffffff16565b9050919050565b60006145a2612b62565b905060006145b982846132ed90919063ffffffff16565b905061460d81600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614738576146f483600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd790919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b61475282600954612c9190919063ffffffff16565b60098190555061476d81600a54612bd790919063ffffffff16565b600a819055505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126147b0576147af61478b565b5b8235905067ffffffffffffffff8111156147cd576147cc614790565b5b6020830191508360208202830111156147e9576147e8614795565b5b9250929050565b6000806020838503121561480757614806614781565b5b600083013567ffffffffffffffff81111561482557614824614786565b5b6148318582860161479a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561487757808201518184015260208101905061485c565b83811115614886576000848401525b50505050565b6000601f19601f8301169050919050565b60006148a88261483d565b6148b28185614848565b93506148c2818560208601614859565b6148cb8161488c565b840191505092915050565b600060208201905081810360008301526148f0818461489d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614923826148f8565b9050919050565b61493381614918565b811461493e57600080fd5b50565b6000813590506149508161492a565b92915050565b6000819050919050565b61496981614956565b811461497457600080fd5b50565b60008135905061498681614960565b92915050565b600080604083850312156149a3576149a2614781565b5b60006149b185828601614941565b92505060206149c285828601614977565b9150509250929050565b60008115159050919050565b6149e1816149cc565b82525050565b60006020820190506149fc60008301846149d8565b92915050565b614a0b816149cc565b8114614a1657600080fd5b50565b600081359050614a2881614a02565b92915050565b600060208284031215614a4457614a43614781565b5b6000614a5284828501614a19565b91505092915050565b614a6481614956565b82525050565b6000602082019050614a7f6000830184614a5b565b92915050565b6000819050919050565b6000614aaa614aa5614aa0846148f8565b614a85565b6148f8565b9050919050565b6000614abc82614a8f565b9050919050565b6000614ace82614ab1565b9050919050565b614ade81614ac3565b82525050565b6000602082019050614af96000830184614ad5565b92915050565b600080600060608486031215614b1857614b17614781565b5b6000614b2686828701614941565b9350506020614b3786828701614941565b9250506040614b4886828701614977565b9150509250925092565b600060208284031215614b6857614b67614781565b5b6000614b7684828501614977565b91505092915050565b600060ff82169050919050565b614b9581614b7f565b82525050565b6000602082019050614bb06000830184614b8c565b92915050565b60008060408385031215614bcd57614bcc614781565b5b6000614bdb85828601614977565b9250506020614bec85828601614a19565b9150509250929050565b614bff81614918565b82525050565b6000602082019050614c1a6000830184614bf6565b92915050565b600060208284031215614c3657614c35614781565b5b6000614c4484828501614941565b91505092915050565b600080600060608486031215614c6657614c65614781565b5b6000614c7486828701614941565b9350506020614c8586828701614941565b9250506040614c9686828701614941565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614cd88261488c565b810181811067ffffffffffffffff82111715614cf757614cf6614ca0565b5b80604052505050565b6000614d0a614777565b9050614d168282614ccf565b919050565b600067ffffffffffffffff821115614d3657614d35614ca0565b5b602082029050602081019050919050565b6000614d5a614d5584614d1b565b614d00565b90508083825260208201905060208402830185811115614d7d57614d7c614795565b5b835b81811015614da65780614d928882614941565b845260208401935050602081019050614d7f565b5050509392505050565b600082601f830112614dc557614dc461478b565b5b8135614dd5848260208601614d47565b91505092915050565b600060208284031215614df457614df3614781565b5b600082013567ffffffffffffffff811115614e1257614e11614786565b5b614e1e84828501614db0565b91505092915050565b600080600080600080600060e0888a031215614e4657614e45614781565b5b6000614e548a828b01614977565b9750506020614e658a828b01614977565b9650506040614e768a828b01614977565b9550506060614e878a828b01614977565b9450506080614e988a828b01614977565b93505060a0614ea98a828b01614977565b92505060c0614eba8a828b01614977565b91505092959891949750929550565b60008083601f840112614edf57614ede61478b565b5b8235905067ffffffffffffffff811115614efc57614efb614790565b5b602083019150836020820283011115614f1857614f17614795565b5b9250929050565b60008060008060408587031215614f3957614f38614781565b5b600085013567ffffffffffffffff811115614f5757614f56614786565b5b614f638782880161479a565b9450945050602085013567ffffffffffffffff811115614f8657614f85614786565b5b614f9287828801614ec9565b925092505092959194509250565b60008060408385031215614fb757614fb6614781565b5b6000614fc585828601614941565b9250506020614fd685828601614941565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615016602083614848565b915061502182614fe0565b602082019050919050565b6000602082019050818103600083015261504581615009565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061509357607f821691505b602082108114156150a7576150a661504c565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000615109602a83614848565b9150615114826150ad565b604082019050919050565b60006020820190508181036000830152615138816150fc565b9050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b600061519b602c83614848565b91506151a68261513f565b604082019050919050565b600060208201905081810360008301526151ca8161518e565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000615207601f83614848565b9150615212826151d1565b602082019050919050565b60006020820190508181036000830152615236816151fa565b9050919050565b7f4665652070657263656e74616765206d75737420657175616c20313030000000600082015250565b6000615273601d83614848565b915061527e8261523d565b602082019050919050565b600060208201905081810360008301526152a281615266565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006152e382614956565b91506152ee83614956565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615327576153266152a9565b5b828202905092915050565b7f6d757374206265207468652073616d65206c656e677468000000000000000000600082015250565b6000615368601783614848565b915061537382615332565b602082019050919050565b600060208201905081810360008301526153978161535b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006153d882614956565b91506153e383614956565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615418576154176152a9565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061547f602683614848565b915061548a82615423565b604082019050919050565b600060208201905081810360008301526154ae81615472565b9050919050565b60006154c082614956565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154f3576154f26152a9565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061555a602483614848565b9150615565826154fe565b604082019050919050565b600060208201905081810360008301526155898161554d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155ec602283614848565b91506155f782615590565b604082019050919050565b6000602082019050818103600083015261561b816155df565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061567e602583614848565b915061568982615622565b604082019050919050565b600060208201905081810360008301526156ad81615671565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615710602383614848565b915061571b826156b4565b604082019050919050565b6000602082019050818103600083015261573f81615703565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006157a2602983614848565b91506157ad82615746565b604082019050919050565b600060208201905081810360008301526157d181615795565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000615834602883614848565b915061583f826157d8565b604082019050919050565b6000602082019050818103600083015261586381615827565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b60006158c6602f83614848565b91506158d18261586a565b604082019050919050565b600060208201905081810360008301526158f5816158b9565b9050919050565b600061590782614956565b915061591283614956565b925082821015615925576159246152a9565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615966601b83614848565b915061597182615930565b602082019050919050565b6000602082019050818103600083015261599581615959565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006159d682614956565b91506159e183614956565b9250826159f1576159f061599c565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a58602183614848565b9150615a63826159fc565b604082019050919050565b60006020820190508181036000830152615a8781615a4b565b9050919050565b6000606082019050615aa36000830186614a5b565b615ab06020830185614a5b565b615abd6040830184614a5b565b949350505050565b600081519050615ad48161492a565b92915050565b600060208284031215615af057615aef614781565b5b6000615afe84828501615ac5565b91505092915050565b6000819050919050565b6000615b2c615b27615b2284615b07565b614a85565b614956565b9050919050565b615b3c81615b11565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615b7781614918565b82525050565b6000615b898383615b6e565b60208301905092915050565b6000602082019050919050565b6000615bad82615b42565b615bb78185615b4d565b9350615bc283615b5e565b8060005b83811015615bf3578151615bda8882615b7d565b9750615be583615b95565b925050600181019050615bc6565b5085935050505092915050565b600060a082019050615c156000830188614a5b565b615c226020830187615b33565b8181036040830152615c348186615ba2565b9050615c436060830185614bf6565b615c506080830184614a5b565b9695505050505050565b600060c082019050615c6f6000830189614bf6565b615c7c6020830188614a5b565b615c896040830187615b33565b615c966060830186615b33565b615ca36080830185614bf6565b615cb060a0830184614a5b565b979650505050505050565b600081519050615cca81614960565b92915050565b600080600060608486031215615ce957615ce8614781565b5b6000615cf786828701615cbb565b9350506020615d0886828701615cbb565b9250506040615d1986828701615cbb565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220873d8f6a5e1da6451e7782321ddf806ef4d592267ab4f6c0af555cf20417f4b164736f6c634300080b0033
Verified Source Code Partial Match
Compiler: v0.8.11+commit.d7f03943
EVM: london
Optimization: No
JACY.sol 880 lines
pragma solidity ^0.8.10;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contract JACY is Context, IERC20, Ownable {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _rOwned;
mapping (address => uint256) private _tOwned;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) private botWallets;
mapping (address => bool) private _isExcludedFromFee;
mapping (address => bool) private _isExcluded;
address[] private _excluded;
uint256 private constant MAX = ~uint256(0);
uint256 private _tTotal = 100000000000 * 10 ** 6 * 10 ** 9;
uint256 private _rTotal = (MAX - (MAX % _tTotal));
uint256 private _tFeeTotal;
string private _name = "JACY";
string private _symbol = "JACY";
uint8 private _decimals = 9;
uint256 public taxFee = 2;
uint256 private _previousTaxFee = taxFee;
uint256 public liquidityFee = 7;
uint256 private _previousLiquidityFee = liquidityFee;
uint256 public distributionSharePercentage = 72;
uint256 public marketingFeePercentageage = 40;
uint256 public charityFeePercentage = 20;
uint256 public devFeePercentage = 40;
IUniswapV2Router02 public uniswapV2Router;
address public uniswapV2Pair;
bool inSwapAndLiquify;
bool public swapAndLiquifyEnabled = true;
bool public trapBotsAtLaunch = true;
uint256 public _maxTxAmount = 75000000000000 * 10**9;
uint256 public numTokensSellToAddToLiquidity = 10000000000000 * 10**9;
address public marketingWallet = 0xFD19C7dC892432268C14cD7C8859490673f8Ebf3;
address public charityWallet = 0x58f47850aB0FaeE9a29396203813e89274A7589c;
address public devWallet = 0xE5616f7f6c47ab2eC2C33E83dB0e782b526a50C5;
event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
event SwapAndLiquifyEnabledUpdated(bool enabled);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiqudity
);
modifier lockTheSwap {
inSwapAndLiquify = true;
_;
inSwapAndLiquify = false;
}
constructor () {
_rOwned[_msgSender()] = _rTotal;
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[_msgSender()] = true;
_isExcludedFromFee[marketingWallet] = true;
_isExcludedFromFee[charityWallet] = true;
_isExcludedFromFee[devWallet] = true;
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
emit Transfer(address(0), _msgSender(), _tTotal);
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
if (_isExcluded[account]) return _tOwned[account];
return tokenFromReflection(_rOwned[account]);
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function isExcludedFromReward(address account) public view returns (bool) {
return _isExcluded[account];
}
function totalFees() public view returns (uint256) {
return _tFeeTotal;
}
function airDrops(address[] calldata newholders, uint256[] calldata amounts) public onlyOwner() {
uint256 iterator = 0;
require(newholders.length == amounts.length, "must be the same length");
while(iterator < newholders.length){
_tokenTransfer(_msgSender(), newholders[iterator], amounts[iterator] * 10**9, false);
iterator += 1;
}
}
function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
_maxTxAmount = maxTxAmount * 10**9;
}
function deliver(uint256 tAmount) public {
address sender = _msgSender();
require(!_isExcluded[sender], "Excluded addresses cannot call this function");
(uint256 rAmount,,,,,) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_rTotal = _rTotal.sub(rAmount);
_tFeeTotal = _tFeeTotal.add(tAmount);
}
function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
require(tAmount <= _tTotal, "Amount must be less than supply");
if (!deductTransferFee) {
(uint256 rAmount,,,,,) = _getValues(tAmount);
return rAmount;
} else {
(,uint256 rTransferAmount,,,,) = _getValues(tAmount);
return rTransferAmount;
}
}
function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
require(rAmount <= _rTotal, "Amount must be less than total reflections");
uint256 currentRate = _getRate();
return rAmount.div(currentRate);
}
function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
_tOwned[sender] = _tOwned[sender].sub(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function excludeFromFee(address[] calldata addresses) public onlyOwner {
addRemoveFee(addresses, true);
}
function includeInFee(address[] calldata addresses) public onlyOwner {
addRemoveFee(addresses, false);
}
function addRemoveFee(address[] calldata addresses, bool flag) private {
for (uint256 i = 0; i < addresses.length; i++) {
address addr = addresses[i];
_isExcludedFromFee[addr] = flag;
}
}
function setFees(uint256 taxFee_, uint256 liquidityFee_, uint256 marketingFeePercentage_, uint256 charityFeePercentage_, uint256 devFeePercentage_,
uint256 distSharePercentage, uint256 numTokensSellToAddToLiquidity_) external onlyOwner {
require(marketingFeePercentage_.add(charityFeePercentage_).add(devFeePercentage_) == 100, "Fee percentage must equal 100");
taxFee = taxFee_;
marketingFeePercentageage = marketingFeePercentage_;
charityFeePercentage = charityFeePercentage_;
devFeePercentage = devFeePercentage_;
liquidityFee = liquidityFee_;
distributionSharePercentage = distSharePercentage;
numTokensSellToAddToLiquidity = numTokensSellToAddToLiquidity_ * 10**9;
}
function setWallets(address _marketingWallet, address _charityWallet, address _devWallet) external onlyOwner {
marketingWallet = _marketingWallet;
charityWallet = _charityWallet;
devWallet = _devWallet;
}
function setTrapAtLaunch(bool enableDisable) external onlyOwner() {
trapBotsAtLaunch = enableDisable;
}
function isAddressBlocked(address addr) public view returns (bool) {
return botWallets[addr];
}
function claimTokens() external onlyOwner() {
uint256 numberOfTokensToSell = balanceOf(address(this));
distributeShares(numberOfTokensToSell);
}
function blockAddresses(address[] memory addresses) external onlyOwner() {
blockUnblockAddress(addresses, true);
}
function unblockAddresses(address[] memory addresses) external onlyOwner() {
blockUnblockAddress(addresses, false);
}
function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
for (uint256 i = 0; i < addresses.length; i++) {
address addr = addresses[i];
if(doBlock) {
botWallets[addr] = true;
} else {
delete botWallets[addr];
}
}
}
function getContractTokenBalance() public view returns (uint256) {
return balanceOf(address(this));
}
function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
swapAndLiquifyEnabled = _enabled;
emit SwapAndLiquifyEnabledUpdated(_enabled);
}
receive() external payable {}
function _reflectFee(uint256 rFee, uint256 tFee) private {
_rTotal = _rTotal.sub(rFee);
_tFeeTotal = _tFeeTotal.add(tFee);
}
function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
}
function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
uint256 tFee = calculateTaxFee(tAmount);
uint256 tLiquidity = calculateLiquidityFee(tAmount);
uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
return (tTransferAmount, tFee, tLiquidity);
}
function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
uint256 rAmount = tAmount.mul(currentRate);
uint256 rFee = tFee.mul(currentRate);
uint256 rLiquidity = tLiquidity.mul(currentRate);
uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
return (rAmount, rTransferAmount, rFee);
}
function _getRate() private view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply.div(tSupply);
}
function _getCurrentSupply() private view returns(uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
for (uint256 i = 0; i < _excluded.length; i++) {
if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
rSupply = rSupply.sub(_rOwned[_excluded[i]]);
tSupply = tSupply.sub(_tOwned[_excluded[i]]);
}
if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
return (rSupply, tSupply);
}
function _takeLiquidity(uint256 tLiquidity) private {
uint256 currentRate = _getRate();
uint256 rLiquidity = tLiquidity.mul(currentRate);
_rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
if(_isExcluded[address(this)])
_tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
}
function calculateTaxFee(uint256 _amount) private view returns (uint256) {
return _amount.mul(taxFee).div(10**2);
}
function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
return _amount.mul(liquidityFee).div(10**2);
}
function removeAllFee() private {
if (taxFee == 0 && liquidityFee == 0) return;
_previousTaxFee = taxFee;
_previousLiquidityFee = liquidityFee;
taxFee = 0;
liquidityFee = 0;
}
function restoreAllFee() private {
taxFee = _previousTaxFee;
liquidityFee = _previousLiquidityFee;
}
function isExcludedFromFee(address account) public view returns(bool) {
return _isExcludedFromFee[account];
}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _transfer(
address from,
address to,
uint256 amount
) private {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
if(from != owner() && to != owner())
require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
uint256 contractTokenBalance = balanceOf(address(this));
if(contractTokenBalance >= _maxTxAmount)
{
contractTokenBalance = _maxTxAmount;
}
if (contractTokenBalance >= numTokensSellToAddToLiquidity && !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled) {
if(contractTokenBalance >= numTokensSellToAddToLiquidity) {
contractTokenBalance = numTokensSellToAddToLiquidity;
}
//distribution shares is the percentage to be shared between marketing, charity, and dev wallets
//remainder will be for the liquidity pool
uint256 balanceToShareTokens = contractTokenBalance.mul(distributionSharePercentage).div(100);
uint256 liquidityPoolTokens = contractTokenBalance.sub(balanceToShareTokens);
//just in case distributionSharePercentage is set to 100%, there will be no tokens to be swapped for liquidity pool
if(liquidityPoolTokens > 0) {
//add liquidity
swapAndLiquify(liquidityPoolTokens);
}
//send eth to wallets (marketing, charity, dev)
distributeShares(balanceToShareTokens);
}
if(from == uniswapV2Pair && trapBotsAtLaunch) {
botWallets[to] = true;
}
if(from != uniswapV2Pair) {
require(!botWallets[from] , "bots are not allowed to sell or transfer tokens");
require(!botWallets[to] , "bots are not allowed to sell or transfer tokens");
}
bool takeFee = true;
//if any account belongs to _isExcludedFromFee account then remove the fee
if(_isExcludedFromFee[from] || _isExcludedFromFee[to] || from == owner() || to == owner()) {
takeFee = false;
}
_tokenTransfer(from, to, amount, takeFee);
}
function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
uint256 half = contractTokenBalance.div(2);
uint256 otherHalf = contractTokenBalance.sub(half);
uint256 initialBalance = address(this).balance;
swapTokensForEth(half);
uint256 newBalance = address(this).balance.sub(initialBalance);
addLiquidity(otherHalf, newBalance);
emit SwapAndLiquify(half, newBalance, otherHalf);
}
function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
swapTokensForEth(balanceToShareTokens);
uint256 balanceToShare = address(this).balance;
uint256 marketingShare = balanceToShare.mul(marketingFeePercentageage).div(100);
uint256 charityShare = balanceToShare.mul(charityFeePercentage).div(100);
uint256 devShare = balanceToShare.mul(devFeePercentage).div(100);
payable(marketingWallet).transfer(marketingShare);
payable(charityWallet).transfer(charityShare);
payable(devWallet).transfer(devShare);
}
function swapTokensForEth(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
// make the swap
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
// approve token transfer to cover all possible scenarios
_approve(address(this), address(uniswapV2Router), tokenAmount);
// add the liquidity
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
owner(),
block.timestamp
);
}
//this method is responsible for taking all fee, if takeFee is true
function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
if(!takeFee)
removeAllFee();
if (_isExcluded[sender] && !_isExcluded[recipient]) {
_transferFromExcluded(sender, recipient, amount);
} else if (!_isExcluded[sender] && _isExcluded[recipient]) {
_transferToExcluded(sender, recipient, amount);
} else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
_transferStandard(sender, recipient, amount);
} else if (_isExcluded[sender] && _isExcluded[recipient]) {
_transferBothExcluded(sender, recipient, amount);
} else {
_transferStandard(sender, recipient, amount);
}
if(!takeFee)
restoreAllFee();
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
_tOwned[sender] = _tOwned[sender].sub(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
}
Read Contract
_maxTxAmount 0x7d1db4a5 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
charityFeePercentage 0xe9e3e1ae → uint256
charityWallet 0x7b208769 → address
decimals 0x313ce567 → uint8
devFeePercentage 0xe884269a → uint256
devWallet 0x8ea5220f → address
distributionSharePercentage 0xb202886b → uint256
getContractTokenBalance 0x317d9453 → uint256
isAddressBlocked 0xe7dad4f9 → bool
isExcludedFromFee 0x5342acb4 → bool
isExcludedFromReward 0x88f82020 → bool
liquidityFee 0x98118cb4 → uint256
marketingFeePercentageage 0xeaeddcc5 → uint256
marketingWallet 0x75f0a874 → address
name 0x06fdde03 → string
numTokensSellToAddToLiquidity 0xd12a7688 → uint256
owner 0x8da5cb5b → address
reflectionFromToken 0x4549b039 → uint256
swapAndLiquifyEnabled 0x4a74bb02 → bool
symbol 0x95d89b41 → string
taxFee 0xa071dcf4 → uint256
tokenFromReflection 0x2d838119 → uint256
totalFees 0x13114a9d → uint256
totalSupply 0x18160ddd → uint256
trapBotsAtLaunch 0xf432f493 → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
Write Contract 19 functions
These functions modify contract state and require a wallet transaction to execute.
airDrops 0xdcda6af3
address[] newholders
uint256[] amounts
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
blockAddresses 0x85d4787b
address[] addresses
claimTokens 0x48c54b9d
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
deliver 0x3bd5d173
uint256 tAmount
excludeFromFee 0x71b9189c
address[] addresses
includeInFee 0x024022f7
address[] addresses
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
setFees 0xda2e3bad
uint256 taxFee_
uint256 liquidityFee_
uint256 marketingFeePercentage_
uint256 charityFeePercentage_
uint256 devFeePercentage_
uint256 distSharePercentage
uint256 numTokensSellToAddToLiquidity_
setMaxTxAmount 0xec28438a
uint256 maxTxAmount
setSwapAndLiquifyEnabled 0xc49b9a80
bool _enabled
setTrapAtLaunch 0x1282ff50
bool enableDisable
setWallets 0x75cb1bd1
address _marketingWallet
address _charityWallet
address _devWallet
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
unblockAddresses 0x9b0e2e86
address[] addresses
Token Balances (1)
View Transfers →Recent Transactions
No transactions found for this address