#     #  ###  #     #     #           ######   #        #######  #     #  
##    #   #   ##    #    # #          #     #  #        #     #  ##   ##  
# #   #   #   # #   #   #   #         #     #  #        #     #  # # # #  
#  #  #   #   #  #  #  #     #        ######   #        #     #  #  #  #  
#   # #   #   #   # #  #######        #     #  #        #     #  #     #  
#    ##   #   #    ##  #     #        #     #  #        #     #  #     #  
#     #  ###  #     #  #     #        ######   #######  #######  #     #