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