/**
 * Counter Machine Simulator and Generartor of Paul Chapmen's Counter Machine in Conway's Game of Life
 */
// Written by Paul Rendell 17/November/2011
// All the life patterns are from Paul Chapman's work at http://www.igblan.free-online.co.uk/igblan/ca/
// where it is called a  Minsky Register Machine (MRM) however terminology has moved on and Counter Machine
// fits the new nomenclature better.
//
// This code is free to use as you like, at youn own risk
//
// It has some ideas from Suzanne Britton) Turing Machine Simulator at http://ironphoenix.org/tril/tm/
// The run length format decodeing has a distant relationship with some code from Mirek's Java Cellebration at http://psoup.math.wisc.edu/mcell/mjcell/mjcell.html
//

import java.awt.Graphics;
import java.util.Comparator;

import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTabbedPane;
import javax.swing.JScrollPane;
import javax.swing.BorderFactory;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.BoxLayout;
import javax.swing.text.BadLocationException;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.ArrayList;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemEvent;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.Toolkit;
//

public class CMapp extends JApplet {

    CMcontrols controls;   // The controls for marking and filling arcs
    CMcounterPanel CMcounters;  // the CMcounters JPanel
	CMcounters[] CntrsLst;    // list of CMcounters

    public void init() {
        setLayout(new BorderLayout());
        CntrsLst = new CMcounters[12];
        for (int i = 0;i < 12;i++){
			CntrsLst[i] = new CMcounters(i);
		}
		CMcounters = new CMcounterPanel(CntrsLst);
        controls = new CMcontrols(CntrsLst);
        add("South", controls);
		add("Center",CMcounters);
    }

    public void destroy() {
        remove(controls);
        remove(CMcounters);
    }

    public void start() {
        controls.setEnabled(true);
    }

    public void stop() {
        controls.setEnabled(false);
    }


    public static void main(String args[]) {
        JFrame f = new JFrame("CMapp");
        CMapp CMapp = new CMapp();

        CMapp.init();
        CMapp.start();

        f.add("Center", CMapp);
        f.setVisible(true);
    }

}

//------------------------------------------------------------------------- CMcounters
class CMcounters extends JPanel  {
    JTextField c01;
    JLabel	Lc01;
	int Number;
	long initialValue;
//------------------------------------------------------------------------- CMcounters
	public  CMcounters(int no){
		Number = no;
		initialValue = 0;
        JPanel pnlHeader = new JPanel(); // horizontal layout
        pnlHeader.setLayout(new BoxLayout(pnlHeader, BoxLayout.Y_AXIS));
        pnlHeader.add(Lc01 = new JLabel(String.format("C%02d",no), JLabel.RIGHT));
        pnlHeader.add(c01 = new CMIntTextField("0", 10));
        add(pnlHeader);
	}
//------------------------------------------------------------------------- CMcounters
	public void setName(String newName){
		Lc01.setText(newName);
	}
//------------------------------------------------------------------------- CMcounters
	public void reSetName(){
		Lc01.setText(String.format("C%02d",Number));
	}
//------------------------------------------------------------------------- CMcounters
	public void set(long val){
		initialValue = val;
		c01.setText(Long.toString(val));
	}
//------------------------------------------------------------------------- CMcounters
	public void reSet(){
		c01.setText(Long.toString(initialValue));
	}
//------------------------------------------------------------------------- CMcounters
	public String getName(){
		return Lc01.getText();
	}
//------------------------------------------------------------------------- CMcounters
	public Long get(){
		return initialValue;
	}
//------------------------------------------------------------------------- CMcounters
	public void inc(){
		c01.setText(Long.toString(Integer.parseInt(c01.getText())+1));
	}
//------------------------------------------------------------------------- CMcounters
	public void dec(){
		if (! isZero())
			c01.setText(Long.toString(Integer.parseInt(c01.getText())-1));
	}
//------------------------------------------------------------------------- CMcounters
	public boolean isZero(){
		return (Integer.parseInt(c01.getText()) == 0);
	}

}

//------------------------------------------------------------------------- CMcounterPanel
//-------------------------- CMcounterPanel
//------------------------------------------------------------------------- CMcounterPanel
class CMcounterPanel extends JPanel  {
	CMcounters[] CntrsLst;

	public CMcounterPanel (CMcounters[] Cntrs){
	    int v, ind;
	    int nh=4;

		Border raisedetched;
		raisedetched = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
		setBorder(raisedetched);

	    this.CntrsLst = Cntrs;
	    v = 0;
	    ind = 0;
	    JPanel pnlHeader = new JPanel(new GridLayout(3, nh)); // 4 vartical ,  nh horizontal
        for (int i = 0; i < Cntrs.length; i++) {
			if ( v == nh){
				v = 0;
				ind += 1;//nh;
			}
			pnlHeader.add(Cntrs[ind+v*3]);
			v +=1;
		}
		add(pnlHeader);
	}

}

//-----------------------------------------------------------------------
//                            Controls
//----------------------------------------------------------------------- Controls

class CMcontrols extends JPanel implements ItemListener, ActionListener, ClipboardOwner {

    public static final int IDLE = -1, LOADED = -2, RUNNING = -3, STEP = -4,  PAUSED = -5,HALT = -6;

    int state;
   	int delay= 100;
	JLabel currentState;
	JLabel countSteps;
	JTabbedPane panBot;
	long countStepsValue;
	long countNDZvalue;
	JLabel countNoDecZ;
    JComboBox speed,codeComb;
	CMcounters[] CntrsLst;
	JButton bStartPause = null;
	CM cMachine;
	CMprogram prog;
	boolean programmed;
    JTextArea messages, trace, code, CCMrle;


    public CMcontrols(CMcounters[] Cntrs) {
        JButton b = null;
    	int delay= 0;
		Border raisedetched;
		raisedetched = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
		setBorder(raisedetched);

        this.CntrsLst = Cntrs;
        programmed = false;

        JPanel panVert = new JPanel();
        panVert.setLayout(new BoxLayout(panVert, BoxLayout.Y_AXIS));

        JPanel panTop = new JPanel(new GridLayout(1, 4));
		panTop.setBorder(raisedetched);

        currentState = new JLabel("State: IDLE", JLabel.CENTER);
		panTop.add(currentState);

        countSteps = new JLabel(String.format("Steps %,12d",0), JLabel.RIGHT);
		panTop.add(countSteps);

        countNoDecZ = new JLabel(String.format("NDZ Steps %,12d",0), JLabel.RIGHT);
		panTop.add(countNoDecZ);

        JPanel panTopE = new JPanel(new GridLayout(1, 2));
    	  JLabel speedLabel = new JLabel("Speed:", JLabel.RIGHT);
    	  String[] speedString = { "Slow", "Fast", "Very Fast", "Compute"};
    	  speed = new JComboBox(speedString);
		  speed.setSelectedIndex(0);
          speed.addItemListener(this);
    	  panTopE.add(speedLabel);
    	  panTopE.add(speed);
		panTop.add(panTopE);

        panVert.add(panTop);

        JPanel panMid = new JPanel();
		panMid.setBorder(raisedetched);
        bStartPause = new JButton(" Start ");
        bStartPause.addActionListener(this);
        panMid.add(bStartPause);
        b = new JButton("Stop");
        panMid.add(b);
        b.addActionListener(this);
        b = new JButton("Step");
        b.addActionListener(this);
        panMid.add(b);
        b = new JButton("Clear Trace");
        b.addActionListener(this);
        panMid.add(b);

        panVert.add(panMid);

		panBot = new JTabbedPane();
		JPanel panel1 = new JPanel();				//                  Tab Log
		messages = new JTextArea(15, 60);
		messages.setLineWrap(true);
		JScrollPane scrollPane1 = new JScrollPane(messages);
		panel1.add(scrollPane1);
		panBot.addTab("Log", panel1);

		JPanel panel2 = new JPanel();				//                  Tab Trace
		trace = new JTextArea(15, 60);
		trace.setLineWrap(true);
		JScrollPane scrollPane2 = new JScrollPane(trace);
		panel2.add(scrollPane2);
		panBot.addTab("Trace", panel2);

        JPanel panCVert = new JPanel();
          panCVert.setLayout(new BoxLayout(panCVert, BoxLayout.Y_AXIS));
		  JPanel panel2b = new JPanel();
    	    String[] codeString = { "Preset Code",  "Add", "Multiply", "UCM-CM", "UCM-CM(p1)", "UCM-TM" };
    	    codeComb = new JComboBox(codeString);
		    codeComb.setSelectedIndex(0);
            codeComb.addItemListener(this);
            panel2b.add(codeComb);
            b = new JButton("Load");
            b.addActionListener(this);
            panel2b.add(b);
          panCVert.add(panel2b);
		  JPanel panel3 = new JPanel();				//                  Tab Code
		    code = new JTextArea(13, 60);
		    code.setLineWrap(true);
  		    JScrollPane scrollPane3 = new JScrollPane(code);
		    panel3.add(scrollPane3);
		  panCVert.add(panel3);
		panBot.addTab("Code", panCVert);

		JPanel panel4 = new JPanel();				//                  Tab CCMrle
          panel4.setLayout(new BoxLayout(panel4, BoxLayout.Y_AXIS));
		  JPanel panel4b = new JPanel();
            b = new JButton("build P1");
            b.addActionListener(this);
            panel4b.add(b);
            b = new JButton("build P30");
            b.addActionListener(this);
            panel4b.add(b);
            b = new JButton("Copy RLE");
            b.addActionListener(this);
            panel4b.add(b);
          panel4.add(panel4b);
		    JPanel panel4c = new JPanel();
		      CCMrle = new JTextArea(13, 60);
		      CCMrle.setLineWrap(true);
		      JScrollPane scrollPane4 = new JScrollPane(CCMrle);
		    panel4c.add(scrollPane4);
          panel4.add(panel4c);
		panBot.addTab("CCM RLE", panel4);

        panVert.add(panBot);

        add(panVert);



        setState(IDLE);
    }


  	public void setState(int newState) {

  	  state = newState;
  	  if (state == IDLE)
  	    currentState.setText("State: IDLE   ");
  	  else if (state == LOADED)
  	    currentState.setText("State: LOADED ");
  	  else if (state == RUNNING)
  	    currentState.setText("State: RUNNING");
  	  else if (state == STEP)
  	    currentState.setText("State: STEP   ");
  	  else if (state == PAUSED)
  	    currentState.setText("State: PAUSED ");
  	  else if (state == HALT)
  	    currentState.setText("State: HALTED ");
  	  else
  	    currentState.setText("State: " + state);
  	}


  	public void itemStateChanged(ItemEvent e) {
  	  	String Selection;
    	Selection = (String)speed.getSelectedItem();
    	if (Selection.equals("Slow")) {
			delay = 1000;
    	} else if (Selection.equals("Fast")) {
			delay = 400;
    	} else if (Selection.equals("Very Fast")) {
			delay = 40;
    	} else if (Selection.equals("Compute")) {
			delay = 0;
		}

    	Selection = (String)codeComb.getSelectedItem();
    	if ( (Selection.equals("Add")) ) {
			code.setText(CMpreset("Add"));
    	} else if ( (Selection.equals("Multiply")) ) {
			code.setText(CMpreset("Multiply"));
    	} else if ( (Selection.equals("UCM-CM")) ) {
			code.setText(CMpreset("UCM-CM"));
    	} else if ( (Selection.equals("UCM-CM(p1)")) ) {
			code.setText(CMpreset("UCM-CM(p1)"));
    	} else if ( (Selection.equals("UCM-TM")) ) {
			code.setText(CMpreset("UCM-TM"));
		}
  	}

    public void actionPerformed(ActionEvent ev) {
        String evLabel = ev.getActionCommand();

		if  ( evLabel.equals(" Start ")) {		//				Start
	   	   if ( programmed ) {
		   		setState(RUNNING);
		   		cMachine = new CM(this, this.CntrsLst, this.prog);
		   		new Thread(cMachine).start();
		   		addTrace("start");
	   	   } else {
		   		addFault("Can't start without Program.");
		   }
	   } else if ( evLabel.equals("Step")) {	//				Step
	   	   if ( programmed ) {
  	   			if (state == RUNNING){
		   			addTrace("Paused");
		   			setState(PAUSED);
  	  			} else if (state == PAUSED){
		   			addTrace("start");
		   			setState(STEP);
		   		} else {	// act like start
		   			setState(STEP);
		   			cMachine = new CM(this, this.CntrsLst, this.prog);
		   			new Thread(cMachine).start();
		   			addTrace("start");
				}
	   	   	} else {
		   		addFault("Can't start without Program.");
			}
	   } else if ( evLabel.equals("Clear Trace")) {	//			Clear Trace
	   		trace.setText("");
	   } else if ( evLabel.equals("Pause")) {	//				Pause
		   setState(PAUSED);
	   } else if ( evLabel.equals("Cont")) {	//				Cont
		   setState(RUNNING);
	   } else if ( evLabel.equals("Stop")) {	//				STOP
		    setState(HALT);
		    addTrace("Stopped");
		  	bStartPause.setText("Reset");
	   } else if ( evLabel.equals("Reset")) {	//				Reset
			setStepsNo((long)0);
			setNDZstepsNo((long)0);
			this.prog.reSetCnters();
		  	bStartPause.setText(" Start ");

	   } else if ( evLabel.equals("Load")) {	//				Load
		   addMessage("Loading..");
		   prog = new CMprogram(this, CntrsLst, code);
		   programmed = prog.loadedOK;
		   if (programmed) {
		   		setState(LOADED);
		   		addMessage("LoadedOK");
			} else
		   		addFault("Loaded Fail");

	   } else if ( evLabel.equals("build P30")) {	//				Build P30
	   		if (programmed){
				CMChapmanBuild CCMbld = new CMChapmanBuild();
				CCMrle.setText("Building");
				CCMbld.getRLE(this, prog, CCMrle);
				CCMbld = null;
			} else {
		   		CCMrle.append("Must be loaded to Build");
			}

	   } else if ( evLabel.equals("build P1")) {	//				Build P1
	   		if (programmed){
				CMChapmanBuild CCMbld = new CMChapmanBuild();
				CCMrle.setText("Building");
				CCMbld.getRLEp1(this, prog, CCMrle);
				CCMbld = null;
			} else {
		   		CCMrle.append("Must be loaded to Build");
			}

	   } else if ( evLabel.equals("Copy RLE")) {	//				Copy RLE
			String selection = CCMrle.getText();
			StringSelection data = new StringSelection(selection);
		    Clipboard clipboard =  Toolkit.getDefaultToolkit().getSystemClipboard();
   			clipboard.setContents(data, CMcontrols.this);
 	   }
    }

    public void setStepsNo(Long stepno){
		countStepsValue = stepno;
		countSteps.setText(String.format("Steps %,12d",countStepsValue));
	}

    public void setNDZstepsNo(Long stepno){
		countNDZvalue = stepno;
		countNoDecZ.setText(String.format("NDZ Steps %,12d",countNDZvalue));
	}

	public void stepUpdate(boolean jump){
		countStepsValue += (long)1;
		setStepsNo(countStepsValue);
		if (jump) {
			countNDZvalue += (long)1;
			setNDZstepsNo(countNDZvalue);
		}
	}

  	public void addMessage(String msg) {
  	  messages.append(msg+"\n");
  	}

  	public void addFault(String msg) {
  	  messages.append(msg+"\n");
  	  panBot.setSelectedIndex(0);
  	}

  	public void addError(int Line, String msg) {
  	  messages.append("** line "+String.valueOf(Line)+" "+msg+" **\n");
  	  panBot.setSelectedIndex(0);
  	}

  	public void addTrace(String msg) {
  	  trace.append(msg+"\n");
  	}

  	public String CMpreset(String prog) {
		if (prog.equals("Add")) {
			return "#C0 = 2\n" +
					"#C1 = 5\n" +
					"#Start 00\n" +
					"00 INC 0 02\n" +
					"01 HLT\n" +
					"02 DEC 1 00 01\n";
//      		return 	"# c1 := C1 + C2\n" +
//      				"#C C1 = 2\n"+
//      				"#C C2 = 5\n"+
//      				"#Start 01\n"+
//      				"01 DEC C2 02 03	\n" +
//      				"02 INC C1 01		\n" +
//      				"03 HLT			\n";

      	} else if (prog.equals("Multiply")) {
					return 	"# t := r*s + t + a*(r-1)\n" +
					"#C t = 0\n" +
					"#C r = 5\n" +
					"#C s = 6\n" +
					"#C a = 0\n" +
					"00 dec r 01 06\n" +
					"01 dec s 02 04\n" +
					"02 inc a 03\n" +
					"03 inc t 01\n" +
					"04 dec a 05 00\n" +
					"05 inc s 04\n" +
					"06 HLT\n";
		} else if (prog.equals("UCM-CM")) {
			return "#C registers = 6       # = 2^1 . 3^1 \n" +
				"#C opcodes = 12       # =  2^2 . 3^1 . 5^0\n" +
				"#C operands = 2       # = 2^1 . 3^0 . 5^0\n" +
				"#C passaddresses = 2  # = 2^1 . 3^0 . 5^0\n" +
				"#C failaddresses = 8  # = 2^3 . 3^0 . 5^0\n" +
				"#C base = 2           # 1st prime in sequence\n" +
				"#C opcode\n" +
				"#C godel\n" +
				"#C exp\n" +
				"#C ret\n" +
				"#C a\n" +
				"#C b\n" +
				"#Start 00\n" +
				"00 DEC opcodes 01 03 #godel := opcodes\n" +
				"01 INC godel 02 \n" +
				"02 INC a 00 \n" +
				"03 DEC a 04 05\n" +
				"04 INC opcodes 03 \n" +
				"05 INC ret 06 \n" +
				"06 INC ret 07 	#ret := 2\n" +
				"07 DEC base 08 13 #start exp := godel(base)\n" +
				"08 DEC godel 09 10 \n" +
				"09 INC b 07 \n" +
				"10 INC base 11 \n" +
				"11 DEC b 12 16 \n" +
				"12 INC godel 10 \n" +
				"13 DEC b 14 15 \n" +
				"14 INC base 13 \n" +
				"15 INC a 07 \n" +
				"16 DEC godel 17 24 #Is Zero\n" +
				"17 INC godel 18 \n" +
				"18 DEC a 19 27 \n" +
				"19 DEC base 20 22\n" +
				"20 INC b 21 \n" +
				"21 INC godel 19 \n" +
				"22 DEC b 23 18\n" +
				"23 INC base 22 \n" +
				"24 DEC a 25 26\n" +
				"25 INC godel 24 \n" +
				"26 INC exp 07 \n" +
				"27 NOP 28	# exp = godel(base)\n" +
				"28 DEC godel 28 29\n" +
				"29 DEC ret 30 81 #was ret = 0?\n" +
				"30 DEC ret 31 39 #was ret = 1? \n" +
				"31 DEC exp 32 33 #opcode := exp\n" +
				"32 INC opcode 31 \n" +
				"33 DEC opcode 34 86 #HLT?\n" +
				"34 DEC operands 35 37 #godel := operands:\n" +
				"35 INC godel 36 \n" +
				"36 INC a 34 \n" +
				"37 DEC a 38 06 # gett godel translation after copy\n" +
				"38 INC operands 37 \n" +
				"\n" +
				"39 INC exp 40 #ret was 0\n" +
				"40 INC exp 41 \n" +
				"41 DEC opcode 42 66 \n" +
				"42 DEC exp 43 48\n" +
				"43 DEC registers 44 45 \n" +
				"44 INC b 42 \n" +
				"45 INC exp 46 \n" +
				"46 DEC b 47 51 \n" +
				"47 INC registers 45\n" +
				"48 DEC b 49 50 #Mov2:\n" +
				"49 INC exp 48 \n" +
				"50 INC a 42 \n" +
				"\n" +
				"51 DEC registers 52 59 #Is Zero\n" +
				"52 INC registers 53 \n" +
				"53 DEC a 54 61\n" +
				"54 DEC exp 55 57\n" +
				"55 INC b 56 \n" +
				"56 INC registers 54 \n" +
				"57 DEC b 58 53\n" +
				"58 INC exp 57 \n" +
				"59 DEC a 60 74\n" +
				"60 INC registers 59 \n" +
				"61 DEC failaddresses 62 64\n" +
				"62 INC godel 63 \n" +
				"63 INC a 61 \n" +
				"64 DEC a 65 79 #Mov2:\n" +
				"65 INC failaddresses 64 \n" +
				"\n" +
				"66 DEC registers 67 68\n" +
				"67 INC a 66 \n" +
				"68 DEC a 69 74\n" +
				"69 DEC exp 70 72\n" +
				"70 INC b 71 \n" +
				"71 INC registers 69 \n" +
				"72 DEC b 73 68 \n" +
				"73 INC exp 72 \n" +
				"74 DEC passaddresses 75 77\n" +
				"75 INC godel 76 \n" +
				"76 INC a 74 \n" +
				"77 DEC a 78 79\n" +
				"78 INC passaddresses 77 \n" +
				"\n" +
				"79 NOP 80	# start exp := godel(pass/faill address)\n" +
				"80 DEC exp 80 07\n" +
				"81 INC exp 82\n" +
				"82 INC exp 83 \n" +
				"83 DEC base 83 84 #Clr base\n" +
				"84 DEC exp 85 00 #base := exp then repreat\n" +
				"85 INC base 84 \n" +
				"86 HLT\n";
		} else if (prog.equals("UCM-CM(p1)")) {
			return "#C registers = 6       # = 2^1 . 3^1 \n" +
				"#C opcodes = 12       # =  2^2 . 3^1 . 5^0\n" +
				"#C operands = 2       # = 2^1 . 3^0 . 5^0\n" +
				"#C passaddresses = 2  # = 2^1 . 3^0 . 5^0\n" +
				"#C failaddresses = 8  # = 2^3 . 3^0 . 5^0\n" +
				"#C base = 2           # 1st prime in sequence\n" +
				"#C opcode\n" +
				"#C godel\n" +
				"#C exp\n" +
				"#C ret\n" +
				"#C a\n" +
				"#C b\n" +
				"#Start 00\n" +
				"00 DEC opcodes 01 03 #godel := opcodes\n" +
				"01 INC godel 02 \n" +
				"02 INC a 00 \n" +
				"03 DEC a 04 05\n" +
				"04 INC opcodes 03 \n" +
				"05 INC ret 06 \n" +
				"06 INC ret 07 	#ret := 2\n" +
				"07 DEC base 08 13 #start exp := godel(base)\n" +
				"08 DEC godel 09 10 \n" +
				"09 INC b 07 \n" +
				"10 INC base 11 \n" +
				"11 DEC b 12 16 \n" +
				"12 INC godel 10 \n" +
				"13 DEC b 14 15 \n" +
				"14 INC base 13 \n" +
				"15 INC a 07 \n" +
				"16 DEC godel 17 24 #Is Zero\n" +
				"17 INC godel 18 \n" +
				"18 DEC a 19 27 \n" +
				"19 DEC base 20 22\n" +
				"20 INC b 21 \n" +
				"21 INC godel 19 \n" +
				"22 DEC b 23 18\n" +
				"23 INC base 22 \n" +
				"24 DEC a 25 26\n" +
				"25 INC godel 24 \n" +
				"26 INC exp 07 \n" +
				"27 NOP 28	# exp = godel(base)\n" +
				"28 DEC godel 28 29\n" +
				"29 DEC ret 30 81a #was ret = 0? (81 is too far)\n" +
				"30 DEC ret 31 39 #was ret = 1? \n" +
				"31 DEC exp 32 33 #opcode := exp\n" +
				"32 INC opcode 31 \n" +
				"33 DEC opcode 34 86 #HLT?\n" +
				"34 DEC operands 35 37 #godel := operands:\n" +
				"35 INC godel 36 \n" +
				"36 INC a 34 \n" +
				"37 DEC a 38 06 # gett godel translation after copy\n" +
				"38 INC operands 37 \n" +
				"\n" +
				"39 INC exp 40 #ret was 0\n" +
				"40 INC exp 41 \n" +
				"41 DEC opcode 42 66 \n" +
				"42 DEC exp 43 48\n" +
				"43 DEC registers 44 45 \n" +
				"44 INC b 42 \n" +
				"45 INC exp 46 \n" +
				"46 DEC b 47 51 \n" +
				"47 INC registers 45\n" +
				"48 DEC b 49 50 #Mov2:\n" +
				"49 INC exp 48 \n" +
				"50 INC a 42 \n" +
				"\n" +
				"51 DEC registers 52 59 #Is Zero\n" +
				"52 INC registers 53 \n" +
				"53 DEC a 54 61\n" +
				"54 DEC exp 55 57\n" +
				"55 INC b 56 \n" +
				"81a NOP 81                # relay from 29 to 81\n" +
				"56 INC registers 54 \n" +
				"57 DEC b 58 53\n" +
				"58 INC exp 57 \n" +
				"59 DEC a 60 74\n" +
				"60 INC registers 59 \n" +
				"61 DEC failaddresses 62 64\n" +
				"62 INC godel 63 \n" +
				"63 INC a 61 \n" +
				"64 DEC a 65 79 #Mov2:\n" +
				"65 INC failaddresses 64 \n" +
				"\n" +
				"66 DEC registers 67 68\n" +
				"67 INC a 66 \n" +
				"68 DEC a 69 74\n" +
				"69 DEC exp 70 72\n" +
				"70 INC b 71 \n" +
				"71 INC registers 69 \n" +
				"72 DEC b 73 68 \n" +
				"73 INC exp 72 \n" +
				"74 DEC passaddresses 75 77\n" +
				"75 INC godel 76 \n" +
				"76 INC a 74 \n" +
				"77 DEC a 78 79\n" +
				"78 INC passaddresses 77 \n" +
				"\n" +
				"79 NOP 80	# start exp := godel(pass/faill address)\n" +
				"80 DEC exp 80 07\n" +
				"81 INC exp 82\n" +
				"82 INC exp 83 \n" +
				"83 DEC base 83 84 #Clr base\n" +
				"84 DEC exp 85 00 #base := exp then repreat\n" +
				"85 INC base 84 \n" +
				"86 HLT\n";
				} else  if (prog.equals("UCM-TM")) {
					return
				"#  Universal Counter Machine. Simulates a Turing Machine\n" +
				"#  Paul Rendell 2011. Variation of Paul Chapmans Universal Life Comupter\n" +
				"#--------------------------------------------------------------\n" +
				"# Example Turing Machine. Started with the head between two 1s \n" +
				"# fills in all the 0s between the 1s with 1s\n" +
				"# Trasitions  cycle: write , move, read, choose next transition\n" +
				"# transition numbers mapped 0->halt, 1->2, 2->3, n->n+2: n+2 is prime\n" +
				"#tr  w move	 nx0  nx1\n" +
				"#t1  0 r1 (2)  t1   t2(\n" +
				"#t2  1 l0 (1)  t2   t3(\n" +
				"#t3  1 l0 (1)   -    -\n" +
				"\n" +
				"#C a\n" +
				"#C b\n" +
				"#C godel\n" +
				"#C base    =	2\n" +
				"#C exp\n" +
				"#C symDir  =   60   	#2^2. 3^1. 5^1\n" +
				"#C nextIf0 =   18   	#2^(2->1). 3^(3->2). 5^(h->0)\n" +
				"#C nextIf1 =  108   	#2^(3->2). 3^(5->3). 5^(h->0)\n" +
				"#C ret	   = 	0\n" +
				"#C tL      =	2\n" +
				"#C tR      =	2\n" +
				"\n" +
				"Lrepeat	DEC	symDir	02	04	# godel := symDir\n" +
				"02	INC	godel	03\n" +
				"03	INC	a	Lrepeat\n" +
				"\n" +
				"04	DEC	a	05	Lgodel\n" +
				"05	INC	symDir	04\n" +
				"\n" +
				"#	godel = symDIR : ret =0 || godel = nextstate : ret = 1\n" +
				"\n" +
				"#\n" +
				"Lgodel	DEC	base	07	12		#Godel	Loop\n" +
				"07	DEC	godel	08	09	\n" +
				"08	INC	b	Lgodel	\n" +
				"\n" +
				"09	INC	base	10	\n" +
				"10	DEC	b	11	15	\n" +
				"11	INC	godel	09		\n" +
				"\n" +
				"12	DEC	b	13	14			\n" +
				"13	INC	base	12	\n" +
				"14	INC	a	Lgodel		# a:= godel/base\n" +
				"\n" +
				"15	DEC	godel	16	23		\n" +
				"16	INC	godel	17	\n" +
				"17	DEC	a	18	26			\n" +
				"18	DEC	base	19	21		\n" +
				"19	INC	b	20	\n" +
				"20	INC	godel	18	\n" +
				"\n" +
				"21	DEC	b	22	17			\n" +
				"22	INC	base	21	\n" +
				"\n" +
				"23	DEC	a	24	25		\n" +
				"24	INC	godel	23	\n" +
				"25	INC	exp	Lgodel	\n" +
				"#		exp	:=	power\n" +
				"\n" +
				"26	NOP	27\n" +
				"27	DEC	godel	27	28	#clear	godel\n" +
				"28	DEC	ret	29	d01	#Jump if symbol\n" +
				"29	DEC	base	29	30	#clear base\n" +
				"\n" +
				"30	DEC	exp	31	halt	#0 = halt\n" +
				"31	DEC	exp	32	36	#1->2\n" +
				"32	DEC	exp	33	35	#2->3\n" +
				"33	INC	base	34		#n ->n+2\n" +
				"34	INC	base	35\n" +
				"35	INC	base	36\n" +
				"36	INC	base	37\n" +
				"37	INC	base	38\n" +
				"38	DEC	exp	37	Lrepeat\n" +
				"	\n" +
				"#---------------------------------------------------------------\n" +
				"#	exp == symDir(base)   dir*2+sym\n" +
				"#	decode a := symbol, b := dirdction\n" +
				"\n" +
				"d01	DEC	exp	d02	d10\n" +
				"d02	INC	a	d03\n" +
				"d03	DEC	exp	d04	d10\n" +
				"d04	DEC	a	d05	d10\n" +
				"d05	INC	b	d01\n" +
				"\n" +
				"d10	DEC	b	cA1	dA1  	# jump if move right\n" +
				"\n" +
				"#	Move Left---------------------------------------------\n" +
				"dA1	DEC	tL	dA2	d20\n" +
				"dA2	INC	exp	dA1		# exp := tL\n" +
				"\n" +
				"d20	DEC	a	d21	d22	\n" +
				"d21	INC	tL	d22   		# symbol a written first time \n" +
				"d22	DEC	exp	d23	d24\n" +
				"d23	INC	tL	d21\n" +
				"#	tapeLeft now tapeLeft *2 + a\n" +
				"\n" +
				"d24	DEC	tR	d25	d40\n" +
				"d25	INC	a	d26\n" +
				"d26	DEC	tR	d27	d40\n" +
				"d27	DEC	a	d28	d40\n" +
				"d28	INC	exp	d24\n" +
				"\n" +
				"d40	DEC	exp	d41	g00\n" +
				"d41	INC	tR	d40		#tR := tR/2, a:= remainder\n" +
				"\n" +
				"#	Move Right--------------------------------------------\n" +
				"cA1	DEC	tR	cA2	c20\n" +
				"cA2	INC	exp	cA1		# exp := tR\n" +
				"\n" +
				"c20	DEC	a	c21	c22	\n" +
				"c21	INC	tR	c22		# symbol a written first time \n" +
				"c22	DEC	exp	c23	c24\n" +
				"c23	INC	tR	c21\n" +
				"#	tapeRight now tapeRight *2 + a\n" +
				"\n" +
				"c24	DEC	tL	c25	c40\n" +
				"c25	INC	a	c26\n" +
				"c26	DEC	tL	c27	c40\n" +
				"c27	DEC	a	c28	c40\n" +
				"c28	INC	exp	c24\n" +
				"\n" +
				"c40	DEC	exp	c41	g00\n" +
				"c41	INC	tL	c40		#tl := tl/2, a:= remainder\n" +
				"\n" +
				"#------------------------------------------------------------\n" +
				"g00	DEC	a	g01	g11	# test symbol read\n" +
				"\n" +
				"g01	DEC	nextIf1	g02	g04\n" +
				"g02	INC	a	g03\n" +
				"g03	INC	godel	g01\n" +
				"\n" +
				"g04	DEC	a	g05	g30\n" +
				"g05	INC	nextIf1	g04\n" +
				"\n" +
				"\n" +
				"g11	DEC	nextIf0	g12	g14\n" +
				"g12	INC	a	g13\n" +
				"g13	INC	godel	g11\n" +
				"\n" +
				"g14	DEC	a	g15	g30\n" +
				"g15	INC	nextIf0 g14\n" +
				" #----------------------------------------------------------\n" +
				" #	godel = next instruction \n" +
				"g30	INC	ret	Lgodel	\n" +
				"\n" +
				"halt	HLT\n" +
				"\n" +
				"#------------- end ----------------------------------------";
		} else
			return "#Not equipped";
  	}

	public void lostOwnership (Clipboard parClipboard, Transferable parTransferable) {
		System.out.println ("Lost ownership");
	}

}
//-------------------------------------------------------------------------------------------------------------
//                                                        CMprogram
//-------------------------------------------------------------------------------------------------------------
class CMprogram {

    CMcontrols controls;
	CMcounters[] CntrsLst;
    HashMap<String,CMinstruction> hmLines;
    ArrayList<CMinstruction> alLines;
    HashMap<String,Integer> hmCounters;
    boolean loadedOK;
    String startInst = "";
    CMinstruction firstInst;


//------------------------------------------------------------------------- CMprogram

	public CMprogram (CMcontrols Cntrls, CMcounters[] Cntrs, JTextArea ta){
		int lines = 0;
		int line = 0;
		int cntr = 0;
		int errs = 0;
		int parms;
		String err;
		String codeLine;
		String [] codeParms;
		String strnull = "";
		String res, comBefore;;
		String parmLine;
		CMinstruction Instruction;
		boolean loadingOK;

		controls = Cntrls;
        CntrsLst = Cntrs;


		hmLines = new HashMap<String,CMinstruction>();
		alLines = new ArrayList<CMinstruction>();
		hmCounters = new HashMap<String,Integer>();

		errs = 0;
		comBefore ="";
		loadingOK = true;
		startInst = "";

        for (int i = 0;i < CntrsLst.length;i++){
			CntrsLst[i].reSetName();
			CntrsLst[i].set(0);
		}

//                                             first pass to collect line and counter names
		for (int i = 0; i < ta.getLineCount();i++){
			err = "";
			codeLine = getline(ta,i);
			res = CMinstruction.isValid(controls, i, codeLine );
			if ( res.equals("INVALID") ){
				errs +=1;
			} else if ( res.equals("COMMENT")){

					if ( codeLine.trim().matches("\\s*#[cC].*")){
					loadingOK = loadingOK && processCounter(codeLine);

				} else if (codeLine.trim().matches("\\s*#[sS][tT][aA][Rr][Tt].*")){
					processStart(codeLine);
				} else {
					if (!comBefore.equals("")) {
						comBefore += "\n";
					}
					comBefore += codeLine;
				}
			} else if ( res.equals("VALID")){						// valid line

				codeParms = codeLine.replaceAll("#.*","").split("\\s+");
				if (codeParms.length > 3){						// counter when present is always P[2] but P[2] is a line for NOP (only 2 parms)
					if ( hmCounters.containsKey(codeParms[2]) ) {
					   cntr = (Integer)hmCounters.get(codeParms[2]);
					} else {
						cntr = hmCounters.size();
						if (codeParms.length > 2)
							hmCounters.put(codeParms[2],cntr);
					}
				}

				if ( hmLines.containsKey(codeParms[0]) ) {
					Instruction = (CMinstruction)hmLines.get(codeParms[0]);
					line = Instruction.Number;
					err += " duplicate line "+ codeParms[0];
				} else {
					line = hmLines.size()+1;
					Instruction = new CMinstruction(controls, CntrsLst, line, codeLine);
					hmLines.put(codeParms[0],Instruction);
					alLines.add(Instruction);
				}

			}
			if (err.length()>2) {
				controls.addError(i,err);
				errs += 1;
			}
		}

		if ((startInst.equals("")) && (alLines.size()>0)) {	// default first instruction
			startInst = alLines.get(0).Name;
		}
		if (! hmLines.containsKey(startInst)) {
			controls.addFault( "Start line "+startInst+ " was not found");
			loadingOK = false;
		}
//                                          second pass to put details in lines
		if (errs > 0)
			controls.addFault( "First Pass errors "+String.valueOf(errs)+"  in  "+ String.valueOf(hmLines.size())+" instructions");
		Collection c = hmLines.keySet();
		Iterator itr = c.iterator();
		String ky, inst;
		int reg, l1,l2;

		while( itr.hasNext() ){
			ky =(String)itr.next();
			err = "";
			Instruction = hmLines.get(ky);
			loadingOK = loadingOK && Instruction.check(controls, hmLines, hmCounters);
		}

//							update counter names
		c = hmCounters.keySet();
		itr = c.iterator();

		if (c.size() > 12){
			errs++;
			String cntrStr="Too many counters: ";//*************************************************************
			boolean cont;
			cont = itr.hasNext();
	   		while( cont ){
				ky =(String)itr.next();
				cntrStr = cntrStr.concat(ky);
				cont = itr.hasNext();
				if (cont) cntrStr = cntrStr.concat(", ");
			}
			controls.addFault( cntrStr+". limit is 12");
			loadingOK = false;
	    }  else {
        	for (int i = 0;i < CntrsLst.length;i++){
				CntrsLst[i].setName("  ");
			}
	   		while( itr.hasNext() ){
				ky =(String)itr.next();
				CntrsLst[hmCounters.get(ky)].setName(ky);
			}
		}

		loadedOK = loadingOK;
		if (loadedOK) {
			controls.addMessage( "loading Successful");
		} else {
			controls.addFault( "loading Failed "+String.valueOf(errs)+ " errors");
		}
	}
//------------------------------------------------------------------------- CMprogram

	private boolean processCounter(String line){
		String part;
		String[] parts;
		int cntr;
		boolean res;

		res = true;
		line = line.replace("="," ").trim();
		part = line.substring(line.toUpperCase().indexOf("#C")+2).trim();
		parts = part.split("\\s+");
		if (parts[0].length() > 0){
			if (! hmCounters.containsKey(parts[0]) ) {
				cntr = hmCounters.size();
				hmCounters.put(parts[0],cntr);
			}
			if (parts.length>1) {
				if ( (parts[1].matches("[0-9]+")) ){
					CntrsLst[hmCounters.get( parts[0] ) ].set(Long.parseLong(parts[1]) );
				} else {
					controls.addFault( "Counter "+parts[0]+" invalid value ");
					res = false;
				}
			}
		}
		return res;
	}
//------------------------------------------------------------------------- CMprogram
	private void processStart(String line){
		String part;
		String[] parts;
		line = line.replace("="," ").trim();
		part = line.substring(line.toUpperCase().indexOf("#Start")+7).trim();
		parts = part.split("\\s+");
		if (parts[0].length() > 0){
			controls.addMessage( "Start at line "+parts[0]);
			startInst = parts[0];
		} else {
			controls.addFault( "Start Line invalid "+line);
		}
	}
//------------------------------------------------------------------------- CMprogram
	private String getline(JTextArea ta, int line){
		int off1, off2;
		String str;

		try {
			off1 =ta.getLineStartOffset(line);
		} catch (BadLocationException ignored ){
			off1 = 0;
		}
		try {
			off2 =ta.getLineEndOffset(line);
		} catch (BadLocationException ignored ){
			off2 = 0;
		}
		try {
			str =ta.getText(off1,off2-off1);
		} catch (BadLocationException ignored ){
			str = "";
		}
		return str;
	}
//------------------------------------------------------------------------- CMprogram
	public CMinstruction getFirst(){
		return hmLines.get(startInst);
	}
//------------------------------------------------------------------------- CMprogram
	public void reSetCnters(){
        for (int i = 0;i < CntrsLst.length;i++){
			CntrsLst[i].reSet();
		}
	}
//------------------------------------------------------------------------- CMprogram
	public int size(){
		return alLines.size();
	}
//------------------------------------------------------------------------- CMprogram
	public CMinstruction instruction(int no){
		return alLines.get(no);
	}
//------------------------------------------------------------------------- CMprogram
	public int noCounters(){
		return hmCounters.size();
	}
//------------------------------------------------------------------------- CMprogram
	public Long getCounter(int no){
		return CntrsLst[no].get();
	}
//------------------------------------------------------------------------- CMprogram
	public String getCounterName(int no){
		return CntrsLst[no].getName();
	}
}



//----------------------------------------------------------------------------------------
//                                 CMinstruction
//--------------------------------------------------------------------------------------- CMinstruction
// instruction format|   lineno Type [counter lineno [ lineno]] [# comment]
class CMinstruction {
    public static final int UNRESOVED = 0, RESOLVED = 1, INVALID = 2;

    CMcontrols controls;
	CMcounters[] CntrsLst;
	int Number;				// line number
	int counter;
	String Name;			// lable
	String Itype;
	CMinstruction iJ1, iJ2;
	String sCntr, sJ1, sJ2;
	String BeforeCom;
	String AfterCom;

	String given;
	int status;

	String[] splits1, splits2;

//--------------------------------------------------------------------------------------- CMinstruction
	public CMinstruction(CMcontrols Cntrls,CMcounters[] Cntrs, int num, String line){

		controls = Cntrls;
        CntrsLst = Cntrs;
		Number = num;
		given = line.trim();
		status = UNRESOVED;

		boolean res;

		res = false;
		sCntr = "";
		sJ1 = "";
		sJ2 = "";
		BeforeCom = "";
		AfterCom = "";

		if (line.length() > 4){
			splits1 = line.split("#");
			splits2 = splits1[0].split("\\s+");
			if ( (splits2.length > 1) && (splits2[0].length()>0) ) {
				if (splits2[1].equalsIgnoreCase("INC")) {
					res = (splits2.length >= 4);
					if (res){
						sCntr = splits2[2];
						sJ1 = splits2[3];
					}
				} else if (splits2[1].equalsIgnoreCase("DEC")) {
					res = (splits2.length >= 5);
					if (res){
						sCntr = splits2[2];
						sJ1 = splits2[3];
				   		sJ2 = splits2[4];
					}
				} else if (splits2[1].equalsIgnoreCase("HLT")) {
					res=true;
				} else if (splits2[1].equalsIgnoreCase("NOP")) {
					res = (splits2.length >= 3);
					if (res){
						sJ1 = splits2[2];
					}
				}
			}
		}

		if (res){							// format looks OK for now
			Name = splits2[0];
			Itype = splits2[1].toUpperCase();
			if (splits1.length > 1)
				AfterCom = splits1[1];
		} else {
			status = INVALID;
		}
	}

//--------------------------------------------------------------------------------------- CMinstruction
	public boolean check(CMcontrols Cntrls, HashMap hrLines, HashMap hrCntrs) {
		boolean res;
		String errs;

		res = true;
		errs ="";

		if ( status != INVALID) {
			if (!sJ1.equals("")){
				if ( hrLines.containsKey(sJ1)) {
					iJ1 = (CMinstruction)hrLines.get(sJ1);
				} else {
					errs += " unknown label: "+sJ1;
				}
			}
			if (!sJ2.equals("")) {
				if (hrLines.containsKey(sJ2)) {
					iJ2 = (CMinstruction)hrLines.get(sJ2);
				} else {
					errs += " unknown label: "+sJ2;
				}
			}
			if  (!sCntr.equals("")) {
				if (hrCntrs.containsKey(sCntr)) {
					counter = (Integer)hrCntrs.get(sCntr);
				} else {
					errs += " unknown Counter: "+sCntr;
				}
			}
		}
		if (!errs.equals("")){
			controls.addError(Number, errs);
			status = INVALID;
			res = false;
		} else {
			status = RESOLVED;
		}
		return res;

	}

//--------------------------------------------------------------------------------------- CMinstruction
	static String isValid(CMcontrols Cntrls, int lineno, String line) {

		String err = "";
		String[] splits1, splits2;
		String res;
		int parms;

		res = "";

		if (!line.equals("")){
			splits1 = line.split("\\s*#");
			if (splits1[0].length() > 1) {
				splits2 = splits1[0].split("\\s+");
				if (splits2.length > 1){
					parms=0;
					if (splits2[1].equalsIgnoreCase("INC")) {
						parms = 4;
					} else if (splits2[1].equalsIgnoreCase("DEC")) {
					   parms = 5;
					} else if (splits2[1].equalsIgnoreCase("HLT")) {
					   parms = 2;
					} else if (splits2[1].equalsIgnoreCase("NOP")) {
						parms = 3;
					} else {
						res = "INVALID";
						Cntrls.addError(lineno," Invalid command "+splits2[1]);
					}
					if (parms > 0){
						if (parms != splits2.length) {
							res = "INVALID";
							Cntrls.addError(lineno,"Wrong number of paramters for  "+splits2[1]);
						} else {
							res = "VALID";
						}
					}
				}
			} else {
				res = "COMMENT";
			}
		} // ignore emty line
		return res;
	}

//--------------------------------------------------------------------------------------- CMinstruction
	CMinstruction  next(boolean NoDecZero) {
		String[] statusStr = {"UNRESOVED","RESOLVED", "INVALID"};
		CMinstruction res;

		res = this;
		if (status == RESOLVED){
			if ( (Itype.equals("DEC")) && NoDecZero ){
				res = iJ2;
			}	else if (! Itype.equals("HLT")) {
				res = iJ1;
				res.isHLT();
			}
		}
		return res;

	}

//--------------------------------------------------------------------------------------- CMinstruction
	boolean  isHLT() {
		return (Itype.equals("HLT"));
	}
//--------------------------------------------------------------------------------------- CMinstruction
	boolean countJZero() {
		boolean res;

		res = false;
		if (Itype.equals("INC")){
			CntrsLst[counter].inc();
		} else if (Itype.equals("DEC")){
			res = CntrsLst[counter].isZero();
			if (! res)
				CntrsLst[counter].dec();
		}
		return res;
	}
//--------------------------------------------------------------------------------------- CMinstruction
	public String trace(){
		return given;
	}
}
//----------------------------------------------------------------------------------------
//                                 CM
//----------------------------------------------------------------------------------------
class CM implements Runnable {

  	public static final int SUCCESS = 0, HALTED = -1, NOTFOUND = -2,
                          	ABNORMAL = -3, NOPROG = -4, USERINT = -5;

    CMcontrols controls;
	CMcounters[] CntrsLst;
	CMprogram prog;
	CMinstruction firstInst, current;
  	boolean stop = false;

	public CM(CMcontrols Cntrls, CMcounters[] Cntrs, CMprogram prog) {

		controls = Cntrls;
        CntrsLst = Cntrs;
        this.prog = prog;
        firstInst = prog.getFirst();

	}

  	public void run() {
    	int result = SUCCESS;

    	this.controls.repaint();
    	current = firstInst;

    	while ( (result == SUCCESS)&&( (controls.state == controls.RUNNING)||(controls.state == controls.PAUSED)||(controls.state == controls.STEP) ) ) {
	 		if ( (controls.state == controls.RUNNING)||(controls.state == controls.STEP) ){

				current = step(current);
				if (current.isHLT()) {
		   			controls.setState(controls.HALT);
    				controls.bStartPause.setText("Reset");
					controls.addTrace("Halt reached");
				} else
					this.controls.bStartPause.setText("Pause");

	 		    if (controls.state == controls.STEP){
		   			controls.setState(controls.PAUSED);
					this.controls.bStartPause.setText("Cont");
				}

			} 	else controls.bStartPause.setText("Cont");
    	  	result =SUCCESS;
    		this.controls.repaint();

    	  	if (this.controls.delay > 0) {
				int dly;
				dly = controls.delay;
				if ((controls.state == controls.PAUSED)||(controls.state == controls.STEP)){
					dly = 5;
				}
    	    	try { Thread.sleep(dly); 	} catch (InterruptedException e) {}
	 		}
    	}
  	}

	CMinstruction step(CMinstruction current){
		CMinstruction res;
		boolean jump;

		res = current;
		if (! current.isHLT()){
			controls.addTrace(current.trace());
			jump = current.countJZero();
			res = current.next(jump);
			controls.stepUpdate(jump);
		}
		return res;
	}

}

//----------------------------------------------------------------------------------------
@SuppressWarnings("serial")
class CMIntTextField extends JTextField {

  public CMIntTextField()  {
    super();
  }

  public CMIntTextField(int cols)  {
    super(cols);
  }

  public CMIntTextField(String defval, int size) {
    super("" + defval, size);
  }

  public int getInt()  {
    final String text = getText();
    if (text == null || text.length() == 0)    {
      return 0;
    }
    return Integer.parseInt(text);
  }

  public void setInt(int value)  {
    setText(String.valueOf(value));
  }

}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------


//------------------------
class CMChapmanBuild {


	String sLatchHead =
	"236b2o$236bobo$231b2o4b3o12bo$227b4o2bo4b3o8b4o$227b3ob2o4b3o8b4o9b2o$\n"+
	"219bo16bobo9bo2bo9b2o$218bobo15b2o10b4o5bo14b2o$217bobo29b4o4bo14b2o$\n"+
	"217b2o6b2o25bo$225b2o54bo$237b2o42b3o$237b2o31b2o12bo$224b2obo55b2o$\n"+
	"225bobo$226bo$225b2o5bo$208b2o15b2o5bobo21b2o11b2o3b2o$208b2o15b2o5b2o\n"+
	"10b3o2bo5bo3bo10b5o$240bo3bo9bo5bo3b2o4b2ob2o11bo$238bobo4bo8bo3bob2o\n"+
	"2b2o4b2ob2o10b3o$236b2o16bo5bo10b3o10b5o$236b2o17bo3bo23b2o3b2o$202b2o\n"+
	"32b2o18b2o$201bobo27b2o5bobo$148bo51bobo27bobo7bo$147b4o50bo28bo54b3o$\n"+
	"130b2o14b2obobo60b2o15b2o54b3o$122bo7bo2bo11b3obo2bo2b2o48b2o4bobo62bo\n"+
	"$121bo3b2o7bo11b2obobo3b2o48bo7bo12b2o42bo3bobo11bo$121bo5bo6bo12b4o\n"+
	"44b2o6bobo20bobo23b2o15b3o3b2o10bobo$122b5o7bo7bo5bo46b2o6b2o21bo25b2o\n"+
	"14b5o13bo3bo$130bo2bo9bo37bo10b2o73bobobobo13b3o$130b2o9b3o13b2o22bobo\n"+
	"7b3o6bo37b2o27b2o3b2o6bo4b2o3b2o$157bobo24b2o6b2o6bo37b2o40bobo$158b3o\n"+
	"9b2o12b2o9b2o83b2o$159b2o9b2o12b2o9b2o26b3o44bo$156b2o23bobo25b2o12bo\n"+
	"45bobo$156b3o22bo11bo15b2o7bo5bo46bo$191bobo15b2o6b3o32bo14bo2bo$192b\n"+
	"2o15bo6b5o30b3o13bo$127bo8b2o19b2o49bobo39b5o13bo$125bobo6bo2bo19b2o\n"+
	"38b2o9bob2o37b2o3b2o9b3o$118b2o4bobo7bo3bo2b2o53bobo40b2o24bo$118b2o3b\n"+
	"o2bo7bo2b2o2b3o54bo40bobo34b2o9b2o$124bobo16b2obo62b2o28bo35b3o9b2o$\n"+
	"125bobo4b3o8bo2bo37b2o23b2o40b3o20bobo2bo2b2o$127bo15b2obo36bobo30b5o\n"+
	"30b3o20b2o2b2o2b2o$141b3o7b2o29b3o4b2o4bo21b3o58b2o$141b2o8bobo19b2o6b\n"+
	"3o4bo2b2obobo21bo35b2o$153bo19b2o7b3o4b3obo3bo9b2o32bo12bo30b2o$153b2o\n"+
	"28bobo4b2obo3bo9b2o31b2o13b3o27bo$184b2o6b2o3bo42bobo14bo17b2o6bobo$\n"+
	"194bobo77b3o6b2o$195bo75bob2o$148bo122bo2bo$147b4o66b3o51bob2o6bobo$\n"+
	"130b2o14b2obobo67bo20b2o24b2o6b3o4b2obo$122bo7bo2bo11b3obo2bo2b2o61bo\n"+
	"9b2o11b2o22bobo7b2o5bo$121bo3b2o7bo11b2obobo3b2o67b2obo2bob2o6bo24bo\n"+
	"17bo$121bo5bo6bo12b4o73b2o2bo4bo30b2o$122b5o7bo7bo5bo23bo46b2o8bo63b2o\n"+
	"$130bo2bo9bo29bo45b2o9bobo61bo$130b2o9b3o13b2o12b3o25b2o41bo7bo32bo10b\n"+
	"obo8b2o$157b2o36b4o4b2o35b3o7bobo28b3o11b2o6bo2bo$144b2o49b3ob2o2b2o\n"+
	"34bo10b2o28bo21bo15bobo$143bobo44b2o8bo16b2o20b2o4b2o33b2o20bo10b3o2bo\n"+
	"3bo$145bo10bob2o30b2o53b2o55bo19bo$156bobo31b2o21bo23bo12b2o51bo2bo2b\n"+
	"2o7bo4bo$150bo6bo32bo20b3o22b3o11bobo52b2o2bo2bobo7bo$148bobo6b2o15b3o\n"+
	"12bobo18bo24bo3bo10bo38b2o19b3o5bo3bo3b2o$127bo8b2o11b2o6b2o17bo12bobo\n"+
	"10b3o5b2o4b2o3b2o14bo40bo10b2o27bobo5bobo$125bobo6bo2bo19b2o16bo14bo\n"+
	"13bo12b5o3b2o7bo5bo36b3o17b3o28bo$118b2o4bobo7bo3bo2b2o60bo13b2ob2o4b\n"+
	"2o6bo5bo28b2o5b5o16bo30b2o$118b2o3bo2bo7bo2b2o2b3o73b2ob2o3bo9bo3bo29b\n"+
	"obo3bobobobo7b3o6bo4bo$124bobo16b2obo40b2o3b2o13b3o8b3o15b3o30bo5b2o3b\n"+
	"2o8b2o10bo$125bobo4b3o8bo2bo40bobobobo3b2o8b3o77b2o13b3o$127bo15b2obo\n"+
	"41b5o4b2o7bo3bo21b2o16bo36b3o$141b3o7b2o36b3o39b2o16bobo26bo9bobo$141b\n"+
	"2o8bobo36bo14b2o3b2o21bo13b2o3bo24bobo9b2o14b2o9b2o$153bo66b3o19b2o3b\n"+
	"2o3bo18bo5bo27bobo7bobo$153b2o65b3o19b2o3b2o3bo17b2o6bo2bo17bo5bo8bo6b\n"+
	"2o$163b2o54bo3bo25bobo9b2o7bobo8bo16bobo13bo2bo2bo2bob2o$163b2o39b2o\n"+
	"12bo5bo25bo10bobo16bo10b2o4bob2o13bo6b2o2b2o$148b2o54bobo12bo3bo39bo\n"+
	"17b3o7b2o3b2ob2o14bobo$146bo3bo5bo2b3o42bo15b3o12bo27b2o18bo13bob2o15b\n"+
	"2o$140b2o3bo5bo9bo3bo68b3o61bobo$140b2o2b2obo3bo8bo4bobo23b3o40b3o62bo\n"+
	"$145bo5bo16b2o20b2ob2o9bo49b4o26b2o$146bo3bo17b2o4b2o14b2ob2o37b2o3b2o\n"+
	"14bo7b2o22bo$148b2o18b2o4b2o14b5o37b2o3b2o14bo3b2o2b2o22bobo6b2o$165bo\n"+
	"bo21b2o3b2o52b2o4bo2b2o27b3o5bobo$165bo82b2o38b3o6bo11bobo$205b3o27bo\n"+
	"35bo16bo2bo2bo2bo10bo2bo4bo$204bo3bo25bobo32b3o17b2o6bo9b2o5b2o$203bo\n"+
	"5bo10b2o14b2o30bo17bo7bobo8b2o3bo8b2o$203bo5bo10b2o14b2o9b3o18b2o15b2o\n"+
	"7b2o11b2o10b2o$206bo28b3o9b3o30b2o3bobo11bo8bo2bo$194b2o8bo3bo25bobo9b\n"+
	"o3bo29bo2bo13b2o10bobo$194bo12bo26b2o9bo5bo46b2o$195b3o5bo2bo39bo3bo\n"+
	"29bo2bo$197bo5bo43b3o16bo12bo2bo$204bo60b3o11bobo$201b3o61b3o12bo11b2o\n"+
	"$201bo50bo39b2o22b2o$252b2o9b2o3b2o10b2o34bo$251bobo9b2o3b2o10b2o22b2o\n"+
	"8bobo$302bo3bo7b2o$293bo7bo5bo$263b2o28bobo4b2obo3bo$262bobo17b2o12b2o\n"+
	"3bo5bo$261b2o19b2o12b2o4bo3bo$262b2o32b2o6b2o$250bo11b2o29bobo$249b3o\n"+
	"13b3o25bo$248b5o$247bobobobo$247b2o3b2o2$261b2o3b2o2$262bo3bo$263b3o$\n"+
	"252b2o9b3o$252bo$67bo140b2o43b3o81bo$65b3o140b2o45bo5b2o72b3o$64bo197b\n"+
	"o71bo$65bo10b2o144b2o35b3o73bo10b2o$62bo2bo10b2o130bo13b2o35bo72bo2bo\n"+
	"10b2o$61bo145b3o121bo$60bo3bo141bo3bo119bo3bo$62bo145bo123bo$59bo5bo8b\n"+
	"2o129bo5bo8b2o107bo5bo8b2o$59bo5bo139bo5bo117bo5bo$60bo3bo141bo3bo119b\n"+
	"o3bo$61b3o143b3o121b3o2$73b2o3b2o139b2o3b2o117b2o3b2o$74b5o141b5o119b\n"+
	"5o$74b2ob2o141b2ob2o119b2ob2o$64bo9b2ob2o131bo9b2ob2o109bo9b2ob2o$34b\n"+
	"2o39b3o143b3o80b2o39b3o$34b2o268b2o$64bo145bo123bo$62bobo143bobo121bob\n"+
	"o$35bo27b2o144b2o94bo27b2o$34bobo267bobo$33bo3bo265bo3bo$33b5o180bo84b\n"+
	"5o$32b2o3b2o18b2o3b2o14bo124b2o3b2o8bobo3bo77b2o3b2o18b2o3b2o14bo$33b\n"+
	"5o39b3o138b2o3b3o77b5o39b3o$34b3o21bo3bo7b2o4b5o123bo3bo13b5o77b3o21bo\n"+
	"3bo7b2o4b5o$35bo23b3o8b2o3bobobobo123b3o13bobobobo77bo23b3o8b2o3bobobo\n"+
	"bo$59b3o13b2o3b2o123b3o13b2o3b2o101b3o13b2o3b2o$24bo269bo$22bobo40bo\n"+
	"226bobo40bo$20b2o42bo13bo145bo65b2o42bo13bo$14b2o4b2o35b2o5b3o10bobo\n"+
	"123b2o18bobo58b2o4b2o35b2o5b3o10bobo$14b2o4b2o36bo18bobo124bo18bobo58b\n"+
	"2o4b2o36bo18bobo$22bobo30b3o20bo122b3o20bo67bobo30b3o20bo$24bo30bo21b\n"+
	"2o122bo21b2o69bo30bo21b2o$77b2o144b2o122b2o$2o75b2o144b2o122b2o$bo$bob\n"+
	"o$2b2o7$68b2o162b2o104b2o$68b2o162b2o104b2o$46bo163bo6b2o97bo$46b3o\n"+
	"161b3o4bobo96b3o$49bo163bo3bo101bo$48b2o162b2o104b2o2$68b3o267b3o$67b\n"+
	"2ob2o143b2o120b2ob2o$67b2ob2o265b2ob2o$61b2o4b5o153b2o104b2o4b5o$66b2o\n"+
	"3b2o152b2o5b3o101b2o3b2o$59bo2bo64bo41bo42b2o3b2o12bo3bo41bo51bo2bo$\n"+
	"50b3o5bo66b3o39bobo42b2o3b2o11bo5bo38b3o42b3o5bo$49bo3bo6bo5bo57bo34b\n"+
	"2o4b2o64bo3bo38bo44bo3bo6bo5bo$48bo5bo9b2obo57bo10b2o21b2o4b2o47b3o3b\n"+
	"3o9b3o40bo10b2o30bo5bo9b2obo$48bo5bo12bo54bo2bo10b2o27b2o47b3o5bo8bo2b\n"+
	"o37bo2bo10b2o30bo5bo12bo$121bo45bobo45bo5bo9b3o37bo$54bo9bob2o52bo3bo\n"+
	"44bo60bob2o36bo3bo49bo9bob2o$53b2o11bo2bo52bo107bobo39bo50b2o11bo2bo$\n"+
	"53b2o12bobo49bo5bo8b2o44bo50bo37bo5bo8b2o37b2o12bobo$51bo2b2o63bo5bo\n"+
	"53b3o87bo5bo45bo2b2o$52bobo65bo3bo53b5o87bo3bo47bobo$52b2o67b3o53b2o3b\n"+
	"2o32b3o9b2o3b2o36b3o48b2o$178b5o33b3o9bobobobo$66b3o64b2o3b2o38bo3bo\n"+
	"32bo3bo9b5o49b2o3b2o46b3o$50b2o3b2o8bo3bo64b5o40bobo48b3o51b5o31b2o3b\n"+
	"2o8bo3bo$50b2o3b2o7bo5bo63b2ob2o41bo33b2o3b2o10bo52b2ob2o31b2o3b2o7bo\n"+
	"5bo$65bo3bo54bo9b2ob2o135bo9b2ob2o46bo3bo$52b3o11b3o25b2o39b3o106b2o\n"+
	"39b3o34b3o11b3o$52b3o11b3o25b2o83b2o63b2o76b3o11b3o$53bo70bo54b2o93bo\n"+
	"48bo$122bobo108b2o37bobo$95bo27b2o108bo11bo27b2o$67b2o25bobo137b3o7bob\n"+
	"o90b2o$55b2o10b2o24bo3bo121b2o15bo6bo3bo77b2o10b2o$55bo37b5o121bo23b5o\n"+
	"77bo$49b2o5b3o33b2o3b2o18b2o3b2o14bo81b3o19b2o3b2o18b2o3b2o14bo37b3o$\n"+
	"49b2o7bo34b5o39b3o82bo20b5o39b3o38bo$94b3o21bo3bo7b2o4b5o103b3o21bo3bo\n"+
	"7b2o4b5o$95bo23b3o8b2o3bobobobo103bo23b3o8b2o3bobobobo$119b3o13b2o3b2o\n"+
	"127b3o13b2o3b2o$84bo149bo$82bobo40bo106bobo40bo$80b2o42bo13bo91b2o42bo\n"+
	"13bo$74b2o4b2o35b2o5b3o10bobo84b2o4b2o35b2o5b3o10bobo$74b2o4b2o36bo18b\n"+
	"obo84b2o4b2o36bo18bobo$82bobo30b3o20bo93bobo30b3o20bo$84bo30bo21b2o95b\n"+
	"o30bo21b2o$137b2o148b2o$2o135b2o148b2o$bo$bobo$2b2o7$128b2o148b2o$128b\n"+
	"2o148b2o$106bo149bo$106b3o147b3o$109bo149bo$108b2o148b2o2$128b3o147b3o\n"+
	"$127b2ob2o145b2ob2o$127b2ob2o145b2ob2o$121b2o4b5o139b2o4b5o$126b2o3b2o\n"+
	"143b2o3b2o$119bo2bo146bo2bo$110b3o5bo141b3o5bo$109bo3bo6bo5bo132bo3bo\n"+
	"6bo5bo$108bo5bo9b2obo130bo5bo9b2obo$108bo5bo12bo130bo5bo12bo2$114bo9bo\n"+
	"b2o136bo9bob2o$113b2o11bo2bo133b2o11bo2bo$113b2o12bobo133b2o12bobo$\n"+
	"111bo2b2o145bo2b2o$112bobo147bobo$112b2o148b2o2$126b3o147b3o$110b2o3b\n"+
	"2o8bo3bo130b2o3b2o8bo3bo$110b2o3b2o7bo5bo129b2o3b2o7bo5bo$125bo3bo145b\n"+
	"o3bo$112b3o11b3o133b3o11b3o$112b3o11b3o133b3o11b3o$113bo149bo3$127b2o\n"+
	"148b2o$115b2o10b2o136b2o10b2o$115bo149bo$116b3o147b3o$118bo149bo!";

		String sCounter =
	"111b2o$109bo2bo$96bobo9bo7b5o22bo$96bo3bo7bo6bo5bo20b2o$100bo7bo7b2o3b\n"+
	"o19b2o11b2o$96bo4bo7bo2bo7bo10b2o7b3o7bo3b3o$100bo10b2o18b2o8b2o5b4o4b\n"+
	"2obo$88b2o6bo3bo41b2o2bo4bo4bo2bo$87bobo6bobo8bobo33bo2bo3bo5b2obo$87b\n"+
	"o20b2o37bob2o3b3o6b2o$86b2o20bo20b2o23b2o7bobo$129b2o34bo$165b2o$129bo\n"+
	"10bobo$128bobo9b2o$128bo2bo9bo4bo$92bo10bo25bo2bo12b2o21b2o$92b2o9b2o\n"+
	"40bobo20bo$83b2o2b2o4b2o7bobo4bo19bo2bo23bo9bobo$83b2o2b2o4b3o13bobo\n"+
	"17b2o24bobo8b2o$87b2o4b2o15bobo31bo8b2o3bo$92b2o16bo2bo30b4o5b2o3bo$\n"+
	"76b3o13bo17bobo32b4o4b2o3bo$75bo33bobo4b2o4bobo20bo2bo6bobo$75bo3bo29b\n"+
	"o6bobo4b2o20b4o7bo$75bo2bobo8bo28bo4bo11b2o7b4o$77bobo2bo4b3o28b2o14bo\n"+
	"bo7bo$78bo3bo3bo47bo$82bo3b2o37bobo5b2o$79b3o43b2o$84bo41bo3b2o$83bobo\n"+
	"44bobo$84b2o2b2o2b2o19b2o17bo$88b2o3bo19bo18b2o$93bobo8b2o5bobo12b2o$\n"+
	"94b2o7b3o5b2o12b2o$100bob2o23bo$100bo2bo$100bob2o$103b3o$104b2o7$145b\n"+
	"2o$146bo$146bobo8bo21b2o$147b2o8bobo19bo$95b2o61bobo7bo8bobo$95b2o61bo\n"+
	"2bo6b2o7b2o$92b2o6bo28bo28bobo2b2o4b2o$91b3o6bo28b3o25bobo3b2o4b3o$92b\n"+
	"2o38bo24bo5b2o4b2o$86b2o7b2o6b2o26b2o35b2o$85bobo7b2o6bobo62bo$85bo19b\n"+
	"o27b3o20bo$84b2o19b2o26b3o19bo$132bo3bo18b3o10bo$131bo5bo29bobo$102b2o\n"+
	"28bo3bo31bobo$101bobo29b3o23b3o7b2o$87bo12b3o4b2o50bo$87b4o8b3o4bo2b4o\n"+
	"47bo$88b4o8b3o4b2ob3o35bo6b2o$88bo2bo9bobo44bobo4b2o$88b4o10b2o28bobo\n"+
	"13b2o$79b2o6b4o41bo2bo$39bo38bobo6bo25b2o19b2obo$39b3o36bo34b2o$42bo\n"+
	"34b2o22b2o10b2o19bo$41b2o58b2o11bo19bob2o3bo$113bobo19bo4bo$112b2obo\n"+
	"24b3o$74b2o$75bo31bo21b2o3b2o48b2o$43b3o29bob2o3b2o21bobo5b2o15b5o49bo\n"+
	"bo$42b2ob2o29bo3bo3bo5bo2b3o10b2o5b2o15b2ob2o50bobo$42b2ob2o38bo9bo3bo\n"+
	"30b2ob2o51bo$42b5o31bo2bo3bo8bo4bobo29b3o$41b2o3b2o31bo5bo16b2o86b2o$\n"+
	"80bo3bo17b2o82b2o4b4o$82b2o18b2o82b2o2b2ob3o$99bobo5b2o20b2o59bo8b2o$\n"+
	"99bo7bobo20bo19bo48b2o$109bo17b3o21bo25bo$109b2o16bo21b3o25b3o$180bo$\n"+
	"41b2o29bo106b2o$42bo27b3o34bo23bo6bo$39b3o27bo34b4o4bo9bo7b2o6b2o59b3o\n"+
	"$39bo29b2o24bo7b4o5bo7bobo6b3o6b3o48b3o$94bobo6bo2bo9b2o3b2o7b2o6b2o\n"+
	"49bo9bobo$82b2o9bo3b2o4b4o9b2o13bo6bo51bo7b5o$82b2o9bo3b2o5b4o89b2o3b\n"+
	"2o$93bo3b2o8bo89b2o3b2o$94bobo44b2o46b3o$95bo22b2o20bobo22bo15b3o7bo$\n"+
	"104bobo11b2o22bo17b3ob2o2b2o10bo3bo5bo6b2o$64b2o3b2o34b2o40b3o10b4o4b\n"+
	"2o9bo5bo9b2obo$65b5o35bo13bo29bo14b2o7b2o5bo3bo10bo$65b2ob2o48bobo27bo\n"+
	"24b2o6b3o$65b2ob2o47bo2bo30bo21b2o6bo2bo11b3obo$66b3o47bo2bo31b3o20bo\n"+
	"7b3o15bo$100bo53bo18bobo6b2obo14bo$88b2o10b2o14bo2bo33b2o5b3o10bobo7bo\n"+
	"bo$88b2o9bobo16b2o40bo13bo9bo$79b2o3bo6b2o12b2o54bo$69b2o8bobo3bo5b3o\n"+
	"10bo3bo$69bo10b5o6b2o10bo5bo45b3o13b2o3b2o3b2o3b2o7b2o3b2o$70b3o8b3o4b\n"+
	"2o13bo3bob2o44b3o8b2o3bobobobo3bobobobo9b3o$72bo15b2o13bo5bo34b2o8bo3b\n"+
	"o7b2o4b5o5b5o9bo3bo$104bo3bo3b2o19b3o8b2o27b3o7b3o11bobo$105b2o5bobo4b\n"+
	"obo4b2o7bo17b2o3b2o14bo9bo13bo$114bo5b2o5b2o5bo$97b2o15b2o4bo5bo$97b2o\n"+
	"$159b2o36b2o$79bo31b2o45bobo25b2o9b2o$78bobo30b2o47bo25bo$61b2o14bo3b\n"+
	"2o14b3o87b3o$61bobo13bo3b2o3b2o9b3o71b3o15bo$62b3o12bo3b2o3b2o8bo3bo\n"+
	"35bo23bo9b2ob2o$24bo38b3o12bobo14bo5bo6b3o2b3o20b2o32b2ob2o$24b3o35b3o\n"+
	"7bo6bo16bo3bo9bo2bo17b2o4b2o31b5o$27bo26b2o5bobo9b2o22b3o9bo4bo16b2o4b\n"+
	"3o7b2o20b2o3b2o21bo$26b2o25bobo5b2o9b2o14b2o41b2o4b2o8b2o47b3o$53bo33b\n"+
	"o2bo37b2o6b2o19b3o35b5o$52b2o36bo36bobo6bo19bo3bo33bobobobo$90bo36bo\n"+
	"27bo5bo32b2o3b2o$87b2obo35b2o27bo5bo8b2o$28b3o56b2o69bo$27b2ob2o17b2o\n"+
	"105bo3bo36bo$27b2ob2o18bo106b3o36bobo$27b5o18bobo6bo7bo20b2o5b2o61bo\n"+
	"13b2o22bo$26b2o3b2o18b2o4bobo5b4o19b2o6bo75b2o23bo2bo$55b2o8b2o2bo2b2o\n"+
	"19b3o104bo$55b2o11b2o2b2o19bo24bo39b2o39bo$55b2o7bo10b2o41b3o14b2o21b\n"+
	"2o40b3o$57bobo4bo10b3o43bo14bo65bo$59bo4bo10b2o43b2o14bob2o5b2o$72b2o\n"+
	"8b2o53bo7bobo$72b2o8bobo18b3o35bo4b3o12bo$26b2o29bo26bo11b2o7bo33bo2bo\n"+
	"4b3o8b4o4bo$27bo27b3o26b2o11b2o5bo17b3o15b2o4b3o8b4o5bo$24b3o27bo41bo\n"+
	"48bobo9bo2bo9b2o$24bo29b2o66bobo20b2o10b4o9b2o$121b5o5b2o16bo8b4o$103b\n"+
	"2o15b2o3b2o4bobo14bo12bo$103bobo14b2o3b2o5b3o13b3o$98b2o4b3o26b2o$97bo\n"+
	"2bo4b3o22b2o$76b2o21bo4b3o23b3o$72b2obo2bob2o13bo7bobo6b2o29b3o38bo$\n"+
	"49b2o3b2o16b2o2bo4bo12bob2o5b2o7bobo6b2o20bo23b2o13b3o$50b5o12b2o8bo\n"+
	"16bo19bo5b2o9b2o11bo22bo13bo$50b2ob2o12b2o9bobo12b2o19b2o3bo2bo2b2o4b\n"+
	"2o23bo8bobo13b2o$50b2ob2o35bo30bo3bo30b2o7b2o$51b3o27b2o5b3o35b3o16bo\n"+
	"5b2o4b2o$82b2o3bo40bo16bobo3b2o4b3o$81bo5b2o12b2o30b2o11bobo2b2o4b2o\n"+
	"19b3o$85b3o12b3o30b2o11bo2bo6b2o19b2ob2o$84bobo12bobo2bo2b2o37bobo7bo\n"+
	"20b2ob2o$24bo29b2o28bobo12b2o2b2o2b2o36bobo29b5o$24b3o27bo30bo8b2o7b2o\n"+
	"40bo30b2o3b2o$27bo27b3o16b2o18b2o$26b2o29bo6b2o3b2o3b2o41bo$82b2obob2o\n"+
	"26b3o61b2o$65bo3bo12bo5bo25bo62b5o$66b3o14bo3bo6bo19b2o65bo$66b3o11bo\n"+
	"3b3o6b3o9b2o35b2o33b3o$28b3o48b2o11bo3bo7bobo35b2o33bo$27b2ob2o47bobo\n"+
	"9bob3obo8bo71b2o$27b2ob2o37bo22b5o81b2o$27b5o36b3o$26b2o3b2o34bo3bo30b\n"+
	"2o7b3o26b2o$69bo32bobo5bo3bo63b2o3b2o$47b2o5b2o10bo5bo29bo75bobobobo$\n"+
	"47b2o5bo11bo5bo10bo13b3o9bo5bo55bobo5b5o$52bobo12bo3bo11bo15bo9b2o3b2o\n"+
	"55b2o7b3o$52b2o14b3o11bobo13bo40b2o3b2o26bo8bo$48b2o31b2ob2o54b5o$48bo\n"+
	"bo29bo5bo22b2o29b2ob2o$26b2o21bo33bo24bobo29b2ob2o$27bo25bo26b2o3b2o\n"+
	"21bo32b3o$24b3o25bobo53b2o55bo$24bo26bo3bo56bo43b3o4b2o$52bo3bo14b2o\n"+
	"11bo10b3o11bo2bo43bo7b2o15b2o$53bo3bo13bo12bo9bo3bo13bo44bo23b2o$54bo\n"+
	"3bo13b3o10bo7bo5bo43b3o$55bobo16bo18b2obob2o43b3o$56bo50b2obob2o28bo3b\n"+
	"o38b2o$82b2o57bo5bo20b2o15b2o$82b2o12bo10bo5bo28bo3bo20b2o$95bobo45b3o\n"+
	"16b2o5bo$95bobo10b2ob2o49b2o$96bo13bo2$95b2o$72bo22b2o10b2o67bo8bo$16b\n"+
	"o53b3o35bo66b2o7b3o$16b3o50bo35b3o67bobo5b5o$19bo49b2o5b3o26bo35b2o39b\n"+
	"obobobo$18b2o55bo66bo39b2o3b2o$75bo3bo59b3o$21bo53bo2bobo8bo49bo$20bob\n"+
	"o54bobo2bo4b3o92b2o$19bo3bo54bo3bo3bo95b2o$19b5o58bo3b2o93bo$18b2o3b2o\n"+
	"39b2o3b2o8b3o99b3o$19b5o41b5o14bo100bo$20b3o42b2ob2o13bobo95b5o$21bo\n"+
	"43b2ob2o14b2o2b2o93b2o$66b3o19b2o2$180b2o3b2o$181b5o$181b2ob2o$69b2o\n"+
	"110b2ob2o$18b2o49bo112b3o$19bo50b3o$16b3o53bo$16bo3$183b2o$183b2o$90bo\n"+
	"$88b3o$87bo$87b2o5$85bo$84b3o$83b5o$82bobobobo$82b2o3b2o3$85bo$84bobo$\n"+
	"84bob2o$85b3o$12bo72bo2bo$12b3o71b3o$15bo43b2o24bo3bo$14b2o43b2o23bo5b\n"+
	"o$79bo5bo3bo$78bo7b3o$78b3o2$59bo$57b2ob2o51b2o$67b2o44bo$56bo5bo4b2o\n"+
	"32b2o8bobo$14b2o3b2o50bo29b2o8b2o$16b3o37b2obob2o8bobo10b2o18b2o$15bo\n"+
	"3bo51b2o12bo18b3o$16bobo63b3o19b2o$17bo43bo20bo11b2o5b2o$58bo2bo31bobo\n"+
	"5b2o$63bo29bo13bo$14b2o41b2o3b4o26b2o11b2o$15bo41bo2bo4bo40b2o6b3o$12b\n"+
	"3o42bobo4b2o48bo$12bo45b2o55bo3$58b2o3b2o$13b2o5b2o36bo5bo33bobo$14bo\n"+
	"5b2o76b2o22b2o$14bobo42bo3bo35bo22bobo$15b2o43b3o59bo$19b2o$18bobo$15b\n"+
	"o3bo$15b2o75bo$14b2obo72b2o$13bo2b3o72b2o16b2o18b3o$12bobobo43b2o46bob\n"+
	"o18bo$11bobobo44b2o45bo13bobo6bo$9b3o2bo83b2o7bo2bo6b2o2bo2bo$10bob2o\n"+
	"84b2o7bo8bobo5b2o$11b2o95bobo3bo3bo3bo3b2o$12bo70bobo23b2o2b2ob3o5b2o$\n"+
	"83b2o31b2o3bo2bo5b2o5b2o$84bo36bobo6bobo4bobo$79b2o12bo2bo35bo4bo$92bo\n"+
	"14b4o21b2o$77bo2bo11bo3bo10bo3bo$77bo14b4o11bo$76bo2bo28bo2bo$77b2o$\n"+
	"144b3o$119b2o23bo12bo$118b2o25bo8b4o$78bo41bo20b2o10b4o$32b3o41b3o62bo\n"+
	"bo9bo2bo$31bo3bo39bo19b2o9b2o24b3ob2o4b3o8b4o$30bo5bo38b2o18bobo9b2o\n"+
	"23b4o2bo4b3o8b4o6b2o$86b3ob2o4b3o7bo6bo22b2o4b3o12bo6bobo30bo$29bo7bo\n"+
	"48b4o2bo4b3o12bobo12bo13bobo22bo28b3o$29bo7bo52b2o4b3o12bo3b2o3b2o4b2o\n"+
	"13b2o23b2o26bo$95bobo13bo3b2o3b2o4bobo65b2o$30bo5bo58b2o14bo3b2o$31bo\n"+
	"3bo76bobo24b2o$32b3o35b2o3b2o36bo25bobo$71b5o53bo4b2o6bo$71b2ob2o52bob\n"+
	"o2bo2bo2bo2bo7b2o$71b2ob2o40b2o10b2obob3o6bo7b2o37b2o3b2o$72b3o41b2o\n"+
	"10b2ob2o6bobo47b2o3b2o$128b2obo7b2o49b5o$128bobo60bobo$129bo$191b3o$\n"+
	"75b2o$21bo53bo$21b3o52b3o$24bo53bo$23bo170b2o$23bo2bo167bo$27bo167b3o$\n"+
	"25bobo54bo114bo$26bo53b3o$79bo$79b2o45bo$23b2o3b2o96bobo$23bobobobo99b\n"+
	"2o6b2o$24b5o86b2o12b2o4bo3bo$25b3o87b2o12b2o3bo5bo8b2o$26bo99bobo4b2ob\n"+
	"o3bo8b2o$126bo7bo5bo$111bo23bo3bo$77bo33bobo23b2o$76b3o15bo17bobo12bo$\n"+
	"23b2o50b5o14b2o16bo2bo3b2o4b2o$24bo49b2o3b2o8b2o4b2o15bobo4b2o5b2o12bo\n"+
	"24b2o$21b3o51b5o5b2o2b2o4b3o13bobo26b2o23bo$21bo53bo3bo5b2o2b2o4b2o7bo\n"+
	"bo4bo23b2o4b2o13b2o5bobo$76bobo15b2o9b2o24b2o2b2o4b3o11b3o5b2o$77b3o\n"+
	"14bo10bo25b2o2b2o4b2o9bob2o$79b2o59b2o10bo2bo$79bo38bobo19bo11bob2o$\n"+
	"80b3o35b2o24bo10b3o$82bo36bo24bobo9b2o$144b2o$76b2o$76b2o15bo2bo$76b2o\n"+
	"14bo14b4o$92bo3bo10bo3bo$78b2o12b4o11bo23b2o4bo$78b2o28bobo20bo4bo$\n"+
	"120b2o7bobo4b3o$83b2o30bo4b2o7b2o$37bo44b2o25b2ob5o6b2o$37b3o44bo23bo\n"+
	"4b2o2bo5b3o$40bo56b2o8bo8b2o5b2o$39b2o56b2o8bo7bo4b2o$107bo12b2o7bo$\n"+
	"108bo20bobo$91bo17b2o18b2o$o89b2o$3o87bobo$3bo$2b2o$122bo$121bo$39b2o\n"+
	"3b2o75b3o$4b3o34b3o54b2o$3b2ob2o32bo3bo52b2o$3b2ob2o33bobo55bo$3b5o34b\n"+
	"o$2b2o3b2o$39b2o73bo$40bo73bobo$37b3o66bo7b2o$37bo53b2o12b2o$92bo12bob\n"+
	"o$92bobo5b2o$93b2o5bobo$2b2o97b3o$3bo71bo26b3o$3o72b4o22b3o$o75b4o20bo\n"+
	"bo7b2o$76bo2bo20b2o8bobo$76b4o32bo$66b2o7b4o4b2o27b2o$65bobo7bo7bobo$\n"+
	"65bo19bo$64b2o19b2o5$94b2o$94b2o4$117bo$116b2o$115b2o3b2o$114b3o$115b\n"+
	"2o$106b2o8b2o5b2o$105bobo9bo5bobo$105bo19bo$104b2o19b2o3$111b2o$111bob\n"+
	"o$98bobo13bo$97bo2bo2b2o6bo2bo7b2o$88b2o6b2o5bobo8bo7b2o$88b2o4b2o3bo\n"+
	"3bo3bo3bobo$96b2o5b3ob2o2b2o$97bo2bo3b2o85b2o$98bobo23b2o65b2o$124b2o\n"+
	"38b2o$112b2o50b2o$112b2o$124b3o$108b2o15b2o$107bobo12b2o$109bo12b3o$\n"+
	"98bo24bobo$97b4o23b2o62b2obob2o$85b2o9b2obobo6bobo53b3o6b3o$85b2o8b3ob\n"+
	"o2bo3bo3bo52bo3bo7bo12bo5bo$82bo13b2obobo4bo55bo5bo5bo$80b3o14b4o4bo4b\n"+
	"o51b2obob2o20b2ob2o$79bo18bo7bo67b3o14bo$79b2o25bo3bo7b2o54bo2bo$108bo\n"+
	"bo7bobo47bo5bo$120bo46b2o5bo$77bo42b2o53bobo$75b2ob2o86bob2o$165bo2b2o\n"+
	"18bo$74bo5bo84b4o17b2o4b3o$111b2o74b2o2bo3bo$74b2obob2o30bobo$98bobo\n"+
	"13bo49b2o3b2o19bo5bo$97bo2bo2b2o6bo2bo7b2o12bo30bo22b2o3b2o$88b2o6b2o\n"+
	"5bobo8bo7b2o13bo26bo5bo2b2o$88b2o4b2o3bo3bo3bo3bobo21b3o27b2ob2o2bobo$\n"+
	"96b2o5b3ob2o2b2o53bobo5bo4bobo$97bo2bo3b2o61bo11b2o$98bobo23b2o41bo8bo\n"+
	"3bo$79b2o43b2o49b2o$79bo44b2o49bobo$80b3o31bo10bo$82bo29bobo9bobo42bo$\n"+
	"108b2o3b2o8b2obo41b3o$107bobo57bo3bo$109bo56bob3obo14b2o3b2o$98bo25b2o\n"+
	"41b5o11b2o3b5o$97b4o23b2o56b2o4b2ob2o$85b2o9b2obobo6bobo27b3o43bo3b2ob\n"+
	"2o$85b2o8b3obo2bo3bo3bo29bo48b3o$96b2obobo4bo32bo$97b4o4bo4bo$98bo7bo$\n"+
	"106bo3bo7b2o$108bobo7bobo66b3o$120bo66b3o$120b2o64bo3bo$130b2o36b2o15b\n"+
	"o5bo$130b2o36b2o16bo3bo$118b2o67b3o$117bobo$107b2o7b3o4b2o4bo$107b2o6b\n"+
	"3o4bo2b2obobo$116b3o4b3obo3bo$117bobo4b2obo3bo9b2o$118b2o6b2o3bo9b2o$\n"+
	"128bobo$129bo2$188b2o$188b2o2$17bo$17b3o$20bo$19b2o6$21b3o$20bo3bo$19b\n"+
	"o5bo$19b2obob2o3$22bo74bo$21bobo73bobo$21bobo74bobo7bo$20b3o62b2o11bo\n"+
	"2bo6b2o$19b2o64b2o11bobo2b2o4b2o8b2o$20bo76bobo3b2o4b3o7b2o$17b3o77bo\n"+
	"5b2o4b2o$17bo90b2o$83b2o23bo$83b2o$83b2o10b2o$83bo11b2o$82bobo$82bob2o\n"+
	"2$100b3o$83b2o15bo12bo$83b2o2b2o12bo8b4o$88bobo6b2o10b4o9b2o$88b2o7bob\n"+
	"o9bo2bo9b2o$92b2o4b3o8b4o5bo$91bo2bo4b3o8b4o4bo$93bo4b3o12bo$89bo7bobo\n"+
	"$88bob2o5b2o$88bo$87b2o4$97bo$97bobo$73bo24bobo7bo$73bobo9b2o11bo2bo6b\n"+
	"2o$73b2o10b2o11bobo2b2o4b2o8b2o$97bobo3b2o4b3o7b2o$97bo5b2o4b2o$108b2o\n"+
	"$83b2o23bo$82bobo11bo$81b3o11bo$81b2o12b3o$84b2o$83b3o2$100b3o$83b2o\n"+
	"15bo12bo$83b2o16bo8b4o$97b2o10b4o9b2o$70b2o25bobo9bo2bo9b2o$70bobo19b\n"+
	"2o4b3o8b4o5bo$70bo20bo2bo4b3o8b4o4bo$93bo4b3o12bo$89bo7bobo$81bo6bob2o\n"+
	"5b2o$80bo7bo$82bo4b2o$77b2o3bo$77bo$78bo9bo$87bobo$75bobo8bob2o10b2o$\n"+
	"70bo4bo2bo6b2ob2o10b2o$71b2o5b2o6bob2o$66b2o8bo3b2o5bobo$66b2o10b2o8bo\n"+
	"$75bo2bo$75bobo!";

		String sCounterIncDec =
	"10bo$8b3o$7bo$7b2o6$2b2o3b2o$2bo5bo2$3bo3bo$4b3o7$8bo$6bobo$7b2o2$3bo$\n"+
	"2b3o$b5o$2o3b2o8bo$b5o10bo$bo3bo3bo4b3o$2bobo4b3o$3bo8bo$11b2o2$3b2o$\n"+
	"3b2o18bo$21bobo$22b2o3$13b3o5bo$12bo3bo4b2o$11bo5bo2bobo18b2o$12bo3bo\n"+
	"24b3o$13b3o15bobo9b2obo5b2o$13b3o15bo6bo4bo2bo5b2o$37bo5b2obo$32bo4bo\n"+
	"3b3o$11b2o21b2o5b2o$12bo5b2o$9b3o6bobo$9bo8bo10b2o3b2o2$30bo3bo$31b3o$\n"+
	"31b3o7b2o$41b2o$25b3o$25bo8b2o$26bo7bo$35b3o$37bo3$33b2o$33bobo5b3o$\n"+
	"33bo6bo3bo$39bo5bo$39bo5bo2$39bo$39b2o$39b2o$38b2o2bo$39bobo$40b2o3$\n"+
	"37b2o3b2o$37b2o3b2o2$39b3o$39b3o$40bo6$40b2o$40b2o!";

		String sdownleftbend =
	"25bo$25bobo$8b2o18b2o$6bo3bo17b2o4b2o$2o3bo5bo16b2o4b2o$2o2b2obo3bo8bo\n"+
	"4bobo$5bo5bo9bo3bo$6bo3bo5bo2b3o$8b2o$29b2o19b2o$30bo19bo$30bobo6bobo\n"+
	"6bobo$31b2o6bo3bo4b2o$28bo14bo$26bobo10bo4bo$27b2o14bo$39bo3bo$39bobo\n"+
	"2$43bo6b3o$35bo5b2o7bo$36bo5b2o7bo$34b3o4$58b2o$58bobo$58bo$49b2o$49b\n"+
	"3o$44b2o5b2obo$43bo2bo4bo2bo$44b2o5b2obo$49b3o6b2o5b3o$45bo3b2o7bobo4b\n"+
	"o$44bobo13bo5bo$44bobo13b2o16bo$45bo32b2o$67bo5b2o4b2o$67bobo3b2o4b3o\n"+
	"7b2o$42b2obob2o6b2o11bobo2b2o4b2o8b2o$42bo5bo6b2o11bo2bo6b2o$43bo3bo\n"+
	"20bobo7bo$44b3o20bobo$67bo7$44b2o$44b2o!\n";

		String sdownright =
	"63bo$61b4o$60bobob2o14b2o$55b2o2bo2bob3o11bo2bo7bo$55b2o3bobob2o11bo7b\n"+
	"2o3bo$61b4o12bo6bo5bo$63bo5bo7bo7b5o$68bo9bo2bo$68b3o9b2o$39b2o19b2o$\n"+
	"40bo19bo$40bobo5bo9bobo$41b2o4bobo8b2o$45b2o3bo$45b2o3bo10bo$45b2o3bo\n"+
	"10bobo$47bobo11b2o$48bo$39b3o$41bo$40bo7bo$49b2o3bo$48b2o3bo$53b3o2$\n"+
	"32b2o$31bobo$33bo2$39bo$37bobo$35b2o8b2o$35b2o6bo$24b3o8b2o9bo$26bo4b\n"+
	"2o4bobo2bo$25bo4bobo6bo2bo$30bo$11b2o16b2o12b2o$11b2o4bo27bo$8b2o6b5ob\n"+
	"2o$2o5b3o5bo2b2o4bo$2o6b2o5b2o8bo8b2o6b2o3b2o$11b2o4bo7bo8b2o6b2o3b2o$\n"+
	"11b2o12bo17b5o$24bo19bobo$22b2o$44b3o6$45b2o$45b2o!";


		String sleftdownfan =
	"53bo$51b3o$50bo$51bo10b2o$48bo2bo10b2o$47bo$46bo3bo$48bo$45bo5bo8b2o$\n"+
	"45bo5bo$46bo3bo$47b3o2$59b2o3b2o$60b5o$60b2ob2o$50bo9b2ob2o$20b2o39b3o\n"+
	"$20b2o$50bo$48bobo$21bo27b2o$20bobo$19bo3bo$19b5o$18b2o3b2o18b2o3b2o\n"+
	"14bo$19b5o39b3o$20b3o21bo3bo7b2o4b5o$21bo23b3o8b2o3bobobobo$45b3o13b2o\n"+
	"3b2o$10bo$8bobo40bo$6b2o42bo13bo$2o4b2o35b2o5b3o10bobo$2o4b2o36bo18bob\n"+
	"o$8bobo30b3o20bo$10bo30bo21b2o$63b2o$63b2o10$54b2o$54b2o$32bo$32b3o$\n"+
	"35bo$34b2o2$54b3o$53b2ob2o$53b2ob2o$47b2o4b5o$52b2o3b2o$45bo2bo$36b3o\n"+
	"5bo$35bo3bo6bo5bo$34bo5bo9b2obo$34bo5bo12bo2$40bo9bob2o$39b2o11bo2bo$\n"+
	"39b2o12bobo$37bo2b2o$38bobo$38b2o2$52b3o$36b2o3b2o8bo3bo$36b2o3b2o7bo\n"+
	"5bo$51bo3bo$38b3o11b3o$38b3o11b3o$39bo3$53b2o$41b2o10b2o$41bo$42b3o$\n"+
	"44bo!";

		String sleftup =
	"49b2o$49b2o2$63b2o$49bo13b2o$48b3o$47bo3bo$49bo$46bo5bo8b2o$46bo5bo$\n"+
	"47bo3bo$48b3o2$60b2o3b2o$61b5o$61b2ob2o$51bo9b2ob2o$62b3o2$51bo$49bobo\n"+
	"$50b2o3$59bo$44b2o3b2o8bobo3bo$59b2o3b3o$45bo3bo13b5o$46b3o13bobobobo$\n"+
	"46b3o13b2o3b2o3$65bo$44b2o18bobo$45bo18bobo$42b3o20bo$42bo21b2o$64b2o$\n"+
	"64b2o10$73b2o$73b2o$51bo6b2o$51b3o4bobo$54bo3bo$53b2o3$56b2o2$66b2o$\n"+
	"66b2o5b3o$10bo42b2o3b2o12bo3bo$8bobo42b2o3b2o11bo5bo$2o4b2o64bo3bo$2o\n"+
	"4b2o47b3o3b3o9b3o$6b2o47b3o5bo8bo2bo$8bobo45bo5bo9b3o$10bo60bob2o$71bo\n"+
	"bo$21bo50bo$20b3o$19b5o$18b2o3b2o32b3o9b2o3b2o$19b5o33b3o9bobobobo$19b\n"+
	"o3bo32bo3bo9b5o$20bobo48b3o$21bo33b2o3b2o10bo3$20b2o$20b2o$74b2o$74bo$\n"+
	"75b3o$60b2o15bo$60bo$61b3o$63bo!";


		String srightdownfan =
	"14bo$14b3o$17bo$o15b2o$3o$3bo$2b2o$56b2o$56b2o3$5bo10b2o3b2o33bo$4b3o\n"+
	"48bobo$3b5o9bo3bo32bo3bo$2bobobobo9b3o33b5o$2b2o3b2o9b3o32b2o3b2o$54b\n"+
	"5o$55b3o$5bo50bo$4bobo$3b2obo60bo$3b3o9bo5bo45bobo$2bo2bo8bo5b3o47b2o$\n"+
	"2b3o9b3o3b3o47b2o4b2o$bo3bo64b2o4b2o$o5bo11b2o3b2o42bobo$bo3bo12b2o3b\n"+
	"2o42bo$2b3o5b2o$10b2o2$20b2o3$23b2o$19bo3bo$17bobo4b3o$18b2o6bo$3b2o$\n"+
	"3b2o10$12b2o$12b2o$12b2o21bo$12bo20b3o$11bobo18bo$11bobo18b2o$12bo3$9b\n"+
	"2o3b2o13b3o$9bobobobo13b3o$10b5o13bo3bo$11b3o3b2o$12bo3bobo8b2o3b2o$\n"+
	"18bo3$26b2o$26bobo$26bo2$13b3o$12b2ob2o9bo$12b2ob2o$12b5o$11b2o3b2o2$\n"+
	"27b3o$26bo3bo$25bo5bo$15b2o8bo5bo$28bo$26bo3bo$27b3o$13b2o13bo$13b2o2$\n"+
	"27b2o$27b2o!\n";

		String sStateLatch =
	"18b2o$18bobo$19b3o$10bo9b2o32b2o$8b3o9b2o31b3o$7bo10bobo29bob2o15bo$7b\n"+
	"2o10bo23b2o5bo2bo8b3o4bobo$43b2o5bob2o16bobo4b2o$53b3o2b2o2bo7bo2bo3b\n"+
	"2o$16b2o3b2o31b2o2bo3bo7bobo$16b2o3b2o36bo2bo6bobo$59b2o8bo$18b3o$18b\n"+
	"3o32b2o$4b3o12bo33b2o$3bo3bo48b2o$2bo5bo47bobo$3bo3bo48bo23b2o$4b3o73b\n"+
	"o$4b3o62b2o7bobo$17bo51bobo6b2o$15b2o42bo4b2o4b3o$16b2o26bo13bobob2o2b\n"+
	"o4b3o$43bo13bo3bob3o4b3o$2b3o15b3o20b3o11bo3bob2o4bobo$b2ob2o3bo9bo3bo\n"+
	"33bo3b2o6b2o$b2ob2o4b2o6bo5bo22b2o9bobo$b5o3b2o7bo5bo21bobo10bo$2o3b2o\n"+
	"14bo24bo$19bo3bo21b2o$20b3o$21bo2$23b2o$23bo$5b2o17b3o$5bo20bo48b2o$6b\n"+
	"3o20bo45b2o39bo$8bo19bo86bobo$28b3o36bo46bo3b2o6b2o$24bo40b3o35b2o9bo\n"+
	"3bob2o4bobo$25b2o37bo38b2o9bo3bob3o4b3o7b2o$24b2o38b2o9b3o37bobob2o2bo\n"+
	"4b3o6b2o$75b3o38bo4b2o4b3o$74bo3bo47bobo$126b2o$73b2o3b2o$113b2o$59b2o\n"+
	"3b2o47b2o$59bobobobo$60b5o$61b3o13b3o38b2o20b2o$62bo11b2o42bobo19bo$\n"+
	"74b2o42bo11bo7bobo$73b2o31bo21bobo7b2o$74bobo28bo9b2o9b2o$75b2o28b3o7b\n"+
	"2o9b2o$111bo6b2o6b2o$111bo6b3o7bobo$63bobo9b2o3b2o36b2o10bo$64b2o9b2o\n"+
	"3b2o25b2o6b2o$64bo4bo36bobo6b2o$67b2o8b3o26bo$68b2o7b3o25b2o$59b3o16bo\n"+
	"$58bo3bo$57bo5bo7bo$58bo3bo9b2o$59b3o9b2o$59b3o18b2o9bo$80bo9bo$62b2o\n"+
	"17b3o6b3o$62bo20bo$63b3o$65bo$196bo$195bobo$178b2o15b2obo4b2o$178bobo\n"+
	"14b2ob2o3b2o$173b2o6bo13b2obo$169b2obo2bo2bo2bo13bobo$169b2o2b2o6bo8bo\n"+
	"5bo$178bobo7bobo$178b2o9b2o$196bo2bo10bo$200bo7b2o$196bo3bo$197b4o7bob\n"+
	"o$185bo23b3o$185b2o$184bobo2$193bo$192b2o23b2o15b2o$192bobo22bobo14b2o\n"+
	"$217bo$166b2o9b2o$166bobo9b2o$157b3ob2o4b3o7bo6bo$157b4o2bo4b3o12bobo\n"+
	"26bo$161b2o4b3o12bo3b2o11b2o2b2o6b4o19b3o$166bobo13bo3b2o6bobo2bob4o5b\n"+
	"2obobo8b3o$166b2o14bo3b2o4bo3bo3bob2o5b3obo2bo7bo9bobo$183bobo6bo12bo\n"+
	"4b2obob2o8bo7b5o$184bo6bo4bo14b4ob3o13b2o3b2o$192bo19bo4bobo12b2o3b2o$\n"+
	"192bo3bo22bo$194bobo22b2o$232b2o$230b2obo$184bo45bo$183bobo$183b2obo7b\n"+
	"2o35b3obo$171b2o10b2ob2o6bobo38bo$171b2o10b2obob3o6bo7b2o28bo$183bobo\n"+
	"2bo2bo2bo2bo7b2o$184bo4b2o6bo$194bobo$194b2o$230b2o3b2o$132b2o24bo22b\n"+
	"2o49b3o$133bo23b2o22b2o48bo3bo$133bobo5b2o13b2o3b2o69bobo$134b2o5b3o\n"+
	"11b3o75bo$143b2obo9b2o29bo20b2o$143bo2bo10b2o5b2o20b2o20bo$143b2obo11b\n"+
	"o5bobo19bobo8bobo6bobo$141b3o10bo11bo8bo19bo3bo6b2o24b2o$141b2o9bo13b\n"+
	"2o5b2o8b2o10bo36b2o$153bo20b2o7bo2bo7bo4bo$155bobo20b2o7bo7bo$155bobo\n"+
	"22bo6bo7bo3bo$187bo9bobo$175b2o6bo2bo$174bobo6b2o$174bo$173b2o$148b2o$\n"+
	"149b2o$148bo2$160b2o$159bobo$159bo$135b2o4bo16b2o$135b2o4b2o$140bobo$\n"+
	"147bo6bo$146b2o6b2o$145b3o6b3o$146b2o6b2o$147bo6bo$133b2o$134b2o$123bo\n"+
	"9bo26bo$123bobo34bobo$124bobo9b2o21bobo$111b2o11bo2bo7b3o23bo$111b2o\n"+
	"11bobo5bob2o$123bobo6bo2bo$123bo8bob2o49b2o$135b3o5b2o40bo$136b2o5bobo\n"+
	"40b3o$145bo42bo$145b2o10$171bo$171b4o$172b4o$172bo2bo$172b4o$162b2o7b\n"+
	"4o4b2o$161bobo7bo7bobo$161bo19bo$160b2o19b2o!\n";

		String supleftbend =

	"44b2o$44b2o6$44b3o$67b2o$44bobo19bo$43b5o17bo12b2o$42b2o3b2o6b2o8bo7bo\n"+
	"4b2o$42b2o3b2o6b2o8bo8b2o5b2o6b2o$66bo4b2o2bo5b3o5b2o$67b2ob5o6b2o$45b\n"+
	"o27bo4b2o$46b2o12b2o16b2o$60bo$48bo2bo6bobo4bo$48bo2bobo4b2o4bo$44bo9b\n"+
	"2o8b3o$47bo6b2o$44b2o8b2o$51bobo$51bo2$57bo$57bobo$57b2o2$35b3o$37bo3b\n"+
	"2o$36bo3b2o$42bo7bo$49bo$49b3o$42bo$28b2o11bobo$27bobo10bo3b2o$29bo10b\n"+
	"o3b2o$40bo3b2o$31b2o8bobo4b2o$30bobo9bo5bobo$2o28bo19bo$bo27b2o19b2o$b\n"+
	"obo5b2o9b3o$2b2o5bo2bo9bo$13bo7bo5bo$13bo12b4o$13bo11b2obobo3b2o$9bo2b\n"+
	"o11b3obo2bo2b2o$9b2o14b2obobo$26b4o$27bo!\n";

		String suprightbend =
	"45b2o$45b2o7$23bo$21bobo20b3o$12bo7bobo20bo3bo$11b2o6bo2bo11b2o6bo5bo$\n"+
	"2o8b2o4b2o2bobo11b2o6b2obob2o$2o7b3o4b2o3bobo$10b2o4b2o5bo$11b2o32bo$\n"+
	"12bo16b2o13bobo$24bo5bo13bobo$25bo4bobo7b2o3bo$23b3o5b2o6b3o$36bob2o5b\n"+
	"2o$36bo2bo4bo2bo$36bob2o5b2o$39b3o$40b2o$32bo$30bobo$31b2o$69b2o$69b2o\n"+
	"2$54b3o$39bo7b2o5bo$40bo7b2o5bo$38b3o6bo2$49bobo$47bo3bo$47bo14b2o$46b\n"+
	"o4bo10bobo$47bo14bo4b2o3b2o$41b2o4bo3bo6b2o9b3o$40bobo6bobo6bobo7bo3bo\n"+
	"$40bo19bo8bobo$39b2o19b2o8bo2$67b3o$67b3o4$65b2o3b2o$66b5o$67b3o$68bo\n"+
	"6$65b2o$66bo$63b3o$63bo!\n";

		String sEater =	"2o$bo$bobo$2b2o!";

		String sEaterSXY =	"2o$obo$2bo$2b2o!";

		String sEaterFX =	"2b2o3b2o$3bo3bo$3o5b3o$o9bo!";

		String tEaterFX =	"2b2o$3bo$3o$o!";



		String sGlider  = "bo$2bo$3o!";

		String sLWSS  = "b4o$o3bo$4bo$o2bo!";

		String sBlock = "2o$2o";
//---------------------------------------------------------------------------------------------------------------------------------
	    String tCounter =
		"599b2o$592b2o5b2o$592b2o$628b2o$628bo$594b2o17b2o14bo$594b2o17bo14b2o$\n" +
		"588b2o21bobo23bo$588b2o21b2o22b3o$634bo$634b2o2$625b2o$625b2o7$585bo\n" +
		"29b2o$555b2o28b3o27bo$548b2o5b2o31bo27b3o$548b2o37b2o29bo$583b2o33bobo\n" +
		"$583bo35b2o$550b2o17b2o14bo$550b2o17bo14b2o$544b2o21bobo73b2o$544b2o\n" +
		"21b2o50b2o18b2obobo$618bobo18b2obo$618bo24bo$617b2o20b2ob2o$581b2o57bo\n" +
		"bo$581b2o17b2o38bobo$600b2o35b2ob2o$637bobo$639bo$601b2o36b2o$601bo$\n" +
		"588b2o12b3o$571b2o16bo14bo$363b2o206bo14b3o$356b2o5b2o207b3o11bo$356b\n"+
		"2o179b2o35bo$392b2o144bo$392bo145bobo$358b2o17b2o14bo11bo130b2ob2o101b\n"+
		"2o$358b2o17bo14b2o9b3o131bo104bo$352b2o21bobo24bo58bo73bobo85b2o15bobo\n"+
		"$352b2o21b2o25b2o10b2o45b3o69b3ob2o20b2o62b2o15b2o$414bo17b2o30bo22bo\n"+
		"44bo26bo$412bobo17bo30b2o20b3o11bo31bo2b2ob2o18bobo$412b2o19bo11bo38bo\n"+
		"14b3o30b2obob2o18b2o$389b2o41b2o9b3o38b2o16bo14bo15bo$389b2o51bo58b2o\n"+
		"12b3o15bo$442b2o10b2o58bo17b2obo$454bo59b2o15bo2b2o$452bobo76b2o23b2o$\n"+
		"452b2o102bo$429b2o82b2o42b3o$429b2o63b2o17b2o44bo$379b2o113b2o126b2o$\n"+
		"349b2o28bo18b2o221bobo$350bo29b3o16bo134b2o85bo$350bobo29bo13b3o136bo\n"+
		"84b2o$351b2o43bo135b3o$532bo$419b2o42b2o32b2o61bo$419bo18b2o23b2o11b2o\n"+
		"20bo59b3o$420b3o16bo36bo19bo60bo80b2o$422bo13b3o38b3o16b2o59b2o79bobo$\n"+
		"436bo42bo20b2o138bo$501bo77bo60b2o$498b3o78b3o$498bo83bo$581b2o$539b2o\n"+
		"35bo34bo$352b2o15b2o169bo33b3o32b3o$352b2o15bobo168bobo30bo34bo$371bo\n"+
		"169b2o30b2o33b2o20b2o$371b2o118b2o70b2o65b2o$492bo71bo56b2o$492bobo15b\n"+
		"2o46b2o4bobo54bo2bo$493b2o15b2o29b2o15b2o5b2o4b2o44b2o4b2o$540bobo27bo\n"+
		"2bo44bo20b2o$540bo30b2o45bobo18bo$539b2o42b2o34b2o16bobo$583b2o52b2o$\n"+
		"341b2o$342bo$342bobo213b2ob2o$343b2o214bobo$352b2o205bobo$352b2o206bo\n"+
		"2$511b2o56b2o3b2o32b2o$374bo136bobo56bo3bo20b2o11b2o$374b3o6bo129bo27b\n"+
		"ob2o22b3o5b3o18bo$368b2o7bo5b3o127b2o26b2obo22bo9bo15b3o35b2o$368bo7b\n"+
		"2o8bo206bo37b2o2b2o$337bo31bo15b2o163b2o83bobo$337b3o28b2o180b2o60b2o\n"+
		"23bo$340bo272bo23b2o$339b2o269b3o$408bo201bo$406b3o127bo$405bo130b3o$\n" +
		"375b2o28b2o94b2o36bo$375b2o124b2o35b2o20b2o$411bo77b2o69bo$336b2o71b3o\n" +
		"76bobo67bobo$335bobo70bo5b2o72bo69b2o$335bo72b2o4bo72b2o$334b2o76bobo\n" +
		"242b2o$372b2o7b2o29b2o98b2o143b2o5b2o$372bo9bo108b2o19bo151b2o$341b2o\n" +
		"3b2o25bo3bo4bobo107bo17bobo115b2o$341b2o3b2o24b2o3b3o3b2o107bobo15b2o\n" +
		"117bo$380bo87b2o23b2o4bo116bo11bo14b2o17b2o$379b2o87b2o28bobo58bob2o\n" +
		"53b3o9b2o14bo17b2o$498bobo58b2obo4bo9bo41bo24bobo21b2o$499bo10b2o55b3o\n" +
		"5b3o28b2o10b2o25b2o21b2o$413b2o13b2o40b2o38bobo57bo3bo13b2o17bo$413b2o\n" +
		"6b2o5b2o40b2o40bo56b2o3b2o13bo17bobo$378b2o41b2o60b2o27b2o74bo19b2o$\n" +
		"378b2o103bo13b2o89b2o41b2o$481bobo14bo39b2o91b2o$423b2o17b2o37b2o12b3o\n" +
		"40b2o$387b2o34b2o17bo42b2o8bo$387b2o28b2o21bobo42b2o$417b2o21b2o$543b\n" +
		"2o46b2o$543b2o46b2o$539b2o100b2o29bo$539b2o81b2o18bo27b3o$622bo16b3o\n" +
		"27bo$472b2o149b3o13bo29b2o$375bo96b2o71b2o78bo$375b3o101b2o64b2o13b2o$\n" +
		"378bo82b2o15bo2bo77bobo11b2o6bo$377b2o81bo2bo15b2o78bo13b2o6b3o$436b2o\n" +
		"23bobo94b2o24bo$436b2o3bo20bo120b2o$440bobo231b2o$441bobo230bo$443bo\n" +
		"228bobo$443b2o227b2o$372b2o$373bo105b2o$373bobo103b2o177b2o$374b2o281b\n" +
		"obo$657bo$451bo204b2o$388b2o22b2o35b3o13bo$388bobo21b2o34bo16b3o$390bo\n" +
		"57b2o18bo205b2obo$390b2o75b2o205bob2o2$417b2o72bo175b2o$370bob2o43b2o\n" +
		"70b3o175b2o$370b2obo39b2o73bo$413b2o73b2o$379b2o$379b2o76b2o130bo18bo$\n" +
		"419b2o36b2o130b3o6b2o6b3o$419b2o13b2o156bo5b2o5bo26bo$433bobo155b2o12b\n" +
		"2o25b3o22b2o$433bo201bo22bo$432b2o10b2o188b2o22bobo$445bo158b2o41bo11b\n" +
		"2o$389b2o51b3o9b2o143b2o3b2o39b3o$389bo52bo11bo20b2o122b2o43bo$387bobo\n" +
		"65bo20bo17b2o148b2o$387b2o65b2o17b3o8b2o8bobo$372bo100bo11bo10bo$372b\n" +
		"3o107b3o11b2o112bo7bo11b2o$375bo106bo125b3o5b3o11b2o25b2o$374b2o231bo\n" +
		"7bo41bo$607b2o6b2o38bobo$655b2o2$406b2o$406bo$404bobo$404b2o273b2o$\n" +
		"423b2o200b2o52b2o$423b2o5b2o193b2o26b2o$430b2o221b2o$367b2o$367b2o305b\n" +
		"2o$409b2o17b2o244b2o$410bo17b2o248b2o$410bobo21b2o192b2o48b2o$372b2o\n" +
		"37b2o21b2o193bo$372b2o254bo$368b2o258b2o42b2o$368b2o302b2o3$374b2o27b\n" +
		"2o$374b2o14b2o11b2o$391bo$388b3o$388bo2$407b2o$408bo$405b3o$375bo6b2o\n" +
		"21bo$375b3o4bo2bobo$378bo5b2ob3o$377b2o11bo$384b2ob3o$384b2obo2$441b2o\n" +
		"$373b2o3b2o61bo$373b2o3b2o59bobo$439b2o$415b2o$415b2o$369bo$368bobo$\n" +
		"369bo3$417b2o$418bo$415b3o$415bo$386b2o28b2o$386b2o29bo$417bobo$418b2o\n" +
		"4$398b2o37bo$398b2o35b3o$376b2o56bo$377bo56b2o$374b3o$374bo5$439b2o$\n" +
		"383b2o54bo$384bo52bobo$381b3o53b2o$381bo2$423b2o$422bobo$422bo$421b2o\n" +
		"3$439b2obo$439bob2o2$432b2o$432b2o2$710bo20bo$708b3o11bo7bobo$682b2o\n" +
		"23bo14b3o6bo$683bo23b2o16bo16bo$683bobo38b2o14b3o$684b2o2b2o49bo$688b\n" +
		"2o49b2o4$717b2o25b2o$717b2o25bo$742bobo$742b2o3$729b2o$682b2o36b2o6bob\n" +
		"o$681bobo16b2o19bo6bo$681bo18bobo17bo6b2o$680b2o20bo17b2o$696b2o4b2o$\n" +
		"446b2o248bo2bo$446bo251b2o$444bobo242b2o$444b2o243b2o40b2o$420b2o308bo\n" +
		"bo$420b2o308bo$729b2o5$422b2o323b2o$423bo323bobo$420b3o326bo$420bo328b\n" +
		"2o$421b2o$422bo$422bobo275bo$423b2o273b3o$697bo$524b2o171b2o$460b2o62b\n" +
		"2o5b2o107bo98b2o$460b2o69b2o105b3o98b2o$441b2o52b2o125bo14bo$441bo54bo\n" +
		"125b3o12b2o91b2obo$439bobo53bo14b2o17b2o94bo43b2o59bob2o$439b2o54b2o\n" +
		"14bo17b2o93b2o43bobo$486b2o23bobo21b2o134b3o28b2o$486bobo23b2o21b2o\n" +
		"133bo3bo27bo$487bo137b2o43b2ob2o25bobo46b2o$460b2o163b2o17b2o54b2o46bo\n" +
		"bo$459bo2bo181b2o102bo$460b2o36b2o247b2o$467b2o29b2o186b2o$467b2o204bo\n" +
		"b2o8bobo$673b2obo8bo$684b2o42b2o$641b2o86bo$421b2o15b2o201bo87bobo$\n" +
		"420bobo15b2o203bo16b2o40b2obo24b2o15b2o$420bo87b2o132b2o17bo40bob2o41b\n" +
		"2o$419b2o33b2o53bo128b2o18b3o$454b2o50b3o129bo19bo36b2o$458b2o46bo132b\n" +
		"3o53b2o33b2o$457bobo181bo87bobo$457bo155bo115bo$456b2o155b3o112b2o$\n" +
		"469b2o145bo$426b2o41b2o144b2o$427bo$427bobo112b2o141b2o$428b2o41b2o69b\n" +
		"o97bo45bo$471b2o67bobo95b3o45bobo57b2o$540b2o95bo49b2o57bo$516b2o94b2o\n" +
		"23b2o64bo43b3o$516b2o94bo2b2o84b3o45bo$613b2obo83bo$614bo85b2o$614bo$\n" +
		"613b2obob2o18b2o$612bo2b2ob2o18bobo$518b2o93bo26bo114b2o$519bo94b3ob2o\n" +
		"20b2o113bo$429b2o85b3o97bobo117b2o15bobo$429b2o14b2o69bo101bo117b2o15b\n" +
		"2o$421b2o22bo71b2o98b2ob2o$422bo23b3o69bo100bobo$422bobo23bo69bobo98bo\n" +
		"49bo$423b2o94b2o97b2o35bo13b3o35b2o$653b3o16bo34b2o$652bo18b2o$652b2o\n" +
		"2$441b2o74b2o183b2o$441bo76bo183b2o$439bobo63b2o11bobo185b2o$439b2o65b\n" +
		"o12b2o185b2o27b2o$506bobo225bobo$507b2o2b2o149b2o70bo$511b2o149b2o36b\n" +
		"2o31b2o$685b2o13b2o$685bobo$687bo$512b2o111b2o21b2o25b2o10b2o$506b2o4b\n" +
		"2o111b2o21bobo24bo75b2o$422b2o82b2o123b2o17bo14b2o9b3o72bobo$422b2o\n" +
		"207b2o17b2o14bo11bo74bo$665bo26bo60b2o$438b2o225b2o25b3o$438b2o189b2o\n" +
		"64bo$629b2o5b2o56b2o$423b2ob2o79b2o127b2o51bo34bo$424bob2o78bobo178b3o\n" +
		"32b3o$422bo83bo179bo34bo$422b5obo76b2o179b2o33b2o20b2o$427b2o247b2o65b\n" +
		"2o$424b2o251bo56b2o$424bo252bobo54bo2bo$425b3o250b2o4b2o44b2o4b2o$427b\n" +
		"o21bo233bo2bo44bo20b2o$447b3o234b2o45bobo18bo$446bo249b2o34b2o16bobo$\n" +
		"446b2o248b2o52b2o$438b2o$438b2o6$455b2o225b2o3b2o32b2o$455bo227bo3bo\n" +
		"20b2o11b2o$453bobo224b3o5b3o18bo$453b2o225bo9bo15b3o35b2o$706bo37b2o2b\n" +
		"2o$748bobo$725b2o23bo$726bo23b2o$723b3o$723bo3$457b2o$457bobo$459bo$\n" +
		"459b2o$449b2o$449b2o$430bob2o$430b2obo2$39bo399b2o$39b3o397b2o$42bo$\n" +
		"41b2o$56b2o$56bo$54bobo$43bo10b2o458b2o$42bobo404b2o63bo$42bobo404bo\n" +
		"62bobo$37b2o4bo403bobo62b2o$36bobo15b2o101bo289b2o$36bo17bobo99bobo$\n" +
		"35b2o19bo99bobo$56b2o96b3ob2o6bo$117b2o34bo10b3o$117b2o35b3ob2o3bo265b\n" +
		"2o$156bob2o3b2o265bo86b2o$430bobo84b2o$115b2o314b2o$45b2o68b2o412b2o$\n" +
		"45b2o55b2o425bo$103bo64b2o357bobo$103bobo62bo358b2o$104b2o60bobo$100b\n" +
		"2o64b2o$100b2o291b2o94b2o$393b2o5b2o88bo$400b2o85b3o$487bo$57b2o302b2o\n" +
		"135b2o$57bo272bo31bo6b2o8b2o17b2o32b2o64b2o$55bobo272b3o29bobo4b2o9bo\n" +
		"17b2o32b2o14b2o$55b2o56b2o218bo23b2o4b2o15bobo21b2o18b2o22bo$113b2o\n" +
		"217b2o23bobo21b2o21b2o19bo23b3o51b2o$167b2o186bobob3o63bobo23bo52bo$\n" +
		"124b2o41b2o144bo37b2o2b2o5bo63b2o73b3o$123bo2bo186b3o35b2o8b2o138bo$\n" +
		"123bobo23b2o165bo$124bo20bo3b2o148b2o14b2o11b2o$144bobo152b2o27b2o43b\n" +
		"2o$68b2o73bobo227b2o49b2o$68bo74bo281bo93b2o$66bobo73b2o149b2o117b2o\n" +
		"11bobo91bo$66b2o79b2o144b2o118bo12b2o92b3o$37b2o15b2o50b2o37bo2bo148b\n" +
		"2o86b2o26bobo106bo$36bobo15b2o50b2o37b2o19b2o129b2o82bo3b2o27b2o2b2o$\n" +
		"36bo117b2o9bo2bo2b2o207bobo35b2o$35b2o117b2o9bobo4bo2bo203bobo$166bo5b\n" +
		"obobo162b2o38bo$169b2obo2bo116b2o44bobo37b2o$169bo2bo119b2o44bo80b2o\n" +
		"90b2o$166bo4bo165b2o74b2o4b2o90b2o$166b5o242b2o$42bo302b2o155b2obo$42b\n" +
		"3o119b5o160b2o15bo155bob2o$45bo118bo3bo160bobo11b3o65b2o107b2o$23b2o\n" +
		"19b2o116bobo2bo163bo11bo7b2o58bo108bo$23bo16b2o120b2o3b2o162b2o18b2o\n" +
		"56bobo106bobo$21bobo16bo368b2o3b2o102b2o$21b2o19bo342b2o26bobo$41b2o\n" +
		"313b2o27b2o26bo89bo$144bo154b2o54bobo54b2o89b3o$144b3o153bo54bo128bo8b\n" +
		"2o11bo$2o145bo149b3o54b2o119b2o7b3o5bob3o8b2o14bo$2o144b2o149bo178bo\n" +
		"10bo4bo4bo22bobo$312b2o53b2o106bo10bo3bobo3b2o23bo$38b2o272bobo52b2o\n" +
		"18b2o86b2o8bo3bobo$38b2o17b2o255bo73bo71bo6bo17b2o3bo$57b2o255b2o69b3o\n" +
		"71bobo5b3o$385bo73bobo8bo$386b2o69b3ob2o6b2o$58b2o327bo68bo$58bo328bob\n" +
		"o67b3ob2o15b2o36b2o$45b2o12b3o326b2o69bob2o15b2o36bobo$28b2o16bo14bo\n" +
		"456bo$28bo14b3o92b2o19b2o143b2o203b2o7b2o$29b3o11bo94b2o19b2o143b2o\n" +
		"203bo$31bo478b3o$10b2o120bo162b2obo87b2o68b2o54bo$10b2o120b3o25b2o133b\n" +
		"ob2o88bo69bo$135bo24bo213b2o11bobo67bobo$134b2o25b3o211bo12b2o68b2o45b\n" +
		"2o$163bo211bobo127b2o$161b2o213b2o2b2o$161bo218b2o$159bobo4bo344b2o$\n" +
		"159b2o3b3o133bo210b2o$163bo135bobo205b2o$163b2o134b2o80b2o124b2o$375b\n" +
		"2o4b2o$375b2o$129b2o336b2o$129b2o337bo43b2o$164b2o301bo10b2o32b2o$164b\n" +
		"2o301b2o5b2o2b2o$473bobo$376b2o95bo$155b2o218bobo94b2o$155b2o218bo$\n" +
		"374b2o2$457bo20bo$146bo176b2o131bobo7bo11b3o$146b3o174b2o132bo6b3o14bo\n" +
		"$149bo169b2o125bo16bo16b2o23b2o$148bobo45bo122b2o125b3o14b2o40bo$149bo\n" +
		"18bo27b3o106b2o142bo56b3o$166b3o30bo105b2o141b2o58bo$165bo32b2o29b2o$\n" +
		"150b2o13b2o62b2o5b2o$150b2o19bo64b2o$169b3o271b2o25b2o$168bo134bo140bo\n" +
		"25b2o$168b2o45b2o17b2o57b2o7bobo139bobo$216bo17b2o57b2o7bobo140b2o$\n" +
		"216bobo21b2o61bo11b2o$217b2o21b2o73bo168b2o21b2o$316b3o139b2o23bobo21b\n" +
		"2o$318bo139bobo6b2o14bo17b2o$171b2o140b2o145bo6bo14b2o17b2o$152b2o17b\n" +
		"2o140b2o145b2o6bo$152b2o313b2o$503b2o$496b2o5b2o$151b2o343b2o$152bo\n" +
		"185bo$149b3o12b2o170b3o76b2o7b2o30b2o$149bo14bo16b2o89bo62bo79b2o7bobo\n" +
		"29bobo$165b3o14bo30b2o29bo27b3o60b2o17bo39bo27bobob3o29bo$167bo11b3o\n" +
		"25b2o5bo27b3o30bo78b3o37b3o25b2o5bo28b2o$179bo27bobob3o27bo32b2o81bo\n" +
		"39bo30b2o$200b2o7bobo29b2o113b2o38b2o$200b2o7b2o36bo47bo$245b3o47b3o\n" +
		"79bo$244bo53bo78b3o$244b2o51b2o11b2o68bo$310b2o67b2o11b2o$392b2o4$247b\n" +
		"2o$228b2o17b2o183b2o21b2o$228b2o201bobo21b2o$335b2o94bo17b2o$322b2o11b\n" +
		"2o93b2o17b2o$227b2o94bo$228bo91b3o75b2o$225b3o12b2o78bo74b2o2bo2b2o47b\n" +
		"2o$225bo14bo154b2obo3bo41b2o5b2o$241b3o3b2o40b2o107bobobo10b2o29b2o$\n" +
		"243bo3b2o34b2o5bo80b2o22b2obob2o12bo$283bobob3o20b2o53b2o5bo16b2o4bo2b\n" +
		"o12b3o$276b2o7bobo22bo54bobob3o17b2o6b2o12bo$276b2o7b2o24b3o44b2o7bobo\n" +
		"$313bo44b2o7b2o4$221bo$220bobo$220bobo$219b2ob2o16b2o$240b2o$219b2ob2o\n" +
		"$220bob2o34b2o$218bo39bobo$218b2o40bo$260b2o2$226b2o$220b2o4b2o$219bob\n" +
		"o27b2o$219bo29bobo$218b2o31bo$226b2o23b2o$226b2o3$232bo$231bobo$232bo\n" +
		"19$280b2o$280b2o8$254bo$253bobo$253bobo$252b2ob2o16b2o$273b2o$252b2ob\n" +
		"2o$253bob2o34b2o$251bo39bobo$251b2o40bo$293b2o2$259b2o$85bo167b2o4b2o$\n" +
		"85b3o164bobo27b2o$88bo163bo29bobo$87b2o162b2o31bo$102b2o155b2o23b2o$\n" +
		"102bo156b2o$100bobo$89bo10b2o$88bobo174bo$88bobo173bobo$83b2o4bo175bo$\n" +
		"82bobo15b2o$82bo17bobo$81b2o19bo$102b2o6$91b2o$91b2o9$103b2o$103bo$\n" +
		"101bobo$101b2o8$114b2o$114bo$112bobo$112b2o$83b2o15b2o$82bobo15b2o$82b\n" +
		"o$81b2o6$88bo$88b3o$91bo$69b2o19b2o$69bo16b2o$67bobo16bo$67b2o19bo$87b\n" +
		"2o3$46b2o$46b2o2$84b2o$84b2o17b2o$103b2o3$104b2o$104bo$91b2o12b3o$74b\n" +
		"2o16bo14bo$74bo14b3o$75b3o11bo$77bo$56b2o$56b2o!";

		String tStateLatchFail =
		"86bo$84b3o$58b2o23bo$59bo23b2o$59bobo$60b2o2b2o37bo$64b2o35b3o15bo9bo$\n" +
		"100bo18b3o5b3o$87b2o11b2o20bo3bo$87b2o32b2o3b2o8$58b2o52b2o$57bobo16b\n" +
		"2o34b2o$57bo18bobo45b2o$56b2o20bo44bo2bo$72b2o4b2o44b2o4b2o$72bo2bo54b\n" +
		"obo$74b2o56bo$65b2o65b2o$65b2o20b2o33b2o$88bo34bo$85b3o32b3o$85bo34bo\n" +
		"4$55b2o$56bo$56bobo$57b2o5$75b2o$75bo$73bobo$73b2o12$55b2o15b2o$54bobo\n" +
		"15b2o$54bo$53b2o6$60bo$60b3o$63bo$62b2o28b2o$92bo$90bobo$86b2o2b2o$86b\n" +
		"2o4$85b2o4b2o$85b2o4b2o5$58b2o$57bobo$57bo$56b2o$60b2o35b2o$60b2o3bo\n" +
		"31bo$64bobo6b2o20bobo$65bobo5b2o20b2o$67bo$67b2o4$11bo$10bobo$10bobo$\n" +
		"11bo3$94b2o$3b2o73b2o14b2o$3b2o74bo22b2o$76b3o23bo$76bo23bobo$100b2o$\n" +
		"23b2o$23bo17b2o$21bobo17bo$21b2o19bo11bo27bo$41b2o9b3o27b3o$51bo33bo$\n" +
		"51b2o10b2o19b2o$2o61bo16b2o$2o59bobo16bo$61b2o19bo$38b2o41b2o$38b2o5$\n" +
		"4b2o72b2o$4b2o72b2o17b2o$28b2o67b2o$28bo18b2o$29b3o16bo$31bo13b3o50b2o\n" +
		"$45bo52bo$85b2o12b3o$68b2o16bo14bo$68bo14b3o$69b3o11bo$71bo35$166bo$\n" +
		"164b3o$138b2o23bo$139bo23b2o$139bobo$140b2o2b2o37bo$144b2o35b3o15bo9bo\n" +
		"$180bo18b3o5b3o$167b2o11b2o20bo3bo$167b2o32b2o3b2o2$391b2o$391b2o$412b\n" +
		"o$410b3o11bo$409bo14b3o$409b2o16bo14bo$138b2o52b2o232b2o12b3o$137bobo\n" +
		"16b2o34b2o245bo$137bo18bobo45b2o233b2o$136b2o20bo44bo2bo$152b2o4b2o44b\n" +
		"2o4b2o$152bo2bo54bobo225b2o$154b2o56bo206b2o17b2o$145b2o65b2o205b2o$\n" +
		"145b2o20b2o33b2o$168bo34bo177b2o$165b3o32b3o178b2o$165bo34bo2$422b2o$\n" +
		"402b2o19bo$135b2o265bobo16bo$136bo267bo16b2o$136bobo265b2o19b2o$137b2o\n" +
		"78bo208bo$215b3o205b3o$189b2o23bo208bo$190bo23b2o$190bobo$155b2o34b2o\n" +
		"2b2o37bo$155bo39b2o35b3o15bo9bo$153bobo75bo18b3o5b3o$153b2o63b2o11b2o\n" +
		"20bo3bo158b2o$218b2o32b2o3b2o158bo$417bobo15b2o$418b2o15b2o$447b2o$\n" +
		"447bobo$449bo$449b2o2$189b2o52b2o$188bobo16b2o34b2o$188bo18bobo45b2o$\n" +
		"135b2o15b2o33b2o20bo44bo2bo$134bobo15b2o49b2o4b2o44b2o4b2o$134bo68bo2b\n" +
		"o54bobo$133b2o70b2o56bo172b2o$196b2o65b2o171bobo$196b2o20b2o33b2o183bo\n" +
		"$219bo34bo183b2o$216b3o32b3o$216bo34bo$140bo105b2o$140b3o103bobo37bo$\n" +
		"143bo104bo37b3o$142b2o28b2o12b2o60b2o39bo23b2o$172bo14bo100b2o23bo$\n" +
		"170bobo14bobo121bobo$166b2o2b2o16b2o79bo37b2o2b2o113b2o$166b2o75bo9bo\n" +
		"15b3o35b2o117b2o$243b3o5b3o18bo$246bo3bo20b2o11b2o$245b2o3b2o32b2o$\n" +
		"165b2o4b2o33b2o$165b2o4b2o33bo$204bobo230b2o$204b2o210b2o19bo$417bo17b\n" +
		"obo$417bobo15b2o$138b2o278b2o4bo$137bobo119b2o52b2o108bobo$137bo121b2o\n" +
		"34b2o16bobo76bo30bobo$136b2o109b2o45bobo18bo76b3o29bo10b2o$140b2o35b2o\n" +
		"67bo2bo44bo20b2o78bo39bobo$140b2o3bo31bo63b2o4b2o44b2o4b2o93b2o41bo$\n" +
		"144bobo6b2o20bobo62bobo54bo2bo136b2o$145bobo5b2o20b2o63bo56b2o123b2o$\n" +
		"147bo91b2o65b2o115bo$147b2o37b2o15b2o44b2o33b2o20b2o112b3o$185bobo15b\n" +
		"2o44bo34bo135bo4b2o$185bo64b3o32b3o137bo$184b2o66bo34bo135bobo$91bo\n" +
		"165b2o122bo37b2o2b2o$90bobo165bo96bo9bo15b3o35b2o$90bobo162b3o97b3o5b\n" +
		"3o18bo$91bo163bo60b2o40bo3bo20b2o11b2o$316bo40b2o3b2o32b2o$191bo122bob\n" +
		"o$174b2o15b3o120b2o$83b2o73b2o14b2o18bo$83b2o74bo22b2o9b2o28b2o$156b3o\n" +
		"23bo40bo$156bo23bobo38bobo$180b2o35b2o2b2o73b2o$103b2o112b2o78bo73b2o\n" +
		"52b2o$103bo17b2o174bobo71b2o34b2o16bobo$101bobo17bo176b2o59b2o45bobo\n" +
		"18bo$101b2o19bo11bo27bo195bo2bo44bo20b2o$121b2o9b3o27b3o51b2o4b2o129b\n" +
		"2o4b2o44b2o4b2o$131bo33bo50b2o4b2o128bobo54bo2bo$131b2o10b2o19b2o186bo\n" +
		"56b2o$80b2o61bo16b2o189b2o65b2o$80b2o59bobo16bo200b2o33b2o20b2o$141b2o\n" +
		"19bo198bo34bo$118b2o41b2o26b2o171b3o32b3o$118b2o68bobo173bo34bo$188bo$\n" +
		"187b2o$191b2o35b2o69b2o15b2o$191b2o3bo31bo70b2o15bobo109b2o$84b2o72b2o\n" +
		"35bobo6b2o20bobo89bo109bo$84b2o72b2o17b2o17bobo5b2o20b2o90b2o106bobo$\n" +
		"108b2o67b2o19bo227b2o$108bo18b2o69b2o$109b3o16bo$111bo13b3o50b2o$125bo\n" +
		"52bo$142bo22b2o12b3o130bo95b2o$141bobo4b2o16bo14bo128b3o96bo$141bobo4b\n" +
		"o14b3o143bo99bobo$142bo6b3o11bo145b2o99b2o$151bo2$225b2o$134b2o73b2o\n" +
		"14b2o$134b2o74bo22b2o$207b3o23bo$207bo23bobo80b2o$231b2o81bo$154b2o\n" +
		"156bobo$154bo17b2o138b2o$152bobo17bo$152b2o19bo11bo27bo197b2o15b2o$\n" +
		"172b2o9b3o27b3o82b2o111b2o15bobo$182bo33bo80bobo130bo$182b2o10b2o19b2o\n" +
		"80bo132b2o$131b2o61bo16b2o83b2o$131b2o59bobo16bo$192b2o19bo$169b2o41b\n" +
		"2o100b2obo$169b2o143bob2o2$307b2o114b2o$307b2o114bo$421bobo$135b2o72b\n" +
		"2o210b2o$135b2o72b2o17b2o$159b2o67b2o$159bo18b2o140bo$160b3o16bo138b3o\n" +
		"11bo$162bo13b3o50b2o66b2o18bo14b3o$176bo52bo68bo18b2o16bo14bo$216b2o\n" +
		"12b3o65bobo33b2o12b3o$199b2o16bo14bo66b2o46bo$199bo14b3o130b2o$200b3o\n" +
		"11bo$202bo89b2o$293bo52b2o72b2o$293bobo31b2o17b2o56b2o14b2o$294b2o31b\n" +
		"2o76bo22b2o$402b3o23bo$402bo23bobo$426b2o$294b2o$293bobo12b2o$293bo14b\n" +
		"2o20b2o$292b2o37bo$321b2o6bo18b2o2b2ob2o51b2o$321bo7b2o17bobo2bobo53bo\n" +
		"$319bobo11b2o16b2o3bo7bo44bobo$319b2o13bo17bob2o6b3o45b2o$295b2o34b3o\n" +
		"15bo2bobo6bo$295b2o34bo16bobobobo6b2o$349b2ob2o$381bo$379b3o17b2o$378b\n" +
		"o20bo6b2o$365b2o11b2o20bo6bo$297b2o66b2o32b2o6bobo$298bo109b2o$295b3o$\n" +
		"295bo$296b2o123b2o$297bo123bobo$297bobo34b2o60b2o25bo$298b2o34b2o60b2o\n" +
		"25b2o$340b2o$340b2o$359b2o$355b2o2bo2b2o54b2o$316b2o20b2o16bo3bob2o54b\n" +
		"o$316bo21b2o5b2o9bobobo42b2o14b3o24bo$314bobo28b2o10b2obob2o22b2o16bo\n" +
		"16bo24b3o11b2o$314b2o44bo2bo4b2o16bo14b3o6bo26bo11bo10bo$360b2o6b2o17b\n" +
		"3o11bo7bobo25b3o8b2o8bobo$389bo20bo4b2o23bo17b2o$368b2o14bo31bo6b2o14b\n" +
		"2o$343b2o24bo14b3o29bobo4b2o$325b2o17bo13b2o6b3o18bo23b2o4b2o$318b2o6b\n" +
		"o17bobo11b2o6bo19b2o23bobo$318bo6bo19b2o62bobob3o$316bobo6b2o78b2o2b2o\n" +
		"5bo$316b2o87b2o8b2o3$303b2o122b2o$302bobo71b2o49b2o23b2o$302bo25b2o46b\n" +
		"2o74bo$301b2o25b2o123b3o$455bo$439b2o$435bo3b2o$305b2o127bobo$304bobo\n" +
		"66b2o58bobo$304bo16b2o50bo19b2o38bo$303b2o16bo16b2o14b2o3b2o13bo17bobo\n" +
		"37b2o$315bo6b3o14bo15bo3bo13b2o17bo$314bobo7bo11b3o13b3o5b3o28b2o$315b\n" +
		"o20bo15bo9bo$399b2o$400bo$397b3o$397bo7b2o$405b2o3$410b2o$409bobo$409b\n" +
		"o$408b2o2$421b2o$421b2o!";

		String tStateLatchPass =
		"86bo$84b3o$58b2o23bo$59bo23b2o$59bobo$60b2o2b2o37bo$64b2o35b3o15bo9bo$\n" +
		"100bo18b3o5b3o$87b2o11b2o20bo3bo$87b2o32b2o3b2o8$58b2o52b2o$57bobo16b\n" +
		"2o34b2o$57bo18bobo45b2o$56b2o20bo44bo2bo$72b2o4b2o44b2o4b2o$72bo2bo54b\n" +
		"obo$74b2o56bo$65b2o65b2o$65b2o20b2o33b2o$88bo34bo$85b3o32b3o$85bo34bo\n" +
		"4$55b2o$56bo$56bobo$57b2o5$75b2o$75bo$73bobo$73b2o12$55b2o15b2o$54bobo\n" +
		"15b2o$54bo$53b2o6$60bo$60b3o$63bo$62b2o28b2o$92bo$90bobo$86b2o2b2o$86b\n" +
		"2o4$85b2o4b2o$85b2o4b2o5$58b2o$57bobo$57bo$56b2o$60b2o35b2o$60b2o3bo\n" +
		"31bo$64bobo6b2o20bobo$65bobo5b2o20b2o$67bo$67b2o4$11bo$10bobo$10bobo$\n" +
		"11bo3$94b2o$3b2o73b2o14b2o$3b2o74bo22b2o$76b3o23bo$76bo23bobo$100b2o$\n" +
		"23b2o$23bo17b2o$21bobo17bo$21b2o19bo11bo27bo$41b2o9b3o27b3o$51bo33bo$\n" +
		"51b2o10b2o19b2o$2o61bo16b2o$2o59bobo16bo$61b2o19bo$38b2o41b2o$38b2o5$\n" +
		"4b2o72b2o$4b2o72b2o17b2o$28b2o67b2o$28bo18b2o$29b3o16bo$31bo13b3o50b2o\n" +
		"$45bo52bo$85b2o12b3o$68b2o16bo14bo$68bo14b3o$69b3o11bo$71bo43$158bo$\n" +
		"156b3o$130b2o23bo$131bo23b2o234b2o$131bobo257b2o$132b2o2b2o37bo236bo$\n" +
		"136b2o35b3o15bo9bo208b3o11bo$172bo18b3o5b3o207bo14b3o$159b2o11b2o20bo\n" +
		"3bo210b2o16bo14bo$159b2o32b2o3b2o226b2o12b3o$439bo$439b2o3$438b2o$419b\n" +
		"2o17b2o$419b2o$130b2o52b2o$129bobo16b2o34b2o195b2o$129bo18bobo45b2o\n" +
		"183b2o$128b2o20bo44bo2bo$144b2o4b2o44b2o4b2o$144bo2bo54bobo217b2o$146b\n" +
		"2o56bo197b2o19bo$137b2o65b2o196bobo16bo$137b2o20b2o33b2o208bo16b2o$\n" +
		"160bo34bo208b2o19b2o$157b3o32b3o231bo$157bo34bo230b3o$187b2o234bo$187b\n" +
		"obo$189bo$127b2o60b2o$128bo$128bobo$129b2o78bo206b2o$207b3o207bo$181b\n" +
		"2o23bo210bobo15b2o$182bo23b2o210b2o15b2o$182bobo262b2o$147b2o34b2o2b2o\n" +
		"37bo220bobo$147bo39b2o35b3o15bo9bo196bo$145bobo75bo18b3o5b3o196b2o$\n" +
		"145b2o63b2o11b2o20bo3bo$210b2o32b2o3b2o6$436b2o$436bobo$181b2o52b2o\n" +
		"201bo$180bobo16b2o34b2o201b2o$180bo18bobo45b2o$127b2o15b2o33b2o20bo44b\n" +
		"o2bo$126bobo15b2o49b2o4b2o44b2o4b2o$126bo68bo2bo54bobo30bo$125b2o70b2o\n" +
		"56bo30b3o$188b2o65b2o32bo23b2o$188b2o20b2o33b2o41b2o23bo$211bo34bo64bo\n" +
		"bo$208b3o32b3o23bo37b2o2b2o113b2o$208bo33bo10bo15b3o35b2o117b2o$132bo\n" +
		"110b3o5b3o18bo$132b3o111bo3bo20b2o11b2o$135bo109b2o3b2o32b2o$134b2o28b\n" +
		"2o12b2o$164bo14bo$162bobo14bobo255b2o$158b2o2b2o16b2o234b2o19bo$158b2o\n" +
		"257bo17bobo$417bobo15b2o$418b2o4bo$259b2o52b2o108bobo$157b2o4b2o33b2o\n" +
		"59b2o34b2o16bobo76bo30bobo$157b2o4b2o33bo48b2o45bobo18bo76b3o29bo10b2o\n" +
		"$196bobo47bo2bo44bo20b2o78bo39bobo$196b2o43b2o4b2o44b2o4b2o93b2o41bo$\n" +
		"240bobo54bo2bo136b2o$240bo56b2o123b2o$130b2o107b2o65b2o115bo$129bobo\n" +
		"117b2o33b2o20b2o112b3o$129bo119bo34bo135bo4b2o$128b2o120b3o32b3o137bo$\n" +
		"132b2o35b2o81bo34bo135bobo$132b2o3bo31bo87b2o122bo37b2o2b2o$136bobo6b\n" +
		"2o20bobo88bo96bo9bo15b3o35b2o$137bobo5b2o20b2o86b3o97b3o5b3o18bo$139bo\n" +
		"115bo60b2o40bo3bo20b2o11b2o$139b2o37b2o15b2o119bo40b2o3b2o32b2o$177bob\n" +
		"o15b2o117bobo$177bo136b2o$176b2o$83bo$82bobo$82bobo$83bo212b2o$297bo\n" +
		"73b2o52b2o$183bo113bobo71b2o34b2o16bobo$166b2o15b3o112b2o59b2o45bobo\n" +
		"18bo$75b2o73b2o14b2o18bo171bo2bo44bo20b2o$75b2o74bo22b2o9b2o28b2o136b\n" +
		"2o4b2o44b2o4b2o$148b3o23bo40bo136bobo54bo2bo$148bo23bobo38bobo136bo56b\n" +
		"2o$172b2o35b2o2b2o136b2o65b2o$95b2o112b2o150b2o33b2o20b2o$95bo17b2o\n" +
		"246bo34bo$93bobo17bo248b3o32b3o$93b2o19bo11bo27bo209bo34bo$113b2o9b3o\n" +
		"27b3o51b2o4b2o$123bo33bo50b2o4b2o$123b2o10b2o19b2o141b2o15b2o$72b2o61b\n" +
		"o16b2o145b2o15bobo109b2o$72b2o59bobo16bo165bo109bo$133b2o19bo163b2o\n" +
		"106bobo$110b2o41b2o26b2o243b2o$110b2o68bobo$180bo$179b2o$183b2o35b2o$\n" +
		"183b2o3bo31bo91bo95b2o$76b2o72b2o35bobo6b2o20bobo89b3o96bo$76b2o72b2o\n" +
		"17b2o17bobo5b2o20b2o89bo99bobo$100b2o67b2o19bo118b2o99b2o$100bo18b2o\n" +
		"69b2o$101b3o16bo$103bo13b3o50b2o$117bo52bo$134bo22b2o12b3o$133bobo4b2o\n" +
		"16bo14bo$133bobo4bo14b3o156b2o$134bo6b3o11bo158bo$143bo168bobo$312b2o$\n" +
		"217b2o$126b2o73b2o14b2o192b2o15b2o$126b2o74bo22b2o71b2o111b2o15bobo$\n" +
		"199b3o23bo71bobo130bo$199bo23bobo71bo132b2o$223b2o71b2o$146b2o$146bo\n" +
		"17b2o$144bobo17bo149b2obo$144b2o19bo11bo27bo108bob2o$164b2o9b3o27b3o$\n" +
		"174bo33bo98b2o114b2o$174b2o10b2o19b2o98b2o114bo$123b2o61bo16b2o216bobo\n" +
		"$123b2o59bobo16bo217b2o$184b2o19bo$161b2o41b2o$161b2o157bo$318b3o11bo$\n" +
		"297b2o18bo14b3o$298bo18b2o16bo14bo$298bobo33b2o12b3o$127b2o72b2o96b2o\n" +
		"46bo$127b2o72b2o17b2o125b2o$151b2o67b2o$151bo18b2o120b2o$152b3o16bo\n" +
		"121bo52b2o72b2o$154bo13b3o50b2o70bobo31b2o17b2o56b2o14b2o$168bo52bo72b\n" +
		"2o31b2o76bo22b2o$208b2o12b3o177b3o23bo$191b2o16bo14bo177bo23bobo$191bo\n" +
		"14b3o217b2o$192b3o11bo87b2o$194bo98bobo12b2o$293bo14b2o20b2o$292b2o37b\n" +
		"o$321b2o6bo18b2o2b2ob2o51b2o$278bo42bo7b2o17bobo2bobo53bo$319bobo11b2o\n" +
		"16b2o3bo7bo44bobo$319b2o13bo17bob2o6b3o45b2o$295b2o34b3o15bo2bobo6bo$\n" +
		"295b2o34bo16bobobobo6b2o$349b2ob2o$381bo$379b3o17b2o$378bo20bo6b2o$\n" +
		"365b2o11b2o20bo6bo$297b2o66b2o32b2o6bobo$298bo109b2o$295b3o$295bo$296b\n" +
		"2o123b2o$297bo123bobo$297bobo34b2o60b2o25bo$298b2o34b2o60b2o25b2o$340b\n" +
		"2o$340b2o$359b2o$355b2o2bo2b2o54b2o$316b2o20b2o16bo3bob2o54bo$316bo21b\n" +
		"2o5b2o9bobobo42b2o14b3o24bo$314bobo28b2o10b2obob2o22b2o16bo16bo24b3o\n" +
		"11b2o$314b2o44bo2bo4b2o16bo14b3o6bo26bo11bo10bo$360b2o6b2o17b3o11bo7bo\n" +
		"bo25b3o8b2o8bobo$389bo20bo4b2o23bo17b2o$368b2o14bo31bo6b2o14b2o$343b2o\n" +
		"24bo14b3o29bobo4b2o$325b2o17bo13b2o6b3o18bo23b2o4b2o$318b2o6bo17bobo\n" +
		"11b2o6bo19b2o23bobo$318bo6bo19b2o62bobob3o$316bobo6b2o78b2o2b2o5bo$\n" +
		"316b2o87b2o8b2o3$303b2o122b2o$302bobo71b2o49b2o23b2o$302bo25b2o46b2o\n" +
		"74bo$301b2o25b2o123b3o$455bo$439b2o$435bo3b2o$305b2o127bobo$304bobo66b\n" +
		"2o58bobo$304bo16b2o50bo19b2o38bo$303b2o16bo16b2o14b2o3b2o13bo17bobo37b\n" +
		"2o$315bo6b3o14bo15bo3bo13b2o17bo$314bobo7bo11b3o13b3o5b3o28b2o$315bo\n" +
		"20bo15bo9bo$399b2o$400bo$397b3o$397bo7b2o$405b2o3$410b2o$409bobo$409bo\n" +
		"$408b2o2$421b2o$421b2o!";

	    String tRightUp =
		"30bo$28b3o$27bo$27b2o$12b2o$13bo$13bobo$14b2o10bo$25bobo$25bobo$26bo4b\n" +
		"2o$14b2o15bobo$13bobo17bo$13bo19b2o$12b2o6$23b2o$23b2o9$11b2o$12bo$12b\n" +
		"obo$13b2o8$2o$bo$bobo$2b2o$14b2o15b2o$14b2o15bobo$33bo$33b2o6$27bo$25b\n" +
		"3o$24bo$24b2o19b2o$28b2o16bo$29bo16bobo$27bo19b2o$27b2o3$68b2o$68b2o2$\n" +
		"30b2o$11b2o17b2o$11b2o3$10b2o$11bo$8b3o12b2o$8bo14bo16b2o$24b3o14bo$\n" +
		"26bo11b3o$38bo$58b2o$58b2o!";

		String tRightDownFan =
		"47bo$47b3o$50bo23b2o$49b2o23bo$72bobo$30bo37b2o2b2o$4bo9bo15b3o35b2o$\n" +
		"4b3o5b3o18bo$7bo3bo20b2o11b2o$6b2o3b2o32b2o8$20b2o52b2o$20b2o34b2o16bo\n" +
		"bo$8b2o45bobo18bo$7bo2bo44bo20b2o$2b2o4b2o44b2o4b2o$bobo54bo2bo$bo56b\n" +
		"2o$2o65b2o$10b2o33b2o20b2o$10bo34bo$11b3o32b3o$13bo34bo4$77b2o$77bo$\n" +
		"75bobo$75b2o5$57b2o$58bo$58bobo$59b2o12$60b2o15b2o$60b2o15bobo$79bo$\n" +
		"79b2o6$73bo$71b3o$70bo$40b2o28b2o$41bo$41bobo$42b2o2b2o$46b2o4$41b2o4b\n" +
		"2o$41b2o4b2o5$74b2o$74bobo$76bo$76b2o$35b2o35b2o$36bo31bo3b2o$36bobo\n" +
		"20b2o6bobo$37b2o20b2o5bobo$66bo$65b2o4$122bo$121bobo$121bobo$122bo3$\n" +
		"38b2o$38b2o14b2o73b2o$30b2o22bo74b2o$31bo23b3o$31bobo23bo$32b2o$109b2o\n" +
		"$91b2o17bo$92bo17bobo$51bo27bo11bo19b2o$49b3o27b3o9b2o$48bo33bo$48b2o\n" +
		"19b2o10b2o$52b2o16bo61b2o$53bo16bobo59b2o$51bo19b2o$51b2o41b2o$94b2o5$\n" +
		"54b2o72b2o$35b2o17b2o72b2o$35b2o67b2o$85b2o18bo$85bo16b3o$34b2o50b3o\n" +
		"13bo$35bo52bo$32b3o12b2o$32bo14bo16b2o$48b3o14bo$50bo11b3o$62bo!";

		String tDownLeft =
		"39bo$39b3o$42bo$41b2o$56b2o$56bo$54bobo$43bo10b2o$42bobo$42bobo$37b2o\n" +
		"4bo$36bobo15b2o$36bo17bobo$35b2o19bo$56b2o6$45b2o$45b2o9$57b2o$57bo$\n" +
		"55bobo$55b2o8$68b2o$68bo$66bobo$66b2o$37b2o15b2o$36bobo15b2o$36bo$35b\n" +
		"2o6$42bo$42b3o$45bo$23b2o19b2o$23bo16b2o$21bobo16bo$21b2o19bo$41b2o3$\n" +
		"2o$2o2$38b2o$38b2o17b2o$57b2o3$58b2o$58bo$45b2o12b3o$28b2o16bo14bo$28b\n" +
		"o14b3o$29b3o11bo$31bo$10b2o$10b2o!";

		String tDownRight =
		"39bo$37b3o$36bo$36b2o5$5b2o$6bo$6bobo$7b2o2b2o37bo$11b2o35b3o15bo9bo$\n" +
		"47bo18b3o5b3o$34b2o11b2o20bo3bo$34b2o32b2o3b2o8$5b2o52b2o$4bobo16b2o\n" +
		"34b2o$4bo18bobo45b2o$3b2o20bo44bo2bo$19b2o4b2o44b2o4b2o$19bo2bo54bobo$\n" +
		"21b2o56bo$12b2o65b2o$12b2o20b2o33b2o$35bo34bo$32b3o32b3o$32bo34bo4$2b\n" +
		"2o$3bo$3bobo$4b2o4$23bo$21b3o$20bo$20b2o10$2o$2o9$15b2o$15b2o!";

		String tUpLeft =
		"64b2o$64b2o9$79b2o$79b2o10$59b2o$60bo$57b3o$57bo4$75b2o$75bobo$77bo$\n" +
		"77b2o4$13bo34bo$11b3o32b3o$10bo34bo$10b2o33b2o20b2o$2o65b2o$bo56b2o$bo\n" +
		"bo54bo2bo$2b2o4b2o44b2o4b2o$7bo2bo44bo20b2o$8b2o45bobo18bo$20b2o34b2o\n" +
		"16bobo$20b2o52b2o8$6b2o3b2o32b2o$7bo3bo20b2o11b2o$4b3o5b3o18bo$4bo9bo\n" +
		"15b3o35b2o$30bo37b2o2b2o$72bobo$74bo$74b2o5$43b2o$44bo$41b3o$41bo!";

		String tUpRight =
		"17$75b2o$75b2o$55bo$43bo11b3o$41b3o14bo$25bo14bo16b2o$25b3o12b2o$28bo$\n" +
		"27b2o3$28b2o$28b2o17b2o$47b2o2$85b2o$85b2o3$44b2o$44bo19b2o$46bo16bobo\n" +
		"$45b2o16bo$41b2o19b2o$41bo$42b3o$44bo6$50b2o$50bo$31b2o15bobo$31b2o15b\n" +
		"2o$19b2o$18bobo$18bo$17b2o8$30b2o$29bobo$29bo$28b2o9$40b2o$40b2o6$29b\n" +
		"2o$30bo19b2o$30bobo17bo$31b2o15bobo$43bo4b2o$42bobo$42bobo$31b2o10bo$\n" +
		"30bobo$30bo$29b2o$44b2o$44bo$45b3o$47bo!";

		String tLeftUp =
		"15b2o$15b2o9$2o$2o10$20b2o$20bo$21b3o$23bo4$4b2o$3bobo$3bo$2b2o4$32bo\n" +
		"34bo$32b3o32b3o$35bo34bo$12b2o20b2o33b2o$12b2o65b2o$21b2o56bo$19bo2bo\n" +
		"54bobo$19b2o4b2o44b2o4b2o$3b2o20bo44bo2bo$4bo18bobo45b2o$4bobo16b2o34b\n" +
		"2o$5b2o52b2o8$34b2o32b2o3b2o$34b2o11b2o20bo3bo$47bo18b3o5b3o$11b2o35b\n" +
		"3o15bo9bo$7b2o2b2o37bo$6bobo$6bo$5b2o5$36b2o$36bo$37b3o$39bo!";


		String tLeftUpFan=
		"71bo$69b3o11bo$68bo14b3o$68b2o16bo14bo$85b2o12b3o$45bo52bo$31bo13b3o\n" +
		"50b2o$29b3o16bo$28bo18b2o$28b2o67b2o$4b2o72b2o17b2o$4b2o72b2o5$38b2o$\n" +
		"38b2o41b2o$61b2o19bo$2o59bobo16bo$2o61bo16b2o$51b2o10b2o19b2o$51bo33bo\n" +
		"$41b2o9b3o27b3o$21b2o19bo11bo27bo$21bobo17bo$23bo17b2o$23b2o$100b2o$\n" +
		"76bo23bobo$76b3o23bo$3b2o74bo22b2o$3b2o73b2o14b2o$94b2o3$11bo$10bobo$\n" +
		"10bobo$11bo4$67b2o$67bo$65bobo5b2o20b2o$64bobo6b2o20bobo$60b2o3bo31bo$\n" +
		"60b2o35b2o$56b2o$57bo$57bobo$58b2o5$85b2o4b2o$85b2o4b2o4$86b2o$86b2o2b\n" +
		"2o$90bobo$92bo$62b2o28b2o$63bo$60b3o$60bo6$53b2o$54bo$54bobo15b2o$55b\n" +
		"2o15b2o12$73b2o$73bobo$75bo$75b2o5$57b2o$56bobo$56bo$55b2o4$85bo34bo$\n" +
		"85b3o32b3o$88bo34bo$65b2o20b2o33b2o$65b2o65b2o$74b2o56bo$72bo2bo54bobo\n" +
		"$72b2o4b2o44b2o4b2o$56b2o20bo44bo2bo$57bo18bobo45b2o$57bobo16b2o34b2o$\n" +
		"58b2o52b2o8$87b2o32b2o3b2o$87b2o11b2o20bo3bo$100bo18b3o5b3o$64b2o35b3o\n" +
		"15bo9bo$60b2o2b2o37bo$59bobo$59bo23b2o$58b2o23bo$84b3o$86bo!";

		String tLeftDown =
		"10b2o$10b2o$31bo$29b3o11bo$28bo14b3o$28b2o16bo14bo$45b2o12b3o$58bo$58b\n" +
		"2o3$57b2o$38b2o17b2o$38b2o2$2o$2o3$41b2o$21b2o19bo$21bobo16bo$23bo16b\n" +
		"2o$23b2o19b2o$45bo$42b3o$42bo6$35b2o$36bo$36bobo15b2o$37b2o15b2o$66b2o\n" +
		"$66bobo$68bo$68b2o8$55b2o$55bobo$57bo$57b2o9$45b2o$45b2o6$56b2o$35b2o\n" +
		"19bo$36bo17bobo$36bobo15b2o$37b2o4bo$42bobo$42bobo$43bo10b2o$54bobo$\n" +
		"56bo$56b2o$41b2o$42bo$39b3o$39bo!";

		String tLeftDownFan =
		"19b2o$19b2o2$31b2o$10b2o19b2o$10b2o5$37b2o$36bo2bo$37b2o9$24b2o$24bo$\n" +
		"25b3o$27bo4$8b2o$7bobo$7bo$6b2o7$16b2o$16b2o2$23bob2o$23b2obo3$5b2o$6b\n" +
		"o$6bobo$7b2o3$21b2o$21bobo$23bo51bo$23b2o50b3o$78bo22bo$49bo27b2o20b3o\n" +
		"11bo$49b3o46bo14b3o$52bo45b2o16bo14bo$51b2o62b2o12b3o$47b2o19b2o58bo$\n" +
		"18b2o27b2o19bo59b2o$18bo47bobo$19b3o44b2o$21bo24bo80b2o$45bobo60b2o17b\n" +
		"2o$46bo61b2o$43b3o$2b2o39bo$bobo$bo$2o$77b2o32b2o$45b2o30b2o11b2o20bo$\n" +
		"45b2o43bo19bo$91b3o16b2o$29b2o62bo20b2o$30bo84bo$10b2o18bobo79b3o$10b\n" +
		"2o19b2o79bo$19b2o$17bo2bo$17b2o4b2o$b2o20bo106b2o$2bo18bobo106bobo$2bo\n" +
		"bo16b2o34b2o46b2o25bo$3b2o52b2o3b2o42bo25b2o$62b2o42bobo15b2o$107b2o\n" +
		"15b2o2$63b2o$57b2o4bo$57b2o5b3o$66bo$32b2o$32b2o11b2o$45bo$9b2o35b3o$\n" +
		"5b2o2b2o37bo$4bobo$4bo23b2o95b2o$3b2o23bo96bobo$29b3o95bo$31bo95b2o9$\n" +
		"115b2o$115b2o6$126b2o$105b2o19bo$106bo17bobo$106bobo15b2o$107b2o4bo$\n" +
		"112bobo$112bobo$113bo10b2o$124bobo$126bo$126b2o$111b2o$112bo$109b3o$\n" +
		"109bo!";

		String tLatchHead =
		"98b2o$98b2o$119bo$117b3o11bo$116bo14b3o$116b2o16bo14bo$133b2o12b3o$\n" +
		"146bo$146b2o3$145b2o$126b2o17b2o$126b2o2$88b2o$88b2o3$129b2o$109b2o19b\n" +
		"o$109bobo16bo$111bo16b2o$111b2o19b2o$133bo$130b3o$130bo6$123b2o$124bo$\n" +
		"124bobo15b2o$125b2o15b2o$154b2o$154bobo$156bo$156b2o8$143b2o$143bobo$\n" +
		"145bo$145b2o9$133b2o$133b2o6$144b2o$123b2o19bo$124bo17bobo$124bobo15b\n" +
		"2o$125b2o4bo$130bobo$130bobo$131bo10b2o$142bobo$144bo$144b2o$129b2o$\n" +
		"130bo$127b3o$127bo8$10b2o$10b2o$31bo$29b3o11bo$28bo14b3o$28b2o16bo14bo\n" +
		"$45b2o12b3o$58bo$58b2o3$57b2o$38b2o17b2o$38b2o2$2o$2o3$41b2o$21b2o19bo\n" +
		"$21bobo16bo$23bo16b2o$23b2o19b2o$45bo$42b3o$42bo161b2o$204b2o2$216b2o$\n" +
		"195b2o19b2o$195b2o$35b2o$36bo$36bobo15b2o$37b2o15b2o$66b2o154b2o$66bob\n" +
		"o152bo2bo$68bo153b2o$68b2o8$55b2o152b2o$55bobo151bo$57bo152b3o$57b2o\n" +
		"153bo4$193b2o$192bobo$192bo$191b2o2$45b2o$45b2o4$201b2o$201b2o$56b2o$\n" +
		"35b2o19bo151bob2o$36bo17bobo151b2obo$36bobo15b2o$37b2o4bo$42bobo28b2o\n" +
		"115b2o$42bobo28b2o116bo$43bo10b2o135bobo$54bobo28b2o105b2o$56bo7b2o19b\n" +
		"2o$56b2o6b2o$41b2o163b2o$42bo163bobo$39b3o166bo51bo$39bo168b2o50b3o$\n" +
		"91b2o170bo22bo$90bo2bo140bo27b2o20b3o11bo$91b2o141b3o46bo14b3o$237bo\n" +
		"45b2o16bo14bo$236b2o62b2o12b3o$232b2o19b2o58bo$203b2o27b2o19bo59b2o$\n" +
		"203bo47bobo$204b3o44b2o$206bo24bo80b2o$230bobo60b2o17b2o$78b2o151bo61b\n" +
		"2o$78bo149b3o$79b3o105b2o39bo$81bo104bobo$186bo$185b2o$262b2o32b2o$62b\n" +
		"2o166b2o30b2o11b2o20bo$61bobo166b2o43bo19bo$61bo214b3o16b2o$60b2o152b\n" +
		"2o62bo20b2o$215bo84bo$195b2o18bobo79b3o$195b2o19b2o79bo$204b2o$202bo2b\n" +
		"o$202b2o4b2o$70b2o114b2o20bo106b2o$70b2o115bo18bobo106bobo$187bobo16b\n" +
		"2o34b2o46b2o25bo$77bob2o107b2o52b2o3b2o42bo25b2o$77b2obo166b2o42bobo\n" +
		"15b2o$292b2o15b2o2$59b2o187b2o$60bo181b2o4bo$60bobo179b2o5b3o$61b2o\n" +
		"188bo$217b2o$217b2o11b2o$75b2o153bo$75bobo116b2o35b3o$77bo51bo60b2o2b\n" +
		"2o37bo$77b2o50b3o57bobo$132bo22bo33bo23b2o95b2o$103bo27b2o20b3o11bo20b\n" +
		"2o23bo96bobo$103b3o46bo14b3o44b3o95bo$106bo45b2o16bo14bo30bo95b2o$105b\n" +
		"2o62b2o12b3o$101b2o19b2o58bo$72b2o27b2o19bo59b2o$72bo47bobo$73b3o44b2o\n" +
		"$75bo24bo80b2o$99bobo60b2o17b2o$100bo61b2o$97b3o200b2o$56b2o39bo202b2o\n" +
		"$55bobo$55bo$54b2o$131b2o32b2o$99b2o30b2o11b2o20bo$99b2o43bo19bo146b2o\n" +
		"$145b3o16b2o124b2o19bo$83b2o62bo20b2o121bo17bobo$84bo84bo121bobo15b2o$\n" +
		"64b2o18bobo79b3o123b2o4bo$64b2o19b2o79bo130bobo$73b2o222bobo$71bo2bo\n" +
		"223bo10b2o$71b2o4b2o230bobo$55b2o20bo106b2o125bo$56bo18bobo106bobo124b\n" +
		"2o$56bobo16b2o34b2o46b2o25bo109b2o$57b2o52b2o3b2o42bo25b2o109bo$116b2o\n" +
		"42bobo15b2o114b3o$161b2o15b2o114bo2$117b2o$111b2o4bo$111b2o5b3o$120bo$\n" +
		"86b2o$86b2o11b2o$99bo$63b2o35b3o$59b2o2b2o37bo$58bobo$58bo23b2o95b2o$\n" +
		"57b2o23bo96bobo$83b3o95bo$85bo95b2o9$169b2o$169b2o6$180b2o$159b2o19bo$\n" +
		"160bo17bobo$160bobo15b2o$161b2o4bo$166bobo$166bobo$167bo10b2o$178bobo$\n" +
		"180bo$180b2o$165b2o$166bo$163b3o$163bo!";

//---------------------------------------------------------------------------------------------------------------------------------

	public  CMChapmanBuild(){
//		Nothing to do
	}
//---------------------------------------------------------------------------------------------------------------------------------
    void addDiag(partList all, CMpart newPart, int state, int x, int y){
    	all.addPart(newPart, x + 100 - 164*state, y + 500 +164*state);
	}
//---------------------------------------------------------------------------------------------------------------------------------
	void getRLEp1(CMcontrols controls, CMprogram prog, JTextArea ta){
		String res, rqName;
		partList all;
		CMpart  pBlock, pCounter, pCounterIncDec, routeArmBelow, routeSelectNxtBelow, pEater, pEaterFX, pEaterSXY,
				pLatchHead, routeSourceDown, routeSourceDownFan, routeSourceUp, routeSourceUpFan, pGlider, prightdownfan, pStateLatchFail,
				pStateLatchPass, routeArmAbove, routeSelectNxtAbove ;

		int nCols = 5;
		int [] routeSourceUpList = 	  {0,0};
		int [] routeSourceDownList = 	  {0,0};
		int [] routeSelectNxtAboveList = {0,0};
		int [] routeSelectNxtBelowList = {0,1};
		int [] routeArmAboveList = 	  {0,0};
		int [] routeArmBelowList = 	  {0,-1};

		long start = System.currentTimeMillis();

		all = new partList();
		pBlock = new CMpart("Block", sBlock);
		pCounter = new CMpart("Counter", tCounter);
		pCounterIncDec = new CMpart("CounterIncDec", tRightUp);
		routeArmBelow = new CMpart("downleftbend", tDownLeft);			//   action reaction bend
		routeSelectNxtBelow = new CMpart("downright", tDownRight);
		pEater = new CMpart("Eater", sEater);
		pEaterFX = new CMpart("EaterFX", tEaterFX);
		pEaterSXY = new CMpart("EaterSXY", sEaterSXY);
		pLatchHead = new CMpart("LatchHead", tLatchHead);
		routeSourceUp = new CMpart("leftup", tLeftUp);
		routeSourceUpFan = new CMpart("leftup", tLeftUpFan);
		pGlider = new CMpart("Glider", sGlider);
		routeSourceDown = new CMpart("leftdown", tLeftDown);
		routeSourceDownFan = new CMpart("leftdownfan", tLeftDownFan);
		prightdownfan = new CMpart("rightdownfan", tRightDownFan);			//	action - reaction fan
		pStateLatchFail = new CMpart("StateLatch", tStateLatchFail);
		pStateLatchPass = new CMpart("StateLatch", tStateLatchPass);
		routeArmAbove = new CMpart("upleftbend", tUpLeft);
		routeSelectNxtAbove = new CMpart("uprightbend", tUpRight);

		String[] prohgLines, lineParms;
		CMinstruction CurrentInst;


		int r0, r1, col;
		colMark space = new colMark(nCols,prog.size()*2+7);

//												add counters
		for (int i=0; i < prog.noCounters(); i++){
			all.addPart(pCounter, 600 + 380*i, 500 + 380*i);
			int cntrV = prog.getCounter(i).intValue();
			all.addPart(pBlock, 1254 + 380*i  + cntrV, 767 + 380*i - cntrV);
		}
//												add inc / dec  below counters
		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("INC")){
				all.addPart(pCounterIncDec, 461 + 380*CurrentInst.counter - 164*i, 1148 + 380*CurrentInst.counter + 164*i);
			} else 	if ( CurrentInst.Itype.equals("DEC")){
				all.addPart(pCounterIncDec, 717 + 380*CurrentInst.counter - 164*i, 1404 + 380*CurrentInst.counter  + 164*i);
			} else{
				all.addPart(pEaterSXY, 486  - 164*i, 1158  + 164*i);
			}
			if ( CurrentInst.Itype.equals("INC") || CurrentInst.Itype.equals("NOP")){
				r0 = CurrentInst.Number;
				r1 = CurrentInst.iJ1.Number;
				if (r0 < r1){
					col = space.getFreeCol(r0*2+1,r1*2,routeSourceDownList,routeSelectNxtBelowList, ta);
					all.addPart(routeSourceDown,     645 -164*r0 - 124*col, 1059 + 164*r0 -124*col);
					all.addPart(routeSelectNxtBelow, 667 -164*r1 - 124*col, 1038 + 164*r1 - 124*col);
				} else {
					col = space.getFreeCol(r1*2,r0*2+1,routeSelectNxtAboveList,routeSourceUpList, ta);
					all.addPart(routeSourceUp,       622 - 164*r0 - 124*col, 1087 + 164*r0 - 124*col);
					all.addPart(routeSelectNxtAbove, 679 - 164*r1 - 124*col,  997 + 164*r1 - 124*col);
				}
			}
		}
		boolean pShort, pUpA, pUpB;
		int cola, colb;
		int longestJump =0;
		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("DEC")){
				r0 = CurrentInst.Number;
				r1 = CurrentInst.iJ1.Number;
				if (r0 < r1){
					cola = space.getFreeCol(r0*2+1,r1*2, routeSourceDownList, routeArmBelowList, ta);
					pUpA = false;
					all.addPart(routeArmBelow, 743 - 164*r1 - 124*cola, 1002 + 164*r1 -124*cola);
					if ( (r1-r0) > longestJump) {
						if (! CurrentInst.iJ1.Itype.equals("HLT") )longestJump = r1-r0;
					}
				} else {
					cola = space.getFreeCol(r1*2, r0*2+1, routeArmAboveList, routeSourceUpList, ta);
					pUpA = true;
					all.addPart(routeArmAbove, 761 - 164*r1 - 124*cola,  989 + 164*r1 - 124*cola);
				}
				r1 = CurrentInst.iJ2.Number;
				if (r0 < r1){
					colb = space.getFreeCol(r0*2+1,r1*2, routeSourceDownList, routeArmBelowList, ta);
					pUpB = false;
					all.addPart(routeArmBelow, 743 - 164*r1 - 124*colb, 1002 + 164*r1 -124*colb);
					if ( (r1-r0) > longestJump) {
						if (! CurrentInst.iJ2.Itype.equals("HLT") )longestJump = r1-r0;
					}
				} else {
					colb = space.getFreeCol(r1*2,r0*2+1, routeArmAboveList, routeSourceUpList, ta);
					pUpB = true;
					all.addPart(routeArmAbove, 761 - 164*r1 - 124*colb, 989 + 164*r1 - 124*colb);
				}
				if (pUpA){
					if ( cola<colb){
						all.addPart(routeSourceUpFan,   569 - 164*r0 - 124*cola,  1017  + 164*r0 - 124*cola);
					} else {
						all.addPart(routeSourceUp,      622 - 164*r0 - 124*cola,  1087  + 164*r0 - 124*cola);
					}
				} else {
					if ( cola<colb){
						all.addPart(routeSourceDownFan, 575 - 164*r0 - 124*cola,  1006  + 164*r0 - 124*cola);
					} else {
						all.addPart(routeSourceDown,    645 - 164*r0 - 124*cola,  1059  + 164*r0 - 124*cola);
					}
				}
				if (pUpB){
					if ( cola<colb){
						all.addPart(routeSourceUp,      622 - 164*r0 - 124*colb,  1087  + 164*r0 - 124*colb);
					} else {
						all.addPart(routeSourceUpFan,   569 - 164*r0 - 124*colb,  1017  + 164*r0 - 124*colb);
					}
				} else {
					if ( cola<colb){
						all.addPart(routeSourceDown,    645 - 164*r0 - 124*colb,  1059  + 164*r0 - 124*colb);
					} else {
						all.addPart(routeSourceDownFan, 575 - 164*r0 - 124*colb,  1006  + 164*r0 - 124*colb);
					}
				}
			}
		}

		if ( (longestJump - (space.size() -7)*248/164 ) > 13) {
			if ( (longestJump - (space.size() -7)*248/164 ) > 18) {
				controls.addFault("Warining - Long DEC Jump down: may trigger early - jumping "+String.valueOf(longestJump));
		} else {
				controls.addMessage("Warining - Long DEC Jump down: may trigger early - jumping "+String.valueOf(longestJump));
			}
		}
		boolean equipedLpass [] = new boolean [prog.size()+1];
		boolean equipedLfail [] = new boolean [prog.size()+1];
		int colladj =  -638+40 +space.size()*124;
		all.addPart(pLatchHead, -365 - colladj,  1 - colladj);

		int lastArm =0;
		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("DEC")){
				r0 = CurrentInst.iJ1.Number;
				all.addPart(pStateLatchPass, -371 - 164*r0 - colladj ,49  + 164*r0 - colladj);
				equipedLpass[r0] = true;
				if (equipedLfail[r0]) controls.addFault("Only one type of latch allowed:  Instruction "+CurrentInst.iJ1.Name);
				r1 = CurrentInst.iJ2.Number;
				all.addPart(pStateLatchFail, -371 - 164*r1 - colladj ,49  + 164*r1 - colladj);
				equipedLfail[r1] = true;
				if (equipedLpass[r1]) controls.addFault("Only one type of latch allowed:  Instruction "+CurrentInst.iJ2.Name);
				lastArm = Math.max(lastArm,Math.max(r0, r1));
			}
			if (! CurrentInst.Itype.equals("HLT")){
				all.addPart(prightdownfan, 356 - 164*i,  1020 + 164*i);
				all.addPart(routeArmBelow, 293 - 164*i,  1076 + 164*i);
			}
		}

		all.addPart(pEaterFX,  -243 - 164*lastArm - colladj, 394  + 164*lastArm - colladj); //bottom
		all.addPart(pEaterFX,  -294 - 164*lastArm - colladj, 359  + 164*lastArm - colladj);  //middle
		all.addPart(pEaterFX,  -364 - 164*lastArm - colladj, 181  + 164*lastArm - colladj); //top

		int startinst=prog.getFirst().Number;
		all.addPart(pGlider, 	  90 -164*startinst - colladj , 434 + 164*startinst - colladj);//done


// the parts where added in order of assending Y, Thay will be removed during RLE generation in the revese order
		all = all.reverse(null);

		all.doRLE(ta);
		long elapsedTimeMillis = System.currentTimeMillis()-start;
		float elapsedTimeSec = elapsedTimeMillis/1000F;
		ta.append(String.format("\n\nTook %.1f seconds\n",elapsedTimeSec));
	}
//-------------------------------------------------------------------------

//---------------------------------------------------------------------------------------------------------------------------------
//2
	void getRLE(CMcontrols controls, CMprogram prog, JTextArea ta){
		String res, rqName;
		partList all;
		CMpart  pBlock, pCounter, pCounterIncDec, routeArmBelow, routeSelectNxtBelow, pEater, pEaterFX, pEaterSXY,
				pLatchHead, routeSourceDown, routeSourceUp, pLWSS, prightdownfan, pStateLatch, routeArmAbove, routeSelectNxtAbove ;

		int nCols = 5;
		int [] routeSourceUpList = 	     { 1,0, -1, 0, -1,1};
		int [] routeSourceDownList =	 { 1,0,  0,-1, -1,-1, -1,0};
		int [] routeSelectNxtAboveList = { 1,0, -1, 0, -1,1};
		int [] routeSelectNxtBelowList = {-1,0,  1, 0,  2,0};
		int [] routeArmAboveList = 	     { 2,0,  1, 0};
		int [] routeArmBelowList = 	     { 2,0,  1, 0};

		long start = System.currentTimeMillis();

		all = new partList();
		pBlock = new CMpart("Block", sBlock);
		pCounter = new CMpart("Counter", sCounter);
		pCounterIncDec = new CMpart("CounterIncDec", sCounterIncDec);
		routeArmBelow = new CMpart("downleftbend", sdownleftbend);			//   action reaction bend
		routeSelectNxtBelow = new CMpart("downright", sdownright);
		pEater = new CMpart("Eater", sEater);
		pEaterFX = new CMpart("EaterFX", sEaterFX);
		pEaterSXY = new CMpart("EaterSXY", sEaterSXY);
		pLatchHead = new CMpart("LatchHead", sLatchHead);
		routeSourceUp = new CMpart("leftup", sleftup);
		pLWSS = new CMpart("LWSS", sLWSS);
		routeSourceDown = new CMpart("leftdownfan", sleftdownfan);
		prightdownfan = new CMpart("rightdownfan", srightdownfan);			//	action - reaction fan
		pStateLatch = new CMpart("StateLatch", sStateLatch);
		routeArmAbove = new CMpart("upleftbend", supleftbend);
		routeSelectNxtAbove = new CMpart("uprightbend", suprightbend);

		String[] prohgLines, lineParms;
		CMinstruction CurrentInst;


		int counterX = 100;
		int counterY = 0;
		int routingX = counterX -20;
		int instY = 582;
		int r0, r1, col;
		colMark space = new colMark(nCols,prog.size()*3+7);

//												add counters
		for (int i=0; i < prog.noCounters(); i++){
			all.addPart(pCounter, counterX + i*180, counterY );
			int cntrV = prog.getCounter(i).intValue();
			all.addPart(pBlock, counterX + i*180 + 175 + cntrV, counterY + 68 - cntrV);
		}
//												add inc / dec  below counters
		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("INC")){
				all.addPart(pCounterIncDec, counterX + 29 +CurrentInst.counter*180, instY + i*210);
			} else 	if ( CurrentInst.Itype.equals("DEC")){
				all.addPart(pCounterIncDec, counterX + 119 + CurrentInst.counter*180, instY + i*210);
			} else {
				all.addPart(pEaterSXY, counterX + 33, instY + i*210 + 69);
			}
			if ( CurrentInst.Itype.equals("INC") || CurrentInst.Itype.equals("NOP")){
				r0 = CurrentInst.Number;
				r1 = CurrentInst.iJ1.Number;
				if (r0 < r1){
					col = space.getFreeCol(r0*3+2,r1*3,routeSourceDownList,routeSelectNxtBelowList, ta);
					all.addPart(routeSourceDown, routingX - col*30 - 89, instY + r0*210 - 61);
					all.addPart(routeSelectNxtBelow,routingX - col*30 -89, instY + r1*210 - 173);
				} else {
					col = space.getFreeCol(r1*3,r0*3+2,routeSelectNxtAboveList,routeSourceUpList, ta);
					all.addPart(routeSourceUp, routingX - col*30 - 94,   instY + r0*210 - 61);
					all.addPart(routeSelectNxtAbove,routingX - col*30 - 102, instY + r1*210 - 166);
				}
			}
		}

		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("DEC")){
				r0 = CurrentInst.Number;
				r1 = CurrentInst.iJ1.Number;
				if (r0 < r1){
					col = space.getFreeCol(r0*3+2,r1*3+1,routeSourceDownList,routeArmBelowList, ta);
					all.addPart(routeSourceDown, routingX - col*30 - 89,  instY + r0*210 - 61);
					all.addPart(routeArmBelow,   routingX - col*30 - 125, instY + r1*210 - 108);
				} else {
					col = space.getFreeCol(r1*3+1,r0*3+2,routeArmAboveList,routeSourceUpList, ta);
					all.addPart(routeSourceUp, routingX - col*30 - 94,   instY + r0*210 - 61);
					all.addPart(routeArmAbove, routingX - col*30 - 138,  instY + r1*210 - 101);
				}
				r1 = CurrentInst.iJ2.Number;
				if (r0 < r1){
					col = space.getFreeCol(r0*3+2,r1*3+1,routeSourceDownList,routeArmBelowList, ta);
					all.addPart(routeSourceDown, routingX - col*30 - 89,  instY + r0*210 - 61);
					all.addPart(routeArmBelow,   routingX - col*30 - 125, instY + r1*210 - 108);
				} else {
					col = space.getFreeCol(r1*3+1,r0*3+2,routeArmAboveList,routeSourceUpList, ta);
					all.addPart(routeSourceUp, routingX - col*30 - 94,   instY + r0*210 - 61);
					all.addPart(routeArmAbove, routingX - col*30 - 138,  instY + r1*210 - 101);
				}
			}
		}

		boolean equipedLpass [] = new boolean [prog.size()+1];
		boolean equipedLfail [] = new boolean [prog.size()+1];
		int colladj = routingX -553 -space.size()*30;
		all.addPart(pLatchHead, colladj,127);

		for (int i=0; i < prog.size(); i++){
			CurrentInst =  prog.instruction(i);
			if ( CurrentInst.Itype.equals("DEC")){
				r0 = CurrentInst.iJ1.Number;
				all.addPart(pStateLatch, colladj + 209,instY + r0*210 -229);
				equipedLpass[r0] = true;
				if (equipedLfail[r0]) controls.addFault("Only one type of latch allowed:  Instruction "+CurrentInst.iJ1.Name);
				r1 = CurrentInst.iJ2.Number;
				all.addPart(pStateLatch, colladj -1,   instY + r1*210 -229);
				equipedLfail[r1] = true;
				if (equipedLpass[r1]) controls.addFault("Only one type of latch allowed:  Instruction "+CurrentInst.iJ2.Name);
			}
			all.addPart(prightdownfan, routingX -30,  instY + i*210 + 24);
			all.addPart(routeArmBelow, routingX -35,  instY + i*210 + 162);
			all.addPart(pEater, 	   colladj + 420, instY + i*210 + 187);
		}

		all.addPart(pEaterFX, 	   colladj +  32, instY + prog.size()*210);
		all.addPart(pEaterFX, 	   colladj +  92, instY + prog.size()*210);
		all.addPart(pEaterFX, 	   colladj + 242, instY + prog.size()*210);
		all.addPart(pEaterFX, 	   colladj + 302, instY + prog.size()*210);

		int startinst=prog.getFirst().Number;
		all.addPart(pLWSS, 	   colladj + 450, instY + startinst*210 - 144);
		ta.append(String.format("LWSS %d, %d \n",colladj + 420,instY + startinst*210 - 144));


// the parts where added in order of assending Y, Thay will be removed during RLE generation in the revese order
		all = all.reverse(null);

		all.doRLE(ta);
		long elapsedTimeMillis = System.currentTimeMillis()-start;
		float elapsedTimeSec = elapsedTimeMillis/1000F;
		ta.append(String.format("\n\nTook %.1f seconds\n",elapsedTimeSec));
	}
//-------------------------------------------------------------------------
//                             CMpart
//--------------------------------------------------------------------------
	class CMpart {
		public static final short isCells = 0, isBlanks = 1, isLines = 2;
		ArrayList<Integer>  rleListV;
		ArrayList<Short>  rleListT;
		private String Name;
		private int start, startX, startY, minX, minY, maxX, maxY;

//----------------------------------------------------------------------------------------------- CMpart
	 	public CMpart(String name, String lines){
			Name = name;
			parsePat(lines);
		}
//----------------------------------------------------------------------------------------------- CMpart
		public void parsePat(String pattern){

			String[] pattLines;
			String bff;
			int iNum; // number of repetitions
			int i, iCol, iRow;
			boolean eol;

			iRow=0;
			iNum=0;
			iCol=0;
			i = 0;
			start = -1;
			rleListV = new ArrayList<Integer>();
			rleListT = new ArrayList<Short>();

			pattLines = pattern.split("\\n");
			eol = false;

			while ( (i < pattLines.length)&& ! eol) {

				bff = pattLines[i].trim();

				if (!bff.startsWith("#D") && ! bff.startsWith("#C") && ! bff.startsWith("x") && (bff.length() > 0) ) {
					for (int ii = 0; (ii < bff.length()) && (!eol); ii++) {
						if ((bff.charAt(ii) >= '0')	&& (bff.charAt(ii) <= '9')) {
							iNum = iNum * 10 + (bff.charAt(ii) - '0');
						} else {
							if (iNum == 0)
								iNum = 1;
							switch (bff.charAt(ii)) {
							case '$':
								rleListV.add(iNum);
								rleListT.add(isLines);
								iRow = iRow + iNum;
								iCol = 0;
								break;
							case 'b':
							case 'B':
							case '.':
								rleListV.add(iNum);; // blank
								rleListT.add(isBlanks);
								iCol = iCol + iNum; // blank
								break;

							case '!': // end flag, the rest is the description
								eol = true;
								break;

							default: // probably a cell
								if (((bff.charAt(ii) >= 'a') && (bff.charAt(ii) <= 'z')) || ((bff.charAt(ii) >= 'A') && (bff.charAt(ii) <= 'Z'))) {
									if (start < 0) {
										start = rleListV.size();	// first x
										startX = iCol;
										startY = iRow;
									}
									rleListV.add(iNum);
									rleListT.add(isCells);
									if (iCol < minX) minX = iCol;
									if (iRow < minY) minY = iRow;
									if (iRow > maxY) maxY = iRow;
									iCol = iCol + iNum;
									if (iCol > maxX) maxX = iCol;
								}
								break;
							}
							iNum = 0;  //digit processed
						} // digit processing
					} // for each character
				}// line to process
				i++;
			}
		}
//---------------------------------------------------------------------------------------------------
	}
//---------------------------------------------------------------------------------------------------
//                       partList
//-------------------------------------------------------------------------------------------------- partList
//  an orderded list of part. Initialiy in decending Y order while being built. It is reveresed
//  to accending order before being read.
//	The cells are extracted in a sequence starting -newY , getXY .. and ending with a null. The
//   parts are removed and the list being shortened as parts have been read.

	public class partList {
		int myX, myY, size, index, lastX, lastY, lastDone;
		int[] myXY, otherXY;
		partList nextPart, anotherPart;
		CMpart myPart;

//-------------------------------------------------------------------------------------------------- partList
		public partList(){
			nextPart = null;
			myXY = null;
			index = -1;
		}

//-------------------------------------------------------------------------------------------------- partList
		public void addPart(CMpart newPart, int newX, int newY){

			if (myPart == null){
				myPart = newPart;
				myX = newX;
				myY = newY;
				nextPart = null;
			} else {
				if (newY < myY){
					// put smaller part in behind of larger or equal part
					if ( nextPart == null){
						nextPart = new partList();
					}
					nextPart.addPart(newPart, newX, newY);
				} else {
					anotherPart = new partList();
					anotherPart.addPart(myPart, myX, myY);
					anotherPart.link(nextPart);
					myPart = newPart;
					myX = newX;
					myY = newY;
					nextPart = anotherPart;
				}
			}
		}
//-------------------------------------------------------------------------------------------------- partList
		public void link(partList nextLink){
			nextPart = nextLink;
		}
//----------------------------------------- start a new get sequence ------------------------------ partList

		public void newGet(){
			int [] temp;

			index = -1;			// incremented to 0 in getmyNext()
			myXY = getmyNextXY();
			if ( nextPart != null ){
				nextPart.newGet();
				otherXY = nextPart.getNextXY();
			} else {
				otherXY = null;
			}
		}

//-------------------------------------------------------------------------------------------------- partList
		public int[] getNextXY(){
			int [] res, temp;
			if ( myXY == null){		// no more values with this y
				res = otherXY;
				if (otherXY != null ) {
					if (nextPart != null) {
						myPart = nextPart.myPart;
						myY =  nextPart.myY;
						myX = nextPart.myX;
						myXY = nextPart.myXY;
						index = nextPart.index;
						lastX = nextPart.lastX;
						lastY = nextPart.lastY;
						lastDone = nextPart.lastDone;
						otherXY = nextPart.otherXY;
						nextPart = nextPart.nextPart;
					} else {
						otherXY = nextPart.getNextXY();
					}
				}
			} else {
				if ( otherXY == null){
					res = myXY;
					if ( myXY != null) {
						myXY = getmyNextXY();
					}
				} else if (   ( myXY[1] < otherXY[1] ) || (  ( myXY[1] == otherXY[1] ) && (myXY[0] < otherXY[0])  )   ) {
					res = myXY;
					if ( myXY != null) {
						myXY = getmyNextXY();
					}
				} else {
					if  (  ( myXY[1] == otherXY[1] ) && (myXY[0] == otherXY[0])  ) {  // remove duplicate cells
						myXY = getmyNextXY();
					}
					res = otherXY;
					if ( otherXY != null ) {
						otherXY = nextPart.getNextXY();
					}
				}
			}
			return res;
		}
//-------------------------------------------------------------------------------------------------- partList
		public partList reverse(partList newlink){
			partList res;

			if (nextPart != null){
				res = nextPart.reverse(this);
			} else {
				res = this;
			}
			nextPart = newlink;
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public int[] getmyNextXY(){
			int count;
			short type;
			boolean notDone;
			int [] res;

			if (index <0) { // initialise
				index = myPart.start;
				lastX = myPart.startX;
				lastY = myPart.startY;
				lastDone = 0;
			} else 	if ( index >= myPart.rleListV.size() ){
				return null;
			}
			notDone = true;
			res = null;

			count = myPart.rleListV.get(index);
			type  = myPart.rleListT.get(index);
			if (count > lastDone ){
				res = new int[] { lastX + myX, lastY + myY };
				lastDone ++;
				lastX += 1;
				notDone =  count <= lastDone;
			}
			while (notDone) {
				index++;
				if ( index < myPart.rleListV.size() ){
					count = myPart.rleListV.get(index);
					type  = myPart.rleListT.get(index);
					if (type == CMpart.isCells){
						notDone = false;
						lastDone = 0;
					} else if ( type == CMpart.isBlanks){
						lastX += count;
					} else {
						lastY += count;
						lastX =0;
					}
				} else notDone = false;
			}
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public int getminX(){
			int res, otherMin;

			res = myPart.minX + myX;
			if (nextPart != null){
				otherMin = nextPart.getminX();
				if (res > otherMin) {
					res = otherMin;
				}
			}
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public int getmaxX(){
			int res, otherMax;

			res = myPart.maxX + myX;
			if (nextPart != null){
				otherMax = nextPart.getmaxX();
				if (res < otherMax) {
					res = otherMax;
				}
			}
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public int getminY(){
			int res, otherMin;

			res = myPart.minY+myY;
			if (nextPart != null){
				otherMin = nextPart.getminY();
				if (res > otherMin) {
					res = otherMin;
				}
			}
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public int getmaxY(){
			int res, otherMax;

			res = myPart.maxY + myY;
			if (nextPart != null){
				otherMax = nextPart.getmaxY();
				if (res < otherMax) {
					res = otherMax;
				}
			}
			return res;
		}
//----------------------------------------------------------------------------------------------- partList
		public void doRLE(JTextArea ta){
			ArrayList<LifeCellByte> LCBlist;
			String oldS;
			LifeCellByte cell;
			int doingX, doingY, run, minX, minY, x,y;
			int [] XY;

			minX = getminX();
			minY = getminY();
			ta.setText("x = "+String.valueOf(getmaxX()-minX+1)+", y = "+String.valueOf(getmaxY()-minY+1)+"\n");
			oldS = "";
			doingX = minX;
			doingY = minY;
			run =0;

			newGet();					// start new sequence
			XY = getNextXY();
			while  (XY != null) {
				if  (XY[1] > doingY){
					if ( run > 0 ){
						oldS = addRLErun(ta, oldS, run,"o");
						run =0;
					}
					oldS = addRLErun(ta, oldS,XY[1] - doingY, "$");
					doingY += XY[1] - doingY;
					doingX = minX;
				}
					if (XY[0] > doingX ) {
					if ( run > 0 ){
						oldS = addRLErun(ta, oldS, run,"o");
						run =0;
					}
				  	oldS = addRLErun(ta, oldS,XY[0] - doingX,"b");
					doingX = XY[0];
			  	}
				run ++;
				doingX ++;
				XY = getNextXY();
			}
			if ( run > 0 ){
				oldS = addRLErun(ta, oldS, run,"o");
			}
			oldS = addRLEone(ta, oldS,"!");
		ta.append(oldS);
		}
	}	// end of class partList
//----------------------------------------------------------------------------------------------- partList
		private String  addRLEone(JTextArea ta, String oldS, String newS){
			if (oldS.length() > 69) {
				ta.append(oldS.concat("\n"));
				oldS = newS;
			} else {
				oldS = oldS.concat(newS);
			}
			return oldS;
		}
//----------------------------------------------------------------------------------------------- partList
		private String addRLErun(JTextArea ta, String oldS, int run, String newS){
			String num;

			if (run == 1){
				oldS = addRLEone(ta, oldS, newS);
			} else {
				num = String.valueOf(run);
				if ( (oldS.length()+ num.length() ) > 69) {
					ta.append(oldS.concat("\n"));
					oldS = num.concat(newS);
				} else {
					oldS = oldS.concat(num.concat(newS));
				}
			}
			return oldS;
		}
//---------------------------------------------------------------------------------------------------
//                             CellComparableY
// ----------------------------------------------------------------
public class CellComparableY implements Comparator<LifeCellByte>{

    @Override
    public int compare(LifeCellByte o1, LifeCellByte o2) {
		int res;
		if (o2.y > o1.y) {
			res = -1;
		} else if (o1.y == o2.y) {
			if (o2.x > o1.x) {
				res = -1;
			} else {
				if (o1.x == o2.x) {
					res =0;
				} else {
					res = 1;
				}
			}
		} else {
			res = 1;
		}
		return res;
    }
}

//--------------------------------------------------------------------------
//								LifeCellBytes

//--------------------------------------------------------------------------
	class LifeCellByte{
		private static final int OFFSET = Integer.MAX_VALUE/2;
		int x;
		int y;
		short cells;
//-------------------------------------------------------------------------- LifeCellBytes

		public LifeCellByte(int px, int py){
			x = (OFFSET+px)/8;
	//		x = (px)/8;
			y = py;
			cells =  (short)(1 << (px+OFFSET)%8);
	//		cells =  (short)(1 << (px)%8);
		}

//-------------------------------------------------------------------------- LifeCellBytes
		public String getString(){
			String res, resnext;

			res = "";
			resnext="";
			for (int i=0; i<8;i++){
				if( (cells & (1 << i) ) != 0 ){
					res += resnext+String.valueOf( x*8 + i - OFFSET) + ","+String.valueOf(y);
	//				res += resnext+String.valueOf( x*8 + i) + ","+String.valueOf(y);
					resnext="\n";
				}
			}

		   return res;
	   	}
//-------------------------------------------------------------------------- LifeCellBytes
	   	public void add(int px, int py){
		   cells |=  (short) ( 1 << ((OFFSET + px)%8) );
	//	   cells |=  (short) ( 1 << px%8 );
	   	}

//-------------------------------------------------------------------------- LifeCellBytes
		public int size(){
			int res = 0;
			for (int i=0; i<8;i++){
				if( (cells & (1 << i) ) != 0 ){
					res += 1;
				}
			}
			return res;
		}

//-------------------------------------------------------------------------- LifeCellBytes
		public int valueY(){
			return y;
		}
//-------------------------------------------------------------------------- LifeCellBytes
		public int valueX(int ind){
			int res = 0;
			int cnt = 0;
			for (int i=0; i<8;i++){
				if( (cells & (1 << i) ) != 0 ){
					if (cnt != ind){
						cnt += 1;
					} else {
						return x*8 + i - OFFSET;
//						return x*8 + i;
					}
				}
			}
			return -1;
		}
//-------------------------------------------------------------------------- LifeCellBytes
		public int[] getXY(int ind){
			int [] res = {valueX(ind), valueY()};
			return res;
		}
	}

//-------------------------------------------------------------------------------------------------- colMark
//												colMark
//-------------------------------------------------------------------------------------------------- colMark
//  Column mark class. To mark occupied areas of the routing table
	public class colMark {
		int nRows;
		int lastRowUsed;

		ArrayList<boolean[]> markCols;
//-------------------------------------------------------------------------------------------------- colMark
		public colMark(int cols, int rows){

			nRows = rows;
			lastRowUsed = 0;
			markCols = new ArrayList<boolean[]>();

			for (int i=0; i < cols; i++){
				markCols.add(new boolean[rows]);
			}
		}
//-------------------------------------------------------------------------------------------------- colMark
		public void setMark(int col, int row){
			markCols.get(col)[row] = true;
		}
//-------------------------------------------------------------------------------------------------- colMark
		public void setMarks(int col, int row1, int row2){
			for (int i=row1; i<=row2; i++){
				markCols.get(col)[i] = true;
			}
		}
//-------------------------------------------------------------------------------------------------- colMark
		public boolean isColFree(int col, int row1, int row2){
			for (int i=row1; i<=row2; i++) {
				if ( markCols.get(col)[i]) {
					return false;
				}
			}
			return true;
		}
//-------------------------------------------------------------------------------------------------- colMark
		public boolean isListFree(int col, int row, int[] list){
			for (int i=0; i < list.length; i+=2) {
				if ( markCols.get(col+list[i])[row + list[i+1] ] ) {
					return false;
				}
			}
			return true;
		}
//-------------------------------------------------------------------------------------------------- colMark
		public void setList(int col, int row, int[] list){
			for (int i=0; i < list.length; i+=2) {
				markCols.get(col + list[i])[row + list[i+1] ] = true;
			}
		}

//-------------------------------------------------------------------------------------------------- colMark
		public int getFreeCol(int row1, int row2, int[] topList, int[] botList, JTextArea ta ){
			int r0,r1, colsdone;
			int res = 0;
			boolean colFound;

			r0 = row1+2;		// allow space for top & bot lists
			r1 = row2+2;
			colFound = false;
			colsdone = 2;		// allow space for top & bot lists
			while ( (! colFound) && (colsdone < 500) ){
				for (res = colsdone; res < markCols.size()-2; res++){
					colFound = isColFree(res, r0,r1) && isListFree(res, r0, topList) && isListFree(res, r1, botList);
					if (colFound) {
						break;
					}
				}
				if (! colFound){
					if (colsdone < 500){
						colsdone = markCols.size()-3;
						markCols.add(new boolean[nRows]);
					} else {
						colFound = true;
						ta.append("addCol abandoned\n");
					}
				}
			}
			if (colsdone < 500){
				setMarks(res, r0, r1);
				setList(res, r0, topList);
				setList(res, r1, botList);
			}
			lastRowUsed = Math.max(lastRowUsed, res);
			return res;
		}
//-------------------------------------------------------------------------------------------------- colMark
		public int size(){
			return lastRowUsed;
		}
	}
//-------------------------------------------------------------------------------------------------- colMark

}


//		End of Lisitng
