		//base64 encode
		var b64s='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
		function s2r(t) 
		{
		 var a, c, n;
		 var r='', l=0, s=0;
		 var tl=t.length;
		
		 for(n=0; n<tl; n++)
		 {
		  c=t.charCodeAt(n);
		  if(s == 0)
		  {
		   r+=b64s.charAt((c>>2)&63);
		   a=(c&3)<<4;
		  }
		  else if(s==1)
		  {
		   r+=b64s.charAt((a|(c>>4)&15));
		   a=(c&15)<<2;
		  }
		  else if(s==2)
		  {
		   r+=b64s.charAt(a|((c>>6)&3));
		   l+=1;
		   if((l%60)==0) r+="\n";
		   r+=b64s.charAt(c&63);
		  }
		  l+=1;
		  if((l%60)==0) r+="\n";
		
		  s+=1;
		  if(s==3) s=0;  
		 }
		 if(s>0)
		 {
		  r+=b64s.charAt(a);
		  l+=1;
		  if((l%60)==0) r+="\n";
		  r+='=';
		  l+=1;
		 }
		 if(s==1)
		 {
		  if((l%60)==0) r+="\n";
		  r+='=';
		 }
		
		 return r;
		}
		
		//base64 decoding
		function r2s(t) 
		{
		 var c, n;
		 var r='', s=0, a=0;
		 var tl=t.length;
		
		 for(n=0; n<tl; n++)
		 {
		  c=b64s.indexOf(t.charAt(n));
		  if(c >= 0)
		  {
		   if(s) r+=String.fromCharCode(a | (c>>(6-s))&255);
		   s=(s+2)&7;
		   a=(c<<s)&255;
		  }
		 }
		 return r;
		}

