// File: contracts/Klaus.sol



/* 

You'll own nothing. And you'll be happy. 


 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDZZZZZZ$ZZZZZZZODMNMNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM8O$$$777777$7$$$7$$ZZOO8MMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOOZZ$$7777777II777$777$$$ZZZO8MNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM8OZZ$$$7$$77IIIIIIII7II77$777$$ZZZZ8MNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOZZ$$$7777777IIIIIIIII??IIIIII$777$$$ZZONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNZZZ$77777I7IIIII?I?I??I???II?IIIII7I7777$ZZOODNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO$Z$7777IIIIIIIIIII?????????I??I?I?II7III77$$ZOZ8NMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOZZZ$7777IIIIII??I??+???+???I++???????I?IIII77Z$$ZZZ8DMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMDOZZ$$$I77IIIII????I?+++++++++?++++??+?++?+??II77$$Z$ZZODMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOOZ$$777I7II???????????+++?+?=+++??++++++??????I777$$$Z$ZODDDMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNM8OZZ$$$$7I?I?I?I?I?+I???+++++++++++++++?+=+++?????I77I777$$Z8DNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOOOZZ$$777I????????+++++++++=+=++++++++=+++++++?????III7$$7$$Z8DDNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNN8OZZ$$777II????+++?+++=+===+=+++====+++=+=+++++=+++????II7777$ZO88DNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN88OZZZZ$777I?????+???++=++=========~+++==?=++=++=++++?+????I777I$Z88DDDDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNDOOOZZ$7$77II?+?+?+?+++=++===~~~===~~===++++===++=++++?????III7777Z8888NND8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDNNNNND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8OZZ$Z$$7I7II?++++??+?=+====~~:~~==~=~~==++====~???+=++?+???II?I77$OO88DNN8DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8OOZZ$Z$777I??I+++++======~=~+=~~~=~~~===++===+==+?=+++++???I???II7$O888DDDNODNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMD88OOZZZ7Z7III??+??++====~==~~~=~~~~~~:~~~~=~===+++====++?+?I??IIII77$O888DDDDD8DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD88OOZZZ$77II??++=++=~~~~====~~~~~~~~~~~~=~=~~~===+==?=?+=?????I?I?77$OOO8DNDDNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMD88OZO$$7$$I7???++++=++=:===~~==~~~~:~~~~::~~~~========?++??+????I?I77ZZOO8DNDDNNDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD8OOZZZ$777III???+?+=++====~:~~=~:~~~~~~~:,~~~~~===~======????+??III$$ZZZO8DD88DDD8DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMD88OOZO$$777III??+?+=====~~===~=~~~~~~:~~~::~~~:~=~~=~+===++=++???II$7Z$Z$O8D88DDNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD88OOZZ$$$7IIII?????+=+==~===~~~~::~~~~::~~:~~:~~~~~==~~==+=+=+??II$7$Z$$$O8O8DDDDDDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDD    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM8888OZOZ$$77II7?I??=+====~~==~~~~:~=~~==:~::::::::~~~~=~====+=?=+I?I$I$$$$$$OO8ODNDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDD    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD88OOZZZ7$77II+??++++====~==~~~:~=~~~=~=:~~:,~:~~~:~~~=~=+=?==+++I?7$$7$$$I$ZZOZDNDNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD8OOOZZ$777$7?I?+++==+=~=~~~~~~~~:~::~~==:~~::::,:~~~~~~=+==+==++?II777$$$7Z$8D88DNNN8MNNNNNNNNNNNNNNNNNNNNDNNNNNNNNDDNDND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN88OOOZ$$7777????+++++===~~~~:~~~:~=~====~:::~:~::,:~~~=~~=====+++=?I?II777$7ZZD88NDDDDONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMD888Z$ZZ77III???+=+=====~~:~~:~:~:~~~~~=~=::::::~::~~==~~=~=+=++?+=++=+?I7$77$$8DNNNNNNDDNNNNNNNNNNNNNNNNNNNNDNNNNDNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM888OZZ$$7777I???++=+==~~~~~~:~~~~~~:~~==~=~~,~::::::~:~~~~~~==~+++==++++?7IZ$$$8DDNNDDDDNNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD88OZZ$$77I??I+=++==~~~==~~==~~::~~~~:=~==,:~:~~~=~~~==:====+++++===+++?I7$ZZODNDNNNNNDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8D8OZZ$$I?7I??++===~:~~~::~~:::~~~~=~~~===:~~===:~~~=?77Z7II7?++?=+=?=???IZO8Z8NDDNNNNDNNNNNNNNNNNNNNNNNNNNNNNDDNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD8OOZZ$777I??++===~:~:~~==:==?=~~~=~=~:===~::~~:~+===I7$$ZZZ8$OZ7I=$ZIO7I?$8D8DND8NNNNNNNNNNNNNNNNNNNNNNNNNNNNDNDDDNDNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDD888ZZ$$7III+=++=:==+~=~I+7I7Z===+=?=+~~~~=~~~+~??+?7II$88ZO8OIZOZ7$$DOZZ$Z8DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNN888OOZ$$7II+++?I++I~?IZ$$8O+Z7++?++I++~~~:+===+??III7OZDZOO8ND8O88$OO8OZOO8DDDNNNNNNNDNNDNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8888ZZZZ77II+?I~.,?Z88DDDD8NDO7?I?IIZ+=~~~==++?78OO8DMINZ8O8O8D8OOZI77Z7OZODD8DNMNNNNDNNDNNNNNNNNNNNNNNNNNNNNNNNDNNDNDDNND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMD888OOO$Z7DNI7?II$I7$O88ND8ZDD88888NOI=~=~~===+I7ZNM.OMNDOZ7$7?+??I?$7$OZOO8DNNDNMNNDDNDNDDNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8OOOZZ8OZZ7$77?ZOOO$Z$ZZZZZ88DDDNDNN7+~~~~+??=77ZNMMMD888D88?=~,~==+II$Z8OD8DDDNNNNDDDN8NNNNNNDDDNNNNNNNNNNNNNDDNNNNNNNNND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMND8OOOONZO$$$Z$O$$III+?:+==?I$OO8O8DDD8ZMM$OZZZDDNMMNMND8N$Z$DNMMMN7?=?7$O8DDD8DNNNMNDNMMMMNNNNNDDDDNNNNNNNNNNNNNNNNNNNNNDND    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNDMM8Z~MOZZ$OOZ$7777===:=INMMNNNN8Z$7I787~~~~~:=+7DNMMMD$$OO+=NDMMMNMND7ZDDDODNDNNMONNNMNMMNNNNNDDNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDMMMMMMOOZO$7$$7I7++I$MMMMMMN8D8OOZ$7NZ==~:::~~=7DM8DDON8$:::DODDNNNDMMN8NDD8NDNNN8N8D8DNNNNNNNNMMNNNNNNNNNNNNNNNNNNDNNDNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNM8MND8MOOO8$7O$O$IIMMMMMMMNDO7$OZ77?D8N+=~::~==+78NONN8$7I=:=:I8DDDZ$$7ODM888DDDDDDNDDODDDNNNNNMMMNNNNNNNDNNNDNDNNDDNDDNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMOO8MMNMMMDMND8OZOZZI$ZMMN8NNNNODI7+7$I+I.ZD?==~~:~~+7ODM88NZ7=:=~~~~~==+++7ZDDNNMNNDDINND888DNDNNNNNMMNNNNNNNNNNNNNDNNNDDNNNNDD    
 .MMMMMMMMMMMMMMMMMMMMMMMMMM88OO8D8O88D8ZDDD8OZ$ZNMZ77I??7=~=~777++=?IOZ==~:,:~~?7O8NMNDD??:~:~+II$7Z$Z$OZZ8DNMMNDDNNNDDNNNNDNNNNMNNNNNNNNNNNDNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMM888OODDZZZO8MO888ZZOM8ZZ7I??:+III7~=~+==~NN++=~:::=~I78DNMO7I$?~=~~:=+?II7$$$$ZODNNDD,DDNNNNNNNNNNNNNMMNNNNNNNNNNNNNDDNDNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMDM8OOD8O$$Z$O8OOOO8N$IIIIIIII7I?,:~=?==~MZ=+=~~:,:~+I$8D8OZM7I$+=~:~~~+=++?I7I$O88D8$888DNMNNNNNNNNNNNMNNNNNNNNNNDNNDDNDNNNNDDDN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMM8DN8D8OZZ$$$ZNZOD8O7??I???++~~:,:=+,~=Z?~+==~:::~=+I$D8OZZ$ZM?I+~~~~~~~+++II7ZOOZMO$ZDO8NMNNNNNMMNNNDNNNNNNNNNNNNNDDNNNNDNNDDNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMM8888D8O8Z$$77ZONZO$ZIII=++===:,~~==,=$======~~::~=+?78OOZ$7777$IZMMN8OO8DMMDOO8OD8$Z$8DODNMMNNMMMNNNNNNNNNNNNDNNNNNNNDNDNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMM8O8OD88OZZZ$77Z$7I77ZOZI?II$Z$?:=:=I+=~==+==~~~::~+?IOO8O$7777??I?I++???I77I77Z$7$$ZODDNDNNNNNMMMMMMNNNNNNNNDNNDNNNNNDDNDDNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMM8888DD8OZZZ$?7III?7777I??II??I?++========+=+~~:::~~+?Z8D8$77777?=++=====++??II77I7I$DDNNNNNMMNNMMMMMNNNNNNNNNNNDNNNNNNNNDNDNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMM8D888D8O8O$77?IIIIIII??++??==+==~:~=====+?+=~:::~:~=?ZDNN8$I777?+======~=+??=?+?I?7$ZD8DNNNMNNNDMMMMNNNNNNNNNNNNNNNDNNNNDNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMD8O88D88O8Z$IIIII?=??=++=~:=:=~:~=~===++???~~::~~~:=+$ONMD$II77I=+=======++++???I7?Z$8NDDNMNNNNNMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMM88888888OZ$$77I???+======:=~~~~=====?++=++~:::,:::~+78NMD8$777?++=+~===?=+?+I?$$$$O8DNN8MMNNNNNMMMNDNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMNMMMMM88DDD8888O$$$$I7II+++~+==~~:~:~~~~~+?+===+~:,..,,~~=7NNN8ZOOZ??++++++=+=?++II77O$$8ZONN8NNMNNNNMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMNM8O8DD888DZ$$$7I77II??+=+==+~~~=~=~+I+=~~==~:,,::~=?IZNNN8$7$8O?=+?+=====I???$I$8$7ZZDNNDNMMNNNMNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMM8OOOO8888OZ$7$77I$+?+?+====~~~=~~+I+=:==+?+=~~~=??7O8NNNDZZ$Z8Z?=??~===+=+??7ZOZ$Z7$8DDDNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMNZZOO8888O$777777III???==+~==~+++?I+=+??I??++=+?77ZDNNNNNNN88NMZ+=~=+=~==?I?7$O8ZZIZO8ODDMNNNMMNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMNMMD8OO88O8OZ$$$77IIII??+===+=~=~=?7+I?$DMMMI?I7$$ZO8DMMMMMMMNNNMDZI+=~==~~I?I7OZ88Z$IZODNMNNNNMMNDDNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNMM8$O88OD8Z7777I7I??++?+==+===+I$?=$Z8NOOMMMOODNDDDMMMMMMMMMMMMDZ$~=~~~=????7$OOD$Z$ZO8DNMMNNMNNDDNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMD888888Z$I$I777I???=+~++++?777+==Z$+~==++78NNNNMMMMMMMMMMDDOZ$7I~=~==++II7$8DNDZZOZOMMNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN888888O$$777$7II?+=+=++++II7+==~=~I?=?++~+ONNMNNNNNMNND8O$$$7?I~~~===?I?$$Z8ND8ZOODNMNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMNMMMNM888888OZ$$7I$777?I=++I++?I7I=====~~=++~==I?$7I77ZZO8OOOZ7Z77III7=~~=++??77ZDDN8OZODNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMDD8888OO$$77$777I??+???+?7$+=+===~?++=~++~=I~~+???7$Z7$7I7I7??IIZ=====?7$$O8NNDODONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMD8D888OO$$7777$+III?++?777+=++++++?==?====+?=:=++??IIII7?7I?I$7$IO~++??7Z$8DDND888NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMN8D8888OZZ7$$77I??III+I$7$=+++++=+??=?+~~++====+++II?I?7?I777?$$I77=+=?I77ONNMDD88NNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMNMNMNMMM888O88O$77$7$7?IIIII7I7Z+=+???==+=+~=:=====+=:+++++??77????II7Z77Z==++77ZONMNDD8NNMMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNM888OO88OZZ7$$IIIIII7I7$++=++??+~==+=~,=~=~??~:~:~+?I+I7?77$$ZOZZ$O8=I?IZZ8NNN88ONMNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNMNMNN8D88888OZZ$7ZIIIII7777Z+++=??I+++=~~~::,::==~~~~~=?+++$IIZIO888ZZO8++?+IZ8DNNND8DNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNMNDDOO8OOZ$$77I7II7II77+??+??II+++==~,~~~~==~==~=++?I?+III$$D8ZZOODD++=?IOZDNNODDDNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNNMNNNMM88OO8OOZ$7$I7I??I7?II7III++???=+==+:~:++===::~+++?I7$7$Z8DONZZOOD8~=+I?ZDDDD8NNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNNMM88888OZZ$$$II????I+I=??I77+?IIII+=+=+=~~==~=+?7$OOD888DNNNNNDN888O:=+I$ODDNN8DNNNNNDMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNM888888ZZZ777I???+++++?7??I$7$$$$Z$$$IIII+==I7ZD8NNNNNMMMMMMMMN8Z$?~+?II$NDDD8NNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMM8888OOZ$Z77I???=====?7I$$ONMMNDDDDNMDD8O8DDNMMMMMMDDNMMMMMMMDO$I~~=+?788DN88NNNNNDMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMNMNNNNNNNNN888OOZ$$$7I?+?+==+II7$8I$7$I7I77:+??IZDMMMMNOZ?ZZONIZZ8DMMMD$?$:~+I7$D8NNDDNMNNNMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMNMNNNNNNNMN8D8OOZZ$77I?++~==?77Z??+II?7777+?~::+?7=:?I=7$8I$OODNMMMN887?~:=+IZOD8NNDNNNNNMMMMMMNNNNNNNNNNMMNNNNNNMNMNNNMNNNNNNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMNMNNNNNNNNNNM88D88ZZZO7II?++=??7$+??I+?I+I++?===I7$$7$Z$ZO8DNNNMMMMMD8OZ$7~~I+$Z8N8DDNNNNNNMMMMMNNNMNNNMNMMMMMNMMMMNMMMMMMNMMMMNN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNM88D8OZ$$77II?+++I7++=I?IIII7$$O888DMMMMMMMMMMMNNMMMNDOZO8$8=+==I$Z8NDNNNNNNNMMMMMMNNNMMNMMMMMMMMMMMMMMMMMMMMMMMMMMN.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMNMMMNMNMNNNNMN8D8OOZ$77I????IIZ?+++?I7778888NNMMDDD8D88D8OD8NDZOOZO8O$ZD$==+7I88NNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMNNNNNNM8DD8OZZ$$7II?I77I?++I+IIII?II77+=+==+???I77Z$$$$Z$ZZZ$ZZZOI=+?$O8NDNNNNNMDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMNNNNNNM8D88OZZ$$7I?I7???7$7??IIIII???+:+=:~=~~?+++7$77$$Z7Z7ZZ8Z8==?$DZNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMNMNMNMNNMM88D88ZZ$777777$I?I77$77?++?+~~~:~~:==~+=+?+??I?7I$$$Z8DDOII7ZDMNDNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.   
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMNNNNM888D8OZZ$Z$7$II7IIII7?+?+=~:~:,~:~~+====++?++?7??$7$OODD$8I$ODNMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMNNNM8DO8O8OOZ$$Z7$$I7III++==~+~~=+==~~?=+++?+IIIIII$7Z8ON8M$$$7DNMDNNNNMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMNNNNM888DOO88OOZ7$ZZ77I+?==+==+~+++I+II??+?=??7$I$$O$OONMMMOOO8DNNNMMNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMNNNNNNNMD88O8888DDOZZZO$7I7I++++=???III7$$7$II+I$ZZO8$88DDNMNND8DDMMMNMNMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNMNNNNNNM888888888D88888O$77III?7II7$IZ$OOZ77$77$DZDDDDNMNNNNNNNNNNNNNNMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNM88O8888888NNNNMNOO7$$Z$Z$OZ$O88O$$$OZZDDNNNNDNNNMMMNMNNNNNNNNMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNM88888D8DDNNNNNND8DO8OZZ8D88NNNNND8NNNNMNMNNNMMMMMMMMMMMNNNNMMMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMNMMMMMMNMMMMMMMNNNMNNNNNNMD888O8DDDNMND8OOZO88NMMNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNMMMMMMNDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNM888888O888O8OZZ$$ZZO8DNNNNNMNNNNNMMMMMMMMMMMMMMMMMMMMNNDNMMMMMMNDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNNNNNNNNMDO888OOOOOOZOZZ$$ZZOO88D8DDDDDNDNNNNNMNNNMMMMMMMMMNMMNNNNNNMMMMDDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNMNI888888OZOZZZZZ$Z$Z$Z8888888DDDDNNNNNNNNNNNNNMNNNMNNNNNNNNNNMMNDDNMMMMMMMNNMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNMNNI788ODD8OOZZOZOOOOOZOO8O8DDNDNNNNNNDNNNNNDMNNNNNNNNDNNNNNNNNMNDDDNMMMMMMMNMNMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNMNNND7+$OOO8D88D8OOOO8OOOO88DDDNDNNNNNND8DDNDDDDNNNMNNNNNNDNNNNMNNNDDDDNMMMMMMMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMNMMNNNNN8$?+?8OOODDDD88O8O8888D8DDDDNNNNNDDND8DD8DNNNMNNNNNNNNNNNNNNNDDDDDDDNMMMMMMMMMNNNNMNNMMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMNNNNNNNZ$I+++OOZOODDD8OO888888D8DDDNNNND888D88888DNDNNNNNNDNNNNNMMNDDDDDDDDDMMMMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNN$77?+=+ZOZZOO88888D88O8D888D8888OOOODOODO8NNMMNNNNNNNNNNMND88DDDDDDDDMMMMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNDNNNNDNNNN777I++==?OOZZ$ZZO8OO8OZOOZZ$ZOO$ZZZOO8ZZ88NNNNNNDNNNNNNNNOOO88DDDDDDDNMMMMMMMMMMMMNMNNMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNDNNNNNNNNNNNN77I??++=+=OZZZZ$OZOOOOOZZZ$$$Z$7Z$$$OZZO8DNNNNNNNNNNNND87ZZO8888888DDDMMNNMMMMMMMMNNNNMMMMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMMMMMMNNNNMMMNDNNNNDNNNNNNNNNZII??++++==+ZOZZ$ZZ8ZOOOOZZOZ$Z$$Z$$ZOO88DNNNNMMNNNNNNII$ZZOOOOOOOO88DNMD8NMMMMMMNMMMNMNNMMMMMMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMMMMMMNDNNNNNMNNNDDDNNNDDNNNDNNNNN8III?++++++==+ZOO$ZZZOOOOOZZZZ$$ZZ$$OO8DNNNMMMMNNNDD8+I7$$ZOOZZZOOOO8DDNNZNMMMMNNMMMNMNNMNNNNNMMMMMMMMMMMMMM    
 .MMMMMMMMMMMMMNNNMNMMNNNNNMMD8DDDDNDDDNNNNNNNDNMIII?++++++++==+$ZZZ$ZZZ$O8OOZZ$OZZZODNNNMMMMNNDDN$++?7777$$$$$ZZZOO888DM$NNNMMMMMMMMNMNMMNNNNNNNNMNMMMMMMMM    
 .MMMMMMMMMMMMNMMNMNNNNNNNNNDDDDDDDDDNNDNDDDNDDNMIII?+==++++++===+7Z$$$$$ZOOOZZOO$Z88NMMMMNMNNDDN==+?III77777777$$OOOZZ8N78NMMNMMNMMMMMMMNMNNNDNNNNNNNNNMMMM    
 .MMMMMMMMMMMMMNNNNNNNNNNNN88DDDDDDDDDDNNNDDDNNNMII???======++++====?ZZ$ZZZZOOOOOZDDDNMMMMNNND8?=+??????I7III7$7$ZOOZ7Z$8?$NNMNNMNNMMMMMMMNNMMMNDNNNNNNNNNMN    
 .MMMMMMMMMMMMNNNNNNNNNNNDD8DDNDDDDDNDDNDDNDDNDNMI????==========+======8ZOZO88O8ODDNNNMMMNDDD$==+??????IIIIIII7$$ZZ$II$$8+INNMMNMMNMMMMNMMMNNNNNMNNNNNNNNNNN.   
 .MMMMMMMMMMNNNNNNNNNNNNDD8DDDDDDDDDDNDDDDDDNNNDM$????+=====~~~==========OOD8DDDDDDNNNMNNDDD==+?+?+++??????III7$Z$$7III7Z=+NNNMMMMMMMMNMNMMMMMMMMMNDNNNNNNNN.   
 .MMMMMMNMNNNNNNNNNNNNNDDDDDDDDDDDDDDDDNDDDNDNDNM8?????+===~~~~~~=~~=~====+D8DD8NNNNNNDNDN+=+++?+++++?I???II777777II+II?7==NNMMMMMMMMMNMMNNMMMMMMMNNDDNNNNNN.   
 .MMMNMNNNNNNNNNNNNMNDDDDDDDDDDDDDDDDDDDDNNNNNDNMN++???++===~~~~~~~~~~~~====?D88NNMNNDDN=~~===++++++????????IIIIII?++???I~~MNMMMMMMMMMMMMMNNMMMMMMMMMNDNNNNN.   
 .MMMMMNNNMNNNNNNNNNDDDDDNDDDDDDDDDDDDDDNNNNNNDDMN++++?++++=~~~~~~~~~~~~~~==+OO$NNNNNN=~~~=====++++???+????????+??++++?I+~~MNNNMMMMMMMMMMMNNNMMMMMMMMMNNNNDN.   
 .NMMNNNNNNNNNNNNNDDDDDDDD8DDDDDDDDDDDDNNNNNNNDNNN?++++++++===~~~~~~~~~~:~=MOD$O8877O$Z~~:~=~+=?++???+???++++?++++===+=$+~~MNNNNMMMMMMMMMMMMNMMMMMMMMMMMNNND    
 .NNNNNNNNNNNNNNNDDDDDDDDDDDDDND8DDDDNNNNNNNNDNDNN?===+++++=====~~~:~::::M$?ZO7+8DDD$?888:~==~+?????+???++++?+=+=======8=:~NNMNNMNMMMMMMMMMMMMMMNNNMMMMMMNND    
 .MNMNNNNNNMNNNDDDDDDDDDDDDDDDDDDDDDNNNNNNNNNNNNNN?=====+++=+====~~~:::I7+NOO8~=OZDNNO7ZD7O~~=++?++???++++++=+=====~==+N+~~NMMNNNMMMNMMMMMMMMMMMMMMMMMNMMMNN    
 .NNNNNNNNNNNNDDDDDDDDDDDNDDDDDDDD8NNNNNNNNNNNDNNNI=======+===+=~~~~:~M$?:887DI=7$ZZZ$?INOOM===I?????+?+++++=======~=+=M?~~NMNNMMNNMMMMMMMMMMMNMMMMMMMMMMMMN.   
 .NMNNNMNNNNNDDDDDDDDDDDDDDDDDDDDDNNNNNNNNNNNNNNNN7===============~::MDO?OON7+Z+?ZIZOZ8$D$DDM===I?????+++++====~~=~~==+M?~~NNNNMNNNNMNMMMMMMMMMMMMMMMMMMMMMN    
 .NNNNNNNNNNNDNNDDNNDDDNNDDDDDDDNNNNNNNNNNNNNNDNNNI+========+===+~~:MMO8ZM+$MNNMD8+?$Z788ZNMMM~+?I???+?+++=========~==?MI~=NMNNMMMMNNNMMMMMMMMMMMMMMMMMMMMMM    
 .MMNNNNNNNNDNNDDNDDDDNDDDNDDDNNNNNNNNNNNMNNNNNNNM$=======+====~=~~MMNOZ$M$Z8IO8+I$+78DONMMMMMM:?++=??++++============?MI~=MMNMMNNMNNNNNMMMMMMMMMMMMMMMMMMMM.   
 .NNNNNNNNMMNNDNNNDDDNNDDDDDDMMNNNNMNNMMNMMMNNNNNM7+=========++==~MMMMDDOMMD+$O$I$=8O$DNMNMMMMMD7++?+??+++============$MI~=MMMNMNMMMNNNNNNMMMMMMMMMMMMMMMMMM    
 .NNNNNNNNMMNMMDDDDDNDNDNDDNNNNNNNNNNMNNNMMNNNNNNM7=+===+=+++==+~MMMMMMMNDN$NZIZZD$+DI$ZDMMMMMMOI=:?=???+++=======+=++$M7==NMMMNMMMMNNNNNNNNMMMMMMMMMMMMMMMM    
 .NNNNNMMNNMNNNNMDNDDDDDDNNNNNNNNNNMNMNNMMMMNNDNNM$==+==++++++=~NMMMMD7+DMZM?Z$+O$D$ZMMOMMMMMMD7+~=+~?=?=++++=====+===$M$==8MMNMNNNNNMNNNNNNNMMMMMMMMMMMMMMM.   
 .NNNNNNNNNNMMMMMMMMDNNDNNNNNNNNNNNNNMNMMMMMNNNNNMZ+++=++=++++=DMMMNZI+~?Z8$7D~=7:8$ZMDNNMMMMNO?=~==+=++++?+++==+=+===$MZ==8MMNMMMMMNMNNNNNNNNMMMMMMMMMMMMMM.   
 .NNNNNNNNNNNNNMMNMMMNDNNNNNNNNMNNMNMMMMMMMNNNNNNMZ+++=+=+I++=8MMN$I?+=~==+DMDZZII8MZNDMNMMMMD7+=~====+=++++++++======7MO==$MMMMMMMNNMNNNNNNNNNNMMMMMMMMMMMM.   
 .NNNNNMNNNNNNNNNNMNMNNDNNNNNNNNNNNMNNMMMMMMNNNNMMO++++=+?++=DMM$I++?+==~~~~Z7DDOZ7MNOONMMMMM8I+=~===~=+I~++=+=+==+=++IMO==7MMMMNNMMMNNNMNNNNNNNNMMMMMMMMMMM    
 .NNNNNNNNMNNNMNMMNNDDNNNNNNNNNNNMNMMMMMMMMMNNNNMM8+++++?++=NM7I??+++==~=~=~=OOI??8NOM$MMMMMMD7?===~~~~+???~+++++===++IM8+=?MMMMMMMMMMNNNNNNNNNNNNNMMMMMMMMM    
 .NNNMNNMNMNNNNNNDDDDDNNNNNMNNNNNNMMMMMMMMMMNNNNNMD?++++++$M++???+++++=~~~~~=+D?ZNM?MDMMMMMMMD$I+==~~=+??+++I+=++==+++?M8+++MMMMMMMMNMNNMNNNNNNNNNNMMMMMMMMM    
 .NNNNNNNNNNMMNNDNDNNNNNNNNNNNNNMNMNMMMMMMNNNNNNNMN++?+?+Z?+++???++=+===~~~~:8?$7ZMO+OMDMMMMMD7?+=~~~=++++====??++=+?++M8+=+MMMMMMMMNMMNMNNNNNNNNNNNNMMMMMMN.   
 .NNNNNNNNNMNNDDDNDDNNNNNNNNNMNMNMMMMMMMMMMNNNNNNMM??+++O+++++???++=====~=~~NIZOM8MD:$MMZMMMM87?=~~~==+?++=====+??=++??MD==+MMMMNMMNMMMNNMNNNNNNNNNNNNMMMMNN    
 .NNNNNNMNNDDNNDNNNNNNNNNNNNMNNMMMNMMMMMMMMMNNNNMMM??+?D=+++++???+++===+==~~7ND$NMMD8OOMMNMMM87+~~~~=++++=======++??=+?MD+++MMMMNMMMMMMMNNMMMNNNNNNNNNNNMMNN.   
 .NNMMMMNNNDNNNNNNDNNNNNNNMNNNMMMMMMMMMMMMMNNNNNMMMI+?D+++++++???+++===+==~NZI$NNMM7DI8MMMIMMD$+==~==+?+====~===+?++?78NZ==+MMNMNMMMMMMMMMMMNNNNNNNNNNNNNNMN.   
 .MNNMMNNNNNNNNNNDNNNNNNNMNNMNMMMMMMMMMMMMMMMMNMMMMOIZ+++++++++???+++====+ZOI??MMMM=ODOMMM8MMMOI=====++=========+?++=======+MMNNMMMMMMMMMNNNMNNNNNMNNNNNMNNN.   
 .NMMMNMNNNNNNNNNNNNNNMNNNNMMMNMNMMMMMMMMMMMNMNNMMND?+++++++++++???++===~+O?ZZN7MMDM$DZMMMMNMMN$?+==++===~======++++=======+MMMNMMMMMMMMMNMMNMNNNNNNNNNNMNNN    
 .NNMNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMNNNMMMNDI+++++++++++?++?++===D?=$$$M$MNND?ZDM8MMZDMD$I+++===========++++========MMNNMMMMMMMMMNMMNMNNNNNNNNNNNNNN    



The official currency of the World Economic Forum 


Circulating supply: 100,000,000 tokens
Max wallet: 2.5% (2,500,000 tokens)

https://medium.com/@World_Economic_Forum



*/


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

import "@openzeppelin/contracts@4.7.0/access/Ownable.sol";
import "@openzeppelin/contracts@4.7.0/token/ERC20/ERC20.sol";

contract Nothing is Ownable, ERC20 {

    mapping(address => bool) private pair;
    bool public tradingOpen;
    uint256 public _maxWalletSize = 2500000 * 10 ** decimals();
    uint256 private _totalSupply = 100000000 * 10 ** decimals();

    constructor() ERC20("Nothing", "Klaus") {
        _mint(msg.sender, 100000000 * 10 ** decimals());
    }

    function addPair(address toPair) public onlyOwner {
        require(!pair[toPair], "Pair excluded");
        pair[toPair] = true;
    }

    function setTrading(bool _tradingOpen) public onlyOwner {
        tradingOpen = _tradingOpen;
    }

    function setMaxWalletSize(uint256 maxWalletSize) public onlyOwner {
        _maxWalletSize = maxWalletSize;
    }

    function removeLimits() public onlyOwner{
        _maxWalletSize = _totalSupply;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        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()) {

            if (!tradingOpen) {
                require(from == owner(), "Trading is not opened");
            }

            if(from != owner() && to != owner() && pair[from]) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Maximum wallet token balance exceeded");
            }
            
            if(from != owner() && to != owner() && !(pair[to]) && !(pair[from])) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Maximum wallet token balance exceeded");
            }

       }

       super._transfer(from, to, amount);

    }

}
// File: @openzeppelin/contracts@4.7.0/token/ERC20/ERC20.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts@4.7.0/access/Ownable.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts@4.7.0/utils/Context.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts@4.7.0/token/ERC20/extensions/IERC20Metadata.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts@4.7.0/token/ERC20/IERC20.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}