# AES encoder 
# Author : Byambadalai Sumiya
# Date   : 03-12-2019

Sbox = (
            0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
            0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
            0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
            0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
            0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
            0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
            0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
            0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
            0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
            0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
            0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
            0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
            0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
            0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
            0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
            0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
            )
            
def xorFourBytes (a, b, c, d):
  ans = ''
  a, b, c, d = str(a), str(b), str(c), str(d)
  for i in range (8):
    if a[i] != b[i]:
      ans += '1'
    else:
      ans += '0'
  second = ''
  for i in range (8):
    if ans[i] != c[i]:
      second += '1'
    else:
      second += '0'
  third = ''
  for i in range (8):
    if second[i] != d[i]:
      third += '1'
    else:
      third += '0'
  return third

def twoByte (a, c):
  print(a, c)
  try:
    a, b = a[0], a[1]
    # a = bin(int(a[0], 16))[2:] + bin(int(a[1], 16))[2:]
    a = bin(int(a, 16))[2:]
    a = '0' * (4 - len(a)) + a
    b = bin(int(b, 16))[2:]
    b = '0' * (4 - len(b)) + b
    a = a + b
  except:
    print('16 тооллын системрүү хөрвүүлэхэд алдаа гарлаа')
  b = c
  # print(a, b)
  # input()
  if b != '02' and b != '01' and b != '03':
    print('Шилжүүлэх утга алдаатай байна')

  defaultXor = '00011011'
  if b == '02':
    if a[0] == '1':
      a = a[1:] + '0'
      a = bin(int(defaultXor, 2) ^ int(a, 2))[2:]
    else:
      a = a[1:] + '0'
    if len(a) < 8:
      a = '0' * (8 - len(a)) + a

  elif b == '03':
    # Өөр алгоритмаар бодсон болно.
    otherXor = a
    if a[0] == '1':
      a = a[1:] + '0'
      a = bin(int(defaultXor, 2) ^ int(a, 2))[2:]
    else:
      a = a[1:] + '0'
    a = bin(int(otherXor, 2) ^ int(a, 2))[2:]
    if len(a) < 8:
      a = '0' * (8 - len(a)) + a
  print('буцааж байна ', a)
  return a
def sanitize (value):
  return hex(int(value, 2))[2:]

if __name__ == '__main__':
  print('Хүснэгтээ оруулна уу ')
  """
  63 EB 9F A0 -> https://kavaliro.com/wp-content/uploads/2014/03/AES.pdf
  2F 93 92 C0                        
  AF C7 AB 30
  A2 20 CB 2B

  87 F2 4D 97 -> дотоод номноос 163 хуудас
  6E 4C 90 EC
  46 E7 4A C3
  A6 8C D8 95

  
  Лабораторийн даалгавар 
  6A 59 CB BD
  4E 48 12 A0
  98 9E 30 9C
  8B 3D F4 98

  15 C9 7F 9E 
  CE 4D 4B C1 
  89 71 BE 8D 
  65 47 97 CB 
  """
  table = []
  ans = [[], [], [], []]
  for i in range (4):
    table.append([str(j) for j in input().split()])
  s_box = [['02', '03', '01', '01'], ['01', '02', '03', '01'], ['01', '01', '02', '03'], ['03', '01', '01', '02']]
  print(s_box)
  
  for i in range (4):
    a, b, c, d = table[0][i], table[1][i], table[2][i], table[3][i]
    ans_a = ''
    for j in range (4):
      s_box_a, s_box_b, s_box_c, s_box_d = s_box[j][0], s_box[j][1], s_box[j][2], s_box[j][3]
      ans_a = xorFourBytes(twoByte(a, s_box_a), twoByte(b, s_box_b), twoByte(c, s_box_c), twoByte(d, s_box_d))
      print(ans_a)
      input()
      ans[i].append(sanitize(ans_a))
  print('Хариу')
  for i in range (4):
    for j in range (4):
      if (len(ans[i][j]) == 1):
        ans[i][j] = '0' + ans[i][j]
      print(ans[j][i].upper(), end=' ')
    print()
  
  

  # print(xorFourBytes('11000110', '01110001', '10101111', '10100010'))
