dP     dP           dP dP              .d888888  .d88888b   a88888b. dP dP 
88     88           88 88             d8'    88  88.    "' d8'   `88 88 88 
88aaaaa88a .d8888b. 88 88 .d8888b.    88aaaaa88a `Y88888b. 88        88 88 
88     88  88ooood8 88 88 88'  `88    88     88        `8b 88        88 88 
88     88  88.  ... 88 88 88.  .88    88     88  d8'   .8P Y8.   .88 88 88 
dP     dP  `88888P' dP dP `88888P'    88     88   Y88888P   Y88888P' dP dP 
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo