#include <bits/stdc++.h>
using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for(int i=0;i<(n);++i)
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define RREP(i, n) for(int i=(int)(n)-1;i>=0;--i)
#define RFOR(i, a, b) for(int i=(int)(b)-1;i>=(a);--i)
#define ALL(a) a.begin(),a.end()
#define DUMP(x) cerr<<#x<<" = "<<(x)<<endl
#define DEBUG(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template <typename T1, typename T2>
bool chmax(T1 &a, const T2 &b) {
    if (a < b) { a = b; return true; }
    return false;
}
template <typename T1, typename T2>
bool chmin(T1 &a, const T2 &b) {
    if (a > b) { a = b; return true; }
    return false;
}
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << "[";
    REP(i, SZ(v)) {
        if (i) os << ", ";
        os << v[i];
    }
    return os << "]";
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
    os << "{";
    int a = 0;
    for (auto &tp : mp) {
        if (a) os << ", "; a = 1;
        os << tp;
    }
    return os << "}";
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
    os << p.first << ":" << p.second;
    return os;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    vector<string> s(8);
    REP(i, 8) cin >> s[i];

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

    int pass = 0;
    for (int t = 0;; ++t) {
        if (pass == 2) break;
        char myStone = t & 1 ? 'x' : 'o';
        char opStone = t & 1 ? 'o' : 'x';

        int ma = 0;
        int pi = -1, pj = -1;
        REP(i, 8) {
            REP(j, 8) {
                if (s[i][j] != '.') continue;
                int cnt = 0;
                REP(k, 8) {
                    int y = i + dy[k], x = j + dx[k];
                    if (y < 0 or x < 0 or 8 <= y or 8 <= x or s[y][x] != opStone) continue;
                    int tmp = 0;
                    while (0 <= y and 0 <= x and y < 8 and x < 8 and s[y][x] == opStone) {
                        ++tmp;
                        y += dy[k], x += dx[k];
                    }
                    if (0 <= y and 0 <= x and y < 8 and x < 8 and s[y][x] == myStone) cnt += tmp;
                }
                if (chmax(ma, cnt)) {
                    pi = i, pj = j;
                } else if (ma == cnt) {
                    if (t & 1) {
                        if (i > pi or i == pi and j > pj) {
                            pi = i, pj = j;
                        }
                    } else {
                        if (i < pi or i == pi and j < pj) {
                            pi = i, pj = j;
                        }
                    }
                }
            }
        }

        if (ma == 0) {
            ++pass; continue;
        } else {
            pass = 0;
        }

        s[pi][pj] = myStone;
        REP(k, 8) {
            int y = pi + dy[k], x = pj + dx[k];
            if (y < 0 or x < 0 or 8 <= y or 8 <= x or s[y][x] != opStone) continue;
            while (0 <= y and 0 <= x and y < 8 and x < 8 and s[y][x] == opStone) {
                y += dy[k], x += dx[k];
            }
            if (y < 0 or x < 0 or 8 <= y or 8 <= x or s[y][x] != myStone) continue;

            y = pi + dy[k], x = pj + dx[k];
            while (0 <= y and 0 <= x and y < 8 and x < 8 and s[y][x] == opStone) {
                s[y][x] = myStone;
                y += dy[k], x += dx[k];
            }
        }
    }

    REP(i, 8) cout << s[i] << endl;

    return 0;

}


Measured memory_bytes: 3240