#include <bits/stdc++.h>
using namespace std;
long long mod_v(long long num) {
  if (num >= 0)
    return (num % 1000000007);
  else
    return (num % 1000000007 + 1000000007) % 1000000007;
}
long long bigmod(long long b, long long p, long long m) {
  long long res = 1 % m, x = b % m;
  while (p) {
    if (p & 1) res = (res * x) % m;
    x = (x * x) % m;
    p >>= 1;
  }
  return res;
}
class node {
 public:
  string str;
  int a, b;
  node() {}
  node(string str, int a, int b) {
    this->str = str;
    this->a = a;
    this->b = b;
  }
};
vector<node> v;
map<string, bool> mark;
int main() {
  int n, K, temp;
  scanf("%d", &K);
  n = 1 << K;
  if (n == 1) {
    printf("+\n");
    return 0;
  }
  string str = "";
  for (int i = 1; i <= n / 2; i++) str += '+';
  for (int i = 1; i <= n / 2; i++) str += '*';
  v.push_back(node(str, -1, -1));
  mark[str] = 1;
  int x = n / 4;
  for (int i = 1; i <= x; i = i * 2) {
    str = "";
    temp = 1;
    for (int j = 1; j <= n; j += i) {
      temp = (temp + 1) % 2;
      for (int k = 0; k < i; k++) {
        if (temp == 0)
          str += '+';
        else
          str += '*';
      }
    }
    v.push_back(node(str, -1, -1));
    mark[str] = 1;
  }
  int ind = 0, len;
  while (v.size() < n) {
    bool flag = false;
    for (int i = 0; i < v.size() && i < n; i++) {
      if (v[ind].a == i || v[ind].b == i || ind == i) continue;
      str = "";
      int o = 0, e = 0;
      for (int j = 0; j < n; j++) {
        if (v[ind].str[j] == v[i].str[j]) {
          str += '+';
          o++;
        } else {
          str += '*';
          e++;
        }
      }
      if (mark[str] == 1 || o != e) continue;
      v.push_back(node(str, ind, i));
      mark[str] = 1;
      flag = true;
    }
    if (!flag) break;
    ind++;
  }
  if (v.size() < n) {
    str = "";
    for (int i = 0; i < n; i++) str += '+';
    v.push_back(node(str, -1, -1));
  }
  for (int i = 0; i < v.size(); i++) cout << v[i].str << "\n";
}
