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