#include<iostream>
#include<complex>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstdio>

#define EPS (1e-10)
#define EQ(a,b) (abs((a)-(b)) < EPS)
#define fs first
#define sc second
#define pb push_back
#define sz size()
#define FOR(i,a,b) for(int i=(int)(a);i<(int)(b);i++)

using namespace std;

typedef complex<double> P;
typedef pair<P,P> L;
typedef vector<P> Poly;
typedef pair<P,double> C;

const double PI = acos(-1);

namespace std{
  bool operator<(const P &a,const P &b){
    return real(a)==real(b)?imag(a)<imag(b):real(a)<real(b);
  }
}

//for vector
P unit(P p){return p / abs(p);}  
pair<P,P> norm(P p){return make_pair(p*P(0,1),p*P(0,-1));}
double dot(P x,P y){return real(conj(x)*y);}
double cross(P x,P y){return imag(conj(x)*y);}

P rotate(P v,double s){
  return P(real(v)*cos(s)+imag(v)*sin(s),imag(v)*cos(s)-real(v)*sin(s));
}

//for triangle

//return seta A
double arg(P a,P b,P c){return acos(dot(b-a,c-a)/(abs(b-a)*abs(c-a)));}
double arg(double a,double b,double c){return acos( (b*b+c*c-a*a)/(2*b*c) );}

//for line(segment)
int ccw(P a,P b,P c){
  b -= a;c -= a;
  if (cross(b,c)>EPS) return 1;   //counter clockwise
  if (cross(b,c)<-EPS) return -1; //clockwise
  if (dot(b, c)<-EPS) return 2;   //c--a--b on line
  if (abs(b)<abs(c)) return -2;   //a--b--c on line
  return 0;                       //on segment
}

bool orth(L a,L b){return abs(dot(a.fs-a.sc,b.fs-b.sc))<EPS;}
bool para(L a,L b){return abs(cross(a.fs-a.sc,b.fs-b.sc))<EPS;}

double line_dis(L a,P x){return abs(cross(a.sc-a.fs,x-a.fs))/abs(a.sc-a.fs);}

P line_cp(L a,L b){
  return a.fs+(a.sc-a.fs)*cross(b.sc-b.fs,b.fs-a.fs)/cross(b.sc-b.fs,a.sc-a.fs);
}

double seg_dis(L a,P x){
  if(dot(a.sc-a.fs,x-a.fs)<EPS)return abs(x-a.fs);
  if(dot(a.fs-a.sc,x-a.sc)<EPS)return abs(x-a.sc);
  return abs(cross(a.sc-a.fs,x-a.fs))/abs(a.sc-a.fs);
}

bool is_cp(L a,L b){
  if(ccw(a.fs,a.sc,b.fs)*ccw(a.fs,a.sc,b.sc)<=0)
    if(ccw(b.fs,b.sc,a.fs)*ccw(b.fs,b.sc,a.sc)<=0)return true;
  return false;
}
P seg_cp(L a,L b){
  double d = abs(cross(b.sc-b.fs,a.fs-b.fs));
  return a.fs + (a.sc-a.fs)*( d /(d * abs(cross(b.sc-b.fs,a.sc-b.fs))) );
}
//for circle
bool in_cir(C c,P x){return (abs(x-c.fs) +EPS < c.sc);}
bool on_cir(C c,P x){return EQ(abs(x-c.fs),c.sc);}

vector<L> adj_line(C c,P p){
  vector<L> res;
  if(in_cir(c,p))return res;
  if(on_cir(c,p)){
    pair<P,P> n = norm(c.fs-p);
    res.pb(L(n.fs+p,p));
    return res;
  }
  double x,y,z;
  x = c.sc;
  z = abs(c.fs-p);
  y = sqrt(z*z-x*x);
  double s = arg(y,x,z);
  P v = unit(p-c.fs)*c.sc;

  res.pb(L(rotate(v,s)+c.fs,p));
  res.pb(L(rotate(v,-s)+c.fs,p));
  return res;
}

vector<L> common_adj_line(C a,C b){
  vector<L> res;
  if(a.sc+EPS<b.sc)return common_adj_line(b,a);
  if(EQ(real(a.fs),real(b.fs)) && EQ(imag(a.fs),imag(b.fs)) && EQ(a.sc,b.sc))return res;

  P pos = ((b.fs-a.fs)*a.sc/(a.sc+b.sc))+a.fs;
  if(!in_cir(a,pos))res = adj_line(a,pos);

  if(EQ(a.sc,b.sc)){
    pair<P,P> n = norm(unit(b.fs-a.fs)*a.sc);
    res.pb(L(a.fs+n.fs,b.fs+n.fs));
    res.pb(L(a.fs+n.sc,b.fs+n.sc)); 
  }else{
    double c = abs(b.fs-a.fs);
    pos = (unit(b.fs-a.fs)*( (a.sc*c)/(a.sc-b.sc) ))+a.fs;
    if(!in_cir(a,pos)){
      vector<L> tmp = adj_line(a,pos);
      FOR(i,0,tmp.sz)res.pb(tmp[i]);
    }
  }
  return res;
}

int main(){
  int n;
  double x[50],y[50],r[50],m[50];
  C c[50];

  while(scanf("%d",&n) && n){
    FOR(i,0,n){
      scanf("%lf %lf %lf %lf",&x[i],&y[i],&r[i],&m[i]);
      c[i] = C(P(x[i],y[i]),r[i]);
    }

    if(n==1){
      printf("1\n");
      continue;
    }
    int ans = 0;

    FOR(i,0,n){
      FOR(j,i+1,n){
	vector<L> x,l = common_adj_line(c[i],c[j]);
	c[i].sc += m[i];
	x = common_adj_line(c[i],c[j]);
	FOR(k,0,x.sz)l.pb(x[k]);
	c[j].sc += m[j];
	x = common_adj_line(c[i],c[j]);
	FOR(k,0,x.sz)l.pb(x[k]);
	c[i].sc -= m[i];
	x = common_adj_line(c[i],c[j]);
	FOR(k,0,x.sz)l.pb(x[k]);
	c[j].sc -= m[j];

	FOR(k,0,l.sz){
	  int tmp = 0;
	  FOR(h,0,n){
	    double dis = line_dis(l[k],c[h].fs);
	    if(c[h].sc < dis+EPS && dis < c[h].sc+m[h]+EPS)tmp++;
	  }
	  ans = max(ans,tmp);
	}
      }
    }
    printf("%d\n",ans);
  }
}

Measured memory_bytes: 0