#include "snd.h"

/* TODO:
   digital line in tested in Linux and SGI new AL tested in general
   smoothed amp sliders(?)
   LINUX: monitor output in duplex case, no mic panel if mic and line in mixed before adc (how to tell?)
   clicks upon swap or whatever
   on-going output sonogram?
   CD input (does this actually make any sense?)
   Sun audio implement/tested
   */

#if HAVE_OSS
  static int have_separate_line_and_mic_inputs = 0;
#else
  static int have_separate_line_and_mic_inputs = 1;
#endif
/* can we read line in channels independent of (and at the same time as) mic input channels?
 * on the SGI this is handled via 4 channel input mode.
 * in Linux, we hope there's a "mixer" on the soundcard before the ADC which we assume is 2 channel at best
 */


/* -------------------------------- ROTATE TEXT -------------------------------- */
/* rotate and scale text */

static float degrees_to_radians(float x) {return(x * 3.14159265 / 180.0);}

#if (!(HAVE_XPM))
static Pixmap transform_text (Widget w, char *str, XFontStruct *font, float angle_in_degrees, 
			      float xscl, float yscl, int *nw, int *nh, Pixel bg, Pixel fg)
{
  /* scale str in font font by xscl and yscl, then rotate clockwise by angle_in_degrees degrees */
  /* (i.e. 45 points text south-east), new bounding box (text centered in it) returned in nw and nh */
  /* returned pixmap must be freed (if at all) by the caller */
  /* bg = background color, fg = foreground (text) color) */
  float matrix[4];
  float angle_in_radians;
  XImage *before,*after;
  Pixmap pix,rotpix;
  unsigned int width,height,depth,nwidth,nheight,x,y,nx,ny,tx,ty;
  int inx,iny;
  GC erase_gc,draw_gc;
  XGCValues v;
  char *data;
  unsigned long px;
  Display *dp;
  Drawable wn;
  Visual *vis;
  int scr;
  int bx0,bx1,by0,by1,b;
  int i,j;

  /* set up transformation matrix */
  angle_in_radians = degrees_to_radians(angle_in_degrees);
  matrix[0] = cos(angle_in_radians) * xscl;
  matrix[1] = sin(angle_in_radians) * xscl;
  matrix[2] = -sin(angle_in_radians) * yscl;
  matrix[3] = cos(angle_in_radians) * yscl;
  
  /* get the usual X info */
  dp = XtDisplay(w);
  wn = XtWindow(w);
  scr = DefaultScreen(dp);
  vis = DefaultVisual(dp,scr);

  v.foreground = bg;
  v.background = bg;
  erase_gc = XtGetGC(w,GCForeground | GCBackground,&v);

  XtVaGetValues(w,XmNdepth,&depth,NULL);
  v.background = bg;
  v.foreground = fg;
  draw_gc = XtGetGC(w,GCForeground | GCBackground,&v);

  /* find extent of original text, expand out to byte boundaries */
  XSetFont(dp,draw_gc,font->fid);
  width = XTextWidth(font,str,strlen(str));
  height = (font->ascent+font->descent);
  if (width%8) width = 8*(1 + (int)(width/8));
  if (height%8) height = 8*(1+(int)(height/8));

  /* get bounding box of transformed text */
  bx0=0; bx1=0; by0=0; by1=0;
  b=width*matrix[0];
  if (b<0) bx0=b; else bx1=b;
  b=height*matrix[2];
  if (b<0) bx0+=b; else bx1+=b;
  b=width*matrix[1];
  if (b<0) by0=b; else by1=b;
  b=height*matrix[3];
  if (b<0) by0+=b; else by1+=b;
  
  /* set translation vector so we're centered in the resultant pixmap */
  if (bx0<0) tx=-bx0; else tx=0;
  if (by0<0) ty=-by0; else ty=0;
  nx = bx1-bx0;
  ny = by1-by0;

  /* expand result bounds to byte boundaries */
  if (nx%8) nwidth = 8*(1+(int)(nx/8)); else nwidth = nx;
  if (ny%8) nheight = 8*(1+(int)(ny/8)); else nheight = ny;
  (*nw) = nwidth;
  (*nh) = nheight;

  /* create pixmaps, fill with background color, write string to pix */
  pix = XCreatePixmap(dp,wn,width,height,depth);
  rotpix= XCreatePixmap(dp,wn,nwidth,nheight,depth);
  XFillRectangle(dp,pix,erase_gc,0,0,width,height);
  XFillRectangle(dp,rotpix,erase_gc,0,0,nwidth,nheight);
  XDrawImageString(dp,pix,draw_gc,0,height,str,strlen(str));

  /* dump pixmap bits into an "image", image data will be freed automatically later */
  data = (char *)calloc(width*height,sizeof(char));
  before = XCreateImage(dp,vis,depth,XYPixmap,0,data,width,height,8,0);
  XGetSubImage(dp,pix,0,0,width,height,AllPlanes,XYPixmap,before,0,0);
  data = (char *)calloc(nwidth*nheight,sizeof(char));
  after = XCreateImage(dp,vis,depth,XYPixmap,0,data,nwidth,nheight,8,0);

  /* clear background of result image */
  for (x=0;x<nwidth;x++) {for (y=0;y<nheight;y++) XPutPixel(after,x,y,bg);}

  /* write transformed pixels to result image */
  for (x=0;x<width;x++)
    {
      for (y=0;y<height;y++)
	{
	  px = XGetPixel(before,x,y);
	  if (px != bg)
	    {
	      bx0 = xscl; if (bx0 == 0) bx0=1;  /* draw full lines if possible (i.e. fill in scaled gaps) */
	      by0 = yscl; if (by0 == 0) by0=1;
	      for (i=0;i<bx0;i++)
		{
		  for (j=0;j<by0;j++)
		    {
		      inx = tx + round((x+(float)i/xscl)*matrix[0] + (y+(float)j/yscl)*matrix[2]);  if (inx<0) inx=0; if (inx>=nwidth) inx=nwidth-1;
		      iny = ty + round((x+(float)i/xscl)*matrix[1] + (y+(float)j/yscl)*matrix[3]);  if (iny<0) iny=0; if (iny>=nheight) iny=nheight-1;
		      XPutPixel(after,inx,iny,px);
		    }
		}
	    }
	}
    }

  /* dump image into result pixmap (needed for later display) */
  XPutImage(dp,rotpix,draw_gc,after,0,0,0,0,nwidth,nheight);

  /* cleanup */
  XDestroyImage(before);  /* frees data as well, or so claims the documentation */
  XDestroyImage(after);
  XFreePixmap(dp,pix);
  return(rotpix);
}
#endif


/* -------------------------------- ICONS -------------------------------- */

static unsigned char speaker_bits[] = {
   0x00, 0x07, 0xc0, 0x04, 0x30, 0x04, 0x0e, 0x04, 0x06, 0x04, 0x06, 0x04,
   0x06, 0x04, 0x06, 0x04, 0x0e, 0x04, 0x30, 0x04, 0xc0, 0x04, 0x00, 0x07};

static unsigned char micer_bits[] = {
   0xf0, 0x00, 0x58, 0x01, 0xa8, 0x01, 0xf8, 0x01, 0x08, 0x01, 0x0f, 0x0f,
   0x09, 0x09, 0x09, 0x09, 0xf9, 0x09, 0xf1, 0x08, 0x61, 0x08, 0xff, 0x0f};

static unsigned char liner_bits[] = {
   0x00, 0x04, 0x40, 0x02, 0x20, 0x02, 0x24, 0x01, 0x12, 0x01, 0xff, 0x0f,
   0x12, 0x01, 0x24, 0x01, 0x20, 0x02, 0x40, 0x02, 0x00, 0x04, 0x00, 0x00};

static Pixmap speaker,liner,micer;

static void make_record_icons(Widget w, snd_state *ss)
{
  XGCValues v;
  GC gc;
  int depth;
  XtVaGetValues(w,XmNforeground,&v.foreground,XmNbackground,&v.background,XmNdepth,&depth,NULL);
  gc = XtGetGC(w,GCForeground | GCBackground,&v);
  speaker = make_pixmap(ss,speaker_bits,12,12,depth,gc);
  micer = make_pixmap(ss,micer_bits,12,12,depth,gc);
  liner = make_pixmap(ss,liner_bits,12,12,depth,gc);
}


/* -------------------------------- VU METER -------------------------------- */

#define VU_OFF 0
#define VU_ON 1
#define VU_CLIPPED 2
#define CLIPPED_TIME 10
#define CLIPPED_TRIGGER 0.99
#define VU_NEEDLE_SPEED 0.25
#define VU_BUBBLE_SPEED 0.025
#define VU_BUBBLE_SIZE (15*64)

typedef struct {
  Widget meter;
  Display *dp;
  Drawable wn;
  GC gc;
  int scr;
  int on_off;
  int clipped;
  float current_val,last_val;
  float red_deg;
  int light_x, light_y, center_x, center_y;
  void *rec;     /* main dialog backpointer */
  snd_state *ss;
} VU;

static int meter_allocated = 0;
static Pixmap off_label;
static Pixmap on_label;
static Pixmap clip_label;

#define LIGHT_X 120
#define LIGHT_Y 100
#define CENTER_X 120
#define CENTER_Y 160
#define VU_COLORS 11
#define VU_NUMBERS 15

#if HAVE_XPM

/* major bug in earlier versions of X involving XImages causing all kinds of errors,
 * so we save these three images as Xpm data files, and read them back in in early
 * linuces -- this kludgery is not necessary in up-to-date versions of Linux.
 */

static void allocate_meter(Widget w, XFontStruct *label_font, snd_state *ss, Pixel red);
/* placed at end of file to get it out of our way */

#else

static void allocate_meter(Widget w, XFontStruct *label_font, snd_state *ss, Pixel red)
{
  /* we have to create the vu meter labels (for on and off states) as static Pixmaps
   * because we want the vu needle moving as a sort of cursor across a multi-colored
   * background (the glow of the lamp), but can't depend on local colormaps (in Linux
   * I get only one pseudocolor map, so any change via XCreateColormap and friends
   * screws up the entire screen, and on the SGI, Motif's allocations appear to
   * get screwed up, although it affects only the Snd window).  Since recalculating
   * the entire label causes the label to flash, and since we want this thing to
   * run during real-time recording, we draw and save the entire vu label as a huge Pixmap.
   * It really ought to be easier in X to allocate specific Pixels so that XOR will
   * work in a predictable manner!
   */
  int scr;
  Display *dp;
  Drawable wn;
  Colormap cmap;
  XColor tmp_color;
  int i,j,k;
  Pixel white,black;
  unsigned int depth;
  int band;
  XPoint pts[16];
  int x0,y0,x1,y1;
  float rdeg;
  XGCValues gv;
  GC gc;

  Pixel yellows[VU_COLORS];
  Pixel reds[VU_COLORS];
  Pixmap numbers[VU_NUMBERS];
  int wids[VU_NUMBERS],hgts[VU_NUMBERS];
  int yellow_vals[] = {0,16,32,64,96,128,160,175,185,200,210,220,230,240};

  float BAND_X;
  float BAND_Y;
  BAND_X = 2.5;
  BAND_Y = 3;

  if (!meter_allocated)
    {
      meter_allocated = 1;
      dp = XtDisplay(w);
      wn = XtWindow(w);
      scr = DefaultScreen(dp);
      cmap = DefaultColormap(dp,scr);
      black = BlackPixel(dp,scr);
      white = WhitePixel(dp,scr);
      XtVaGetValues(w,XmNdepth,&depth,NULL);
      tmp_color.flags = DoRed | DoGreen | DoBlue;
      tmp_color.red = (unsigned short)65535;
      for (i=0;i<VU_COLORS;i++)
	{
	  tmp_color.blue = (unsigned short)(256*yellow_vals[i]);
	  tmp_color.green = (unsigned short)(256*230 + 26*yellow_vals[i]);
	  XAllocColor(dp,cmap,&tmp_color);
	  yellows[i] = tmp_color.pixel;
	}
      for (i=0;i<VU_COLORS;i++)
	{
	  tmp_color.blue = (unsigned short)(128*yellow_vals[i]);
	  tmp_color.green = (unsigned short)(128*yellow_vals[i]);
	  XAllocColor(dp,cmap,&tmp_color);
	  reds[i] = tmp_color.pixel;
	}
      /* need two versions of these, one with white bg and black fg for "off" state, then... */
      j=0;
      numbers[j] = transform_text(w,"0.0",label_font,-40.0,1.0,1.0,&wids[j],&hgts[j],yellows[9],red); j++;
      numbers[j] = transform_text(w,"0.25",label_font,-25.0,1.0,1.0,&wids[j],&hgts[j],yellows[7],red); j++;
      numbers[j] = transform_text(w,"0.5",label_font,0.0,1.0,1.0,&wids[j],&hgts[j],yellows[7],red); j++;
      numbers[j] = transform_text(w,"0.75",label_font,23.0,1.0,1.0,&wids[j],&hgts[j],yellows[7],red); j++;
      numbers[j] = transform_text(w,"1.0",label_font,40.0,1.0,1.0,&wids[j],&hgts[j],yellows[9],red); j++;
      numbers[j] = transform_text(w,"0.0",label_font,-40.0,1.0,1.0,&wids[j],&hgts[j],white,black); j++;
      numbers[j] = transform_text(w,"0.25",label_font,-25.0,1.0,1.0,&wids[j],&hgts[j],white,black); j++;
      numbers[j] = transform_text(w,"0.5",label_font,0.0,1.0,1.0,&wids[j],&hgts[j],white,black); j++;
      numbers[j] = transform_text(w,"0.75",label_font,23.0,1.0,1.0,&wids[j],&hgts[j],white,black); j++;
      numbers[j] = transform_text(w,"1.0",label_font,40.0,1.0,1.0,&wids[j],&hgts[j],white,black); j++;
      numbers[j] = transform_text(w,"0.0",label_font,-40.0,1.0,1.0,&wids[j],&hgts[j],reds[9],black); j++;
      numbers[j] = transform_text(w,"0.25",label_font,-25.0,1.0,1.0,&wids[j],&hgts[j],reds[7],black); j++;
      numbers[j] = transform_text(w,"0.5",label_font,0.0,1.0,1.0,&wids[j],&hgts[j],reds[7],black); j++;
      numbers[j] = transform_text(w,"0.75",label_font,23.0,1.0,1.0,&wids[j],&hgts[j],reds[7],black); j++;
      numbers[j] = transform_text(w,"1.0",label_font,40.0,1.0,1.0,&wids[j],&hgts[j],reds[9],black); j++;
      
      XtVaGetValues(w,XmNforeground, &gv.foreground,XmNbackground, &gv.background,NULL);
      gc = XtGetGC(w, GCForeground | GCBackground, &gv);

      for (k=0;k<2;k++) 
	{
	  band = 1;

	  if (k == 1)
	    {
	      clip_label = XCreatePixmap(dp,wn,CENTER_X*2,CENTER_Y,depth);
	      XSetForeground(dp,gc,reds[0]);	    
	    }
	  else 
	    {
	      on_label = XCreatePixmap(dp,wn,CENTER_X*2,CENTER_Y,depth);
	      XSetForeground(dp,gc,yellows[2]);
	    }
	  /* initialize the sequence of nested polygons */
	  pts[0].x = LIGHT_X - BAND_X;
	  pts[0].y = LIGHT_Y;
	  pts[1].x = pts[0].x;
	  pts[1].y = pts[0].y - BAND_Y + 1;
	  pts[2].x = pts[1].x + 1;
	  pts[2].y = pts[1].y - 1;
	  pts[3].x = pts[2].x + BAND_X * 2 - 2;
	  pts[3].y = pts[2].y;
	  pts[4].x = pts[3].x + 2;
	  pts[4].y = pts[3].y + 1;
	  pts[5].x = pts[4].x;
	  pts[5].y = pts[0].y;
	  pts[6].x = pts[0].x;
	  pts[6].y = pts[0].y;
	  if (k == 1)
	    XFillPolygon(dp,clip_label,gc,pts,7,Convex,CoordModeOrigin);
	  else XFillPolygon(dp,on_label,gc,pts,7,Convex,CoordModeOrigin);

	  for (i=1;i<VU_COLORS;i++)
	    {
	      band += i;
	      if (k == 1) 
		XSetForeground(dp,gc,reds[i]); 
	      else 
		{
		  if (i<2) XSetForeground(dp,gc,yellows[2]); else XSetForeground(dp,gc,yellows[i]);
		  /* why do the first two elements of this array return gray??? */
		}
	      pts[6].x = LIGHT_X + band*BAND_X;
	      pts[6].y = pts[5].y;
	      pts[7].x = pts[6].x;
	      pts[7].y = LIGHT_Y - band*(BAND_Y - 1);
	      pts[8].x = LIGHT_X + band*(BAND_X - 1);
	      pts[8].y = LIGHT_Y - band*BAND_Y;
	      pts[9].x = LIGHT_X - band*(BAND_X - 1);
	      pts[9].y = pts[8].y;
	      pts[10].x = LIGHT_X - band*BAND_X;
	      pts[10].y = LIGHT_Y - band*(BAND_Y - 1);
	      pts[11].x = pts[10].x;
	      pts[11].y = pts[6].y;
	      pts[12].x = pts[0].x;
	      pts[12].y = pts[0].y;
	      if (k == 1)
		XFillPolygon(dp,clip_label,gc,pts,13,Complex,CoordModeOrigin);
	      else XFillPolygon(dp,on_label,gc,pts,13,Complex,CoordModeOrigin);
	      for (j=0;j<6;j++) 
		{ 
		  /* set up initial portion of next polygon */
		  pts[j].x = pts[j+6].x;
		  pts[j].y = pts[j+6].y;
		}
	    }
	}

      off_label = XCreatePixmap(dp,wn,CENTER_X*2,CENTER_Y,depth);
      /* not on, so just display a white background */
      XSetForeground(dp,gc,white);
      XFillRectangle(dp,off_label,gc,0,0,CENTER_X*2,CENTER_Y);

      XSetForeground(dp,gc,black);
      /* draw the numbers */
      j=0;
      XCopyArea(dp,numbers[j],on_label,gc,0,0,wids[j],hgts[j],CENTER_X - 114,CENTER_Y - 116); j++;
      XCopyArea(dp,numbers[j],on_label,gc,0,0,wids[j],hgts[j],CENTER_X - 71, CENTER_Y - 147); j++;
      XCopyArea(dp,numbers[j],on_label,gc,0,0,wids[j],hgts[j],CENTER_X - 11, CENTER_Y - 153); j++;
      XCopyArea(dp,numbers[j],on_label,gc,0,0,wids[j],hgts[j],CENTER_X + 42, CENTER_Y - 145); j++;
      XCopyArea(dp,numbers[j],on_label,gc,0,0,wids[j],hgts[j],CENTER_X + 88, CENTER_Y - 116); j++;

      j=5;
      XCopyArea(dp,numbers[j],off_label,gc,0,0,wids[j],hgts[j],CENTER_X - 114,CENTER_Y - 116); j++;
      XCopyArea(dp,numbers[j],off_label,gc,0,0,wids[j],hgts[j],CENTER_X - 71, CENTER_Y - 147); j++;
      XCopyArea(dp,numbers[j],off_label,gc,0,0,wids[j],hgts[j],CENTER_X - 11, CENTER_Y - 153); j++;
      XCopyArea(dp,numbers[j],off_label,gc,0,0,wids[j],hgts[j],CENTER_X + 42, CENTER_Y - 145); j++;
      XCopyArea(dp,numbers[j],off_label,gc,0,0,wids[j],hgts[j],CENTER_X + 88, CENTER_Y - 116);

      j=10;
      XCopyArea(dp,numbers[j],clip_label,gc,0,0,wids[j],hgts[j],CENTER_X - 114,CENTER_Y - 116); j++;
      XCopyArea(dp,numbers[j],clip_label,gc,0,0,wids[j],hgts[j],CENTER_X - 71, CENTER_Y - 147); j++;
      XCopyArea(dp,numbers[j],clip_label,gc,0,0,wids[j],hgts[j],CENTER_X - 11, CENTER_Y - 153); j++;
      XCopyArea(dp,numbers[j],clip_label,gc,0,0,wids[j],hgts[j],CENTER_X + 42, CENTER_Y - 145); j++;
      XCopyArea(dp,numbers[j],clip_label,gc,0,0,wids[j],hgts[j],CENTER_X + 88, CENTER_Y - 116);

      /* draw the arcs */
      XDrawArc(dp,on_label,gc,CENTER_X - 120,CENTER_Y - 120,240,240,45*64,90*64);
      XDrawArc(dp,on_label,gc,CENTER_X - 119,CENTER_Y - 120,239,239,45*64,89*64);
      XDrawArc(dp,on_label,gc,CENTER_X - 119,CENTER_Y - 119,239,239,45*64,89*64);
      XDrawArc(dp,on_label,gc,CENTER_X - 116,CENTER_Y - 116,232,232,45*64,90*64);

      XDrawArc(dp,off_label,gc,CENTER_X - 120,CENTER_Y - 120,240,240,45*64,90*64);
      XDrawArc(dp,off_label,gc,CENTER_X - 119,CENTER_Y - 120,239,239,45*64,89*64);
      XDrawArc(dp,off_label,gc,CENTER_X - 119,CENTER_Y - 119,239,239,45*64,89*64);
      XDrawArc(dp,off_label,gc,CENTER_X - 116,CENTER_Y - 116,232,232,45*64,90*64);

      XDrawArc(dp,clip_label,gc,CENTER_X - 120,CENTER_Y - 120,240,240,45*64,90*64);
      XDrawArc(dp,clip_label,gc,CENTER_X - 119,CENTER_Y - 120,239,239,45*64,89*64);
      XDrawArc(dp,clip_label,gc,CENTER_X - 119,CENTER_Y - 119,239,239,45*64,89*64);
      XDrawArc(dp,clip_label,gc,CENTER_X - 116,CENTER_Y - 116,232,232,45*64,90*64);

      /* draw the axis ticks */
      for (i=0;i<5;i++)
	{
	  rdeg = degrees_to_radians(45-i*22.5);
	  x0 = CENTER_X+120*sin(rdeg);
	  y0 = CENTER_Y-120*cos(rdeg);
	  x1 = CENTER_X+130*sin(rdeg);
	  y1 = CENTER_Y-130*cos(rdeg);
	  XDrawLine(dp,on_label,gc,x0,y0,x1,y1);
	  XDrawLine(dp,on_label,gc,x0+1,y0,x1+1,y1);
	  XDrawLine(dp,off_label,gc,x0,y0,x1,y1);
	  XDrawLine(dp,off_label,gc,x0+1,y0,x1+1,y1);
	  XDrawLine(dp,clip_label,gc,x0,y0,x1,y1);
	  XDrawLine(dp,clip_label,gc,x0+1,y0,x1+1,y1);
	  if (i<4)
	    {
	      for (j=1;j<6;j++)
		{
		  rdeg = degrees_to_radians(45-i*22.5-j*(90.0/20.0));
		  x0 = CENTER_X+120*sin(rdeg);
		  y0 = CENTER_Y-120*cos(rdeg);
		  x1 = CENTER_X+126*sin(rdeg);
		  y1 = CENTER_Y-126*cos(rdeg);
		  XDrawLine(dp,on_label,gc,x0,y0,x1,y1);
		  XDrawLine(dp,off_label,gc,x0,y0,x1,y1);
		  XDrawLine(dp,clip_label,gc,x0,y0,x1,y1);
		}
	    }
	}
      for (i=0;i<VU_NUMBERS;i++) XFreePixmap(dp,numbers[i]);
    }
#if 0
  /* here's how the label xpm files were created */
  /* the data was then transferred to this file and cleaned up by hand */
  XpmWriteFileFromPixmap(dp,"onlabel.xpm",on_label,NULL,NULL);  
  XpmWriteFileFromPixmap(dp,"offlabel.xpm",off_label,NULL,NULL);  
  XpmWriteFileFromPixmap(dp,"cliplabel.xpm",clip_label,NULL,NULL);
#endif
}
#endif

static void display_vu_meter(VU *vu)
{
  /* one size fits all, but at least we can move it around and copy it */
  float deg,rdeg,val;
  int nx0,nx1,ny0,ny1,redx,redy;
  Pixmap label;
  snd_state *ss;
  ss = vu->ss;
  if (vu->current_val > CLIPPED_TRIGGER) 
    {
      if (vu->on_off == VU_ON) 
	{
	  vu->on_off = VU_CLIPPED;
	  vu->clipped = CLIPPED_TIME * ((float)(ss->record_srate) / 22050.0);
	  /* might also change with record buffer size (RECORD_SIZE below)
	   * at 4096, we're getting updated here every 1024 samps (4 chans in always)
	   * which is fast enough to look smooth, except perhaps at 8kHz?
	   * so clipped_time == 10 gives us about a .5 sec flash
	   */
	}
    }
  if (vu->current_val > 1.0) vu->current_val = 1.0;
  switch (vu->on_off)
    {
    case VU_OFF: label = off_label; break;
    case VU_CLIPPED: 
      vu->clipped--; 
      if (vu->clipped <= 0) 
	{
	  label = on_label; 
	  vu->on_off = VU_ON;
	} 
      else label = clip_label; 
      break;
    case VU_ON: label = on_label; break;
    }
  XCopyArea(vu->dp,label,vu->wn,vu->gc,0,0,CENTER_X*2,CENTER_Y,vu->center_x - CENTER_X,vu->center_y - CENTER_Y);
  val = vu->current_val*VU_NEEDLE_SPEED + (vu->last_val*(1.0-VU_NEEDLE_SPEED));
  vu->last_val = val;
  deg = -45.0 + val*90.0;
  /* if (deg < -45.0) deg = -45.0; else if (deg > 45.0) deg = 45.0; */
  rdeg = degrees_to_radians(deg);
  nx0 = vu->center_x - (int)((float)(vu->center_y - vu->light_y) / tan(degrees_to_radians(deg+90)));
  ny0 = vu->light_y;
  nx1 = vu->center_x + 130*sin(rdeg);
  ny1 = vu->center_y - 130*cos(rdeg);
  XSetForeground(vu->dp,vu->gc,(ss->sgx)->black);
  XDrawLine(vu->dp,vu->wn,vu->gc,nx0,ny0,nx1,ny1);
  if (deg != 0.0)
    {
      if (vu->on_off == VU_OFF)
	XSetForeground(vu->dp,vu->gc,(ss->sgx)->scale);
      else
	if (vu->on_off == VU_CLIPPED)
	  XSetForeground(vu->dp,vu->gc,(ss->sgx)->text);
	else XSetForeground(vu->dp,vu->gc,(ss->sgx)->white);
      if (deg < 0.0)
	XDrawLine(vu->dp,vu->wn,vu->gc,nx0-1,ny0,nx1-1,ny1);
      else XDrawLine(vu->dp,vu->wn,vu->gc,nx0+1,ny0,nx1+1,ny1);
      XSetForeground(vu->dp,vu->gc,(ss->sgx)->black);
    }
  if (vu->on_off != VU_OFF)
    {
      if (vu->current_val > vu->red_deg) 
	vu->red_deg = vu->current_val;
      else vu->red_deg = vu->current_val*VU_BUBBLE_SPEED + (vu->red_deg*(1.0 - VU_BUBBLE_SPEED));
      XSetForeground(vu->dp,vu->gc,(ss->sgx)->red);
      redx = vu->red_deg * 90*64;
      if (redx<(VU_BUBBLE_SIZE)) redy=redx; else redy=VU_BUBBLE_SIZE;
      XDrawArc(vu->dp,vu->wn,vu->gc,vu->center_x - 117,vu->center_y - 117,234,234,135*64 - redx,redy);
      XDrawArc(vu->dp,vu->wn,vu->gc,vu->center_x - 118,vu->center_y - 118,236,236,135*64 - redx,redy);
      XDrawArc(vu->dp,vu->wn,vu->gc,vu->center_x - 119,vu->center_y - 119,238,238,135*64 - redx,redy);
      XSetForeground(vu->dp,vu->gc,(ss->sgx)->black);
    }
}

static void Meter_Display_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  display_vu_meter((VU *)clientData);
}

static VU *make_vu_meter(Widget meter, int light_x, int light_y, int center_x, int center_y, Pixel needle_color, void *rec, snd_state *ss)
{
  VU *vu;
  XGCValues gv;
  vu = (VU *)calloc(1,sizeof(VU));
  vu->meter = meter;
  XtVaGetValues(meter,XmNforeground, &gv.foreground,XmNbackground, &gv.background,NULL);
  vu->gc = XtGetGC(meter, GCForeground | GCBackground, &gv);
  vu->dp = XtDisplay(meter);
  vu->wn = XtWindow(meter);
  vu->scr = DefaultScreen(vu->dp);
  vu->on_off = VU_OFF;
  vu->current_val = 0.0;
  vu->last_val = 0.0;
  vu->clipped = 0;
  vu->light_x = light_x;
  vu->light_y = light_y;
  vu->center_x = center_x;
  vu->center_y = center_y;
  vu->rec = rec;
  vu->ss = ss;
  return(vu);
}

static void set_vu_val (VU *vu, float val) 
{
  vu->last_val = vu->current_val;
  vu->current_val = val;
  display_vu_meter(vu);
}


/* -------------------------------- AMP SLIDER CALLBACKS -------------------------------- */

static char *amp_labels[] = {"A->A:","B->B:","A->B:","B->A:","A->A:","B->B:","A->B:","B->A:","A:","B:"};

typedef struct {
  Widget label, number, slider;
  snd_state *ss;
  int last_amp;
  int which_amp; /* state relative, not rec->amps */
  float amp;
} AMP;

static char record_one[5]={'1',snd_string_decimal,'0','0','\0'};
static char record_zero[5]={'0',snd_string_decimal,'0','0','\0'};
static char amp_number_buffer[5]={'1',snd_string_decimal,'0','0','\0'};

#if 0
static void reset_amp_number(Widget w) {strcpy(amp_number_buffer,record_one); make_name_label(w,amp_number_buffer);}
#endif

#define RECORD_SCROLLBAR_MAX 300
#define RECORD_SCROLLBAR_MID 150
#define RECORD_SCROLLBAR_LINEAR_MAX 50
#define RECORD_SCROLLBAR_LINEAR_MULT 0.00365368
#define RECORD_SCROLLBAR_CHANGEOVER_VALUE 0.188
/* final low end portion is linear -- multiplier is (exp-value-at-linear-max) / linear_max */

static void record_amp_changed(AMP *ap, int val)
{
  char *sfs;
  snd_state *ss;
  ss = ap->ss;
  if (val == 0) 
    ap->amp = 0.0;
  else 
    {
      if (val < RECORD_SCROLLBAR_LINEAR_MAX)
	ap->amp = (float)val * RECORD_SCROLLBAR_LINEAR_MULT;
      else ap->amp = exp((float)(val-RECORD_SCROLLBAR_MID)/((float)RECORD_SCROLLBAR_MAX*.2));
    }
  sfs=prettyf(ap->amp,2);
  fill_number(sfs,amp_number_buffer);
  make_name_label(ap->number,amp_number_buffer);
  ss->record_amps[ap->which_amp] = ap->amp;
  free(sfs);
}

static int amp_to_slider(float val)
{
  /* reverse calc above */
  if (val <= 0.0) 
    return(0);
  else
    {
      if (val <= RECORD_SCROLLBAR_CHANGEOVER_VALUE)
	return(val / RECORD_SCROLLBAR_LINEAR_MULT);
      else return(RECORD_SCROLLBAR_MID + ((RECORD_SCROLLBAR_MAX * .2) * log(val)));
    }
}

static void Record_Amp_Click_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  XmPushButtonCallbackStruct *cb = (XmPushButtonCallbackStruct *)callData;
  AMP *ap = (AMP *)clientData;
  XButtonEvent *ev;
  int val;
  ev = (XButtonEvent *)(cb->event);
  if (ev->state & (snd_ControlMask | snd_MetaMask)) val = ap->last_amp; else val = RECORD_SCROLLBAR_MID;
  record_amp_changed(ap,val);
  XtVaSetValues(ap->slider,XmNvalue,val,NULL);
}

static void Record_Amp_Drag_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  record_amp_changed((AMP *)clientData,((XmScrollBarCallbackStruct *)callData)->value);
}

static void Record_Amp_ValueChanged_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  XmScrollBarCallbackStruct *cb = (XmScrollBarCallbackStruct *)callData;
  AMP *ap = (AMP *)clientData;
  ap->last_amp = cb->value;
  record_amp_changed(ap,cb->value);
}



/* -------------------------------- THE RECORDER -------------------------------- */

typedef struct {
  VU **meters;
  Widget *wids;
  int panes;
  snd_state *ss;
  int recording,line1,line2,mic1,mic2,out1,out2,in_digital; /* line1 et al are meter on/off button dependent */
  AMP **amps;
  Position *pane_sizes;
  float *maxes;
  int autoload;
  int **obufs;
  int out_chans,out_srate;
  int speaker1,speaker2,in_line1,in_line2,in_mic1,in_mic2;
} REC;

/* order matters here! */
enum {rec_dialog,rec_panes,

      line_pane,
      line_1_frame,line_2_frame,line_vu_1,line_vu_2,
        line_label,line_data,line_reset,line_sep,
          line_1_on,line_2_on,line_1_max,line_2_max,line_1_max_frame,line_2_max_frame,
        line_amp_sep,
          line_amp,line_amp_bb,line_amp_ab,line_amp_ba,
          line_amp_number,line_amp_number_bb,line_amp_number_ab,line_amp_number_ba,
          line_amp_slider,line_amp_slider_bb,line_amp_slider_ab,line_amp_slider_ba,
          line_in1_slider,line_in2_slider,line_in_sep,line_in_icon,

      mic_pane,
      mic_1_frame,mic_2_frame,mic_vu_1,mic_vu_2,
        mic_label,mic_data,mic_reset,mic_sep,
          mic_1_on,mic_2_on,mic_1_max,mic_2_max,mic_1_max_frame,mic_2_max_frame,
        mic_amp_sep,
          mic_amp,mic_amp_bb,mic_amp_ab,mic_amp_ba,
          mic_amp_number,mic_amp_number_bb,mic_amp_number_ab,mic_amp_number_ba,
          mic_amp_slider,mic_amp_slider_bb,mic_amp_slider_ab,mic_amp_slider_ba,
          mic_in1_slider,mic_in2_slider,mic_in_sep,mic_in_icon,

      out_pane,
      out_1_frame,out_2_frame,out_vu_1,out_vu_2,
        out_label,out_data,out_reset,out_sep,
          out_1_on,out_2_on,out_1_max,out_2_max,out_1_max_frame,out_2_max_frame,
        out_amp_sep,
          out_amp_a,out_amp_b,                              file_label,file_text,
          out_amp_number_a,out_amp_number_b,                line_on,mic_on,
          out_amp_slider_a,out_amp_slider_b,                file_on,line_digital,
          speaker1_volume,speaker2_volume,speaker_sep,speaker_icon,

      file_pane,
      /* partly defined above (need to keep IO pane offsets in order) */
        file_form,button_frame,comment_label,comment_text,
        format_list,type_list,srate_text,chans_text,
        button_holder,file_duration,duration_label,ff_form,
          ff_sep1,ff_sep2,ff_sep3,ff_sep4,
        autoload_file,
      message_pane,
        messages,
      record_button,reset_button
};

#define REC_WIDGETS 120
#define REC_PANES 5
#define REC_AMPS 10
#define REC_VU_METERS 6

static int in_chans,in_format,in_type,in_lines,in_mics,in_digitals,in_srate,in_datum_size;
static char *output_filename;
static int output_fd = -1;

#ifdef CLM_LITTLE_ENDIAN
  #define COMPATIBLE_FORMAT snd_16_linear_little_endian
#else
  #define COMPATIBLE_FORMAT snd_16_linear
#endif

static char msgbuf[512];
static char timbuf[64];
static void record_report(REC *rec, char *msg)
{
  /* place time-stamped message in text window */
  time_t ts;
  int pos;
  Widget text;
  time(&ts);
  strftime(timbuf,64,"%H:%M:%S",localtime(&ts));
  sprintf(msgbuf,"\n[%s] %s",timbuf,msg);
  text = rec->wids[messages];
  pos = XmTextGetLastPosition(text);
  if (pos == 0) 
    XmTextSetString(text,msgbuf);
  else XmTextInsert(text,pos,msgbuf);
  XmTextShowPosition(text,XmTextGetLastPosition(text));
}

static void update_maxes(float f1, float f2, Widget w1, Widget w2)
{
  sprintf(timbuf,"%.2f",f1*clm_sndflt);
  make_name_label(w1,timbuf);
  sprintf(timbuf,"%.2f",f2*clm_sndflt);
  make_name_label(w2,timbuf);
}

static void update_duration(REC *rec, float new_dur)
{
  sprintf(timbuf,"%.2f",new_dur);
  make_name_label(rec->wids[file_duration],timbuf);
}

static void update_max_labels(REC *rec, int which)
{
  switch (which)
    {
    case 0: update_maxes(rec->maxes[0],rec->maxes[1],rec->wids[line_1_max],rec->wids[line_2_max]); break;
    case 1: update_maxes(rec->maxes[2],rec->maxes[3],rec->wids[mic_1_max],rec->wids[mic_2_max]); break;
    case 2: update_maxes(rec->maxes[4],rec->maxes[5],rec->wids[out_1_max],rec->wids[out_2_max]); break;
    }
}


/* -------------------------------- RECORDER CLM INTERFACE -------------------------------- */

static void initialize_recorder(snd_state *ss, REC *rec)
{
  int i;
  rec->in_digital = ss->record_digital;
  rec->autoload = ss->record_autoload;
  rec->speaker1 = 100 * ss->record_amps[12];
  rec->speaker2 = 100 * ss->record_amps[13];
  rec->in_line1 = 100 * ss->record_amps[0];
  rec->in_line2 = 100 * ss->record_amps[1];
  rec->in_mic1 = 100 * ss->record_amps[6];
  rec->in_mic2 = 100 * ss->record_amps[7];
  for (i=0;i<REC_AMPS;i++)
    {
      rec->amps[i] = (AMP *)calloc(1,sizeof(AMP));
    }
  for (i=0;i<4;i++)
    {
      rec->amps[i]->amp = ss->record_amps[i+2];
      rec->amps[i+4]->amp = ss->record_amps[i+2+6];
    }
  for (i=0;i<2;i++) rec->amps[i+8]->amp = ss->record_amps[i+14];
  rec->out_chans = ss->record_chans;
  rec->out_srate = ss->record_srate;
  ss->rec = rec;
  in_chans = 2;
  in_type = raw_sound_file;
  in_lines = 2;
  in_digitals = 2;
  in_mics = 2;
  in_srate = 22050;
  in_format = COMPATIBLE_FORMAT;
  in_datum_size = 2;
}

void reflect_record(snd_state *ss, int which, int new_value)
{
  REC *rec;
  int hpos,dpos;
  rec = (REC *)(ss->rec);
  switch (which)
    {
    case 0: ss->record_chans = new_value;      break;
    case 1: ss->record_srate = new_value;      break;
    case 2: ss->record_type = new_value;       break;
    case 3: ss->record_format = new_value;     break;
    case 4: ss->record_line_panel = new_value; break;
    case 5: ss->record_mic_panel = new_value;  break;
    case 6: ss->record_out_panel = new_value;  break;
    case 7: ss->record_autoload = new_value;   break;
    case 8: ss->record_digital = new_value;    break;
    }
  if (rec)
    {
      switch (which)
	{
	case 0: 
	  if (rec->out_chans != new_value)
	    {
	      sprintf(timbuf,"%d",new_value);
	      XmTextSetString(rec->wids[chans_text],timbuf);
	    }
	  rec->out_chans = new_value;
	  break;
	case 1:
	  if (rec->out_srate != new_value)
	    {
	      sprintf(timbuf,"%d",new_value);
	      XmTextSetString(rec->wids[srate_text],timbuf);
	    }
	  rec->out_srate = new_value;
	  break;
	case 2:
	  load_header_and_data_lists(rec->wids[type_list],rec->wids[format_list],new_value,ss->record_format,&hpos,&dpos);
	  break;
	case 3:
	  load_header_and_data_lists(rec->wids[type_list],rec->wids[format_list],ss->record_type,new_value,&hpos,&dpos);
	  break;
	case 4:
	  XmToggleButtonSetState(rec->wids[line_on],new_value,TRUE);
	  break;
	case 5:
	  XmToggleButtonSetState(rec->wids[mic_on],new_value,TRUE);
	  break;
	case 6:
	  XmToggleButtonSetState(rec->wids[file_on],new_value,TRUE);
	  break;
	case 7:
	  if (rec->autoload != new_value) XmToggleButtonSetState(rec->wids[autoload_file],new_value,FALSE);
	  rec->autoload = new_value;
	  break;
	case 8: 
	  if (rec->in_digital != new_value) XmToggleButtonSetState(rec->wids[line_digital],new_value,FALSE);
	  rec->autoload = new_value;
	  break;
	}
    }
}

static int set_volume(Widget w, int panel, int value);

float reflect_record_slider(snd_state *ss, float new_val, int slider, int op, int setf)
{
  Widget w;
  int scrollmax = 0,val = 0;
  REC *rec;
  if (setf)
    {
      if (op == 0) ss->record_amps[slider] = new_val;
      else
	if (op == 1) 
	  ss->record_amps[slider] += new_val;
	else ss->record_amps[slider] -= new_val;
      rec = ss->rec;
      if (rec)
	{
	  switch (slider)
	    {
	    case 0: w = rec->wids[line_in1_slider]; scrollmax = 100; break;
	    case 1: w = rec->wids[line_in2_slider]; scrollmax = 100; break;
	    case 2: case 3: case 4: case 5: w = rec->wids[line_amp_slider+slider-2]; scrollmax = RECORD_SCROLLBAR_MAX; break;
	    case 6: w = rec->wids[mic_in1_slider]; scrollmax = 100; break;
	    case 7: w = rec->wids[mic_in2_slider]; scrollmax = 100; break;
	    case 8: case 9: case 10: case 11: w = rec->wids[mic_amp_slider+slider-8]; scrollmax = RECORD_SCROLLBAR_MAX; break;
	    case 12: w = rec->wids[speaker1_volume]; scrollmax = 100; break;
	    case 13: w = rec->wids[speaker2_volume]; scrollmax = 100; break;
	    case 14: case 15: w = rec->wids[out_amp_slider_a+slider-14]; scrollmax = RECORD_SCROLLBAR_MAX; break;
	    }
	  if (scrollmax == 100)
	    {
	      val = ss->record_amps[slider] * scrollmax;             /* these are linear */
	      XmScaleSetValue(w,val);                                /* why no 'notify' argument? */
	      set_volume(w,(slider<2) ? 0 : ((slider<12) ? 1 : 2),val);
	    }
	  else XmScrollBarSetValues(w,amp_to_slider(val),0,0,0,TRUE);
	}
    }
  return(ss->record_amps[slider]);
}

void save_recorder_state(snd_state *ss, int fd)
{
  if (ss->rec)
    {
      sprintf(msgbuf,"(setf record-autoload %d)\n(setf record-chans %d)\n(setf record-digital-line-in %d)\n(setf record-format %d)\n",
	      ss->record_autoload,ss->record_chans,ss->record_digital,ss->record_format);            
      write(fd,msgbuf,strlen(msgbuf));
      sprintf(msgbuf,"(setf record-line-panel %d)\n(setf record-mic-panel %d)\n(setf record-out-panel %d)\n(setf record-srate %d)\n",
	      ss->record_line_panel,ss->record_mic_panel,ss->record_out_panel,ss->record_srate);              
      write(fd,msgbuf,strlen(msgbuf));
      sprintf(msgbuf,"(setf record-type %d)\n(setf record-line-a %.3f)\n(setf record-line-b %.3f)\n(setf record-line-aa %.3f)\n",
	      ss->record_type,ss->record_amps[0],ss->record_amps[1],ss->record_amps[2]);
      write(fd,msgbuf,strlen(msgbuf));
      sprintf(msgbuf,"(setf record-line-bb %.3f)\n(setf record-line-ab %.3f)\n(setf record-line-ba %.3f)\n(setf record-mic-a %.3f)\n",
	      ss->record_amps[3],ss->record_amps[4],ss->record_amps[5],ss->record_amps[6]);          
      write(fd,msgbuf,strlen(msgbuf));
      sprintf(msgbuf,"(setf record-mic-b %.3f)\n(setf record-mic-aa %.3f)\n(setf record-mic-bb %.3f)\n(setf record-mic-ab %.3f)\n",
	      ss->record_amps[7],ss->record_amps[8],ss->record_amps[9],ss->record_amps[10]);        
      write(fd,msgbuf,strlen(msgbuf));
      sprintf(msgbuf,"(setf record-mic-ba %.3f)\n(setf record-out-a %.3f)\n(setf record-out-b %.3f)\n(setf record-out-aa %.3f)\n(setf record-out-bb %.3f)\n",
	      ss->record_amps[11],ss->record_amps[12],ss->record_amps[13],ss->record_amps[14],ss->record_amps[15]);        
      write(fd,msgbuf,strlen(msgbuf));
    }
}


static REC *rec = NULL;

static void reset_buttons (void)
{
  XtSetSensitive(rec->wids[line_on],TRUE);
  XtSetSensitive(rec->wids[mic_on],TRUE);
  XtSetSensitive(rec->wids[file_on],TRUE);
  XtSetSensitive(rec->wids[line_digital],TRUE);
  XtSetSensitive(rec->wids[autoload_file],TRUE);
}


/* -------------------------------- OS RECORDING CALLS -------------------------------- */
/*
 * this is a mess!  Support for SGI's new audio library is only half-implemented.  Linux only half-tested.  Sun sketchy at best.
 */

static XtWorkProcId ever_read = 0;

#define RECORD_SIZE 4096
/* on the SGI 1024 is very prone to clicks */
static short *record_buf;
static short *monitor_buf;
static float *fbuf;
static short *out_buf;
static int audio_open = 0;
static int monitor_open = 0;
static int data_is_compatible = 0;

static int vu_ctr = 0;
static int vu_count = 1;
static float max[6];
static float amps[10];
static int total_out_samps,duration_samps;

static void error_report(char *msg, int err);
static int input_channels = 0;

static int fire_up_recorder(REC *rec);


/* -------------------------------- SGI ADC -------------------------------- */
#ifdef SGI
/* two versions because the newer library does not seem to do input using old-style calls */
#include <audio.h>

static ALconfig rt_record_config;
static ALport rt_record_p;

static ALconfig rt_monitor_config;
static ALport rt_monitor_p;

#ifdef AL_RESOURCE
/* new AL */

#include <sys/hdsp.h>

static void save_current_audio_state (void)
{
}

static void restore_previous_audio_state (void)
{
}

static int close_audio(int val) 
{
  if (audio_open)
    {
      if ((alClosePort(rt_record_p)) == -1) error_report("close port",oserror());
      if ((alFreeConfig(rt_record_config)) == -1) error_report("free config",oserror());
      audio_open = 0;
    }
  if (ever_read) 
    {
      XtRemoveWorkProc(ever_read);
      ever_read = 0;
    }
  if (monitor_open)
    {
      if ((alClosePort(rt_monitor_p)) == -1) error_report("close monitor port",oserror());
      if ((alFreeConfig(rt_monitor_config)) == -1) error_report("free monitor config",oserror());
      monitor_open = 0;
    }
  return(val);
}

static void set_mic(int channel, int amp) 
{
  ALpv x[4];
  ALparamInfo pi;
  ALfixed g;
  int rv;
  rv = alGetResourceByName(AL_SYSTEM,"Microphone",AL_DEVICE_TYPE);
  if (!rv) error_report("no microphone?",oserror());
  if ((alGetParamInfo(rv,AL_GAIN,&pi)) == -1) error_report("get mic info ",oserror());
  g = pi.min.ll + (pi.max.ll - pi.min.ll) * (float)amp/100.0;
  x[0].param = AL_GAIN;
  x[0].value.ll = alDoubleToFixed((double)g);
  if (alSetParams(rv,x,1) == -1) error_report("set mic vol",oserror());
  /* other channel ? */

}

static void set_line(int channel, int amp) 
{
}

static void set_out(int channel, int amp) 
{
  /* line out? -- some of this is handled by explicit multiply by rec->speaker1 etc */
}

static void set_line_source(int in_digital)
{
  if (in_digital) error_report("digital line in is not yet implemented",0);
  /* line in is apparently named "Line In" */
}

static void set_record_srate(int srate)
{
  ALpv pv[2];
  pv[0].param = AL_RATE;
  pv[0].value.ll = alDoubleToFixed((double)srate);
  pv[1].param = AL_MASTER_CLOCK;
  pv[1].value.i = AL_CRYSTAL_MCLK_TYPE;
  alSetParams(AL_DEFAULT_OUTPUT, pv, 2); 
}

static int snd_open_adc (REC *rec, int srate, int *chans, int *format, int *line, int *digital, int *mic) 
{
  ALpv pv;
  ALpv x[2];
  int device,itf;

  device = alGetResourceByName(AL_SYSTEM,"Microphone",AL_DEVICE_TYPE);
  if (!device) error_report("get mic",oserror());
  if (itf = alGetResourceByName(AL_SYSTEM, "Microphone", AL_INTERFACE_TYPE))
    {
      pv.param = AL_INTERFACE;
      pv.value.i = itf;
      alSetParams(device,&pv,1);
    }
  x[0].param = AL_RATE;
  x[0].value.ll = alDoubleToFixed((double)srate);
  x[1].param = AL_MASTER_CLOCK;
  x[1].value.i = AL_CRYSTAL_MCLK_TYPE;
  if ((alSetParams(device,x,2)) == -1) error_report("set mic rate",oserror());
  x[0].param = AL_RATE;
  x[0].value.ll = alDoubleToFixed((double)srate);
  x[1].param = AL_MASTER_CLOCK;
  x[1].value.i = AL_CRYSTAL_MCLK_TYPE;
  if ((alSetParams(AL_DEFAULT_OUTPUT,x,2)) == -1) error_report("set mic rate",oserror());

  input_channels = 2;
  rt_record_config = alNewConfig();
  if (!rt_record_config) error_report("new config",oserror());
  if ((alSetChannels(rt_record_config,input_channels)) == -1) error_report("mic chans",oserror());
  if ((alSetWidth(rt_record_config,AL_SAMPLE_16)) == -1) error_report("mic samp width",oserror());
  if ((alSetSampFmt(rt_record_config,AL_SAMPFMT_TWOSCOMP)) == -1) error_report("mic samp format",oserror());
  if ((alSetQueueSize(rt_record_config,RECORD_SIZE)) == -1) error_report("mic queue size",oserror());
  if ((alSetDevice(rt_record_config,device)) == -1) error_report("mic device",oserror());
  rt_record_p = alOpenPort("inport", "r", rt_record_config); 
  if (!rt_record_p) error_report("open port",oserror());
  audio_open = 1;
  /* if ((alReadFrames(rt_record_p,record_buf,RECORD_SIZE>>1)) == -1) error_report("mic read first frame",oserror()); */
  /* throw away first buffer (garbage, it seems) */

  rt_monitor_config = alNewConfig();
  if (!rt_monitor_config) error_report("speaker config",oserror());
  if ((alSetChannels(rt_monitor_config,2)) == -1) error_report("out chans",oserror());
  if ((alSetWidth(rt_monitor_config,AL_SAMPLE_16)) == -1) error_report("out samp width",oserror());
  if ((alSetSampFmt(rt_monitor_config,AL_SAMPFMT_TWOSCOMP)) == -1) error_report("out samp format",oserror());
  if ((alSetQueueSize(rt_monitor_config,RECORD_SIZE)) == -1) error_report("out queue size",oserror());
  if ((alSetDevice(rt_monitor_config,AL_DEFAULT_OUTPUT)) == -1) error_report("out device",oserror());
  rt_monitor_p = alOpenPort("dac","w",rt_monitor_config);
  if (!rt_monitor_p) error_report("speaker open port",oserror());
  monitor_open = 1;

  return(0);
}


#else
/* old AL */

#define STEREO_QUEUE_MIN_SIZE 512
#define MONO_QUEUE_MIN_SIZE 1024
#define MAX_VOLUME 255

static long init_state[22];
static void save_current_audio_state (void)
{
  /* save channel mode, input source, left/right atten (2), speaker gain, input/output rate, mic_mode */
  init_state[0] = AL_CHANNEL_MODE;
  init_state[2] = AL_INPUT_SOURCE;
  init_state[4] = AL_LEFT_INPUT_ATTEN;
  init_state[6] = AL_RIGHT_INPUT_ATTEN;
  init_state[8] = AL_LEFT2_INPUT_ATTEN;
  init_state[10] = AL_RIGHT2_INPUT_ATTEN;
  init_state[12] = AL_MIC_MODE;
  init_state[14] = AL_LEFT_SPEAKER_GAIN;
  init_state[16] = AL_RIGHT_SPEAKER_GAIN;
  init_state[18] = AL_INPUT_RATE;
  init_state[20] = AL_OUTPUT_RATE;
  if ((ALgetparams(AL_DEFAULT_DEVICE,init_state,22)) == -1) error_report("save state",oserror());
}

static void restore_previous_audio_state (void)
{
  if ((ALsetparams(AL_DEFAULT_DEVICE,init_state,22)) == -1) error_report("restore state",oserror());
}

static int close_audio(int val) 
{
  if (audio_open)
    {
      if ((ALcloseport(rt_record_p)) == -1) error_report("close port",oserror());
      if ((ALfreeconfig(rt_record_config)) == -1) error_report("free config",oserror());
      audio_open = 0;
    }
  if (ever_read) 
    {
      XtRemoveWorkProc(ever_read);
      ever_read = 0;
    }
  if (monitor_open)
    {
      if ((ALcloseport(rt_monitor_p)) == -1) error_report("close monitor port",oserror());
      if ((ALfreeconfig(rt_monitor_config)) == -1) error_report("free monitor config",oserror());
      monitor_open = 0;
    }
  return(val);
}

static void set_mic(int channel, int amp) 
{
  long pb[2];
  int g;
  g = ((float)(100-amp))/100.0 * (float)MAX_VOLUME;
  pb[0] = (channel == 0) ? AL_LEFT2_INPUT_ATTEN : AL_RIGHT2_INPUT_ATTEN;
  pb[1] = g;
  if ((ALsetparams(AL_DEFAULT_DEVICE,pb,2)) == -1) error_report("set mic",oserror());
}

static void set_line(int channel, int amp) 
{
  long pb[2];
  int g;
  g = ((float)(100-amp))/100.0 * (float)MAX_VOLUME;
  pb[0] = (channel == 0) ? AL_LEFT_INPUT_ATTEN : AL_RIGHT_INPUT_ATTEN;
  pb[1] = g;
  if ((ALsetparams(AL_DEFAULT_DEVICE,pb,2)) == -1) error_report("set line",oserror());
}

static void set_out(int channel, int amp) 
{
  /* is this redundant ? */
  long pb[2];
  pb[0] = (channel == 0) ? AL_LEFT_SPEAKER_GAIN : AL_RIGHT_SPEAKER_GAIN;
  pb[1] = ((float)amp)/100.0 * (float)MAX_VOLUME;
  if ((ALsetparams(AL_DEFAULT_DEVICE,pb,2)) == -1) error_report("set speaker",oserror());
}

static void set_in_chans(int in_chans)
{
  long sr[2];
  sr[0] = AL_CHANNEL_MODE;
  sr[1] = (in_chans == 4) ? AL_4CHANNEL : AL_STEREO;
  if ((ALsetparams(AL_DEFAULT_DEVICE,sr,2)) == -1) error_report("set input chans",oserror());
}

static void set_line_source(int in_digital)
{
  long sr[2];
  close_audio(0);
  sr[0] = AL_INPUT_SOURCE;
  if (in_digital) sr[1] = AL_INPUT_DIGITAL; else sr[1] = AL_INPUT_MIC;
  if ((ALsetparams(AL_DEFAULT_DEVICE,sr,2)) == -1) error_report("line digital",oserror());
  set_in_chans((in_digital) ? 2 : 4);
  fire_up_recorder(rec);
}

static void set_record_srate(int srate)
{
  long sr[2];
  sr[0] = AL_INPUT_RATE;
  sr[1] = srate;
  if ((ALsetparams(AL_DEFAULT_DEVICE,sr,2)) == -1) error_report("set srate",oserror());
}

static int snd_open_adc (REC *rec, int srate, int *chans, int *format, int *line, int *digital, int *mic) 
{
  /* unlike Linux, on the SGI we can assume something reasonable is available here */
  /* also we have independent access to the line-in and mic-in data, and can assume */
  /* that output is compatible with input (what OSS calls full-duplex) */
  /* since we want all 6 channels at all times, we use 4CHANNEL_MODE */
  long sr[8];
  long hi,lo,err;
  sr[0] = AL_INPUT_RATE;
  sr[1] = srate;
  sr[2] = AL_INPUT_SOURCE;
  if (rec->in_digital)
    sr[3] = AL_INPUT_DIGITAL;
  else sr[3] = AL_INPUT_MIC;
  sr[4] = AL_MIC_MODE;
  sr[5] = AL_STEREO;
  if ((ALsetparams(AL_DEFAULT_DEVICE,sr,6)) == -1) error_report("setup sources",oserror());
  err = ALgetminmax(AL_DEFAULT_DEVICE,AL_CHANNEL_MODE,&lo,&hi);
  if ((err != 0) || (hi != AL_4CHANNEL)) input_channels = 2; else input_channels = 4;
  set_in_chans(input_channels);
  rt_record_config = ALnewconfig();
  if (!rt_record_config) error_report("new config",oserror());
  if ((ALsetqueuesize(rt_record_config,RECORD_SIZE*2)) == -1) error_report("set queue size",oserror());
  if ((ALsetsampfmt(rt_record_config,AL_SAMPFMT_TWOSCOMP)) == -1) error_report("set data format",oserror());
  if ((ALsetwidth(rt_record_config,AL_SAMPLE_16)) == -1) error_report("set data size",oserror());
  if ((ALsetchannels(rt_record_config,input_channels)) == -1) error_report("set chans",oserror());
  rt_record_p = ALopenport("inport", "r", rt_record_config); 
  if (!rt_record_p) error_report("open port",oserror());
  audio_open = 1;
  ALreadsamps(rt_record_p,record_buf,RECORD_SIZE);
  /* throw away first buffer (garbage, it seems) */

  rt_monitor_config = ALnewconfig();
  if (!rt_monitor_config) error_report("speaker config",oserror());
  if ((ALsetsampfmt(rt_monitor_config,AL_SAMPFMT_TWOSCOMP)) == -1) error_report("speaker format",oserror());
  if ((ALsetwidth(rt_monitor_config,AL_SAMPLE_16)) == -1) error_report("speaker data size",oserror());
  if ((ALsetchannels(rt_monitor_config,input_channels)) == -1) error_report("speaker chans",oserror());
  if ((ALsetqueuesize(rt_monitor_config,RECORD_SIZE)) == -1) error_report("speaker queue size",oserror());
  rt_monitor_p = ALopenport("dac","w",rt_monitor_config);
  if (!rt_monitor_p) error_report("speaker open port",oserror());
  monitor_open = 1;

  return(0);
}

#endif
#endif


/* -------------------------------- OSS ADC -------------------------------- */
#if HAVE_OSS

#include <signal.h>
#include <sys/ioctl.h>

#ifdef LINUX
  #include <sys/soundcard.h>
#else
  #include <soundcard.h>
#endif

#define DAC_NAME "/dev/dsp"
#define FRAGMENTS 2
#define FRAGMENT_SIZE 10

static int audio_fd = -1;

/* these are the fields that the recorder might change */
/* it also sets fragment size/number, but I don't see a way to read the current state of those fields */
static int init_format,init_chans,init_srate,init_mixer_volume,init_mixer_ogain,init_mixer_line,init_mixer_mic,init_mixer_reclev,init_mixer_pcm;

static void save_current_audio_state (void)
{
  /* in linux we need to reset the "mixer" to its initial state upon exit */
  int afd;
  afd = open(DAC_NAME,O_WRONLY,0);
  if (afd == -1) {error_report("can't save current audio state",0); return;}
  ioctl(afd,MIXER_READ(SOUND_MIXER_LINE),&init_mixer_line);
  ioctl(afd,MIXER_READ(SOUND_MIXER_MIC),&init_mixer_mic);
  ioctl(afd,MIXER_READ(SOUND_MIXER_VOLUME),&init_mixer_volume);
  ioctl(afd,MIXER_READ(SOUND_MIXER_OGAIN),&init_mixer_ogain);
  ioctl(afd,MIXER_READ(SOUND_MIXER_PCM),&init_mixer_pcm);
  ioctl(afd,MIXER_READ(SOUND_MIXER_RECLEV),&init_mixer_reclev);
  ioctl(afd,SOUND_PCM_READ_RATE,&init_srate);
  ioctl(afd,SOUND_PCM_READ_CHANNELS,&init_chans);
  init_format = AFMT_QUERY;
  ioctl(afd,SOUND_PCM_SETFMT,&init_format);
  close(afd);
}

static void restore_previous_audio_state (void)
{
  int afd;
  afd = open(DAC_NAME,O_WRONLY,0);
  if (afd == -1) {error_report("can't restore previous audio state",0); return;}
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_LINE),&init_mixer_line);
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_MIC),&init_mixer_mic);
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_VOLUME),&init_mixer_volume);
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_OGAIN),&init_mixer_ogain);
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_PCM),&init_mixer_pcm);
  ioctl(afd,MIXER_WRITE(SOUND_MIXER_RECLEV),&init_mixer_reclev);
  ioctl(afd,SOUND_PCM_WRITE_CHANNELS,&init_chans);
  ioctl(afd,SOUND_PCM_WRITE_RATE,&init_srate);
  ioctl(afd,SOUND_PCM_SETFMT,&init_format);
  close(afd);
}

static int close_audio(int val)
{
  /* see monitor stuff in SGI case */
  close(audio_fd);
  audio_fd = -1;
  if (ever_read) XtRemoveWorkProc(ever_read);
  ever_read = 0;
  audio_open = 0;
  return(val);
}

static int snd_to_oss_format(int snd_format)
{
  switch (snd_format)
    {
    case snd_8_linear: return(AFMT_S8); break;
    case snd_16_linear: return(AFMT_S16_BE); break;
    case snd_8_unsigned: return(AFMT_U8); break;
    case snd_8_mulaw: return(AFMT_MU_LAW); break;
    case snd_8_alaw: return(AFMT_A_LAW); break;
    case snd_16_linear_little_endian: return(AFMT_S16_LE); break;
    case snd_16_unsigned: return(AFMT_U16_BE); break;
    case snd_16_unsigned_little_endian: return(AFMT_U16_LE); break;
    default: return(-1); break;
    }
  return(-1);
}

static int oss_to_snd_format(int oss_format)
{
  switch (oss_format)
    {
    case AFMT_S8: return(snd_8_linear); break;
    case AFMT_S16_BE: return(snd_16_linear); break;
    case AFMT_U8: return(snd_8_unsigned); break;
    case AFMT_MU_LAW: return(snd_8_mulaw); break;
    case AFMT_A_LAW: return(snd_8_alaw); break;
    case AFMT_S16_LE: return(snd_16_linear_little_endian); break;
    case AFMT_U16_BE: return(snd_16_unsigned); break;
    case AFMT_U16_LE: return(snd_16_unsigned_little_endian); break;
    default: return(-1); break;
    }
  return(-1);
}

static int snd_open_adc (REC *rec, int srate, int *chans, int *format, int *line, int *digital, int *mic)
{ 
  int ft,stereo,buffer_info,formats,status,deffmt,devmask,actual_srate,duplex;
  char *buf;
  if ((audio_fd = open(DAC_NAME,O_RDWR,0)) == -1) 
    {
      duplex=0;
      if ((audio_fd = open(DAC_NAME,O_RDONLY,0)) == -1)
	{
	  record_report(rec,"can't open any inputs!");
	  if ((errno == EACCES) || (errno == ENOENT))
	    record_report(rec,"(to get input in Linux, we need read permission on /dev/dsp)");
	  return(-1);
	}
    }
  else duplex=1;
  ft = snd_to_oss_format(*format);
  status = ioctl(audio_fd,SOUND_PCM_GETFMTS,&formats);
  if (status != -1)
    {
      if (!(formats & ft)) 
	{
	  status = ioctl(audio_fd,SOUND_PCM_SETFMT,&deffmt);
	  if (status == -1)
	    {
	      if (!(formats & AFMT_S16_LE))
		{
		  record_report(rec,"can't find any suitable supported format!");
		  return(close_audio(-1));
		}
	      else 
		{
		  ft = AFMT_S16_LE;
		  (*format) = snd_16_linear_little_endian;
		}
	    }
	  else 
	    {
	      ft = deffmt;
	      (*format) = oss_to_snd_format(ft);
	    }
	}
    }
  ioctl(audio_fd,SOUND_MIXER_READ_DEVMASK,&devmask);
  if (*line)
    {
      if (!(SOUND_MASK_LINE & devmask))
	{
	  (*line = 0);
	  record_report(rec,"no line input available");
	}
    }
  if (*mic)
    {
      if (!(SOUND_MASK_MIC & devmask))
	{
	  (*mic = 0);
	  record_report(rec,"no mic input available");
	}
    }
  ioctl(audio_fd,SNDCTL_DSP_RESET,0);
  buffer_info = (FRAGMENTS<<16) | (FRAGMENT_SIZE);
  if (ioctl(audio_fd,SNDCTL_DSP_SETFRAGMENT,&buffer_info) == -1) 
    record_report(rec,"can't set real-time buffer fragment sizes");
  if (ioctl(audio_fd,SNDCTL_DSP_SETFMT,&ft) == -1)
    {
      record_report(rec,"can't handle requested format");
      return(close_audio(-2));
    }
  if ((*chans) == 2) stereo = 1; else stereo = 0;
  if (ioctl(audio_fd,SNDCTL_DSP_STEREO,&stereo) == -1) 
    {
      record_report(rec,"can't read stereo.");
      if ((*line) == 2) (*line)=1;
      if ((*mic) == 2) (*mic)=1;
      (*chans)=1;
    }
  actual_srate = srate;
  if (ioctl(audio_fd,SNDCTL_DSP_SPEED,&actual_srate) == -1) 
    record_report(rec,"can't approximate desired srate");
  else
    {
      if (actual_srate != srate)
	{
	  buf = (char *)calloc(64,sizeof(char));
	  sprintf(buf,"actual srate: %d",actual_srate);
	  record_report(rec,buf);
	  free(buf);
	}
    }
  audio_open = 1;
  monitor_open = duplex;
  input_channels = (*line) + (*mic);
  if ((!have_separate_line_and_mic_inputs) && (input_channels > 2)) input_channels = 2;
  return(0);
}

static void set_line(int channel, int amp) {ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_LINE),&amp);}
static void set_mic(int channel, int amp) {ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_MIC),&amp);}
static void set_out(int channel, int amp)
{
  ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_VOLUME),&amp);
  ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_OGAIN),&amp);
  ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_RECLEV),&amp);
  ioctl(audio_fd,MIXER_WRITE(SOUND_MIXER_PCM),&amp);
}

static void set_line_source(int in_digital)
{
  if (in_digital) error_report("digital line-in is not yet implemented",0);
}

static void set_record_srate(int srate)
{
  ioctl(audio_fd,SNDCTL_DSP_RESET,0); 
  if (ioctl(audio_fd,SNDCTL_DSP_SPEED,&srate) == -1) 
    error_report("can't change srate",0);
}

#endif  /* LINUX */


/* -------------------------------- SUN ADC -------------------------------- */

#ifdef SUN
#include <sys/audioio.h>
/* apparently open RDWR (dev/audio?), setup as in snd-dac.c, use read and close */

static int audio_fd = 0;

static void set_record_srate(int srate) {}
static void set_line_source(int in_digital) {}
static void set_line(int channel, int amp) {}
static void set_mic(int channel, int amp) {}
static void set_out(int channel, int amp) {}
static int snd_open_adc (REC *rec, int srate, int *chans, int *format, int *line, int *digital, int *mic) {return(-1);}
static void save_current_audio_state (void) {}
static void restore_previous_audio_state (void) {}

static int close_audio(int val) 
{
  close(audio_fd);
  audio_fd = -1;
  if (ever_read) XtRemoveWorkProc(ever_read);
  ever_read = 0;
  audio_open = 0;
  return(val);
}

#endif

/* -------------------------------- end (most) OS-specific ADC code -------------------------------- */


static int read_adc(REC *rec) 
{
  snd_state *ss;
  int i,k,j,out_samp;
  float outval1,outval2,g0,g1; /* at the meter, pre-output-slider as in input cases */
  float val1,val2;
  if (ever_read == 0) return(0); /* should not happen, but ... */
  ss = rec->ss;
#ifdef SGI
  #ifdef AL_RESOURCE
    if ((alReadFrames(rt_record_p,record_buf,RECORD_SIZE>>1)) == -1) error_report("read",oserror());
  #else
    if ((ALreadsamps(rt_record_p,record_buf,RECORD_SIZE)) == -1) error_report("read",oserror());
  #endif
  for (i=0;i<RECORD_SIZE;i++) fbuf[i] = record_buf[i];
#endif
#if HAVE_OSS
  read(audio_fd,record_buf,RECORD_SIZE*in_datum_size);
  if (in_format != COMPATIBLE_FORMAT) 
    snd_reformat((char *)record_buf,RECORD_SIZE,in_format,fbuf);
  else for (i=0;i<RECORD_SIZE;i++) fbuf[i] = record_buf[i];
#endif
#ifdef SUN
  read(audio_fd,record_buf,RECORD_SIZE*in_datum_size);
  if (in_format != COMPATIBLE_FORMAT) 
    snd_reformat((char *)record_buf,RECORD_SIZE,in_format,fbuf);
  else for (i=0;i<RECORD_SIZE;i++) fbuf[i] = record_buf[i];
#endif
  if (vu_ctr == 0) for (k=0;k<6;k++) max[k] = 0.0;
  g0 = (float)(rec->speaker1) * 0.01;
  g1 = (float)(rec->speaker2) * 0.01;
  for (i=0;i<REC_AMPS;i++) amps[i] = rec->amps[i]->amp;
  out_samp=0;
  if (input_channels == 4)
    {
      for (i=0;i<RECORD_SIZE;i+=4)
	{
	  val1 = fbuf[i]; if (val1 < 0.0) val1 = -val1; if (val1 > max[0]) max[0] = val1;
	  val1 = fbuf[i+1]; if (val1 < 0.0) val1 = -val1; if (val1 > max[1]) max[1] = val1;
	  val1 = fbuf[i+2]; if (val1 < 0.0) val1 = -val1; if (val1 > max[2]) max[2] = val1;
	  val1 = fbuf[i+3]; if (val1 < 0.0) val1 = -val1; if (val1 > max[3]) max[3] = val1;

	  outval1 = 0.0;
	  outval2 = 0.0;
	  if (rec->line1) {outval1 += (amps[0] * fbuf[i+0]); outval2 += (amps[2] * fbuf[i+0]);}
	  if (rec->line2) {outval1 += (amps[3] * fbuf[i+1]); outval2 += (amps[1] * fbuf[i+1]);}
	  if (rec->mic1)  {outval1 += (amps[4] * fbuf[i+2]); outval2 += (amps[6] * fbuf[i+2]);}
	  if (rec->mic2)  {outval1 += (amps[7] * fbuf[i+3]); outval2 += (amps[5] * fbuf[i+3]);}
	  
	  if (rec->recording)
	    {
	      if (rec->out1) out_buf[out_samp++] = (short)(outval1 * amps[8]);
	      if (rec->out2) out_buf[out_samp++] = (short)(outval2 * amps[9]);
	      /* write direct to clm-style input buffers, send to clm_write for possible translation (16-bit here) */
	      /* write to file at end of loop (keep writes small) */
	      /* if output also 16-bit (compatible), just write direct */
	    }
	  
	  if (outval1 > max[4]) max[4] = outval1; else if ((-outval1) > max[4]) max[4] = -outval1;
	  if (outval2 > max[5]) max[5] = outval2; else if ((-outval2) > max[5]) max[5] = -outval2;
	  val1 = (short)(outval1 * g0);
	  val2 = (short)(outval2 * g1);
	  monitor_buf[i] = val1;
	  monitor_buf[i+1] = val2;
	  monitor_buf[i+2] = val1;
	  monitor_buf[i+3] = val2;
	}
    }
  else
    {
      for (i=0;i<RECORD_SIZE;i+=2)
	{
	  val1 = fbuf[i]; if (val1 < 0.0) val1 = -val1; if (val1 > max[0]) max[0] = val1;
	  val1 = fbuf[i+1]; if (val1 < 0.0) val1 = -val1; if (val1 > max[1]) max[1] = val1;
	  outval1 = 0.0;
	  outval2 = 0.0;
	  if (rec->line1) {outval1 += (amps[0] * fbuf[i+0]); outval2 += (amps[2] * fbuf[i+0]);}
	  if (rec->line2) {outval1 += (amps[3] * fbuf[i+1]); outval2 += (amps[1] * fbuf[i+1]);}
	  if (rec->mic1) {outval1 += (amps[4] * fbuf[i+0]); outval2 += (amps[6] * fbuf[i+0]);}
	  if (rec->mic2) {outval1 += (amps[7] * fbuf[i+1]); outval2 += (amps[5] * fbuf[i+1]);}
	  
	  if (rec->recording)
	    {
	      if (rec->out1) out_buf[out_samp++] = (short)(outval1 * amps[8]);
	      if (rec->out2) out_buf[out_samp++] = (short)(outval2 * amps[9]);
	    }

	  if (outval1 > max[4]) max[4] = outval1; else if ((-outval1) > max[4]) max[4] = -outval1;
	  if (outval2 > max[5]) max[5] = outval2; else if ((-outval2) > max[5]) max[5] = -outval2;
	  val1 = (short)(outval1 * g0);
	  val2 = (short)(outval2 * g1);
	  monitor_buf[i] = val1;
	  monitor_buf[i+1] = val2;
	}
    }
  vu_ctr++;
  if (vu_ctr >= vu_count)
    {
      vu_ctr = 0;
      for (k=0;k<6;k++)
	{
	  set_vu_val(rec->meters[k],max[k]*clm_sndflt);
	  if (max[k] > rec->maxes[k])
	    {
	      rec->maxes[k] = max[k];
	      sprintf(msgbuf,"%.3f",max[k]*clm_sndflt);
	      switch (k)
		{
		case 0: make_name_label(rec->wids[line_1_max],msgbuf); break;
		case 1: make_name_label(rec->wids[line_2_max],msgbuf); break;
		case 2: make_name_label(rec->wids[mic_1_max],msgbuf); break;
		case 3: make_name_label(rec->wids[mic_2_max],msgbuf); break;
		case 4: make_name_label(rec->wids[out_1_max],msgbuf); break;
		case 5: make_name_label(rec->wids[out_2_max],msgbuf); break;
		}
	    }
	}
    }
  if (monitor_open)
    {
#ifdef SGI
  #ifdef AL_RESOURCE
      if ((alWriteFrames(rt_monitor_p,monitor_buf,RECORD_SIZE>>1)) == -1) error_report("write",oserror());
  #else
      if ((ALwritesamps(rt_monitor_p,monitor_buf,RECORD_SIZE)) == -1) error_report("write",oserror());
  #endif
#endif
#if HAVE_OSS
      /* what is LINUX case here? The following doesn't work */
      /* if (monitor_open) write(audio_fd,monitor_buf,RECORD_SIZE*2); */
#endif
#ifdef SUN
      /* what is SUN case? */
      /* if (monitor_open) write(audio_fd,monitor_buf,RECORD_SIZE*2); */
#endif
    }
  if (rec->recording)
    {
      if (data_is_compatible)
	write(output_fd,(char *)out_buf,out_samp*2);
      else 
	{
	  if (rec->out1)
	    {
	      if (rec->out2)
		{
		  for (i=0,j=0;i<out_samp;i+=2,j++)
		    {
		      rec->obufs[0][j] = (int)out_buf[i];
		      rec->obufs[1][j] = (int)out_buf[i+1];
		    }
		}
	      else
		{
		  for (i=0;i<out_samp;i++) rec->obufs[0][i] = (int)out_buf[i];
		}
	    }
	  else
	    {
	      for (i=0;i<out_samp;i++) rec->obufs[0][i] = (int)out_buf[i];
	    }
	  clm_write(output_fd,0,(out_samp/ss->record_chans)-1,ss->record_chans,rec->obufs);
	}
      total_out_samps += out_samp;
      if (total_out_samps > duration_samps)
	{
	  update_duration(rec,(float)total_out_samps/(float)(rec->out_chans * rec->out_srate));
	  duration_samps += (rec->out_srate / 4);
	}
    }
  return(0);
}

static Boolean run_adc(XtPointer rec) 
{
  return(read_adc((REC *)rec));
}

static void set_read_in_progress (snd_state *ss, REC *rec)
{
  ever_read = XtAppAddWorkProc(XtWidgetToApplicationContext(main_PANE(ss)),run_adc,(XtPointer)rec);
}

static int fire_up_recorder(REC *rec)
{
  snd_state *ss;
  int err;
  ss = rec->ss;

  save_current_audio_state();

  /* input setup state is independent of output file choices and the lines are held open as long as the window is active */
  err = snd_open_adc(rec,in_srate,&in_chans,&in_format,&in_lines,&in_digitals,&in_mics);
  in_datum_size = c_snd_datum_size(in_format);
  if (err)
    {
      /* assume snd_open_adc sent an error message for us */
      rec->recording = 0;
      reset_buttons();
    }
  set_read_in_progress(ss,rec);

  set_line(0,rec->in_line1);
  set_line(1,rec->in_line2);
  set_mic(0,rec->in_mic1);
  set_mic(1,rec->in_mic2);
  set_out(0,rec->speaker1);
  set_out(1,rec->speaker2);

  return(err);
}

/* -------------------------------- CALLBACKS -------------------------------- */

static void Meter_Button_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  VU *vu = (VU *)clientData;
  snd_state *ss;
  int panel,val,n;
  REC *rec;
  Widget ctext;
  char *str;
  rec = (REC *)(vu->rec);
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  ss = vu->ss;
  if (vu->on_off == VU_OFF)
    {
      XmChangeColor(w,(Pixel)(ss->sgx)->red);
      vu->on_off = VU_ON;
      vu->red_deg = 0.0;
    }
  else 
    {
      XmChangeColor(w,(Pixel)(ss->sgx)->main);
      vu->on_off = VU_OFF;
    }
  display_vu_meter(vu);
  val = (vu->on_off == VU_ON);
  switch (panel)
    {
    case 0: if (w == rec->wids[line_1_on]) rec->line1 = val; else rec->line2 = val; break;
    case 1: if (w == rec->wids[mic_1_on]) rec->mic1 = val; else rec->mic2 = val; break;
    case 2: 
      if (w == rec->wids[out_1_on]) rec->out1 = val; else rec->out2 = val; 
      ctext = rec->wids[chans_text];
      str = XmTextGetString(ctext); 
      if (str) 
	sscanf(str,"%d",&n);
      else n=0;
      val = 0;
      if (rec->out1) val++;
      if (rec->out2) val++;
      if ((val>0) && (val != n))
	{
	  sprintf(timbuf,"%d",val);
	  XmTextSetString(ctext,timbuf);
	}
      break;
    }
}

static void line_on_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  /* open or close line panel (leaves state alone, just changes window) */
  if ((ss->record_line_panel = (XmToggleButtonGetState(w))))
    XtVaSetValues(rec->wids[line_pane],XmNpaneMinimum,rec->pane_sizes[0],NULL);
  else XtVaSetValues(rec->wids[line_pane],XmNpaneMaximum,1,NULL);
  XtVaSetValues(rec->wids[line_pane],XmNpaneMinimum,1,XmNpaneMaximum,rec->pane_sizes[0],NULL);
}

static void line_on_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
       "Line In",
"This button opens or closes the Line In Panel.\n\
You can also close it partially or fully with the\n\
sash button on the right, though you may need to\n\
reduce the overall dialog size first.  The Line In\n\
panel is active (that is, you can record from Line In\n\
even when its panel is closed.\n\
");	   
}

static void mic_on_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  if ((ss->record_mic_panel = (XmToggleButtonGetState(w))))
    XtVaSetValues(rec->wids[mic_pane],XmNpaneMinimum,rec->pane_sizes[1],NULL);
  else XtVaSetValues(rec->wids[mic_pane],XmNpaneMaximum,1,NULL);
  XtVaSetValues(rec->wids[mic_pane],XmNpaneMinimum,1,XmNpaneMaximum,rec->pane_sizes[1],NULL);
}

static void mic_on_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
       "Microphone",
"This button opens or closes the Microphone Panel.\n\
You can also close it partially or fully with the\n\
sash button on the right, though you may need to\n\
reduce the overall dialog size first.  The Microphone\n\
panel is active (that is, you can record from the\n\
microphone) even when its panel is closed.\n\
");	   
}

static void file_on_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  if ((ss->record_out_panel = (XmToggleButtonGetState(w))))
    XtVaSetValues(rec->wids[out_pane],XmNpaneMinimum,rec->pane_sizes[2],NULL);
  else XtVaSetValues(rec->wids[out_pane],XmNpaneMaximum,1,NULL);
  XtVaSetValues(rec->wids[out_pane],XmNpaneMinimum,1,XmNpaneMaximum,rec->pane_sizes[2],NULL);
}

static void file_on_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
       "File Out",
"This button opens or closes the File Out Panel.\n\
You can also close it partially or fully with the\n\
sash button on the right, though you may need to\n\
reduce the overall dialog size first.  The Output\n\
panel is active (that is, you can write the output\n\
file while recording) even when its panel is closed.\n\
");	   
}

static void line_digital_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  rec->in_digital = XmToggleButtonGetState(w);
  ss->record_digital = rec->in_digital;
  set_line_source(rec->in_digital);
}

static void line_digital_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
       "Digital Line In",
"This button toggles between analog and digital\n\
line input (on: digital, off: analog).\n\
");	   
}


static void autoload_file_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  rec->autoload = XmToggleButtonGetState(w);
  ss->record_autoload = rec->autoload;
}

static void autoload_file_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
       "Autoload File",
"If this button is set, the recorded file\n\
is automatically loaded into Snd.\n\
");	   
}

/* the other portion of the record dialog involves the sonogram, if it's do-able
 */

void cleanup_recording (void)
{
  if (audio_open) close_audio(0);
  if (rec) restore_previous_audio_state();
  if ((rec) && (rec->recording) && (output_fd > 0)) 
    {
      rec->recording = 0;
      reset_buttons();
      snd_close(output_fd);
    }
}

static void RecordCleanupCB(Widget w,XtPointer clientData,XtPointer callData)
{
  cleanup_recording(); 
}

static char *pane_labels[] = {snd_string_Line_In,snd_string_Microphone,snd_string_File_Out};

static void VU_Reset_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  /* set current max to 0.0 */
  REC *rec = (REC *)clientData;
  int panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  rec->maxes[panel*2] = 0.0;
  rec->maxes[panel*2+1] = 0.0;
  update_max_labels(rec,panel);
}

static void VU_Reset_Help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  snd_help(rec->ss,
	   "Reset Button",
"This button resets the fields above it that\n\
indicate the on-going max amp encountered\n\
since the last reset\n\
");
}

static char *panel_name[] = {"line in","the microphone","the output file"};

static void VU_Max_Help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  ssnd_help(rec->ss,
	   "Max Amp Indicator",
	    "This number indicates the max amp encountered\n\
since the last reset in ",
	    panel_name[panel],"'s",
	    " channel ",
	    ((w == rec->wids[line_1_max]) || (w == rec->wids[mic_1_max]) || (w == rec->wids[out_1_max])) ? "A" : "B",
	    ".\n\
The reset button sets it back to 0.0.\n",
	    NULL);
}

static void VU_On_Help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  ssnd_help(rec->ss,
	    "On/Off Button",
	    "This button causes ",
	    panel_name[panel],"'s",
	    " channel ",
	    ((w == rec->wids[line_1_on]) || (w == rec->wids[mic_1_on]) || (w == rec->wids[out_1_on])) ? "A" : "B",
	    " to be included\n\
in or removed from the recording. The button\n\
is red when the signal is active.\n",
	    NULL);
}

static void Messages_Help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
	   "Message Pane",
"This pane contains any messages the recorder\n\
generates.  Each is time stamped.  Many are merely\n\
informational or mild gripes.\n\
");
}

static void file_label_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
	   "Output File Name",
"This field sets the name of the output file.\n\
");	   
}

static void button_holder_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
	   "Record Options",
"The 'Line Panel' button opens or closes the line\n\
input panel, but has no effect on the actual data\n\
paths.  Similarly, 'Mic Panel' opens or closes the\n\
Microphone panel, and 'Output Panel' opens or closes\n\
the output panel.  'Digital Line In' chooses between\n\
analog and digital input lines (if any). 'Autoload\n\
Recording', if set, causes the recorded output to be\n\
loaded automatically into Snd.\n\
");
}

static void duration_label_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
	   "Output File Duration",
"This field shows the duration of the current\n\
or previous recording.\n\
");	   
}

static void comment_label_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_help(rec->ss,
	   "Output File Comment",
"This optional field provides any comments\n\
that you want saved in the output file's\n\
header.\n\
");	   
}

static void volume_help_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int chan = 0,panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  switch (panel)
    {
    case 0: if (w == rec->wids[line_in1_slider]) chan = 0; else chan = 1; break;
    case 1: if (w == rec->wids[mic_in1_slider]) chan = 0; else chan = 1; break;
    case 2: if (w == rec->wids[speaker1_volume]) chan = 0; else chan = 1; break;
    }
  ssnd_help(rec->ss,
	   (panel == 0) ? "Line in Gain" : ((panel == 1) ? "Mic Gain" : "Speaker Volume"),
	    "This slider sets the ",
	    (panel < 2) ? "gain" : "volume",
	    " of channel ",
	    (chan == 0) ? "A" : "B",
	    " of ",
	    (panel < 2) ? panel_name[panel] : "the speaker",
	    "\n",
	    (panel < 2) ? "This scales the in-coming signal before it\n\
is reflected in the meters or the audio data.\n" : "",
	    NULL);
}

static void volume_callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)callData;
  int chan,panel;
  XtVaGetValues(w,XmNuserData,&panel,NULL);
  chan = set_volume(w,panel,cbs->value);
  ss = rec->ss;
  ss->record_amps[panel*6 + chan] = (float)(cbs->value)/100.0;
}

static int set_volume(Widget w, int panel, int value)
{
  int chan = 0;
  switch (panel)
    {
    case 0: if (w == rec->wids[line_in1_slider]) chan = 0; else chan = 1; break;
    case 1: if (w == rec->wids[mic_in1_slider]) chan = 0; else chan = 1; break;
    case 2: if (w == rec->wids[speaker1_volume]) chan = 0; else chan = 1; break;
    }
  switch (panel*2 + chan)
    {
    case 0:
      rec->in_line1 = value;
      set_line(0,value);
      break;
    case 1:
      rec->in_line2 = value;
      set_line(1,value);
      break;
    case 2:
      rec->in_mic1 = value;
      set_mic(0,value);
      break;
    case 3:
      rec->in_mic2 = value;
      set_mic(1,value);
      break;
    case 4:
      rec->speaker1 = value;
      set_out(0,value);
      break;
    case 5:
      rec->speaker2 = value;
      set_out(1,value);
      break;
    }
  return(chan);
}

static void amp_slider_help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int slider,panel;
  XtVaGetValues(w,XmNuserData,&slider,NULL);
  panel = slider/4;
  ssnd_help(rec->ss,
	    "Volume Slider",
	    "This slider scales ",
	    (panel != 2) ? "the contribution of " : "",
	    panel_name[panel],"'s",
	    "channel ",
	    (slider & 1) ? "B" : "A",
	    (panel != 2) ? " to the output file's channel " : ".",
	    (panel != 2) ? (((slider == 0) || (slider == 3) || (slider == 4) || (slider == 7)) ? "A." : "B.") : "",
	    NULL);
}

static void Meter_Help_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  int meter,panel;
  XtVaGetValues(w,XmNuserData,&meter,NULL);
  panel = meter/2;
  ssnd_help(rec->ss,
	    "VU Meter",
	    "This meter shows the current volume of ",
	    panel_name[panel],"'s",
	    " channel ",
	    (meter & 1) ? "B" : "A",
	    ".\n\
It is yellow if active, red if clipping.\n",
	    NULL);
}

static void Reset_Record_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  /* if recording, cancel and toss data, else reset various fields to default (ss) values */
  REC *rec = (REC *)clientData;
  snd_state *ss;
  char *str;
  XmString s1;
  int panel;
  ss = rec->ss;
  if (rec->recording)             /* cancel */
    {
      rec->recording = 0;
      reset_buttons();
      XmChangeColor(rec->wids[record_button],(Pixel)(ss->sgx)->main);
      s1 = XmStringCreate(snd_string_Reset,XmFONTLIST_DEFAULT_TAG);
      XtVaSetValues(rec->wids[reset_button],XmNlabelString,s1,NULL);
      XmStringFree(s1);
      s1 = XmStringCreate(snd_string_Record,XmFONTLIST_DEFAULT_TAG);
      XtVaSetValues(rec->wids[record_button],XmNlabelString,s1,NULL);
      XmStringFree(s1);
      snd_close(output_fd);
      output_fd = -1;
      str = just_filename(output_filename);
      sprintf(timbuf,"%s recording cancelled",str);
      record_report(rec,timbuf);
      free(str);
      remove(output_filename);
    }
  else                            /* reset or restart */
    {
      for (panel=0;panel<3;panel++)
	{
	  rec->maxes[panel*2] = 0.0;
	  rec->maxes[panel*2+1] = 0.0;
	  update_max_labels(rec,panel);
	}
      /* now if dac turned us off, turn everything back on */
      if (!audio_open)            /* restart */
	{
	  fire_up_recorder(rec);
	  s1 = XmStringCreate(snd_string_Reset,XmFONTLIST_DEFAULT_TAG);
	  XtVaSetValues(rec->wids[reset_button],XmNlabelString,s1,NULL);
	  XmStringFree(s1);
	}
    }
}

static void Help_Record_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  ss = rec->ss;
  ssnd_help(ss,
	    "Record",
	    get_recording_help(),
	    "\n\
If you go to the main Snd window while the\n\
recorder is active and play a sound, the\n\
recorder's audio lines are made inactive\n\
to try to reduce confusion.  To re-activate\n\
the recorder, press the 'reset' button at\n\
the bottom of the window.\n\
",
	    NULL);
}

static void Dismiss_Record_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *)callData;
  state_context *sgx;
  snd_state *ss;
  ss = rec->ss;
  sgx = ss->sgx;
  if (cb->event != sgx->text_activate_event)  /* passed up from textfield widget after <cr> typed */
    {
      if (rec->recording) Reset_Record_Callback(w,clientData,callData);
      XtUnmanageChild(rec->wids[rec_dialog]);
#if HAVE_OSS
      close_clm_file_descriptors(audio_fd);
#endif
      close_audio(0);
      restore_previous_audio_state();
    }
}

static void Record_Button_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  REC *rec = (REC *)clientData;
  snd_state *ss;
  XmString s1,s2;
  snd_info *sp;
  static int srate,chans,format,type;
  int err,i;
  float duration;
  static char *comment;
  char *str,*str1;
  ss = rec->ss;
  rec->recording = (!(rec->recording));
  if (rec->recording)
    {
      if (!audio_open) fire_up_recorder(rec);
      str = XmTextGetString(rec->wids[file_text]);
      if ((str) && (*str))
	{
	  str1 = copy_string(str);
	  output_filename = copy_string(complete_filename(str1));
	  free(str1);
	  read_file_data_choices(rec->wids[srate_text],rec->wids[chans_text],
				 rec->wids[type_list],rec->wids[format_list],
				 &srate,&chans,&type,&format);

	  if (ss->record_srate != srate) set_record_srate(srate);
	  rec->out_srate = srate;
	  ss->record_srate = srate;
	  if (srate <= 0)
	    {
	      record_report(rec,snd_string_cant_record_screwed_up_srate);
	      rec->recording = (!(rec->recording));
	      return;
	    }
	  rec->out_chans = chans;
	  if (chans <= 0)
	    {
	      record_report(rec,snd_string_cant_record_screwed_up_chans);
	      rec->recording = (!(rec->recording));
	      return;
	    }
	  ss->record_type = type;
	  ss->record_format = format;
	  comment = XmTextGetString(rec->wids[comment_text]);
	  update_duration(rec,0.0);
	  ss->record_chans = chans; /* chans field in file description panel */
	  if ((rec->out1 + rec->out2) == 0) /* no out channels selected */
	    {
	      record_report(rec,snd_string_cant_record_no_outputs);
	      rec->recording = (!(rec->recording));
	      return;
	    }
	  if ((rec->out1 + rec->out2) != chans)
	    {
	      record_report(rec,"chans field doesn't match file out panel state");
	      Meter_Button_Callback(rec->wids[out_2_on],(XtPointer)(rec->meters[5]),NULL); /* callData not used */
	      /* push out B button for user */
	    }
	  if ((rec->line1 + rec->line2 + rec->mic1 + rec->mic2) == 0)
	    {
	      record_report(rec,snd_string_cant_record_no_inputs);
	      rec->recording = (!(rec->recording));
	      return;
	    }
	  XmChangeColor(w,(Pixel)(ss->sgx)->red);
	  s1 = XmStringCreate(snd_string_Cancel,XmFONTLIST_DEFAULT_TAG);
	  s2 = XmStringCreate(snd_string_Done,XmFONTLIST_DEFAULT_TAG);

	  err = snd_write_header(ss,output_filename,type,srate,chans,0,0,format,comment,strlen(comment)); /* 0,0-> location,size */
	  if (err)
	    {
	      rec->recording = 0;
	      return;
	    }

	  XtSetSensitive(rec->wids[line_on],FALSE);
	  XtSetSensitive(rec->wids[mic_on],FALSE);
	  XtSetSensitive(rec->wids[file_on],FALSE);
	  XtSetSensitive(rec->wids[line_digital],FALSE);
	  XtSetSensitive(rec->wids[autoload_file],FALSE);

	  output_fd = snd_reopen_write(ss,output_filename);
	  c_read_header_with_fd(output_fd);
	  open_clm_file_descriptors(output_fd,format,c_snd_header_datum_size(),c_snd_header_data_location());
	  data_is_compatible = (format == COMPATIBLE_FORMAT);
	  total_out_samps = 0;
	  duration_samps = srate/4;
	  if (!data_is_compatible)
	    {
	      if (!(rec->obufs))
		rec->obufs = (int **)calloc(2,sizeof(int *));
	      for (i=0;i<chans;i++) 
		{
		  if (!(rec->obufs[i]))
		    rec->obufs[i] = (int *)calloc(RECORD_SIZE,sizeof(int));
		}
	    }
	}
      else
	{
	  record_report(rec,snd_string_cant_record_no_output_file);
	  rec->recording = (!(rec->recording));
	  return;
	}
    }
  else 
    {
      /* total_out_samps -> true duration here for header update */
      reset_buttons();
      XmChangeColor(w,(Pixel)(ss->sgx)->main);
      s1 = XmStringCreate(snd_string_Reset,XmFONTLIST_DEFAULT_TAG);
      s2 = XmStringCreate(snd_string_Record,XmFONTLIST_DEFAULT_TAG);
      snd_close(output_fd);
      output_fd = clm_reopen_write(output_filename);
      c_update_header_with_fd(output_fd,ss->record_type,total_out_samps*c_snd_datum_size(ss->record_format));
      close(output_fd);
      output_fd = -1;
      duration = (float)total_out_samps / (float)(rec->out_chans * rec->out_srate);
      update_duration(rec,duration);
      str = (char *)calloc(256,sizeof(char));
      if (chans == 1) 
	sprintf(str,"recorded %s:\n  duration: %.2f\n  max amp: %.2f\n  srate: %d, chans: %d\n  type: %s, format: %s",
		output_filename,duration,rec->maxes[4]*clm_sndflt,rec->out_srate,rec->out_chans,sound_type(type),sound_format(format));
      else sprintf(str,"recorded %s:\n  duration: %.2f\n  max amps: %.2f %.2f\n  srate: %d, chans: %d\n  type: %s, format: %s",
		   output_filename,duration,rec->maxes[4]*clm_sndflt,rec->maxes[5]*clm_sndflt,
		   rec->out_srate,rec->out_chans,sound_type(type),sound_format(format));
      /* report settings also? (they can change) */

      record_report(rec,str);
      free(str);
      if (rec->autoload)
	{
	  if ((sp = find_sound(ss,output_filename)))
	    snd_update(ss,sp);
	  else snd_open_file(output_filename,ss);
	}
    }
  XtVaSetValues(rec->wids[reset_button],XmNlabelString,s1,NULL);
  XmStringFree(s1);
  XtVaSetValues(rec->wids[record_button],XmNlabelString,s2,NULL);
  XmStringFree(s2);
}

static void Record_Header_Type_Callback(Widget w,XtPointer clientData,XtPointer callData) 
{
  int pos,hpos,dpos,type = 0,format = 0;
  XmListCallbackStruct *cbs = (XmListCallbackStruct *)callData;
  Widget *fwids = (Widget *)clientData;
  pos = cbs->item_position;
  switch (pos)
    {
    case 1: type = NeXT_sound_file; format = snd_16_linear; break;
    case 2: type = AIFF_sound_file; format = snd_16_linear; break;
    case 3: type = RIFF_sound_file; format = snd_16_linear_little_endian; break;
    case 4: type = IRCAM_sound_file; format = snd_16_linear; break;
    case 5: type = raw_sound_file; format = COMPATIBLE_FORMAT; break;
    }
  load_header_and_data_lists(fwids[fdata_hlist],fwids[fdata_dlist],type,format,&hpos,&dpos);
}


/* -------------------------------- RECORDER INVOCATION -------------------------------- */

void snd_record_file(snd_state *ss)
{
  Arg args[32];
  int n,i,m,pane_size,offset,amp_sliders;
  XmString xhelp,xdismiss,xreset,titlestr,labelstr,s1;
  Widget last_widget;
  AMP *curamp;
  Position pane_max;
  Widget *fwids;
  Atom wm_delete;
  float curval;
  if (!rec)
    {
      /* create recording dialog */
      rec = (REC *)calloc(1,sizeof(REC));
      rec->wids = (Widget *)calloc(REC_WIDGETS,sizeof(Widget));
      rec->meters = (VU **)calloc(REC_VU_METERS,sizeof(VU *));
      rec->amps = (AMP **)calloc(REC_AMPS,sizeof(AMP *));
      rec->pane_sizes = (Position *)calloc(REC_PANES,sizeof(Position));
      rec->maxes = (float *)calloc(REC_VU_METERS,sizeof(float));
      record_buf = (short *)calloc(RECORD_SIZE,sizeof(short));
      monitor_buf = (short *)calloc(RECORD_SIZE,sizeof(short));
      out_buf = (short *)calloc(RECORD_SIZE,sizeof(short));
      fbuf = (float *)calloc(RECORD_SIZE,sizeof(float));
      rec->ss = ss;
      initialize_recorder(ss,rec);

      xdismiss = XmStringCreate(snd_string_Dismiss,XmFONTLIST_DEFAULT_TAG);
      xhelp = XmStringCreate(snd_string_Help,XmFONTLIST_DEFAULT_TAG);
      xreset = XmStringCreate(snd_string_Reset,XmFONTLIST_DEFAULT_TAG);
      titlestr = XmStringCreateLocalized(snd_string_Record);

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNcancelLabelString,xreset); n++;
      XtSetArg(args[n],XmNhelpLabelString,xhelp); n++;
      XtSetArg(args[n],XmNokLabelString,xdismiss); n++;
      XtSetArg(args[n],XmNautoUnmanage,FALSE); n++;
      XtSetArg(args[n],XmNdialogTitle,titlestr); n++;
#if RESIZE_DIALOG
      XtSetArg(args[n],XmNallowResize,TRUE); n++;
      XtSetArg(args[n],XmNresizePolicy,XmRESIZE_ANY); n++;
      XtSetArg(args[n],XmNnoResize,FALSE); n++;
#endif
#if UNSET_TRANSIENT
      XtSetArg(args[n],XmNtransient,FALSE); n++;
#endif
      rec->wids[rec_dialog] = XmCreateTemplateDialog(main_SHELL(ss),snd_string_Record,args,n);
#if UNSET_TRANSIENT
      add_dialog(ss,rec->wids[rec_dialog]);
#endif

      XtAddCallback(rec->wids[rec_dialog],XmNcancelCallback,Reset_Record_Callback,rec);
      XtAddCallback(rec->wids[rec_dialog],XmNhelpCallback,Help_Record_Callback,rec);
      XtAddCallback(rec->wids[rec_dialog],XmNokCallback,Dismiss_Record_Callback,rec);
      XmStringFree(xhelp);
      XmStringFree(xdismiss);
      XmStringFree(xreset);

#ifndef LESSTIF_VERSION
      /* now add the RECORD button to the others at the bottom of the window */
      /* this is a push button from Motif's point of view, but it's behaviour is like a toggle button */
      /* in Lesstif, this causes a segmentation fault, so we move the record button elsewhere */
      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNlabelString,titlestr); n++;
      rec->wids[record_button] = XtCreateManagedWidget("record-button",xmPushButtonWidgetClass,rec->wids[rec_dialog],args,n);
      XtAddCallback(rec->wids[record_button],XmNactivateCallback,Record_Button_Callback,rec);
#endif
      XmStringFree(titlestr);

#ifndef LESSTIF_VERSION
      rec->wids[reset_button] = XtNameToWidget(rec->wids[rec_dialog],"Cancel");
#else
      rec->wids[reset_button] = XmMessageBoxGetChild(rec->wids[rec_dialog],XmDIALOG_CANCEL_BUTTON);
#endif

      if (!(ss->using_schemes))
	{
	  XtVaSetValues(XmMessageBoxGetChild(rec->wids[rec_dialog],XmDIALOG_CANCEL_BUTTON),XmNarmColor,(ss->sgx)->text,NULL);
	  XtVaSetValues(XmMessageBoxGetChild(rec->wids[rec_dialog],XmDIALOG_HELP_BUTTON),XmNarmColor,(ss->sgx)->text,NULL);
	  XtVaSetValues(XmMessageBoxGetChild(rec->wids[rec_dialog],XmDIALOG_OK_BUTTON),XmNarmColor,(ss->sgx)->text,NULL);
	}

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
#ifdef LESSTIF_VERSION
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
#else
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNbottomWidget,XmMessageBoxGetChild(rec->wids[rec_dialog],XmDIALOG_SEPARATOR)); n++;
#endif
      XtSetArg(args[n],XmNallowResize,TRUE); n++;
      XtSetArg(args[n],XmNsashHeight,10); n++;
      XtSetArg(args[n],XmNsashWidth,10); n++;
      XtSetArg(args[n],XmNsashIndent,-1); n++; /* need room for icons -- default is -10 */
      rec->wids[rec_panes] = XtCreateManagedWidget("rec-panes",xmPanedWindowWidgetClass,rec->wids[rec_dialog],args,n);

      for (i=0;i<REC_PANES;i++)
	{
	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNallowResize,TRUE); n++;
	  /* need to set maximum size for each so that they can't be opened too much */
	  switch (i)
	    {
	    case 0: rec->wids[line_pane] = XtCreateManagedWidget("record-line-pane",xmFormWidgetClass,rec->wids[rec_panes],args,n); break;
	    case 1: rec->wids[mic_pane] = XtCreateManagedWidget("record-mic-pane",xmFormWidgetClass,rec->wids[rec_panes],args,n); break;
	    case 2: rec->wids[out_pane] = XtCreateManagedWidget("record-out-pane",xmFormWidgetClass,rec->wids[rec_panes],args,n); break;
	    case 3: rec->wids[file_pane] = XtCreateManagedWidget("record-file-pane",xmFormWidgetClass,rec->wids[rec_panes],args,n); break;
	    case 4: rec->wids[message_pane] = XtCreateManagedWidget("record-message-pane",xmFormWidgetClass,rec->wids[rec_panes],args,n); break;
	    }
	}

      XtManageChild(rec->wids[rec_dialog]);

      if (!meter_allocated) 
	{
	  allocate_meter(rec->wids[rec_dialog],
			 XLoadQueryFont(XtDisplay(rec->wids[rec_dialog]),"-*-courier-bold-r-*-*-12-*-*-*-*-*-iso8859-1"),
			 ss,
			 (ss->sgx)->red);
	  make_record_icons(rec->wids[rec_dialog],ss);
	}

      /* ---------------- INPUT/OUTPUT PANES ---------------- */

      pane_size = mic_pane - line_pane; /* pane_size refers to the widget array, not the pane size */

      for (m=0,offset=0;m<3;m++,offset+=pane_size)
	{
	  n=0;
	  if (!(ss->using_schemes)) {XtSetArg(args[n],XmNbackground,(ss->sgx)->black); n++;}
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNshadowType,XmSHADOW_ETCHED_IN); n++;
	  XtSetArg(args[n],XmNshadowThickness,6); n++;
	  rec->wids[line_1_frame+offset] = XtCreateManagedWidget("frame",xmFrameWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  XtSetArg(args[n],XmNbackground,(ss->sgx)->white); n++;
	  XtSetArg(args[n],XmNforeground,(ss->sgx)->black); n++;
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNwidth,CENTER_X*2); n++;
	  XtSetArg(args[n],XmNheight,LIGHT_Y); n++;
	  XtSetArg(args[n],XmNallowResize,FALSE); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)(m*2)); n++;
	  rec->wids[line_vu_1+offset] = XtCreateManagedWidget("vu-1",xmDrawingAreaWidgetClass,rec->wids[line_1_frame+offset],args,n);
	  rec->meters[m*2] = make_vu_meter(rec->wids[line_vu_1+offset],LIGHT_X,LIGHT_Y,CENTER_X,CENTER_Y,(ss->sgx)->black,rec,ss);
	  XtAddCallback(rec->wids[line_vu_1+offset],XmNexposeCallback,Meter_Display_Callback,rec->meters[m*2]);
	  XtAddCallback(rec->wids[line_vu_1+offset],XmNresizeCallback,Meter_Display_Callback,rec->meters[m*2]);
	  XtAddCallback(rec->wids[line_vu_1+offset],XmNhelpCallback,Meter_Help_Callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) {XtSetArg(args[n],XmNbackground,(ss->sgx)->black); n++;}
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_1_frame+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNshadowType,XmSHADOW_ETCHED_IN); n++;
	  XtSetArg(args[n],XmNshadowThickness,6); n++;
	  rec->wids[line_2_frame+offset] = XtCreateManagedWidget("frame",xmFrameWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  XtSetArg(args[n],XmNbackground,(ss->sgx)->white); n++;
	  XtSetArg(args[n],XmNforeground,(ss->sgx)->black); n++;
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNwidth,CENTER_X*2); n++;
	  XtSetArg(args[n],XmNheight,LIGHT_Y); n++;
	  XtSetArg(args[n],XmNallowResize,FALSE); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)(1+m*2)); n++;
	  rec->wids[line_vu_2+offset] = XtCreateManagedWidget("vu-2",xmDrawingAreaWidgetClass,rec->wids[line_2_frame+offset],args,n);
	  rec->meters[1+m*2] = make_vu_meter(rec->wids[line_vu_2+offset],LIGHT_X,LIGHT_Y,CENTER_X,CENTER_Y,(ss->sgx)->black,rec,ss);
	  XtAddCallback(rec->wids[line_vu_2+offset],XmNexposeCallback,Meter_Display_Callback,rec->meters[1+m*2]);
	  XtAddCallback(rec->wids[line_vu_2+offset],XmNresizeCallback,Meter_Display_Callback,rec->meters[1+m*2]);
	  XtAddCallback(rec->wids[line_vu_2+offset],XmNhelpCallback,Meter_Help_Callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	  XtSetArg(args[n],XmNbottomWidget,rec->wids[line_2_frame+offset]); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_2_frame+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNseparatorType,XmNO_LINE); n++;
	  XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
	  XtSetArg(args[n],XmNwidth,10); n++;
	  rec->wids[line_sep+offset] = XtCreateManagedWidget("sep",xmSeparatorWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNlabelType,XmPIXMAP); n++;
	  switch (m)
	    {
	    case 0: XtSetArg(args[n],XmNlabelPixmap,liner); n++; break;
	    case 1: XtSetArg(args[n],XmNlabelPixmap,micer); n++; break;
	    case 2: XtSetArg(args[n],XmNlabelPixmap,speaker); n++; break;
	    }
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNwidth,30); n++;
	  XtSetArg(args[n],XmNalignment,XmALIGNMENT_CENTER); n++;
	  rec->wids[line_in_icon+offset] = XtCreateManagedWidget("icon",xmLabelWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_zoom_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_in_icon+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
	  XtSetArg(args[n],XmNwidth,15); n++;
	  switch (m)
	    {
	      case 0: XtSetArg(args[n],XmNvalue,rec->in_line2); n++; break;
	      case 1: XtSetArg(args[n],XmNvalue,rec->in_mic2); n++; break;
	      case 2: XtSetArg(args[n],XmNvalue,rec->speaker2); n++; break;
	    }
	  XtSetArg(args[n],XmNshowValue,FALSE); n++;
	  XtSetArg(args[n],XmNuserData,m); n++;
	  rec->wids[line_in2_slider+offset] = XtCreateManagedWidget("mon",xmScaleWidgetClass,rec->wids[line_pane+offset],args,n);
	  XtAddCallback(rec->wids[line_in2_slider+offset],XmNvalueChangedCallback,volume_callback,rec);
	  XtAddCallback(rec->wids[line_in2_slider+offset],XmNdragCallback,volume_callback,rec);
	  XtAddCallback(rec->wids[line_in2_slider+offset],XmNhelpCallback,volume_help_callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_zoom_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_in2_slider+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in2_slider+offset]); n++;
	  XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
	  XtSetArg(args[n],XmNwidth,15); n++;
	  switch (m)
	    {
	      case 0: XtSetArg(args[n],XmNvalue,rec->in_line1); n++; break;
	      case 1: XtSetArg(args[n],XmNvalue,rec->in_mic1); n++; break;
	      case 2: XtSetArg(args[n],XmNvalue,rec->speaker1); n++; break;
	    }
	  XtSetArg(args[n],XmNshowValue,FALSE); n++;
	  XtSetArg(args[n],XmNuserData,m); n++;
	  rec->wids[line_in1_slider+offset] = XtCreateManagedWidget("mon",xmScaleWidgetClass,rec->wids[line_pane+offset],args,n);
	  XtAddCallback(rec->wids[line_in1_slider+offset],XmNvalueChangedCallback,volume_callback,rec);
	  XtAddCallback(rec->wids[line_in1_slider+offset],XmNdragCallback,volume_callback,rec);
	  XtAddCallback(rec->wids[line_in1_slider+offset],XmNhelpCallback,volume_help_callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in1_slider+offset]); n++;
	  XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
	  XtSetArg(args[n],XmNwidth,10); n++;
	  XtSetArg(args[n],XmNseparatorType,XmNO_LINE); n++;
	  rec->wids[line_in_sep+offset] = XtCreateManagedWidget("ff-sep5",xmSeparatorWidgetClass,rec->wids[line_pane+offset],args,n);      


	  n=0;
	  if (!(ss->using_schemes)) n = background_high_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_sep+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in_sep+offset]); n++;
	  rec->wids[line_label+offset] = XtCreateManagedWidget(pane_labels[m],xmLabelWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_label+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_sep+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in_sep+offset]); n++;
	  rec->wids[line_data+offset] = XtCreateManagedWidget("data",xmFormWidgetClass,rec->wids[line_pane+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION); n++;
	  XtSetArg(args[n],XmNrightPosition,50); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)m); n++;
	  rec->wids[line_1_on+offset] = XtCreateManagedWidget("A",xmPushButtonWidgetClass,rec->wids[line_data+offset],args,n);
	  XtAddCallback(rec->wids[line_1_on+offset],XmNactivateCallback,Meter_Button_Callback,rec->meters[m*2]);
	  XtAddCallback(rec->wids[line_1_on+offset],XmNhelpCallback,VU_On_Help_Callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	  XtSetArg(args[n],XmNbottomWidget,rec->wids[line_1_on+offset]); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_1_on+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)m); n++;
	  rec->wids[line_2_on+offset] = XtCreateManagedWidget("B",xmPushButtonWidgetClass,rec->wids[line_data+offset],args,n);
	  XtAddCallback(rec->wids[line_2_on+offset],XmNactivateCallback,Meter_Button_Callback,rec->meters[1+m*2]);
	  XtAddCallback(rec->wids[line_2_on+offset],XmNhelpCallback,VU_On_Help_Callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_1_on+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION); n++;
	  XtSetArg(args[n],XmNrightPosition,50); n++;
	  XtSetArg(args[n],XmNshadowType,XmSHADOW_ETCHED_OUT); n++;
	  rec->wids[line_1_max_frame+offset] = XtCreateManagedWidget("max-frame1",xmFrameWidgetClass,rec->wids[line_data+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNrecomputeSize,FALSE); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)m); n++;
	  rec->wids[line_1_max+offset] = XtCreateManagedWidget("0.000",xmLabelWidgetClass,rec->wids[line_1_max_frame+offset],args,n);
	  XtAddCallback(rec->wids[line_1_max+offset],XmNhelpCallback,VU_Max_Help_Callback,rec);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_2_on+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_1_max_frame+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNshadowType,XmSHADOW_ETCHED_OUT); n++;
	  rec->wids[line_2_max_frame+offset] = XtCreateManagedWidget("max-frame2",xmFrameWidgetClass,rec->wids[line_data+offset],args,n);

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNuserData,(XtPointer)m); n++;
	  XtSetArg(args[n],XmNrecomputeSize,FALSE); n++;
	  rec->wids[line_2_max+offset] = XtCreateManagedWidget("0.000",xmLabelWidgetClass,rec->wids[line_2_max_frame+offset],args,n);
	  XtAddCallback(rec->wids[line_2_max+offset],XmNhelpCallback,VU_Max_Help_Callback,rec);

	  labelstr = XmStringCreate(snd_string_Reset,XmFONTLIST_DEFAULT_TAG);
	  n=0;
	  if (!(ss->using_schemes)) 
	    {
	      n = background_main_color(args,n,ss);
	      XtSetArg(args[n],XmNarmColor,(ss->sgx)->text); n++;
	    }
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_data+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	  XtSetArg(args[n],XmNbottomWidget,rec->wids[line_sep+offset]); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNleftWidget,rec->wids[line_sep+offset]); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in_sep+offset]); n++;
	  XtSetArg(args[n],XmNlabelString,labelstr); n++;
	  XtSetArg(args[n],XmNuserData,(XtPointer)m); n++;
	  rec->wids[line_reset+offset] = XtCreateManagedWidget("reset",xmPushButtonWidgetClass,rec->wids[line_pane+offset],args,n);
	  XtAddCallback(rec->wids[line_reset+offset],XmNactivateCallback,VU_Reset_Callback,rec);
	  XtAddCallback(rec->wids[line_reset+offset],XmNhelpCallback,VU_Reset_Help_Callback,rec);
	  XmStringFree(labelstr);

	  /* now the amp sliders across the bottom of the pane, with 'mixer' info on the right */

	  n=0;
	  if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNtopWidget,rec->wids[line_1_frame+offset]); n++;
	  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	  XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	  XtSetArg(args[n],XmNrightWidget,rec->wids[line_in_sep+offset]); n++;
	  XtSetArg(args[n],XmNseparatorType,XmNO_LINE); n++;
	  XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
	  XtSetArg(args[n],XmNheight,10); n++;
	  rec->wids[line_amp_sep+offset] = XtCreateManagedWidget("amp-sep",xmSeparatorWidgetClass,rec->wids[line_pane+offset],args,n);
	  last_widget = rec->wids[line_amp_sep+offset];

	  if (m == 2) amp_sliders = 2; else amp_sliders = 4;

	  for (i=0;i<amp_sliders;i++)
	    {
	      n=0;      
	      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	      XtSetArg(args[n],XmNalignment,XmALIGNMENT_BEGINNING); n++;	
	      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
	      XtSetArg(args[n],XmNtopWidget,last_widget); n++;
	      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
	      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
	      XtSetArg(args[n],XmNmarginHeight,CONTROLS_MARGIN); n++;
	      XtSetArg(args[n],XmNrecomputeSize,FALSE); n++;
	      XtSetArg(args[n],XmNshadowThickness,0); n++;
	      XtSetArg(args[n],XmNhighlightThickness,0); n++;
	      XtSetArg(args[n],XmNfillOnArm,FALSE); n++;
	      XtSetArg(args[n],XmNuserData,(XtPointer)(i+m*4)); n++;
	      rec->wids[line_amp + i + offset] = XtCreateManagedWidget(amp_labels[i+m*4],xmPushButtonWidgetClass,rec->wids[line_pane+offset],args,n);
	      last_widget = rec->wids[line_amp + i + offset];
	      XtAddCallback(rec->wids[line_amp + i + offset],XmNactivateCallback,Record_Amp_Click_Callback,(XtPointer)(rec->amps[i+m*4]));
	      XtAddCallback(rec->wids[line_amp+i+offset],XmNhelpCallback,amp_slider_help_Callback,rec);

#if OVERRIDE_TOGGLE
	      override_toggle_translation(last_widget);
#endif
	      XtVaGetValues(rec->wids[line_amp + i + offset],XmNy,&pane_max,NULL);
	      rec->pane_sizes[m] = pane_max + 30; /* upper left corner, need 16 for slider + margin */

	      n=0;
	      if ((i == 2) || (i == 3))
		s1=XmStringCreateLtoR(record_zero,XmFONTLIST_DEFAULT_TAG);
	      else s1=XmStringCreateLtoR(record_one,XmFONTLIST_DEFAULT_TAG);
	      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
	      XtSetArg(args[n],XmNalignment,XmALIGNMENT_BEGINNING); n++;	
	      XtSetArg(args[n],XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	      XtSetArg(args[n],XmNtopWidget,last_widget); n++;
	      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	      XtSetArg(args[n],XmNleftWidget,last_widget); n++;
	      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
	      XtSetArg(args[n],XmNlabelString,s1); n++;
	      XtSetArg(args[n],XmNmarginHeight,CONTROLS_MARGIN); n++;
	      XtSetArg(args[n],XmNrecomputeSize,FALSE); n++;
	      XtSetArg(args[n],XmNuserData,(XtPointer)(i+m*4)); n++;
	      rec->wids[line_amp_number + i + offset] = XtCreateManagedWidget ("amp-number",xmLabelWidgetClass,rec->wids[line_pane+offset],args,n);
	      XtAddCallback(rec->wids[line_amp_number+i+offset],XmNhelpCallback,amp_slider_help_Callback,rec);
	      XmStringFree(s1);

	      n=0;      
	      if (!(ss->using_schemes)) n = background_scale_color(args,n,ss);
	      XtSetArg(args[n],XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
	      XtSetArg(args[n],XmNtopWidget,rec->wids[line_amp_number + i + offset]); n++;
	      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
	      XtSetArg(args[n],XmNheight,16); n++;
	      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
	      XtSetArg(args[n],XmNleftWidget,rec->wids[line_amp_number + i + offset]); n++;
	      XtSetArg(args[n],XmNrightAttachment,XmATTACH_WIDGET); n++;
	      XtSetArg(args[n],XmNrightWidget,rec->wids[line_in_sep+offset]); n++;
	      XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
	      XtSetArg(args[n],XmNmaximum,RECORD_SCROLLBAR_MAX); n++;
	      if ((i == 2) || (i == 3))
		{
		  XtSetArg(args[n],XmNvalue,0); n++;
		  curval = 0.0;
		}
	      else 
		{
		  XtSetArg(args[n],XmNvalue,(int)(RECORD_SCROLLBAR_MID)); n++;
		  curval = 1.0;
		}
	      XtSetArg(args[n],XmNuserData,(XtPointer)(i+m*4)); n++;
	      XtSetArg(args[n],XmNdragCallback,make_callback_list(Record_Amp_Drag_Callback,(XtPointer)(rec->amps[i+m*4]))); n++;
	      XtSetArg(args[n],XmNvalueChangedCallback,make_callback_list(Record_Amp_ValueChanged_Callback,(XtPointer)(rec->amps[i+m*4]))); n++;
	      rec->wids[line_amp_slider + i + offset] = XtCreateManagedWidget("amp",xmScrollBarWidgetClass,rec->wids[line_pane+offset],args,n);
	      XtAddCallback(rec->wids[line_amp_slider+i+offset],XmNhelpCallback,amp_slider_help_Callback,rec);

	      curamp = rec->amps[i+m*4];
	      curamp->label = rec->wids[line_amp + i + offset];
	      curamp->number = rec->wids[line_amp_number + i + offset];
	      curamp->slider = rec->wids[line_amp_slider + i + offset];
	      curamp->ss = ss;
	      curamp->which_amp = i + 2 + m*6;
	      curamp->amp = ss->record_amps[curamp->which_amp];
	      if (curamp->amp != curval) XmScrollBarSetValues(curamp->slider,amp_to_slider(curamp->amp),0,0,0,TRUE);

	    } /* sliders loop */
	}     /* IO panes loop */


      /* ---------------- FILE INFO PANE ---------------- */

      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      rec->wids[file_form] = XtCreateManagedWidget("file-data",xmFormWidgetClass,rec->wids[file_pane],args,n);

      n=0;
      if (!(ss->using_schemes)) {XtSetArg(args[n],XmNbackground,(ss->sgx)->black); n++;}
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
      XtSetArg(args[n],XmNseparatorType,XmDOUBLE_LINE); n++;
      XtSetArg(args[n],XmNheight,15); n++;
      rec->wids[ff_sep4] = XtCreateManagedWidget("ff-sep4",xmSeparatorWidgetClass,rec->wids[file_form],args,n);
      
      /* file data */
      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep4]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
      rec->wids[ff_form] = XtCreateManagedWidget("ff-form",xmFormWidgetClass,rec->wids[file_form],args,n);

      n=0;
      if (!(ss->using_schemes)) {XtSetArg(args[n],XmNbackground,(ss->sgx)->red); n++;}
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
      /* XtSetArg(args[n],XmNheight,34); n++; */
      XtSetArg(args[n],XmNmarginTop,8); n++;
      XtSetArg(args[n],XmNmarginBottom,8); n++;
      rec->wids[file_label] = XtCreateManagedWidget(snd_string_file_p,xmLabelWidgetClass,rec->wids[ff_form],args,n);
      XtAddCallback(rec->wids[file_label],XmNhelpCallback,file_label_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[file_label]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[file_label]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      rec->wids[file_text] = sndCreateTextFieldWidget(ss,"text",rec->wids[ff_form],args,n);
      XtAddCallback(rec->wids[file_text],XmNhelpCallback,file_label_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[file_text]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
      XtSetArg(args[n],XmNheight,10); n++;
      rec->wids[ff_sep3] = XtCreateManagedWidget("ff-sep3",xmSeparatorWidgetClass,rec->wids[ff_form],args,n);      

      n=0;
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep3]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      fwids = sndCreateFileDataForm(ss,rec->wids[ff_form],"data-form",args,n,TRUE,ss->record_type,ss->record_format);
      /* packaged up in its own form = fdata_form */
      XtAddCallback(fwids[fdata_hlist],XmNbrowseSelectionCallback,Record_Header_Type_Callback,fwids);
      sprintf(timbuf,"%d",ss->record_srate);
      XmTextSetString(fwids[fdata_stext],timbuf);
      sprintf(timbuf,"%d",ss->record_chans);
      XmTextSetString(fwids[fdata_ctext],timbuf);
      for (i=0;i<FILE_DATA_WIDGETS;i++) XmChangeColor(fwids[i],(ss->sgx)->main);
      map_over_children(XtParent(fwids[fdata_dlist]),set_main_color_of_widget,(void *)ss);
      XtVaSetValues(fwids[fdata_hlist],XmNbackground,(ss->sgx)->white,NULL);
      XtVaSetValues(fwids[fdata_dlist],XmNbackground,(ss->sgx)->white,NULL);
      rec->wids[format_list] = fwids[fdata_dlist];
      rec->wids[type_list] = fwids[fdata_hlist];
      rec->wids[srate_text] = fwids[fdata_stext];
      rec->wids[chans_text] = fwids[fdata_ctext];

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);      
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,fwids[fdata_form]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
      rec->wids[comment_label] = XtCreateManagedWidget(snd_string_comment_p,xmLabelWidgetClass,rec->wids[ff_form],args,n);
      XtAddCallback(rec->wids[comment_label],XmNhelpCallback,comment_label_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[comment_label]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[comment_label]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      rec->wids[comment_text] = sndCreateTextFieldWidget(ss,"comment",rec->wids[ff_form],args,n);
      XtAddCallback(rec->wids[comment_text],XmNhelpCallback,comment_label_help_callback,rec);
      
      XtVaGetValues(rec->wids[comment_text],XmNy,&pane_max,NULL);
      rec->pane_sizes[3] = pane_max + 50;

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep4]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[ff_form]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
      XtSetArg(args[n],XmNwidth,15); n++;
      rec->wids[ff_sep1] = XtCreateManagedWidget("ff-sep1",xmSeparatorWidgetClass,rec->wids[file_form],args,n);      



      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep4]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[ff_sep1]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE); n++;
      rec->wids[duration_label] = XtCreateManagedWidget(snd_string_duration_p,xmLabelWidgetClass,rec->wids[file_form],args,n);
      XtAddCallback(rec->wids[duration_label],XmNhelpCallback,duration_label_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) n = background_text_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep4]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[duration_label]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrecomputeSize,FALSE); n++;
      rec->wids[file_duration] = XtCreateManagedWidget("0.0",xmLabelWidgetClass,rec->wids[file_form],args,n);
      XtAddCallback(rec->wids[file_duration],XmNhelpCallback,duration_label_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[file_duration]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[ff_sep1]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNorientation,XmHORIZONTAL); n++;
      XtSetArg(args[n],XmNheight,10); n++;
      rec->wids[ff_sep2] = XtCreateManagedWidget("ff-sep2",xmSeparatorWidgetClass,rec->wids[file_form],args,n);      

      /* buttons */
      n=0;
      if (!(ss->using_schemes)) n = background_zoom_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNtopWidget,rec->wids[ff_sep2]); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++;
      XtSetArg(args[n],XmNleftWidget,rec->wids[ff_sep1]); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNshadowThickness,4); n++;
      rec->wids[button_frame] = XtCreateManagedWidget("button-frame",xmFrameWidgetClass,rec->wids[file_form],args,n);

      n=0;
      if (!(ss->using_schemes)) n = background_high_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNorientation,XmVERTICAL); n++;
      XtSetArg(args[n],XmNspacing,0); n++;
      rec->wids[button_holder] = XtCreateManagedWidget("button-holder",xmRowColumnWidgetClass,rec->wids[button_frame],args,n);
      XtAddCallback(rec->wids[button_holder],XmNhelpCallback,button_holder_help_callback,rec);

      n=0;
      if (!(ss->using_schemes)) 
	{
	  n = background_high_color(args,n,ss);
	  XtSetArg(args[n],XmNselectColor,(ss->sgx)->red); n++;
	}
      rec->wids[line_on] = XtCreateManagedWidget(snd_string_Line_Panel,xmToggleButtonWidgetClass,rec->wids[button_holder],args,n);
      rec->wids[mic_on] = XtCreateManagedWidget(snd_string_Mic_Panel,xmToggleButtonWidgetClass,rec->wids[button_holder],args,n);
      rec->wids[file_on] = XtCreateManagedWidget(snd_string_Output_Panel,xmToggleButtonWidgetClass,rec->wids[button_holder],args,n);
      rec->wids[line_digital] = XtCreateManagedWidget(snd_string_Digital_Line_In,xmToggleButtonWidgetClass,rec->wids[button_holder],args,n);
      rec->wids[autoload_file] = XtCreateManagedWidget(snd_string_Autoload_Recording,xmToggleButtonWidgetClass,rec->wids[button_holder],args,n);

      XmToggleButtonSetState(rec->wids[line_on],ss->record_line_panel,(!(ss->record_line_panel)));
      XmToggleButtonSetState(rec->wids[mic_on],ss->record_mic_panel,(!(ss->record_mic_panel)));
      XmToggleButtonSetState(rec->wids[file_on],ss->record_out_panel,(!(ss->record_out_panel)));
      XmToggleButtonSetState(rec->wids[autoload_file],ss->record_autoload,FALSE);
      XmToggleButtonSetState(rec->wids[line_digital],ss->record_digital,FALSE);

      XtAddCallback(rec->wids[line_on],XmNvalueChangedCallback,line_on_callback,rec);
      XtAddCallback(rec->wids[line_on],XmNhelpCallback,line_on_help_callback,rec);
      XtAddCallback(rec->wids[mic_on],XmNvalueChangedCallback,mic_on_callback,rec);
      XtAddCallback(rec->wids[mic_on],XmNhelpCallback,mic_on_help_callback,rec);
      XtAddCallback(rec->wids[file_on],XmNvalueChangedCallback,file_on_callback,rec);
      XtAddCallback(rec->wids[file_on],XmNhelpCallback,file_on_help_callback,rec);
      XtAddCallback(rec->wids[line_digital],XmNvalueChangedCallback,line_digital_callback,rec);
      XtAddCallback(rec->wids[line_digital],XmNhelpCallback,line_digital_help_callback,rec);
      XtAddCallback(rec->wids[autoload_file],XmNvalueChangedCallback,autoload_file_callback,rec);
      XtAddCallback(rec->wids[autoload_file],XmNhelpCallback,autoload_file_help_callback,rec);



      /* ---------------- MESSAGE PANE ---------------- */
      /* we need a way to communicate various messages to the user with history (time stamped list) */
	  
      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++;
      XtSetArg(args[n],XmNeditMode,XmMULTI_LINE_EDIT); n++;
      XtSetArg(args[n],XmNscrollBarDisplayPolicy,XmAS_NEEDED); n++;
      XtSetArg(args[n],XmNeditable,FALSE); n++;
      XtSetArg(args[n],XmNautoShowCursorPosition,FALSE); n++;
      XtSetArg(args[n],XmNcursorPositionVisible,FALSE); n++;
      XtSetArg(args[n],XmNscrollingPolicy,XmAUTOMATIC); n++;
      rec->wids[messages] = XmCreateScrolledText(rec->wids[message_pane],"scrolled-text",args,n);
      XtManageChild(rec->wids[messages]);
      map_over_children(XtParent(rec->wids[messages]),set_main_color_of_widget,(void *)ss);
      XtVaSetValues(rec->wids[messages],XmNbackground,(ss->sgx)->text,NULL);
      XtAddCallback(rec->wids[messages],XmNhelpCallback,Messages_Help_Callback,rec);

      if (!(ss->using_schemes)) map_over_children(rec->wids[rec_panes],color_sashes,(void *)ss);
      /* now try to get some reasonable initial pane sizes */
      XtVaSetValues(rec->wids[line_pane],XmNpaneMaximum,rec->pane_sizes[0],NULL);
      XtVaSetValues(rec->wids[mic_pane],XmNpaneMaximum,rec->pane_sizes[1],NULL);
      XtVaSetValues(rec->wids[out_pane],XmNpaneMaximum,rec->pane_sizes[2],NULL);
      XtVaSetValues(rec->wids[file_pane],XmNpaneMaximum,rec->pane_sizes[3],NULL);
      XtVaSetValues(rec->wids[message_pane],XmNpaneMinimum,12,NULL);

#ifdef LESSTIF_VERSION
      XtVaSetValues(rec->wids[line_pane],XmNheight,rec->pane_sizes[0],NULL);
      XtVaSetValues(rec->wids[mic_pane],XmNheight,rec->pane_sizes[1],NULL);
      XtVaSetValues(rec->wids[out_pane],XmNheight,rec->pane_sizes[2],NULL);
      XtVaSetValues(rec->wids[file_pane],XmNheight,rec->pane_sizes[3],NULL);
      XtVaSetValues(rec->wids[message_pane],XmNheight,12,NULL);
#endif

#ifdef LESSTIF_VERSION
      n=0;
      if (!(ss->using_schemes)) n = background_main_color(args,n,ss);
      rec->wids[record_button] = XtCreateManagedWidget(snd_string_Record,xmPushButtonWidgetClass,rec->wids[rec_dialog],args,n);
      XtAddCallback(rec->wids[record_button],XmNactivateCallback,Record_Button_Callback,rec);
#endif

      /* in case caller closes (via window menu) dialog: */
      wm_delete = XmInternAtom(XtDisplay(rec->wids[rec_dialog]),"WM_DELETE_WINDOW",FALSE);
      XmAddWMProtocolCallback(XtParent(rec->wids[rec_dialog]),wm_delete,RecordCleanupCB,(XtPointer)ss);
    }
  else 
    {
      raise_dialog(rec->wids[rec_dialog]);
    }
  if (!XtIsManaged(rec->wids[rec_dialog])) XtManageChild(rec->wids[rec_dialog]);
  XtVaSetValues(rec->wids[message_pane],XmNpaneMinimum,1,NULL);
  if (!audio_open) fire_up_recorder(rec);


  /* geez -- it would be nice if anything would work... */
#if HAVE_OSS
  record_report(rec,
"This version of the recorder is 'under construction' --\n\
please send bug reports to bil@ccrma.stanford.edu."
);
#endif
#ifdef SGI
  #ifdef AL_RESOURCE
    record_report(rec,
"This version of the recorder using the new SGI audio library\n\
is screwed up.  The microphone input will appear in the 'Line In'\n\
panel, and input gains may be scrambled or inoperative."
);
  #endif
#endif
#ifdef SUN
    record_report(rec,"Snd's Sun audio support is sketchy at best");
#endif
}

static void error_report(char *msg, int err)
{
  char *str;
  if (err != 0)
    {
      str = (char *)calloc(128,sizeof(char));
      sprintf(str,"audio error: %s: %s",msg,strerror(err));
      record_report(rec,str);
      free(str);
    }
  else record_report(rec,msg);
}

void lock_recording_audio(void)
{
  if ((rec) && (XtIsManaged(rec->wids[rec_dialog])))
    {
      close_audio(0);
      XtSetSensitive(rec->wids[record_button],FALSE);
      XtSetSensitive(rec->wids[reset_button],FALSE);
    }
}

void unlock_recording_audio(void)
{
  XmString s1;
  if ((rec) && (XtIsManaged(rec->wids[rec_dialog])))
    {
      XtSetSensitive(rec->wids[record_button],TRUE);
      XtSetSensitive(rec->wids[reset_button],TRUE);
      XmProcessTraversal(rec->wids[reset_button],XmTRAVERSE_CURRENT);
      s1 = XmStringCreate(snd_string_Restart,XmFONTLIST_DEFAULT_TAG);
      XtVaSetValues(rec->wids[reset_button],XmNlabelString,s1,NULL);
      XmStringFree(s1);
    }
}

int record_in_progress(void)
{
  return((rec) && (rec->recording));
}

/* -------------------------------- XPM VU METER LABEL PIXMAP DATA -------------------------------- */

#if HAVE_XPM
#include <X11/xpm.h>
static char * onlabel_xpm[] = {
"240 160 11 1",
" 	c #FFFFFBFBD2D2",
".	c #FFFFFAFAC8C8",
"X	c #FFFFF8F8B9B9",
"-	c #FFFFF7F7AFAF",
"O	c #FFFF00000000",
"+	c #000000000000",
"@	c #FFFFF6F6A0A0",
"#	c #FFFFF3F38080",
"$	c #FFFFEFEF6060",
"%	c #FFFFECEC4040",
"&	c #FFFFE9E92020",
"             ..........             .................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......                ..................             ",
"            ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................            ",
"           ....         ...........................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............................        ..           ",
"          ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....................               .....          ",
"                 ................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................         ",
"        ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....                       ..............        ",
"       ....   ..............     ..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................            ",
"      ........................................XXX.............XXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................           ",
"         ....................................XXXXXXXXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......................................        ",
"     ..........     ........................XXX...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-----------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..........................             .     ",
"     ..............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX----------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......        ........................     ",
"     .....................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX----------------------------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......................................     ",
"     ....      ............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX--------------------------------------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...........        ..................     ",
"     ..................        .........XXXXXXXXX-XXXXXXXXX--------------------------------------------------------------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................     ",
"     ..................................XXXX....XX-------XXXXX--------------------------------------------------OOOO---------OOOOOO-----------------------------------------------XXXXXXXXXXXXXXXXXXXXXXX.............     .................     ",
"     ......    .......................XXXXXXXXXXXXXXXXXXXX----------------------------------------------------OO--OO--------OO------------------------------------------------------XXXXX----XXXXXXX------...................        ......     ",
"     ................................XXXXXXXXXXXX-------------------------------------------------------------OO--OO--------OO------------------------------------------------------------------XXXXXXXXX-.................................     ",
"     .............. ................XXXXXXXXXXXXX--XXXXXXXXX--------------------------------------------------OO--OO--------OO--------------------------------------------------------XXXXXXXX--------XXX-X................................     ",
"           ........................X..XXXXXXXXXXX-XXXXX-------------------------------------------------------OO--OO--------OOOOO------------------------------------------------------------------XXXXX--XX............             ......     ",
"     ......               ........XXXXXXXXXXXXXXX-------------------------------------------------------------OO--OO------------OO----------------------------------------------------------XXXXXXXX------XXX..............................     ",
"     ............................XXXXXXXXXXXXXXXXXXXXXXX------------------------------------------------------OO--OO------------OO--------------------------------------------------------XXXXXX----------XXXX.............................     ",
"        .............................XXXXXXXXXXXX-------------------------------------------------------------OO--OO---OO---OO--OO--------------------------------------------------------------XXXXXXXXX-XXXXX.........         ..........     ",
"     ..........................XXXXXXXXXXXXXXXXXXXXXX----------------------O-----------------------------------OOOO----OO---OOOOO--------------------------------------OOO--------------------------------XXXXXX...........................     ",
"     .........        ........XX....XXXXXXXXXXXXX------------------------OO-------------------------------------------------------------------------------------------OOOOO------------------------XXXXXXXXXXXX............................     ",
"     .........................XXXXXXXXXXXXXXXXXXX-XXX-------------------OO--------------------------------------------------------------------------------------------OO--OO------------------------XXXXXXXXXXXXXX.........................     ",
"           ......................XXXXXXXXXXXXXXXX-------------------OOO--OO--O---------------------------------------------------------------------------------------OO---OO------------------------------XXXXXXXXX.   ....................     ",
"            .......................XXXXXXXXXXXXXXX----------------OO--OO-OOOO-OO-------------------------------------------------------------------------------------OO---OO------------------------------XXXXXXXX.........................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----------------OO--OO------OO------------------------------------------------------------------------------------OO----OO-------O----------------------XXXXXX...........................     ",
"           ................XXXXX.......XXXXXXXXXXX----------------OO--OO------O-------------------------------------------------------------------------------------OO---OO---------OOO----------------XXXXXXXXXXX.............                 ",
"     ...........................XXXXXXXXXXXXXXXXX------------------O--O----OOOO-------------------------------------------------------------------------------------OO--OO-----------OOOO-----------------XXXXXXXXX........................     ",
"         ..................XXXXXXXXXXXXXXXXXXXXXXX-----OO------------O---O-OO-------------------------------------------++------------------------------------------OOOOO-------------OO------------------XXX....XXX..........       ......     ",
"     ..........................XXXXXXXXXXXXXXXXXX-----OOOOO----------OO-OO----------------------------------------------++-------------------------------------------OOO-------------OO--OOOO----------XX-XXXXXXXXXX.......................     ",
"         ..................XXXXXXXXXXXXXXXXXXXXXXX----O---OO---------O-OOO----------------------------------------------++--------------------------------------------------OO------OO---OO--O------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OO---OO---------OO------------------------------------------------++-------------------------------------------------OO------OO---OO----O--------XXXXXXX.....X....................        ",
"       .......................XXXXXXXXXXXXXXXXXXXX----OO---OO---OO----------------------------@@@@@@@@@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@@@@@@@@@@@@@---------------------------OO-----OO--------------X-XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OO---OO---OO---------------------------@@@@@@@+@@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@@+@@@@@@@@@@@@@@----------------------OO--------OO--------------XXXXXXXXXX........             ..     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX------OO--OO------------------------------@@@@@@@@@+@@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@@+@@@@@@@@@@@@@@@--------------------------------O-------------XXXXXXXXXXX.......................     ",
"     ........................XXXXXXXXXXXXXXXXXXXXX-----OO--OO----------------------------@+@@@@@@@@@+@@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@@+@@@@@@@@@+@@@@@@--------------------------O----OO-------------XXXXXXXXXX...     ...............     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-------OOOO-----------------------------@+@@@@@@@@@@+@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@+@@@@@@@@@@+@@@@@@@--------------------------OO-OOO-------------XX...............................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX---------------------++-----------------@+@@@@@@@@@@+@@@@@@@@+@@@@@@@@@++@@@@@@@+@@@@@@@@+@@@@@@@@@@+@@@@@@@@-----------++--------------OO---------------XXXXXXXXXX.......................     ",
"     ..........................XXXXXXXXXXXXXXXXXX---------------------++---------+-------@@+@@@@@@@@@+@@@@@@@@++++++++++++++++++++++@@@@@@+@@@@@@@@@+@@@@@@@@@+----------++-------------------------------XXX....XXX...........        ....     ",
"     ......................XXXXXXXXXXXXXXXXXXXXX-----------------------++--------+-------@@+@@@@@@@@@+++++++++++++++++++++++++++++++++++++++@@@@@@@@+@@@@@@@@@+@--------++--------------------------------XXXXXXXXXX.......................     ",
"     .............................XXXXXXXXXXXXX------------------------++--------+-------@@+@@@@++++++++++++++@@@@@@@@@@@@@@@@@@@@@@+++++++++++++@@@+@@@@@@@@@+@@-------++--------------------------------XXXX.............................     ",
"     ..............................XXXXXXXXXXXX------------------------+++--------+------@@+++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++@@@@@@@+@@@@-----++---------------------------------XXXXXXX..........................     ",
"     .................................XXXXXXXXX-------------------------++--------+-----+++++++++@@@@@@@@@@@@@+++++++++++++++++++++@@@@@@@@@@@@@@++++++++@@@@+@@@@-----++---------------------------------XXXXXX................................",
"     .................................XXXXXXXXX-------------------------++--@@@@@@+@@+++++++@@@@@@@@@@++++++++@@@@@@@@@@@@@@@@@@@@@++++++++@@@@@@@@@@@++++++++@@@@-----++---------------------------------XXXXXX................................",
"     .................................XXXXXXXXX--------------------------++@@@@@@@+++++++@@@@@@@@+++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++@@@@@@@@@+++++++@@----++----------------------------------XXXXXX................................",
"     .................................XXXXXXXXX---------------+----------++@@@@++++++@@@@@@@+++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++@@@@@@@@++++++@@@++---------+------------------XXXXXXXXXXXX................................",
"     .................................XXXXXXXXX----------------+---------@++++++++@@@@@@@+++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++@@@@@@@@+++++++---------+------------------XXXXXXXXXXXXX................................",
"     .................................XXXXXXXXX----------------+--------@@+++++@@@@@@++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++@@@@@@@+++++--------+----------------XXXXXXXXXXX....................................",
"     ..................................XXXXXXXX-----------------+------++++++@@@@@+++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++@@@@@@+++++-----+----------------.......XXXXX....................................",
"     .................................XXXXXXXXX-----------------+----+++++@@@@@+++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++@@@@@@++++---+----------------XXXXXXXXXXXXXXXX......OOOO......................",
"     ...................................XXXXXXX-------+----------+-+++++@@@@@++@@@@@@@@@@@@@@@@@################################################@@@@@@@@@@@@@@@@@@++@@@@@@+++++----------+------XXXXXXXXXX..............OO......................",
"     ...................OOO...........XXXXXXXXX--------+---------+++++@@@@@++@@@@@@@@@@@@@@@@@@##################################################@@@@@@@@@@@@@@@@@@@++@@@@@@++++--------+-------XXXXXXXXXXXX...X.......OO.......................",
"     ..................OO.OO...............XXXX--------+-------+++++@@@@+++@@@@@@@@@@@@@@@@@@@####################################################@@@@@@@@@@@@@@@@@@@@+++@@@@-++++------+-------XXXXXXXXXXXXXXXX......OO........................",
"     ..................O...OO...........XXXXXXX---------+-----++++@@@@++@@@@@@@@@@@@@@@@@@@@@######################################################@@@@@@@@@@@@@@@@@@@@@@++@@@--++++---+--------XXXXXXXXXX...........OO.........................",
"     ..................OO...OO........XXXXXXXXX---------+---++++-@@@++@@@@@@@@@@@@@@@@@@@@@@########################################################@@@@@@@@@@@@@@@@@@@@@@@++@@---++++-+--------XXXXXXXXXXXXXXXX..O.O.O.........................",
"     ..................OO....OO..........XXXXXX----------+++++---@++@@@@@@@@@@@@@@@@@@@@@@@##########################################################@@@@@@@@@@@@@@@@@@@@@@@@++-----+++---------XXXXXXXXXXXXXXXX..OOOO..........................",
"     ...................OO....O..........XXXX+X---------++++----++@@@@@@@@@@@@@@@@@@@@@@@@############################################################@@@@@@@@@@@@@@@@@@@@@@@@@++-----+++-------XX+XXXXXXXXXXXXX....O...........................",
"     ....................OO..OO.........XXXXXX+--------++++----+-@@@@@@@@@@@@@@@@@@@@@@@@##############################################################@@@@@@@@@@@@@@@@@@@@@@@@--+-----+++------X+XXXXXXXXXXXXXX.....O..........................",
"     ......................OOO........XXXXXXXXX+-----++++----++--@@@@@@@@@@@@@@@@@@@@@@@################################################################@@@@@@@@@@@@@@@@@@--------++-----+++----+XXXXX.......XXX................OOO.............",
"     ...................................XXXXXXX-+---++++---++---------@@@@@@@@@@@@@@@@@##################################################################@@@@@@@@@@@@@@@@@@@@@@-----++----+++--+XXXXXXXXXXXXXXXX.........O.....OO..O............",
"     ........OOOO.....................XXXXXXXXX--+-+++----+------@@@@@@@@@@@@@@@@@@@@@####################################################################@@@@@@@@@@@@@@@@@@@@@-------+-----+++-XXXXXXXXXXXXXXXX........OOO...OO....O...........",
"     .......O...OO.....OO.............XXXXXXXXX--++++---++--------------@@@@@@@@@@@@@######################################################################@@@@@@@@@@@@@@@@@-----------++----+++XXXXXXXXXXXXXXXX.........O....OO...OO...........",
"     .......OO...OO....OO.............+XXXXXXXX-+++----+----------@@@@@@@@@@@@@@@@@@########################################################################@@@@@@@@@@@@@@@@@@@----------+-----++XXXXXXXX+XXXXXX.............OO....OO...........",
"     ........OO...OO..................X+XXXXXXX+++---++-----------------@@@@@@@@@@@##########################################################################@@@@@@@@@@@@@@@@@------------++----+++XXXXX+XXXXXXX.............O....OO............",
"     ........OO...OO..................XX+XXXX++++---+-------------@@@@@@@@@@@@@@@@############################################################################@@@@@@@@@@@@@@@@@-------------+---X+++XXX+XXXXXXXX.............O...OO.............",
"     .........OO...O..................XXX+XX+++----+-------------@@@@@@@@--@@@@@@######################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#######################@@@@@@@@@@@@@@@---------------+--XXX++X+XXXXXXXXX..............OOOO..............",
"     ..........O...O........++........XXXX++++X--++--------------@@@@@@@@@@@@@@@######################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#######################@@@@@@@@@@@@@@@---------------++XXXX++XXXXXXXXXX...++...........................",
"     ...........OOO..........++.......XXXX+++XX-+---------------------@@@@@@@@@@#####################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$######################@@@@@@@@@@@@@-------------------+XXXX+++XXXXXXXX..++............................",
"     .........................++......XXX+++XXX+-----------------@@@@@@@@@@@@@@@####################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#####################@@@@@@@@@@@@@@@-----------------X+XXXX+++XXXXXXX.++.............................",
"     ..........................++.....X+++XXXX+-----------------------@@@@@@@@@@###################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$####################@@@@@@@@@@@@@@------------------XX+XXXXX++XXXXXX++..............................",
"     ...........................++....+++XXX++X-------------------@@@@@@@@@@@@@@##################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###################@@@@@@@@@@@@@@@-----------------XXX++XXXX++XXXX++...............................",
"     ............................++..+++XXX+XXX------------------@@@@@@@@@@@@@@@#################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##################@@@@@@@@@@@@@@@-----------------XXXXX+XXXX++XX++................................",
"     .............................+++.+XXX+XXXX----------------------@@@@@@@@@@@################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#################@@@@@@@@@@@@@@------------------XXXXXX+XXXX++++X................................",
"     ..............................++.XXX+XXXXX------------------@@@@@@@@@@@@@@@###############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$################@@@@@@@@@@@@@@@-----------------XXXXXXX+XXXX++XX................................",
"     ...........................XXXXXXXX+XXXXXX------------------@-@@@@@@@@@@@@@##############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###############@@@@@@@@@@@@@@@-----------------XXXXXXXX+XXXXXXXXXXX.......................     ",
"     ........................XXXXXXXXXX+XXXXXXX-------------------@@@@@@@@@@@@@@#############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##############@@@@@@@@@@@@@@@-----------------XXXXXXXXX+XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXX+XXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXX+XXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX-------------------@@@@@@@@@@@@@@############$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ...........................XXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ..........................XXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     .........................XXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ........................XXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%%%%&&&&&&&&&&&&%%%%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%%%&&&&&&&&&&&&&&%%%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%%&&&&&&&&&&&&&&&&%%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%%&&&&&&&&&&&&&&&&&&%%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------@@@@@@@@@@@@@@@############$$$$$$$$$$%%%%%%%%&&&&&&&&&&&&&&&&&&&&%%%%%%%$$$$$$$$$$#############@@@@@@@@@@@@@@@-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

static char * offlabel_xpm[] = {
"240 160 2 1",
" 	c #FFFFFFFFFFFF",
".	c #000000000000",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                               ....         ......                                                                                                              ",
"                                                                                                              ..  ..        ..                                                                                                                  ",
"                                                                                                              ..  ..        ..                                                                                                                  ",
"                                                                                                              ..  ..        ..                                                                                                                  ",
"                                                                                                              ..  ..        .....                                                                                                               ",
"                                                                                                              ..  ..            ..                                                                                                              ",
"                                                                                                              ..  ..            ..                                                                                                              ",
"                                                                             .                                ..  ..   ..   ..  ..                                                                                                              ",
"                                                                           ..                                  ....    ..   .....                                       ...                                                                     ",
"                                                                         ..                                                                                            .....                                                                    ",
"                                                                        ..                                                                                            ..  ..                                                                    ",
"                                                                   ...   ..  .                                                                                       ..   ..                                                                    ",
"                                                                  ..  .. .... ..                                                                                     ..   ..                                                                    ",
"                                                                  ..  ..      ..                                                                                    ..    ..       .                                                            ",
"                                                                  ..  ..      .                                                                                     ..   ..         ...                                                         ",
"                                                                      .     ....                                                                                    ..  ..           ....                                                       ",
"                                                       ..            .   . ..                                           ..                                          .....             ..                                                        ",
"                                                      .....          .. ..                                              ..                                           ...             ..  ....                                                   ",
"                                                      .  ..          . ...                                              ..                                                  ..      ..   ..  .                                                  ",
"                                                      ..  ..         ..                                                 ..                                                 ..      ..   ..    .                                                 ",
"                                                      ..  ...   ..                                            .         ..       .                                                ..    ..                                                      ",
"                                                      ..   ..   ..                                  .         .         ..       .         .                                     ..       ..                                                    ",
"                                                       ..  ..                                       .         .         ..       .         .                                               .                                                    ",
"                                                       ..  ..                             .         .         .         ..       .         .         .                                .    ..                                                   ",
"                                                        ....                              .          .        .         ..       .        .          .                                 .. ...                                                   ",
"                                                                      ..                  .          .        .         ..       .        .          .                   ..              ..                                                     ",
"                                                                      ..         .         .         .        ......................      .         .         .          ..                                                                     ",
"                                                                       ..        .         .         .......................................        .         .         ..                                                                      ",
"                                                                       ..        .         .    ..............                      .............   .         .         ..                                                                      ",
"                                                                       ...        .        ...........                                      ..........       .         ..                                                                       ",
"                                                                        ..        .     .........             .....................              ........    .         ..                                                                       ",
"                                                                        ..        .  .......          ........                     ........           ........         ..                                                                       ",
"                                                                         ..       .......        .....                                     .....         .......      ..                                                                        ",
"                                                              .          ..    ......       .....                                               .....        ......   ..         .                                                              ",
"                                                               .          ........       ...                                                         ...        .......         .                                                               ",
"                                                               .          .....      ....                                                               ....       .....        .                                                               ",
"                                                                .      ......     ...                                                                       ...      .....     .                                                                ",
"                                                                .    .....     ...                                                                             ...      ....   .                                      ....                      ",
"                                                      .          . .....     ..                                                                                   ..      .....          .                              ..                      ",
"                        ...                            .         .....     ..                                                                                       ..      ....        .                              ..                       ",
"                       .  ..                           .       .....    ...                                                                                           ...     ....      .                             ..                        ",
"                       .   ..                           .     ....    ..                                                                                                 ..     ....   .                             ..                         ",
"                       ..   ..                          .   ....    ..                                                                                                     ..     .... .                          . . .                         ",
"                       ..     .                          .....    ..                                                                                                         ..     ...                            ...                          ",
"                        ..    .              .          ....    ..                                                                                                             ..     ...         .                 .                           ",
"                         ..  ..               .        ....    .                                                                                                                 .     ...       .                   .                          ",
"                           ...                 .     ....    ..                                                                                                                   ..     ...    .                               ...             ",
"                                                .   ....   ..                                                                                                                       ..    ...  .                         .     ..  .            ",
"             ....                                . ...    .                                                                                                                           .     ...                         ...   ..    .           ",
"            .   ..     ..                        ....   ..                                                                                                                             ..    ...                         .    ..   ..           ",
"            ..   ..    ..             .         ...    .                                                                                                                                 .     ..        .                   ..   ...           ",
"             ..   ..                   .       ...   ..                                                                                                                                   ..    ...     .                    .    ..            ",
"             ...  ..                    .    ....   .                                                                                                                                       .    ...   .                     .   ..             ",
"              ..   .                     .  ...    .                                                                                                                                         .     .. .                       ....              ",
"               ..  .        ..            ....   ..                                                                                                                                           ..    ..             ..                           ",
"                 ..          ..           ...   .                                                                                                                                               .    ...          ..                            ",
"                              ..         ...   .                                                                                                                                                 .    ...        ..                             ",
"                               ..      ...    .                                                                                                                                                   .     ..      ..                              ",
"                                ..    ...   ..                                                                                                                                                     ..    ..    ..                               ",
"                                 ..  ...   .                                                                                                                                                         .    ..  ..                                ",
"                                  .....   .                                                                                                                                                           .    ....                                 ",
"                                   ..    .                                                                                                                                                             .    ..                                  ",
"                                        .                                                                                                                                                               .                                       ",
"                                       .                                                                                                                                                                 .                                      ",
"                                      .                                                                                                                                                                   .                                     ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                ",
"                                                                                                                                                                                                                                                "};
static char * cliplabel_xpm[] = {
"240 160 12 1",
" 	c #FFFF69696969",
".	c #FFFF64646464",
"X	c #FFFF5C5C5C5C",
"-	c #FFFF57575757",
"O	c #000000000000",
"+	c #FFFF50505050",
"@	c #FFFF40404040",
"#	c #FFFF30303030",
"$	c #FFFF20202020",
"%	c #FFFF10101010",
"&	c #FFFF08080808",
"*	c #FFFF00000000",
"             ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................             ",
"            ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................            ",
"           ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................           ",
"          ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................          ",
"         ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................         ",
"        ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................        ",
"       ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................       ",
"      ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................      ",
"     ........................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........................................     ",
"     .......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........................................     ",
"     ......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......................................     ",
"     .....................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......................................     ",
"     ....................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....................................     ",
"     ...................................XXXXXXXXX------------------------------------------------------------------------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................     ",
"     ..................................XXXXXXXXXX--------------------------------------------------------------OOOO---------OOOOOO----------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...................................     ",
"     .................................XXXXXXXXXXX-------------------------------------------------------------OO--OO--------OO----------------------------------------------------------------------------.................................     ",
"     ................................XXXXXXXXXXXX-------------------------------------------------------------OO--OO--------OO----------------------------------------------------------------------------.................................     ",
"     ...............................XXXXXXXXXXXXX-------------------------------------------------------------OO--OO--------OO----------------------------------------------------------------------------X................................     ",
"     ..............................XXXXXXXXXXXXXX-------------------------------------------------------------OO--OO--------OOOOO-------------------------------------------------------------------------XX...............................     ",
"     .............................XXXXXXXXXXXXXXX-------------------------------------------------------------OO--OO------------OO------------------------------------------------------------------------XXX..............................     ",
"     ............................XXXXXXXXXXXXXXXX-------------------------------------------------------------OO--OO------------OO------------------------------------------------------------------------XXXX.............................     ",
"     ...........................XXXXXXXXXXXXXXXXX-------------------------------------------------------------OO--OO---OO---OO--OO------------------------------------------------------------------------XXXXX............................     ",
"     ..........................XXXXXXXXXXXXXXXXXX--------------------------O-----------------------------------OOOO----OO---OOOOO--------------------------------------OOO--------------------------------XXXXXX...........................     ",
"     .........................XXXXXXXXXXXXXXXXXXX------------------------OO-------------------------------------------------------------------------------------------OOOOO-------------------------------XXXXXXX..........................     ",
"     ........................XXXXXXXXXXXXXXXXXXXX-----------------------OO--------------------------------------------------------------------------------------------OO--OO------------------------------XXXXXXXX.........................     ",
"     .......................XXXXXXXXXXXXXXXXXXXXX-------------------OO---OO------------------------------------------------------------------------------------------OO---OO------------------------------XXXXXXXXX........................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----------------OO--OO-OOOOOOO-------------------------------------------------------------------------------------OO---OO------------------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----------------OO--OO------OO------------------------------------------------------------------------------------OO---OO--------O----------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----------------O---OO------O-------------------------------------------------------------------------------------OO---OO---------OOO-------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX---------------------O----OOOOO------------------------------------------------------------------------------------OO--OO-----------OOOO-----------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX------OO------------O---O-OO-------------------------------------------OO------------------------------------------OOOOO-------------OO------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OOOOO----------OO-OO----------------------------------------------OO-------------------------------------------OOO-------------OO--OOOO-------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----O---OO---------O-OOO----------------------------------------------OO--------------------------------------------------OO------OO---OO--O------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OO--OO---------OO-------------------------------------------------OO-------------------------------------------------OO------OO---OO----O-----------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OO---OO---OO-----------------------+++++++++++++++++++++O+++++++++OO+++++++O+++++++++++++++++++++++-------------------------OO----OO----------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-----OO---OO---OO-----------------------+++++++++++O+++++++++O+++++++++OO+++++++O+++++++++O++++++++++++++-----------------------OO-------OO--------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX------OO--OO----------------------------+++++++++++O+++++++++O+++++++++OO+++++++O+++++++++O+++++++++++++++--------------------------------O--------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX------OO--OO----------------------------+O+++++++++O+++++++++O+++++++++OO+++++++O+++++++++O+++++++++O++++++--------------------------O----OO-------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX-------OOOO-----------------------------+O++++++++++O++++++++O+++++++++OO+++++++O++++++++O++++++++++O+++++++--------------------------OO-OOO-------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX---------------------OO-----------------+O++++++++++O++++++++O+++++++++OO+++++++O++++++++O++++++++++O++++++++-----------OO--------------OO---------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXXX---------------------OO---------O-------++O+++++++++O++++++++OOOOOOOOOOOOOOOOOOOOOO++++++O+++++++++O+++++++++O----------OO-------------------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXXX-----------------------OO--------O-------++O+++++++++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO++++++++O+++++++++O+--------OO--------------------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------------OO--------O-------++O++++OOOOOOOOOOOOOO++++++++++++++++++++++OOOOOOOOOOOOO+++O+++++++++O++-------OO--------------------------------XXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------------OOO--------O------++OOOOOOOOOOO++++++++++++++++++++++++++++++++++++++OOOOOOOOOO+++++++O++++-----OO---------------------------------XXXXXXXXXX.......................     ",
"     .................................XXXXXXXXX-------------------------OO--------O-----OOOOOOOOO+++++++++++++OOOOOOOOOOOOOOOOOOOOO++++++++++++++OOOOOOOO++++O++++-----OO---------------------------------XXXXXX................................",
"     .................................XXXXXXXXX-------------------------OO--++++++O++OOOOOOO++++++++++OOOOOOOO+++++++++++++++++++++OOOOOOOO+++++++++++OOOOOOOO++++-----OO---------------------------------XXXXXX................................",
"     .................................XXXXXXXXX--------------------------OO+++++++OOOOOOO++++++++OOOOO+++++++++++++++++++++++++++++++++++++OOOOO+++++++++OOOOOOO++----OO----------------------------------XXXXXX................................",
"     .................................XXXXXXXXX---------------O----------OO++++OOOOOO+++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++OOOOOO+++OO---------O--------------XXXXXXXXXXXXXXXX................................",
"     .................................XXXXXXXXX----------------O---------+OOOOOOOO+++++++OOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++++++OOOOOOO---------O---------------XXXXXXXXXXXXXXXX................................",
"     .................................XXXXXXXXX----------------O--------++OOOOO++++++OOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOO+++++++OOOOO--------O---------------XXXXXXXXXXXXXXXX................................",
"     .................................XXXXXXXXX-----------------O------OOOOOO+++++OOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++++OOOOO-----O----------------XXXXXXXXXXXXXXXX................................",
"     .................................XXXXXXXXX-----------------O----OOOOO+++++OOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++++OOOO---O----------------XXXXXXXXXXXXXXXX......OOOO......................",
"     .................................XXXXXXXXX-------O----------O-OOOOO+++++OO+++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++OO++++++OOOOO----------O------XXXXXXXXXXXXXXXX........OO......................",
"     ....................OOO..........XXXXXXXXX--------O---------OOOOO+++++OO++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++OO++++++OOOO--------O-------XXXXXXXXXXXXXXXX.......OO.......................",
"     ...................O..OO.........XXXXXXXXX--------O-------OOOOO++++OOO+++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++OOO++++-OOOO------O-------XXXXXXXXXXXXXXXX......OO........................",
"     ..................O....OO........XXXXXXXXX---------O-----OOOO++++OO+++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++++OO+++--OOOO---O--------XXXXXXXXXXXXXXXX.....OO.........................",
"     ..................OO....OO.......XXXXXXXXX---------O---OOOO-+++OO++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++++++OO++---OOOO-O--------XXXXXXXXXXXXXXXX..O.O.O.........................",
"     ..................OOO....O.......XXXXXXXXX----------OOOOO---+OO+++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++++++OO-----OOO---------XXXXXXXXXXXXXXXX..OOOO..........................",
"     ...................OOO...O.......XXXXXXXOX---------OOOO----OO++++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++++++++OO-----OOO-------XXOXXXXXXXXXXXXX....O...........................",
"     .....................OO.OO.......XXXXXXXXO--------OOOO----O-++++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++++++--O-----OOO------XOXXXXXXXXXXXXXX.....O..........................",
"     ......................OOO........XXXXXXXXXO-----OOOO----OO--+++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++++++---OO-----OOO----OXXXXXXXXXXXXXXX................OOOO............",
"     .........OOO.....................XXXXXXXXX-O---OOOO---OO----++++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++++-----OO----OOO--OXXXXXXXXXXXXXXXX.........O.....OO...O...........",
"     ........OOOO.....................XXXXXXXXX--O-OOO----O------+++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++++-------O-----OOO-XXXXXXXXXXXXXXXX........OOO...OO....O...........",
"     .......O...OO.....OO.............XXXXXXXXX--OOOO---OO-------++++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++++--------OO----OOOXXXXXXXXXXXXXXXX.........O....OO...OO...........",
"     .......OO...OO....OO.............OXXXXXXXX-OOO----O---------+++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++++----------O-----OOXXXXXXXXOXXXXXX.............OO....OO...........",
"     ........OO...OO..................XOXXXXXXXOOO---OO----------++++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++++-----------OO----OOOXXXXXOXXXXXXX.............O...OOO............",
"     ........OOO..OO..................XXOXXXXOOOO---O------------+++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++++-------------O---XOOOXXXOXXXXXXXX.............O..OO..............",
"     .........OO...O..................XXXOXXOOO----O-------------++++++++++++++++@@@@@@@@@@@@@@@@@@@@@@#################################@@@@@@@@@@@@@@@@@@@@@@@++++++++++++++++--------------O--XXXOOXOXXXXXXXXX..............OOO...............",
"     ..........OOO.O........OO........XXXXOOOOX--OO--------------+++++++++++++++@@@@@@@@@@@@@@@@@@@@@@###################################@@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++---------------OOXXXXOOXXXXXXXXXX...OO...........................",
"     ............OO..........OO.......XXXXOOOXX-O----------------+++++++++++++++@@@@@@@@@@@@@@@@@@@@@#####################################@@@@@@@@@@@@@@@@@@@@@@+++++++++++++++-----------------OXXXXOOOXXXXXXXX..OO............................",
"     .........................OO......XXXOOOXXXO-----------------+++++++++++++++@@@@@@@@@@@@@@@@@@@@#######################################@@@@@@@@@@@@@@@@@@@@@+++++++++++++++-----------------XOXXXXOOOXXXXXXX.OO.............................",
"     ..........................OO.....XOOOXXXXO------------------+++++++++++++++@@@@@@@@@@@@@@@@@@@#########################################@@@@@@@@@@@@@@@@@@@@+++++++++++++++-----------------XXOXXXXXOOXXXXXXOO..............................",
"     ...........................OO....OOOXXXOOX------------------+++++++++++++++@@@@@@@@@@@@@@@@@@###########################################@@@@@@@@@@@@@@@@@@@+++++++++++++++-----------------XXXOOXXXXOOXXXXOO...............................",
"     ............................OO..OOOXXXOXXX------------------+++++++++++++++@@@@@@@@@@@@@@@@@#############################################@@@@@@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXOXXXXOOXXOO................................",
"     .............................OOO.OXXXOXXXX------------------+++++++++++++++@@@@@@@@@@@@@@@@###############################################@@@@@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXOXXXXOOOOX................................",
"     ..............................OO.XXXOXXXXX------------------+++++++++++++++@@@@@@@@@@@@@@@#################################################@@@@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXOXXXXOOXX................................",
"     ......................XXXXXXXXXXXXXOXXXXXX------------------+++++++++++++++@@@@@@@@@@@@@@###################################################@@@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXOXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXOXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@@#####################################################@@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXOXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXOXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@#######################################################@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXOXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@#################$$$$$$$$$$$$$$$$$$$$$#################@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@################$$$$$$$$$$$$$$$$$$$$$$$################@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@###############$$$$$$$$$$$$$$$$$$$$$$$$$###############@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##############$$$$$$$$$$$$$$$$$$$$$$$$$$$##############@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@#############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#############@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$############@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@###########$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$$$$%%%%%%%%%%%%$$$$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$$$%%%%%%%%%%%%%%$$$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$$%%%%%%%%%%%%%%%%$$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$$%%%%%%%%%%%%%%%%%%$$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%%%%%%%%%%%%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%%%%%%%%%%%%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%%%&&&&&&%%%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%%&&&&&&&&%%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%&&&&&&&&&&%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%&&&***&&&&%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%&&******&&%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"     ......................XXXXXXXXXXXXXXXXXXXX------------------+++++++++++++++@@@@@@@@@@@@##########$$$$$$$$%%%%%&&******&&%%%%%$$$$$$$##########@@@@@@@@@@@@@+++++++++++++++-----------------XXXXXXXXXXXXXXXXXXXX.......................     ",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"};

static void allocate_meter(Widget w, XFontStruct *label_font, snd_state *ss, Pixel red)
{
  int err;
  Pixmap shape;
  Display *dp;
  Drawable wn;
  if (!meter_allocated)
    {
      dp = XtDisplay(w);
      wn = XtWindow(w);
      err = XpmCreatePixmapFromData(dp,wn,onlabel_xpm,&on_label,&shape,NULL);     if (err != XpmSuccess) fprintf(stderr,"trouble with on label");
      err = XpmCreatePixmapFromData(dp,wn,offlabel_xpm,&off_label,&shape,NULL);   if (err != XpmSuccess) fprintf(stderr,"trouble with off label");
      err = XpmCreatePixmapFromData(dp,wn,cliplabel_xpm,&clip_label,&shape,NULL); if (err != XpmSuccess) fprintf(stderr,"trouble with clip label");
      meter_allocated = 1;
    }
}

#endif
