//
/* ----------------------------------------------------------------------------------------------
    run_len.java	M†ˆ³kiƒ‰ƒ“ƒŒƒ“ƒOƒX–@j				ver. 1.11 (JDK 1.02)  2004.10.12
    														ueyama@infonet.co.jp  1998.12.05
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;
import java.util.*;


public class run_len extends Applet implements Runnable
{
	int			Tn=0;										// ”ñˆ³k ‘—Mƒrƒbƒg”
	int			Cy=0;										// ˆ³kƒf[ƒ^‘—Ms”
	int			Cx=0;										// ˆ³kƒf[ƒ^‘—M•\¦XÀ•W’l
	int			Ch=0;										// MH •„†‘—MŒ…”
	int			Cm=0;										// MH •„†‘—M”
	int			Cn=0;										// ”’E••Ï‰»‰ñ”^s
	int			Chx[] = new int[16];						// ”’E••Ï‰»ˆÊ’u
	int			Chc[] = new int[16];						// ”’ or •
	int			Chl[] = new int[16];						// LEN
	String		Chs[] = new String[16];						// MH •„†
	int			Bc;											// ”wŒiF
	int			Wait=256;									// ‘Ò‚¿ŠÔ (msec)
	long		Fl=0x8000000000000000L;						// ÅãˆÊƒrƒbƒg‚Ì‚İ‚ª "1" ‚Ì 64Œ…‚Qi”
	int			X0=400, Y0=8;
	Image		Gif;
	boolean		Run=false, Wf=false;
	Thread		th=null;
	Graphics	gr;

	// -------- •¶š "Š¿" ƒhƒbƒgƒtƒHƒ“ƒgƒf[ƒ^ ----------
	long Kan[]={0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
				0x0000000700380000L,0x01c00007f83fc000L,0x00f80007f03f8000L,0x007c0007e03f0080L,
				0x007e0007e03f01c0L,0x003f0007e03f03e0L,0x003f0007e03f07f8L,0x001f9ffffffffffcL,
				0x001f0ffffffffffcL,0x000f0007e03f0000L,0x000e0007e03f0000L,0x00000007e03f0000L,
				0x00001007e03f0000L,0x00001007e03f0000L,0x0000320700381c00L,0x1c00238000001e00L,
				0x0f8063f000003f00L,0x07c063ffffffffc0L,0x07e0e3ffffffffc0L,0x03f0c3f00f803f00L,
				0x03f1c3f00f803f00L,0x01f9c3f00f803f00L,0x01f183f00f803f00L,0x00f383f00f803f00L,
				0x000383f00f803f00L,0x000703f00f803f00L,0x000703ffffffff00L,0x000f03ffffffff00L,
				0x000e03f00f803f00L,0x001e03800f803000L,0x001e00000f800600L,0x001e00000f800f00L,
				0x003c00000f801f80L,0x003c1fffffffffc0L,0x007c0fffffffffc0L,0x007800000f800000L,
				0x00f800000f800000L,0x00f800000f800180L,0x1ff000000f8003c0L,0x1ff000001f8007f0L,
				0x07f1fffffffffff8L,0x03f0fffffffffff8L,0x01f000003fc00000L,0x01e000003fe00000L,
				0x01f000007e700000L,0x01f000007e380000L,0x01f00000fc3c0000L,0x01f00001f81f0000L,
				0x01f00003f80fc000L,0x01f80007f007f000L,0x01f8000fc007fc00L,0x01f8001f8003ff80L,
				0x03f8003f0000fff8L,0x03f800fc00007ffcL,0x03f803f000003ff0L,0x01f81fc000000fc0L,
				0x01f0fe00000003c0L,0x00e1e00000000080L,0x0L,0x0L,0x0L,0x0L};
	
	// -------- MH •„†ƒf[ƒ^ ------------
	String MH[][]={{"00110101","0000110111"},{"000111","010"},{"0111","11"},{"1000","10"},
			   {"1011","011"},{"1100","0011"},{"1110","0010"},{"1111","00011"},{"10011","000101"},
			   {"10100","000100"},{"00111","0000100"},{"01000","0000101"},{"001000","0000111"},
			   {"000011","00000100"},{"110100","00000111"},{"110101","000011000"},
			   {"101010","0000010111"},{"101011","0000011000"},{"0100111","0000001000"},
			   {"0001100","00001100111"},{"0001000","00001101000"},{"0010111","00001101100"},
			   {"0000011","00000110111"},{"0000100","00000101000"},{"0101000","00000010111"},
			   {"0101011","00000011000"},{"0010011","000011001010"},{"0100100","000011001011"},
			   {"0011000","000011001100"},{"00000010","000011001101"},{"00000011","000001101000"},
			   {"00011010","000001101001"},{"00011011","000001101010"},{"00010010","000001101011"},
			   {"00010011","000011010010"},{"00010100","000011010011"},{"00010101","000011010100"},
			   {"00010110","000011010101"},{"00010111","000011010110"},{"00101000","000011010111"},
			   {"00101001","000001101100"},{"00101010","000001101101"},{"00101011","000011011010"},
			   {"00101100","000011011011"},{"00101101","000001010100"},{"00000100","000001010101"},
			   {"00000101","000001010110"},{"00001010","000001010111"},{"00001011","000001100100"},
			   {"01010010","000001100101"},{"01010011","000001010010"},{"01010100","000001010011"},
			   {"01010101","000000100100"},{"00100100","000000110111"},{"00100101","000000111000"},
			   {"01011000","000000100111"},{"01011001","000000101000"},{"01011010","000001011000"},
			   {"01011011","000001011001"},{"01001010","000000101011"},{"01001011","000000101100"},
			   {"00110010","000001011010"},{"00110011","000001100110"},{"00110100","000001100111"},
			   {"11011","0000001111"}};
	
	public void init()
	{
		String	bg=getParameter("BgColor");
				Bc=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(Bc));
		
		MediaTracker mt=new MediaTracker(this);
		Gif=getImage(getCodeBase(),"run_len.gif");
		mt.addImage(Gif, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	public boolean inside(int x, int a, int b)
	{
		return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_b(int x, int y, int l, int n, int bg)			// ‚Qi”E”’l‚Ì•\¦
	{
		for(int i=0; i=0) dsp_g(x+i*7-1, y-1, bg, 7);
			dsp_g(x+i*7, y, Integer.parseInt(MH[l][n].substring(i,i+1)), n);
		}
	}
	
	public void dsp_n(int x, int y, int n, int c, boolean bg)		// 10i”E”’l‚Ì•\¦
	{
		if(n>9)
		{
			if(bg) dsp_g(x-1, y-1, c, 7);
			dsp_g(x, y, n/10, 1);
		}
		if(bg) dsp_g(x+7-1, y-1, c, 7);
		dsp_g(x+7, y, n%10, 1);
	}
	
	public void dsp_g(int x, int y, int n, int c)					// ‰æ‘œ (run_len.gif) ‚Ì•\¦
	{
		Graphics	gx=gr.create();
		int			w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w= 6; h= 9; ox=  0; oy= 0;	break;			// ”’”š
			case	 1:	w= 6; h= 9; ox= 60; oy= 0;	break;			// •”š
			case	 2:	w=34; h=11; ox=120; oy= 0;	break;			// "”’•„†"
			case	 3:	w=35; h=11; ox=154; oy= 0;	break;			// "••„†"
			case	 4:	w=17; h=11; ox=189; oy= 0;	break;			// "LEN"
			case	 5:	w=50; h=11; ox=206; oy= 0;	break;			// "©”ñˆ³k"
			case	 6:	w=37; h=11; ox=256; oy= 0;	break;			// "©ˆ³k"
			case	 7:	w= 9; h=11; ox=293; oy= 0;	break;			// ”wŒiF
			case	 8:	w= 5; h= 5; ox=320; oy= 0;	break;			// ƒtƒHƒ“ƒg—pƒhƒbƒg
			case	 9:	w=26; h=23; ox=  0; oy=11;	break;			// "á"
			case	10:	w=26; h=23; ox= 78; oy=11;	break;			// "â"
			case	11:	w=26; h=23; ox=156; oy=11;	break;			// "ƒŒ"
			case	12:	w=26; h=23; ox=234; oy=11;	break;			// "a"
			case	13:	w=26; h=23; ox=286; oy=11;	break;			// "|>"
		}
		gx.clipRect(x,y,w,h);
		gx.drawImage(Gif,x-(ox+n*w),y-oy,this);
		gx.dispose();
	}

	public void dsp_d(int x, int y, int l)							// •¶šƒf[ƒ^‚Ps•\¦
	{
		int		c,i;
		long	f=0x8000000000000000L;
		for(i=0;i<64;i++)
		{
			c=((f&Kan[l])==0)?0:1;
			dsp_g(x+i*6, y, c, 8);
			f>>>=1;
		}
	}
	
	public void dsp_c()												// ˆ³kƒf[ƒ^‚ğ•\¦
	{
		int		b,c,i,j,k,len, cl=0, x=6, y=406+Y0;
		long	f=0x8000000000000000L;

		Cn=0;
		for(i=0;i<16;i++) {Chx[i]=0; Chc[i]=0; Chl[i]=0; Chs[i]="";}
		c=((f&Kan[Cy])==0)?0:1;
		for(i=0,k=0,len=0; i<64; i++)
		{
			b=((f&Kan[Cy])==0)?0:1;
			if(c==b) len++;											// len: ”’‚Ü‚½‚Í•‚̃Œƒ“ƒOƒX
			else
			{
				Chs[k]=MH[len][c];									// MH •„†
				Chc[k]=c; Chl[k]=len;
				c=(c==0)?1:0;
				len=1;
				Chx[k+1]=i; k++;
				Cn++;
			}
			f>>>=1;
		}
		Chs[k]=MH[len][c];
		Chl[k]=len;
		Cn++;
		for(i=0; i<=Cn; i++)
		{
			for(j=0; j0)													// ˆ³kE”ñˆ³kƒf[ƒ^‚Ps•\¦
		{
			dsp_d(6, 394+Y0, Tn/64);
			dsp_c();
		}
		dsp_g(X0, 392+Y0, 0, 5);									// "©ˆ³k", "©”ñˆ³k" •\¦
		dsp_g(X0, 404+Y0, 0, 6);
		dsp_g(X0,     Y0, 0, 4);									// "LEN"
		dsp_g(X0+182, Y0, 0, 4);
		dsp_g(X0+21,     Y0, 0, 2);									// "”’•„†"
		dsp_g(X0+182+21, Y0, 0, 2);
		dsp_g(X0+84,     Y0, 0, 3);									// "••„†"
		dsp_g(X0+182+84, Y0, 0, 3);
		for(y=0;y<33;y++)											// MH •„†•\‚Ì•\¦
		{
			if(y<32)
			{
				dsp_n(X0, y*11+Y0+15, y, 1, false);
				dsp_b(X0+21, y*11+Y0+15, y, 0, -1);
				dsp_b(X0+84, y*11+Y0+15, y, 1, -1);
			}
			dsp_n(X0+182, y*11+Y0+15, y+32, 1, false);
			dsp_b(X0+182+21, y*11+Y0+15, y+32, 0, -1);
			dsp_b(X0+182+84, y*11+Y0+15, y+32, 1, -1);
		}
		dsp_g(520, 400, 0, 11);										// "ƒŒ"
		dsp_g(570, 400, 0,  9);										// "á"
		dsp_g(600, 400, (Wait<=32)? 2:0, 10);						// "â"
		dsp_g(650, 400, 0, (Run)?12:13);							// "a" or "|>"
	}
	
	public void run()
	{
		int		c=0,l=0,ce=0,cd=0,le=0,ne=0,re=0,dx=0,dy=0;
		
		while(true)
		{
			if(Run)
			{
				if(Tn%64==0)
				{
					dsp_d(6, 394+Y0, Tn/64);							// ”ñˆ³kƒf[ƒ^‚Ps•\¦
					Fl=0x8000000000000000L;
				}
				if(Cy==0) dsp_c();										// ˆ³kƒf[ƒ^‚Ps•\¦
				if(Ch==0)												// MH •„†‚Ì•\¦ ‘¼
				{
					c=Chc[Cm]; l=Chl[Cm]; ne=Chx[Cm];
					dsp_g(ne*6+6, Cy*6+Y0, c+4, 8);						// ˆ³k“]‘—ƒf[ƒ^Œ³ˆÊ’u•\¦
					dx=(l<32)? 0:182; dy=(l<64)? l%32*11:32*11;
					dsp_n(dx+X0, dy+Y0+15, l, 1, true);					// 10i”‚Ì•\¦
					dsp_b(((c==0)?21:84)+dx+X0, dy+Y0+15, l, c, c);		// MH•„†‚Ì•\¦
					ce=c; le=l; re=Cy;
				}
				c=((Fl&Kan[Tn/64])==0)? 0:1;
				cd=Integer.parseInt(Chs[Cm].substring(Ch, Ch+1));
				dsp_g(Tn%64*6+6, Tn/64*6+Y0, c+2, 8);					// ƒf[ƒ^‘—MÀsˆÊ’u‚Ì•\¦
				dsp_g(Tn%64*6+6, 394+Y0, c+2, 8);
				dsp_g(Cx*6+6, 406+Y0, cd+4, 8);
				Wf=true;
			}
			
			try
			{
				th.sleep((Run)? Wait:256);
			}
			catch (InterruptedException e){}
			
			if(Run && Wf)
			{
				dsp_g(Tn%64*6+6, Tn/64*6+Y0, c, 8);
				dsp_g(Tn%64*6+6, 394+Y0, c, 8);
				dsp_g(Cx*6+6, 406+Y0, cd, 8);
				
				Tn++;
				Fl>>>=1;
				Ch++; Cx++;
				if(Ch==Chs[Cm].length())								// MH •„†‚Ì‘—MI—¹
				{
					dsp_g(ne*6+6, re*6+Y0, Chc[Cm], 8);					// ˆ³k“]‘—ƒf[ƒ^Œ³ˆÊ’u
					dx=(le<32)? 0:182; dy=(le<64)? le%32*11:32*11;
					dsp_n(dx+X0, dy+Y0+15, le, 2, true);				// 10i”
					dsp_b(((ce==0)? 21:84)+dx+X0, dy+Y0+15, le, ce, 2);	// MH•„†
					Ch=0;
					Cm++;
					if(Cm==Cn)											// ˆ³kƒf[ƒ^‚Ps‘—MI—¹
					{
						Cm=0; Cx=0;
						Cy++;
						dsp_c();
						if(Cy==64)
						{
							Run=false;
							dsp_g(Tn%64*6+6, Tn/64*6+Y0, c+2, 8);
							dsp_g(Tn%64*6+6, 394+Y0, c+2, 8);
							Fl=0x8000000000000000L;
						}
					}
				}
			}
		}
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		if(x>520 && y>400)											// ƒ{ƒ^ƒ“‚ğƒNƒŠƒbƒN
		{
			if(inside(x, 520, 546))									// "ƒŒ"
			{
				Tn=0; Cy=0; Ch=0; Cm=0; Wf=false; Run=false;
				repaint();
			}
			if(inside(x, 570, 596))									// "á"
			{
				dsp_g(570, 400, 1,  9);
				Wait*=2;
			}
			if(inside(x, 600, 626) && Wait>16)						// "â"
			{
				dsp_g(600, 400, 1, 10);
				Wait/=2;
			}
			if(inside(x, 650, 676))									// "a" or "|>"
			{
				dsp_g(650, 400, 1, (Run)?12:13);
				Run=!Run;
			}
		}
		return true;
	}

	public boolean mouseUp(Event e, int x, int y)
	{
		if(x>520 && y>400)
		{
			if(inside(x, 520, 546))
			{
				dsp_g(520, 400, 0, 11);										// "ƒŒ"
				dsp_g(650, 400, 0, 13);
			}
			if(inside(x, 570, 596))											// "á"
			{
				dsp_g(570, 400, 0,  9);
				dsp_g(600, 400, 0, 10);
			}
			if(inside(x, 600, 626)) dsp_g(600, 400, (Wait<=16)?2:0, 10);	// "â"
			if(inside(x, 650, 676)) dsp_g(650, 400, 0, (Run)?12:13);		// "a" or "|>"
		}
		return true;
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
}
//
–ß‚é