Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

blockquote {
font-family: Menlo, Monaco, "Courier New", monospace;
color: #333333;
display: block;
padding: 8.5px;
margin: 0 0 9px;
font-size: 12px;
line-height: 18px;
background-color: #f5f5f5;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.15);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
white-space: pre;
white-space: pre-wrap;
word-break: break-all;
word-wrap: break-word;
}

Problem Statement

Let's consider operations on monochrome images that consist of hexagonal pixels, each of which is colored in either black or white. Because of the shape of pixels, each of them has exactly six neighbors (e.g. pixels that share an edge with it.)

"Filtering" is an operation to determine the color of a pixel from the colors of itself and its six neighbors. Examples of filterings are shown below.

Example 1: Color a pixel in white when all of its neighboring pixels are white. Otherwise the color will not change.

Performing this operation on all the pixels simultaneously results in "noise canceling," which removes isolated black pixels.

Example 2: Color a pixel in white when its all neighboring pixels are black. Otherwise the color will not change.

Performing this operation on all the pixels simultaneously results in "edge detection," which leaves only the edges of filled areas.

Example 3: Color a pixel with the color of the pixel just below it, ignoring any other neighbors.

Performing this operation on all the pixels simultaneously results in "shifting up" the whole image by one pixel.

Applying some filter, such as "noise canceling" and "edge detection," twice to any image yields the exactly same result as if they were applied only once.
We call such filters idempotent. The "shifting up" filter is not idempotent since every repeated application shifts the image up by one pixel.

Your task is to determine whether the given filter is idempotent or not.

Input

The input consists of multiple datasets. The number of dataset is less than $100$.
Each dataset is a string representing a filter and has the following format (without spaces between digits).

$c_0c_1\cdots{}c_{127}$

$c_i$ is either '0' (represents black) or '1' (represents white), which indicates the output of the filter for a pixel when the binary representation of the pixel and its neighboring six pixels is $i$.
The mapping from the pixels to the bits is as following:

and the binary representation $i$ is defined as $i = \sum_{j=0}^6{\mathit{bit}_j \times 2^j}$,
where $\mathit{bit}_j$ is $0$ or $1$ if the corresponding pixel is in black or white, respectively.
Note that the filter is applied on the center pixel, denoted as bit 3.

The input ends with a line that contains only a single "#".

Output

For each dataset, print "yes" in a line if the given filter is idempotent, or "no" otherwise (quotes are for clarity).

Sample Input

00000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000111111111
10000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111
01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
#

Output for the Sample Input

yes
yes
no

Solution in C (judge verdict: Accepted)

#include <stdio.h>

const char* map[]={
	"       ",
	"       ",
	"   7   ",
	"  8 I  ",
	" 9 6 H ",
	"  1 5  ",
	" A 0 G ",
	"  2 4  ",
	" B 3 F ",
	"  C E  ",
	"   D   ",
	"       ",
	"       ",
	NULL
};
const int map_d[7][2]={
	{ 2, 0},
	{ 1, 1},
	{ 1,-1},
	{ 0, 0},
	{-1, 1},
	{-1,-1},
	{-2, 0}
};

int get_func(const char *func,const int id[],int input) {
	int idx=0;
	int i;
	for(i=0;i<7;i++) {
		if((input>>id[i])&1)idx|=1<<i;
	}
	return func[idx]-'0';
}

int main(void) {
	char input[256];
	int taiou[100][7];
	const char* map_chars="0123456789ABCDEFGHI";
	int map_num;
	int i,j,k;
	int search_max;
	for(map_num=0;map_chars[map_num]!='\0';map_num++) {
		for(i=0;map[i]!=NULL;i++) {
			for(j=0;map[i][j]!='\0';j++) {
				if(map[i][j]==map_chars[map_num]) {
					for(k=0;k<7;k++) {
						char m=map[i+map_d[k][0]][j+map_d[k][1]];
						if(m<='9') {
							taiou[map_num][k]=m-'0';
						} else {
							taiou[map_num][k]=m-'A'+10;
						}
					}
				}
			}
		}
	}
	search_max=1<<map_num;
	while(scanf("%s",input)==1 && input[0]!='#') {
		int ok=1;
		int search;
		for(search=0;search<search_max;search++) {
			int new_input=0;
			for(i=0;i<7;i++) {
				new_input|=get_func(input,taiou[i],search)<<i;
			}
			if(get_func(input,taiou[0],new_input)!=(new_input&1)) {
				ok=0;
				break;
			}
		}
		puts(ok?"yes":"no");
	}
	return 0;
}