library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}
/**
 *      _____            _    _            
 *     / ____|          | |  (_)           
 *    | |     ___   ___ | | ___  ___       
 *    | |    / _ \ / _ \| |/ / |/ _ \      
 *    | |___| (_) | (_) |   <| |  __/      
 *     \_____\___/ \___/|_|\_\_|\___|      
 *    |  \/  |               | |           
 *    | \  / | ___  _ __  ___| |_ ___ _ __ 
 *    | |\/| |/ _ \| '_ \/ __| __/ _ \ '__|
 *    | |  | | (_) | | | \__ \ ||  __/ |   
 *    |_|__|_|\___/|_| |_|___/\__\___|_|   
 *    |  ____(_)                           
 *    | |__   _ _ __   __ _ _ __   ___ ___ 
 *    |  __| | | '_ \ / _` | '_ \ / __/ _ \
 *    | |    | | | | | (_| | | | | (_|  __/
 *    |_|    |_|_| |_|\__,_|_| |_|\___\___|
 *                                      
 *
 *                .---. .---. 
 *               :     : o   :    me want cookie!
 *           _..-:   o :     :-.._    /
 *       .-''  '  `---' `---' "   ``-.    
 *     .'   "   '  "  .    "  . '  "  `.  
 *    :   '.---.,,.,...,.,.,.,..---.  ' ;
 *    `. " `.                     .' " .'
 *     `.  '`.                   .' ' .'
 *      `.    `-._           _.-' "  .'  .----.
 *        `. "    '"--...--"'  . ' .'  .'  o   `.
 *        .'`-._'    " .     " _.-'`. :       o  :
 *      .'      ```--.....--'''    ' `:_ o       :
 *    .'    "     '         "     "   ; `.;";";";'
 *   ;         '       "       '     . ; .' ; ; ;
 *  ;     '         '       '   "    .'      .-'
 *  '  "     "   '      "           "    _.-'
 *    https://cookiemonster.finance/
 **/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
  if (a == 0) {
    return 0;
  }
  uint256 c = a * b;
  assert(c / a == b);
  return c;
}

/**
 * @dev Multiplies two numbers, throws on overflow.
 */