//*******************************************
//*******************************************
//********** GET CLIENT IP ADDRESS **********
//*******************************************
//*******************************************
function GetClientIpAddress()
{
  //Cloudflare real client IP header
  if(!empty($_SERVER["HTTP_CF_CONNECTING_IP"]))
  {
    return $_SERVER["HTTP_CF_CONNECTING_IP"];
  }

  //Generic reverse proxy header (first IP in list)
  if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
  {
    $Parts = explode(",", $_SERVER["HTTP_X_FORWARDED_FOR"]);
    $Ip    = trim($Parts[0]);
    if(filter_var($Ip, FILTER_VALIDATE_IP))
    {
      return $Ip;
    }
  }

  //Fallback: direct connection
  if(!empty($_SERVER["REMOTE_ADDR"]) && filter_var($_SERVER["REMOTE_ADDR"], FILTER_VALIDATE_IP))
  {
    return $_SERVER["REMOTE_ADDR"];
  }

  return NULL;
}