#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<climits>
#include<set>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
using namespace std;
typedef pair<int, int> pii;
typedef long long int ll;
typedef pair<ll, ll> pll;
//int dx[4] = { 1,0,0,-1 };
//int dy[4] = { 0,1,-1,0 };
#define MOD 1000000007
#define ARRAY_MAX 100005

const int INF = 1e9 + 7;


int dx[8] = { 0,1,1,1,0,-1,-1,-1 };
int dy[8] = { 1,1,0,-1,-1,-1,0,1 };


char mp[10][10];

int dfs(int x, int y, char c, int flag) {

	//現在のクッキーの配置状況の時に
	//マス(x,y)にクッキーcを置いた時に得られるクッキーの数
	//flagが1の場合は実際に置く
	//flagが0の場合はクッキーを置けるかどうかの探索に相当し、クッキーは置かない

	int cnt = 0;
	char cokkie;//相手のクッキー
	if (c == 'o')
	{
		cokkie = 'x';
	}
	else
	{
		cokkie = 'o';
	}
	if (mp[x][y] == '.')
	{
		//まだ置いていないマスがあった場合は置けるか調べる
		for (int i = 0; i < 8; i++)
		{
			int r = 1;//現在いるマスからdx[i],dy[i]方向にrマス分先に進む
			//周辺を調べる
			int nx = x + r * dx[i];
			int ny = y + r * dy[i];
			while (0 <= nx && nx < 8 && 0 <= ny && ny < 8)
			{

				char focus = mp[nx][ny];

				if (focus == c)
				{
					//自分のクッキーが見つかった場合はその間が自分のクッキーに変わる

					if (flag == 1)
					{
						//置くのが確定しているため、置いていく
						mp[x][y] = c;
						for (int tm = 1; tm < r; tm++)
						{
							mp[x + tm * dx[i]][y + tm * dy[i]] = c;
						}
					}
					else
					{
						//置ける候補になるかの確認なので置かない
					}
					cnt += r - 1;//間が自分のクッキーに変わる
					break;//自分のクッキーを見つけたのでその先は見なくて良い（見てもその先はこの操作でひっくり返らないので）

				}
				else if (focus == cokkie)
				{
					//相手のクッキーだった場合はさらにその先を調べる
					r++;
					nx += dx[i];
					ny += dy[i];
				}
				else
				{
					//それ以外のもの(ないはずだけど)
					break;
				}
			}
		}
	}

	//どこにも置けない場合（パスに相当）は0が返る
	//それ以外は0より大きい整数が返る
	return cnt;
}




bool charlotte() {

	int cnt = 0;//反転させてもらえるクッキーの数
	int x = -1, y = -1;
	char c = 'x';//CHARLOTTEのクッキーはxに相当


	//問題よりCHARLOTTEは最大化できるマスが複数ある場合は右下に近いほうが最適なので右下から調べる
	for (int i = 7; i >= 0; i--)
	{
		for (int j = 7; j >= 0; j--)
		{
			int tmp = dfs(i, j, c, 0);
			if (cnt < tmp)
			{
				cnt = tmp;
				x = i;
				y = j;
			}
		}
	}


	if (x >= 0)
	{
		//置ける場所があったので実際にお置いていく（この時x,yは置き換えられる最大のクッキーが最大化されるようになっている）
		dfs(x, y, c, 1);
	}

	if (cnt > 0)
	{
		//置ける場所があった（次の手番に移るのに相当）
		return true;
	}
	else {
		//置けなかった（パスに相当）
		return false;
	}
}



bool tomoe() {

	int cnt = 0;
	int x = -1, y = -1;
	char c = 'o';//巴マミのクッキーはoに相当

	//問題より巴マミは最大化できるマスが複数ある場合は左上に近いほうが最適なので右下から調べる
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			int tmp = dfs(i, j, c, 0);
			//cout << i << " " << j << " tmp=" << tmp << endl;
			if (cnt < tmp)
			{
				cnt = tmp;
				x = i;
				y = j;
			}
		}
	}
	if (x >= 0)
	{
		//置ける場所があったので実際にお置いていく（この時x,yは置き換えられる最大のクッキーが最大化されるようになっている）
		dfs(x, y, c, 1);
	}

	if (cnt > 0)
	{
		//置ける場所があった（次の手番に移るのに相当）
		return true;
	}
	else {
		//置けなかった（パスに相当）
		return false;
	}
}



int main() {


	ios::sync_with_stdio(false);
	cin.tie(0);

	//char mp[10][10];

	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			cin >> mp[i][j];
		}
	}

	bool T = true;
	bool C = true;

	while (T || C) {
		//何も置けなくなるまでシミュレーション

		T = tomoe();
		C = charlotte();
	}

	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			cout << mp[i][j];
		}
		cout << endl;
	}


	return 0;
}



Measured memory_bytes: 3240