Browse Source

Solve day 12

Taddeus Kroes 1 year ago
parent
commit
bd1d40d645
2 changed files with 194 additions and 0 deletions
  1. 54 0
      2024/12_fences.py
  2. 140 0
      2024/input/12

+ 54 - 0
2024/12_fences.py

@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+import sys
+from itertools import pairwise
+
+def neighbors(x, y):
+    return ((x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1))
+
+def regions(grid):
+    h = len(grid)
+    w = len(grid[0])
+    visited = set()
+
+    def bfs(x, y):
+        ty = grid[y][x]
+        visited.add((x, y))
+        work = [(x, y)]
+        while work:
+            x, y = work.pop()
+            yield x, y
+            for nb in neighbors(x, y):
+                nx, ny = nb
+                if 0 <= nx < w and 0 <= ny < h and \
+                        grid[ny][nx] == ty and nb not in visited:
+                    visited.add(nb)
+                    work.append(nb)
+
+    for y in range(h):
+        for x in range(w):
+            if (x, y) not in visited:
+                yield set(bfs(x, y))
+
+def fences(region):
+    for xy in region:
+        for nb in neighbors(*xy):
+            if nb not in region:
+                yield xy, nb
+
+def sides(region):
+    indexed = {}
+    for (x1, y1), (x2, y2) in fences(region):
+        if x1 == x2:
+            indexed.setdefault((True, y1, y2), []).append(x1)
+        else:
+            indexed.setdefault((False, x1, x2), []).append(y1)
+    return sum(1 + sum(b - a > 1 for a, b in pairwise(sorted(line)))
+               for line in indexed.values())
+
+def perimeter(region):
+    return sum(1 for _ in fences(region))
+
+grid = [line[:-1] for line in sys.stdin]
+reg = list(regions(grid))
+print(sum(len(r) * perimeter(r) for r in reg))
+print(sum(len(r) * sides(r) for r in reg))

+ 140 - 0
2024/input/12

@@ -0,0 +1,140 @@
+CCCCPPPPPPPPPPIIIIAAABBBBBBBBLLLLLLFFFFFFFFFFFFFFFFFSSSSSSSSSSSSSWOWWWWWWWZZZZZZZZZDDDDDDDDDIWIIIIIIIJJJJJJJJJJJJJJEEEEEEEKKKKCCCOOOOOOOOOOO
+CCCCCCCXPPPPPPIIIIAAABBBBBBBLLLLLLLLFFFFFFFFFFFFFFFFSSSSSSSSSSSSWWWWWWWWWWZZZZZZZZDDDDDDDDDDIIJIIIIIJJJJJJJJJJJJJJJEEEEEEEECCCCCCOOCCCOOOOOO
+CCCCCCPPPPPPPPPIIAAAAABBBBBLLLLLLLLLFFFGGGGFFFFFFFFFFFFLLSSSSWSWWWWWWWWWWWZZZZZZDDDDDDDDDDDDIIIIIIIIJJJJJJJJJJJWJEEEEEEEEEECCDCICCOCCCCCCCOO
+CCCCCCCPPPPPPPPUIAAAAAABBBBBBLLLLFLLFFFGYGGGFFFFFFFFFFFLLLBSWWWWWWWWWWWDDDZOZZZZDDDDDDDWDDDWQIIIIIIIJJJJJJJJJJWWJEEEEEEEEEKCCCCCCCCCCCCCCOOO
+CCCCCCCPPPPPPQUUAAAAAAAAAAAAAAALLFFFFFGGGGGGFFFFFFFFFFLLBBBWWWWWWWWWWWWDDDDOZZDDDDDDDWWWWWWWWIIIIIIIJJJJJJJJWJWWWWEEEEEEECCCCCCCCCCCCCCCCOOO
+CCCCCCCPPPPPUUUUWAAAAAAAAAAAFFFFFFFFFFFFFGGGGFFFFFFFFFFLBBBBBBWWWWWWWWWWDDDDZZZDDDDDWWWWWWWWWWWIIIIJJJJJJJJJWWWWWEEEEEEECCCCCCCCCCCCCNNNNOON
+CCCCCCCEPPPPPSUUAAAAAAAAAAAAAFFFFFFFFFFGGGGLGFLLFFFFLLLLBBBBBBWWWWWWWWWGDDDDDZDDDDDDWWWWWWWWWQQIIIQQJJJJJJJWWWWWEEEEEEEEECSCCCCCCCCCCNNNNONN
+CRCCCCEEPPUPPPUUUAAAAAAAAAAAAFFFUFFFGFGGGGGGGLLLFLFFLLLLBLBBBBBWWWWWWGGGDDDDDDDDDDDDDWWWWWWWWQQIIQQJJJJJJJJJJWWWEEEEEEEECCCCCCCCCCCCCCCNNONN
+CCCCCEEEEPUPUUUUAAAAAAAAAAAAAFUUUFFFGGGGGGGLLLLLLLFFLLLLLLBBBBBWWWWGGGGGGGGDDDDDDMDDDWWWWWWWWWWIQQQJJJJJJJJJJJWWWJEEEEEEECCCCCCCCCCCCCCNNNNN
+CCCCCEEUUUUUUUUUUAAAAAAAAAAFFFUUUUUFUGGGGGGLLLLLLLLLLLLLLBBBBBBBWWWGGGGGGGDDDDDDMMDWWWWWWWWWWWWQQMQQJJJJJJJJJJWJWJEEEEKEVCCCCCCCCCCCCNNNNNNN
+COOCCEEUUUUUCCUUUBBAAAAAAAAFFFUUUPUUUGGGGGGLLLLLLLLLLLLLLBBBBBBNWWGGGGGGDDDDDDDMMMMMWWWWWWWWWWWMMMQQQJJJJJJJJJJJJJEEKKKEECPCCCCNCCCNNNNNNNNN
+SGGEEEGGUUUCCCUUUBBAAAAAAAFFUUUUUUUUUUUUGGGGLLLLLLLLLLLLLLBBNNNNWWGGGGGDDDDDDDDMMMMMMWWWWWWWMMMMMMQQQQQJJJJJJJJJEEEEKKKNEPPPPPCNNCCNNNCNNNNN
+GGGGGEGGGUUCCCCCBBBBBABAAAUUUUUUUUUUUUUUMMGLLLLLLLLLLLLLLLLLNNNNNWNGGGGDDDDDDDMMMMMMMWWWWWWWMMMMMMMQQQQJJJVVVLJJJJJEKKKKPPPPPPPNNNCNNCCCCCNN
+GGGGGGGGGUCCCCKKBBBBBBBBBAUQQUUUUUUUUUUUULLLLLLLLLLLLLLLSLLLLNNNNNNNNGGDDDDDMMMMMMMMMWWMWWWWMMMMMMRRRQQJJJPVLLLJWJJKKKKKKPPPPPPNNNNNCCCCCCCC
+GGGGGGGGGUKKKKKKBBBBBBBBBBUUUUUUUUUUUUUUULLLLLLLLLSSSSSSSSLLNNNNNNNNNNNDDDDDDMMMMMMMMMMMMMWWWMMMMMRRRQQQJPPPPLWWWWWWPPKKKPPNNNNNNNNCCCCCCCCC
+GGGGGGGGKKKKKKKBBBBBBBBBBBUUUUUUUUUUUUUUULLLLLLLLLSSSSSSSSNNNNNNNNNNNNNNNDDMMMMMMMMMMMMMMMMMMMMMMHRRRQQQQPPPLLLWWWWWPPPPPPNNNNNNNNNNCCCCCCCC
+GGGGGGGGGKKGGKBBBBBBBBBBBBBBUUUUUUUUUUUUXXLLLLLLLSSSSSSSSNNNNNNNNNNNNNNNNDMMMMMMMMMMMMMMMMMMMMMMMMRRRPQQPPPPPLWWWWWWPPPPPPNNNNNNNNNNNSSCCCCC
+GGGGGGGGGGKGDDDDBBBBBBBBBBBBBUUUUUGUUUTUXXXXLLLSSSSSSSSSSSSNNNNNNMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMRRRPQQPPPPVWWWWWWWWPPPPPPNPPPNNNNNNSSCYYYC
+GGGGGGGGGGGGDDDADDBBBBBBBBBBBBUUUUGGUUTTXXXXLLXXSSSSSSSESNNNNNNNMMMMMMNNNNMMMMMMMMMMMMMMMMMMMMMMMMRRZPQPPPPPPPPPPWWWPPPPPPPPPPPNNVNNNSSSQQQC
+GGGGGGGGGGGDDDDDDDDBBBBBBBBBBBUUUGGGNTTTTXXXXLXXNJSSSSSSSNNNNNNMMMMMMKMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMPPPPPPPPPWWWWWWWPPPPPPPPPPNZZZZSSSSSQCC
+GGGGGGGGGGDDDDDDDDDDDDBBBBBBBBPUUGNNNTTXXXXXXNXNNNNNNSSNNNNNNNNMMMMMMKMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMPPPPPPPPPPWWWWWWWPPPPPPPPPPZZZZZZKKKKQQQ
+GGGGGGGGDGDDDDDDDDDDDBBBBBPPPPPUUGNNTTTTXXXXXNNNNNNNNNNNNNNNNNMMMMMMMMMMTNMMMMMMBGMGMMMMMMMMMMMMMMVMPPPPPPPPPPPWWWWWWPPPPPPPPZZZZZZZZKKRKQQQ
+LGGGGGGDDDDDDDDDDDPPDBBBBBPPPPPPNNNNNTTTXXXXXXXNNNDDNDNNNNNNNMMMMMMMMMMMTTMMMMMGGGGGGMMMMMSMSMMMMVVPPPPPPPPPPPPWWWWWWWPPPFPPZZZZZZZZKKKKKQQQ
+LLGGGGGGDDDDDDDDDDPPPBBBBBBPPPPPPNNNNWWTTXTTXXXXNNMDNDNNDDNNMMMMMMMMMWMWWTMMMMMMMGGGGMMMLSSSSMSMMMVPPPPPPPPPPPPPWWWWWWPPFFPPPZZZZZZZKKKKQQKV
+LLLLLGGGDDDDDDODDDPPPPPPBPPPPPPPNNNWWWWWTTTXXLXLDDDDDDDNLDDNNMMMMMMMMWWWWWMMMMMMMGGGGMMLLSSSSSSKKMVPPPPPPPPPPBBWWWWWFFFFFFPPZZZZZZFFFFFKKKKK
+LLLLLLLDDDPDDDDDPPPPPPPPPPPPEPEPPPPPWWWWOOOOOLLLLDDDDDDDDDDDDMMMMMMMMMMWWWMMMMMMGGGGGMMLLSSSSSSSSAZSPPPPPPPPPPWWWWWWWFFFFFFFZFFFZFFFFREEKQKQ
+LLLLLLLLDDPDDDDPPPPPPPPPPPPEEEEPPPPEWWWWWOOOOOLLLDDDDDDDDDDDDRMMMMMMMWWWWWWWWMWWGGGGGSSSSSSSSSSSAAZSPPPPPPPPPPPWBBWWWFFFFFFFFFFFFFFFRRRERQQQ
+LLLLLLLDDPPPDDPPPPPHPPKKKKPEEEEEPPPEWWWWOOXXXLLLLLDDDDDDDDDDDDDGMMMMMWWWWWWWWWWWGGGGGRSSSSSSSSSPSZZZPPPPPPPPPBBBBBBBFFFFFFFFFFFFFFFFFRRRRRRR
+LLLLLLLDDPFPPPPPPPPHPKKKKPPKEEEEEEEEWWWXXXXXXLLLHDDDDQQDZDDDDDDMMMMMWWWWWWWWWWWGGKGGRRRRSSSSSSSSSZZZZPPPPPPPBBBBBBBBBFFFFFFFFFFFFFFFFRRRRRRR
+LLLLLLLFPPFFFPFFPPPHHKKKKKKKEEEEEEUEWWWXXXXXWWHHHWDDQQDDDDDDDDDMMMMWWWWWWWWWWWWWWKGRRRRSSSSSSSSSSZZZZZZZPPPPBBBBBBBBBFFFFFFFFFFFFFBFRRRRRRRR
+LLLLLLLFPPPFFFFPPSSHHKKKKKKEEEEEEUUWWWWXXXXXWWWHHDDDQQQQDDDDDDMMMMMMWWWWWWWWWWWWKKRRRCSSSSSSSSSSSZZZZZZZPPPPPPBBBBUUUUUUFFFFFFFFFFBBRRRRRRRR
+LLLLLLLFFFFFFFPPSSSSHHHKKKKEEEEEEEEWWWWWWXXWWWHHHHQQQQQQDDDDDMMMMMMMHWWWWWWWWWWWKKRRRSSSSSSSSSSSZZZZZZZZZPLLLLBLBBUUUUUUBFFFFFLLFFBBRRRRRRRR
+LLLLLLFFFFFFFFPSSSSSSUUKUKKEEEEEEEEWWWWWWWWWWWWHHHHQQQQQQDDDDMMMMMMMHWWWWWWWWWWWKKKKSSSSSSSSSSSSZZZZZZZZZLLLLLLUUUUUUUUUFFFUFLLLFBBBRRRRRRRR
+LLLLLFFFFFFFFPPSSSSSSSUUUEEEEEEEOOOWWWWWWWWLWWWGGHHQQQQQQDDMMMMMMMMMMMWWWWWWWWWKKKKKSSSSSSSSSZZZZZZZZZZZZLLLLLLUUUUUUUUUUUUUUUUUUUUBRRRRRRRG
+LLNLFFFFFFFFFFFFSSSSSSSUUEEEEEEEOOOWWWWWWWWMMOMGGHHHQQQAAPMMMMMMMMMMWWWWWWWWWWWKKRKRRSVSSSSSZZZZZZZZZZZZZZZZLLLUUUUUUUUUUUUUUUUUUUUBRRRRRRRR
+NLNLFFFFFFFFFFFFSSSSSSSSSRERREEEOOWWWWWWMMMMMMMMMHHQQAAAAPPMMMMMMMMMJJWWWWWWWWKKKRRRRSSSSSZZZZZZZZZZZZZZZZZZLLLUUUUUUUUUUUUUUUUUUUUBRRRRRRRR
+NNNFFFFFFFFFFFFFFSSSSSSSSRRRREBOOOOWOWWWMWMWMMMMMZHAAAAAAMMMMMMMMMMMMJJWWWAWWVVKKRRLLLLSGLOOZFFZZZZZZZZZZQQZLLQUUUUUUUUUUUUUUUUUUUUBBRBBRREE
+NNNNFFFFFFFFFFFZFSSSSSSSSRRRRROOOOOOOWWWWWWWMMMMMZZAAAAAAFFMMMMMMMMMMWWWAAAWVVVVKRRRLLLLLLOOZFFZZZZZZZZZZQQQQQQUUUUUUUUUUUUUUUUUUUUBBBBBEEEE
+NNNNFFFFFFFFFFFSSSSSSSSSSSSRRROOOWOWWWWWWWWWMMMMMMMMMHAASFFMEETMMGMMMAAWAAAEVVVVLLLLLLLLLLLLFFFZZZZZZZZQQQQQQQQUUUUUUUHDDDUUUUUUUUUBBBBBBEEE
+FNFNFFFFFFFFFFFSSSSSSSSSSSSSRROOOWWWWWWWWWWYMMMMMMMSSSSSSFSEEEMMFFFNNAAAAAEEEEVVBLLLLLLLLLLRRFFFFFZZZZZZQQQQQQQUUUUUUUDDDDUUUUUUUUUQBBBBBEEE
+FFFFFFFFFFFFFFFFSSSSSSSSSSYSRRRROOWWWWWWWWYYYMMMMMKSSSSSSSSSEFFFFFFNFFAAAAEVEEEBBLBWBLLLLLLRRRRFFFFZZZZNQQQQQQQUUUUUUUJJDDUUUUUUUUUQQBBBBEEE
+FFFFFFFFFFFOSSSSSSSSSSSSSSSSRRRMMMMWMWWWWWWYYMMMSSSSSSSUUSSSEFFFFFFFFFFFAAEEEEEEBBBBBLLLLLLRRRIRRFFFFZZQQQQQQQQUUUUUUUJJDDUUUUUUUUUQQQQQEEEE
+FKFFFFFFFFFOOSOSSSSSSSSSSSSSRRMMMMMMMMWWTWYYYTYMPSSSSSSSSFFSEFFFFFFFFFFAAAEEEEEEEEEEELLLLRRRRRRRFFFFFQQQQQQQQQQQQQOOXJJXDDUUUUUUUUUQQQQEEEEE
+KKKFFFKFFFFOOOOSSSSHHGSSSSHIHHHMMMMMMMMTTTTTYYYSSSSSSSSSSSSSEXFIVFFFFFAAAEEEEEEEEEEEEEEEERRRRRRRRRRFFFQQQQQQQQQXQQXXXXXXVDPXQQQQQQQQQQQQEEEE
+KKKFKFKKFFFFOOOSSSSHHHSSHZHIIHHMMMMMMMMTTTTTYYYIISSSSSSSSSSSXXIIFFFLLLLLLEEEEEEEEEEEEEEEERRRRRRRRRVFFVQQQQQQQQQXXXXXXXXXXXXXYQQQQQQQQQQQEEEE
+KKKKKKKKLLLLOOOSSSSHHHHHHHHHHHHMMMMMTTTTTTTTYYYYIISSSSSSSSSSSXIIIIIILLLLLLEEEEEEEEEEEEEEERRRRRRRRRVFVVNQQQQQQXXXXXXXXRXXXXUNYQQQQQQQQQQQEEII
+KKKKKKKKLULLLLOOSSSHHHHHHHHPHHHMMMMMTTTTTTTTTYYYIISSSSSSSSSSSXXIIIVLLLLLLLUEEEEEEEEEEEEEERRRRRHHHVVFVVNNQQQQQXXXXXXXXXXXXXUNQQQQQQQQQQQQIIII
+KKKKKKKKLLLLZLOOOSSHHHHHHHHHHHHMMMMMTMTTTHTIIIYYISSSSSSSSSSMUUUBIUVLLLLVLLLEEEEEEEEEEEEEERRRRRRVVVVVVVNNQQQQQXXXXXXXXXXXXQNNNQQQQQQQQQIIIIII
+KKKKKKKWLLLLLOOOOSBHHHHHHHHHHMMMMMMMMMTTMHHHHIIIISGSSSSSSMMUUUUUUUUULLLLLPEEEEEEEEEEEEEERRRRRRRRVVVVVVVNNNQXXEXXXXXXXXXXXQNNNNQQQQQQQIIIIIII
+KKKKKKKLLLLLLLOOOHHHHHHHHHHHHHMMMMMMMMMMMHHHHHSSISSSSSSSSMMUUUUUVUUULLLLLLLEEEEEEEEEERRRRRRRRRRRVVVVVVVNNNNXXXXXXXXXXXXXXXNNNNNQTQQQIIIIIIII
+KBBBKKLLLLLLLLLLLHHHHHHHHHHHHHHMMMMMMMMMHHHHHHSSSSSSSSSSSUUUUUUUUUUUWLLLLLLEEEEEEEEEERRRRRRRGGGGVVVVVVVNNNXXXXXXXXXXXXXXNNNNNNNNTIIQIIIIIIII
+KBBBBKBQQLLLLLAAAHHHHHHHHHHHHMMMMMMMMMMMHHHHHHSSSSSSSSSYSYUUUUUUUUUUWWLLLLEEEEEEEEEEERRRRRRRGGGGVVVVVVVVVNXIXXXXXXXXXXXXXNNNNNNNNIIIIIIIIIII
+ZBBBBBBBLLLLLLLAAOHHHHHHHHHHHMQMMMMMMMMMHHHHHHSSSSSSSYYYYYUUUUUUUUUUWWLLLLECCEEEECRRRRRRPPRRRGGGGVVVVVVVQQQQXXXXXXXXXXXXNNNNNNNNIIIIIIIIIIII
+BBBBBBBBBLLALAAAAAHHHHHHHHHHHPMMMMMMMMMMRHHHHSSSSSSSSSYYYUUUUUUUUUUWWWLWLCCCCCCCCCCRRRRRRRGGRGGGGVVVVUQVQQQQXXNQXXXXXXXNNNNNNNNNNIIIIIIIIIIA
+BBBBBBBBBLLAAAAAAPPHHPHHPPPPPPPIMMMMMMMMMXHHHHSSSSSSSSSYUUUUUUUUUUUWWWWWTCCCCCCCCCCCRRRRRGGRRGGGGVGVVQQQQQQQXQQQQQXXXXXXNNNNNNNNIIIIIIIIIIIA
+BBBBBBBBBLLAAAAKAPRPPPHHPPPPPPPMMMMMMMMMXXSSSSSSSSSSSSEEBBUUUUUUUUUKWWWTTTCCCCCCCCCBBBBRRRGGGGGGGGGGGQQQQQQQQQQQQQQVVXTXNNNNNNNNIIIIIIIIIIII
+BBBBBBBBBAAAAAAAOPPPPPHPPPPPPPPPMMMMMMXXXXSSSSSSSSSSSSEEBBUUUUUUUUUWWWTTTTCCCCCCCCCBBBGGGGGGGGGGGGGRRRRQQQQQQQQGQQQGVXNNNNNNNNNNNIIIIIIIIIXI
+BBBBBBBBBAAAAAAAOOPPPPPPPPPPPPPPMMMMMMXXXXXSSSSSSSSSSSEKSBUUUUUUUUUHHTTTTTTCCCCCCCCBBBBGGGGGGGGGGRGRNNQQQQQQQGGGGGGGGGGNNUUUUUUUUUUJJIIIIIIR
+BBBBBBBBAAAAAAAAOOOPPPPPPPPPPPPPMMMMMXXXXXSSSSSSSSSSMSSSSUUUUWWUUUUWWDDTTTOTCCCCCCCBBBBGGGGGGGRRRRRRRNRQQQQQQQGGGGGXXGGNNUUUUUUUUUUJJIIIIRRR
+BBBBBBBEAAAAAAAOOOOORRRPPPPPPPPPPXXMXXXXXXXSSSSSSSSSSSQQQQQDWWWWWUUWWDDTTTTTCCCCCCCXBBBXGGGGRRRRRRRRRRRQQQQQQGGGGGGGGGGGNUUUUUUUUUUJJJJJJRRR
+BBBBBBBEPAAAAOOOOOORFRRRRRPPPPPPXXXXXXXXXXXSSSSXSSSSSSSQQQQDWWWWWWWWWTTTTTTTTCCCCCCXGXXXXXGRRRRRRRRRRRRQQQQQQGGGGGGGGGEENUUUUUUUUUUJJJJJJRRR
+BBBBBEEEEUUAAOOOOOORFRRRRRPPPPOOBXXXXXXXXXXXSSSXXXXXXQQQQQQQQWWWWWWWWTTTTTTTTCCCCCCXXXXXXXGRRRRRRRRWRRRQQQQQQGGGGGGGGGGNNUUUUUUUUUUJJJJJJRRR
+XBBBBEEEUUAAOOOOOORRRRRRRRREPZOOBXXXXXXXXXXXXXXXXXXXQQQQQQQQQQQWVVVWMMTTTTTTTCCCCCCXXXXXXXGRRRRRRRRRRQQQQQQQQGGGGUUUUUUUUUUUUUUUJJJJJJJJJRRX
+XXBEBEEEEEEEEOOORORRRRRRRRRRZZOOBBXDXXXXXXXXXXXXXXXXXCCQQQWWWWWWVVVVVVTTTTTTCCCCXXXXXXXXXXXRRRRRRRRRVQQVVVQGGGGGGUUUUUUUUUUUUUUUJJJJJJJJJRXX
+XXBEEEEEEEEEEOORRRRRRRRRRRRROOOOOOODDDDXXXXXXXXXXXXCCCCQWCWWWWWWWWVVVVTTTTTTCCCQXXXXXXXNNNNNNNNRRRVVVVVVVVQQGGGGGUUUUUUUUUUUUUUUXJJJJJJJJJXX
+XBBEEEEEEEEEFFOFFRRRRRRRRRRROOOOOODDDDDDDDXXXXXXWXXCCCCCCCWWWWWWWVVVVVTTMTTTCCQQXXXXXXXXNNNNNNVVRRVVVVVVVVQQLGGGGUUUUUUUUUUUUUUUJJJJJJJJJJJX
+XEEEEEEEEEEEFFFFFFRRRRRRRRRROOOOODDDDDDDDDDXXXXXWWXCCCCCCCCCWWWWWVVVVVMMMMMMMCCQXXXXXXXXNNNNNVVVVVVVVVVVVVQJJJGGGJJDDDDDDDUUUUUUJJJJJJJJJXXX
+EEEEEEEEEEEEFFFFFFRVRRRRRRRROOOOOODDDDDDDXXXXXXXWWCCCCCCCCCCCWCWWWWVVMMMMMMMCCXXXXXXXXXNNNNNNVVVVVVVVVVVVVJJJJJJJJJDDDDDDDUUUUUUMJJJJJJXXXXX
+BEEEEEEEEEEFFFFFFFFFZRRRRVRROOOOOODDDDDDIWXXXXXXXWCCCCCCCCCCCCCCWWWWVMMMMMMMMMSXXXXXXXTTNNNVVVVVVVVVVVVVVVWWWJJJJJJDDDDDDDDDMMMMMJMXJJJXXXXX
+EEEEEEEEEEFFFFFFFFFFZZRRRRRROOOAOODDDDDDWWXXXXWWWWWWCCCCCCCCCCCWWWWWVMMGGGMMMSSXXXLLLLTTNNVVVVVVVVVVVVVVVVWQQQQJJJJDDDDDDWDDMMMMMXXXDJJXXXXX
+EEEEEELLEEFFFFFFFFFFZZZZZRZROODDDDDDDDDDWWXWWWWWWWUCCCCCCCCVVVVVVVWVVWWGGGMMMSSCXXLLLLLTNNVVVVVVVVVVVVVVVVWQQQQJJJJDDDDDDDBBMXXXMXXDDJXXXXXX
+OEEEYYYLEFFFFYFFFFFFZZZZZZZZOEDDDDDDDDDWUWWWWWWWWWWCCMCCCCCVVVVVVVWWWWWGGGMSSSSLLLLLLLTTTTTVVTVVVVVVVVVVVVVQQQQQQJJJJDDDDBBBBXXXXXXXXJXXXXXX
+OOOOYYYYFFFYYYFYFFFZZZZZZZZZOEDDDDDDDDDWWWWWWWWWWWWMMMCWCCCVVVVVVVWWWWWQGGSSSSSLLLLLLTTTTTTTTTVVVTVVVCVUUQQQQQQJJJJJIIDDUBBBXXXXXXXXXJJXXXXX
+OVVOOYYYYYYYYYYYFFFZZZZZZZZZZEDDDDDDDDDWUWWWWWWWWWWWWWWWLCCVVVVVVVWWWWWGGGSSSSSSSSLLLLTTTTTTTTTTTTCCVVVCUUQQQQQQQJJJIIDDUUBBBXXXXXXXXXXXXXXX
+OVVOOOYYYYYYYYYYYZFZZZZZZZZZZEDDDDDDDDDDDWWWWWWWWWWWWWWWWCVVVVVVVVWWWWWWGGSQSSSSLLLLLLTWTTTTTTTTTTCKCCCCUUUQQQQPJJJJJIUUUUBBBBXXXXXXXXXXXXXX
+VVBVVVVVYYYYYYYYYZZZZZZZZZZZZZZZZDDDDDDZDWWWWWWWWWWWWWWWWVVVVVVVVVWWWWWWWGSQQQLLLLLLLTTTTTTTTTTTCCCCCCCCCCUQQQQJJJJJJJUUUBBBBBXXXXXXXXXXXXXX
+KVVVVVVVYYYYYYYYYZZZZZZZZZZZZZZZZDZDSSZZZWWWWWWWWWWWWWWWVVVVVVVVVVWWWWWWLLOQQQQQQLLLLTTTTTTTTTTCCCCCCCCCCUUUQJJJJJJJUUUUUUUBBBBMMXXXXXXXXXXX
+VVVVVVVVYYYYYYYYYYZZZZZZZZZZZZZZZDZZSSSZZZZZWWWWWWWWWWWWVVXVVVVVVVVVWWWLLLQQQQLLLLLLLLTTTTTTTTCCCCCCCCCCCUUUUUJJUUJJUUUUUUUUBBBBMMXQXXXXXXXX
+VVVVVVVVYYYYYYYYZYYYZZZZZZZZZZZZZZZZZZZZZZZZZWWWWWWLWLWLLVXXXVVVVVVVWWWLLLLQQQQLLLLLTTTTTTTTWTTCCCCCCCCCCCCCUUJUUUUUUUUUUUBBBBBBMQQQXQQQQXXX
+VVVVVVVYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZWWZWWWLLLLLLVXXXVVVVVVVVVVVLLLLLLLLLLLLTTTTTTTTTTTLLCCCCCCCCCCCUUUUUUUUUUUUUVVBFBBOQQQQQQQQQQQQ
+VVVVVVVYYYYGYYYYYZZQZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZLLLLLLXXXXVVVVVVVVVVVDDLLLLLLLLLTTTTTTTTTTTTLLCCCCCCCCCCCUUUUUUUUUFUFVVVFFCBOQQQQQQQQQQQQ
+VVGVVVVGYYGGYYYYYZQQQQQZZZZZZZZZZZZZZZZZZZZZZZZLZZLLLLLLLXXXXXVVVVVVVVVVDDDLLLLLLLTTTTTTTTTTTTTUURCCCCCCCCUUUUUUUUUUUFFFFFFFYQQQQQQQQQQQQQQQ
+GGGGGVGGYGGYYYYYZZQQQQQQQZQZZZZZZZZZZZZZZZZZZZZLLLLLLLLLLXXXXXVVVVVVVVVVDDLLLLLLLLTTTTTTTTTTTUUUUCCCCCCCCCCCUUUUUUUUUUFFFFMFYQQQQQQQQQQQQQQQ
+GGGGGGGGGGGGGZZZZZZQQQQQQQQQZZZZZZZZZZZZZZZZZZLLLLLLLLLLLLXXXXVVVVVVVVVVVVVLLLLLLLTTTTWCJTUUUUUUUCCCCCCCCCCCUUUUUUUUUFNFFFFFFQFQQQQQQQQQQQQQ
+GGGGGGGGGGGGGZZZZQQQQQQQQQQQZZZZZZZZZZZZZZZZZZLLLLLLLLLLLXXXXXVVVVVVVVVVVVVDLLLLLTTCCCCCCCCCUUUUUPZPCCCCCCCCUUUUUUUUFFFFFEFFFFFQQQQQQQQQQQQQ
+GGGGGGGGGGGZZZZZZZQQQQQQQQQQZZZZEEEZJJJJJZZZZLLLLLLLLLLLLXXXXXXXVVVVVVVVVVVLLLLLCCCCCCCCCCCCCUUUPPPPPCCCCCCCCUUUUUUUUUFFFFFFFFFFQQQQQYQQQQQQ
+NGGGNNGGGGZZWWWZZZQQQQQQQQQOTTTTREEEJJJJJJZZZZLLLLLLLLLLLXXXXXXDVVVVVVVVVVVLLLLCCCCCCCCCCCCCCUPPPPPPPCCCCCCCCUUUUUUUUUFFFFFFFFFFYYYYYYQQQQQQ
+NNNNNNGGGGGZWWWZZZTTQQQQQQQQTTTTRRREEJJJJJJJZLLLLLLLLLLLXXKXXXXXVVVVVVVVVVVLLLLCCCCCCCCCCCCFCPPPPPPPLCCCCCCCUUUUUUUCUUFFFFFFFFXYYYYYYYYQQQQQ
+NNNNNGGGGGWWWWWWZZZQQQQQQQQQTTTTTTTTTJJJJJJZZLLLLLLLLLOOXXKXXXXXXVVVVVVVVVVLTTCCCCCCCCCCCCPPPPPPPPPPWWWWWCCCCSSSUSSCCCCCCFFFFFYYYYYYYYNYQXXU
+NNNNNGGGGGWWWWWWZZZQQQQQQQQQQTTTTTTTTTJJJJJJZLLLLLLLLLLOXKKKXXXXXVVVVDDDTLLTTTCCCCCCCCCCCCPPPPPPPPPPWWWWWCCJJSSSSSSSSCCCCFFFFFFYYYYYYYYYXXXU
+NNNNNNNGGGWWWWWWZMMQQQQQQQQQQTTTTTTTRRMEJOJZZZZZLLLLLKKOKKKKXXXXKDDDDDDTTTTTTROCCCCCCCCCCCCSSPPPPPPPWWWWWJJJJJSSSSSSSCUUUUFFFFYYYYYYYYYYUXXU
+NNNNNNNNGGGWWWWWWMQQQQQQQQQQTTTTTTTTTTMMJJZZZZZZKLKKKKKKKKKRRKKXKWWDDDDDTTTTRRRRCCCCCCCCCCCMSPTPPWWWWWWWWJJJJJNSSSSSSSUUUUUYYYYYYYYYYYYYUUUU
+NNNNNNNGGYGGGGGGWIVQQQQQQQQQTTTTTTTTTTMMZZZZZZZZKKKKKKKKKKKKKKKKKKWDDDTTTRTRRRRRCCCCCCCCCCMMMMMPPWWWWWWWWWWWWWWNSSSSSSSUUUUWUUYYYYYYYYYZUUUU
+NNNNNNOGGYYYYGGGIIIIHIQQQQQQTTTTTTTTTTMMMMZZZZZZKKKKKKKKKKKKKKKKKWWWGGTTTRRRRRRRCCCCCCCCMMMMVVVVPWWWWWWWWWWWWWWNSSSSSSSSUUUUUUUYYYYYYYYUUUUU
+NNNNHHOYYYYYYGGGIIIIIIQQITTTTTTTTTTBMMMMMMMZZZZZKKKKKKKKKKKKKKVVGWGGGGTTGRRRRRRRCCCCCCCMMMMMMMMVVWWWWWWWWWWWWWWSSSSYSSSSUUUUUUUUYYYYYHHHHUUH
+NNNOOOOOOOYYYYYGIIIIIIIIITTTTTTTTTMMMMMMMMMMZZZZZMKKKKKKKKKKKKVVGGGGGGGGGHRRRRRCCCCCCCCMMMMMMMMMWWWWWWWWWWWWWWWNCCYYYLYUUUUUUUUUYYYYNHHHUUHH
+NNNNOOOOOOYYJJIIIIIIIIIIIJTTTEEETTTMMMMMMMMMMMMMZMKKKKKKKKKKKKGVGGGGGGGGGHHHRRCCHHCCCCCMMMMMMMMMWWWWWWWWWWWWWWWNNCCYYLYUUUUUUUUYYYYYHHHHHUHH
+NNNNOOOOOOOYJJIIIIIIIIIEJJEEEEECEHMMMMMMMMMMMMMMMMMKKKKKKKKVVVVVVVVVVVVGGHHHHHHHHHHHCCCMMMMMMMMMWWWWWWWWWWWWWWWNCCCYXYYYYUUUUUPYYYHHHHHHHHHH
+NNNNNOOOOOOOIIIIIIIIIIIEJJEEEEEEEHHMMMMMMMMMMMMMMMMKKKKKKKFVVVVVVVVVVVVGGHHHHHHHHHHHCCMMMMMMMMMMWWWWWWWWWWWWWWWYCCYYYYYYYUUUUUUPPPHHHHHHHHHH
+NNNNOOOOOOOOIIIIIIIIIIIEJJEEEEEEHHHHMMMMMMMMMMMYMMMKKKKKKSFFVVVVVVVVVVVGGGHHHHHHHHHHHCCMMMMMMMMMWWWWWWWWWWWWWWWYYYYYYYYYYUUUUUUUPPPHHHHHHHHH
+OOOOOOOOOOOOOIIIIIIIIEEEEEEEEEEEEHHMMMMMMMMMGMYYMMKKKKKKKSFFVVVVVVVVVVVGGNGHHHHXXXXXXXMMMMMMMMMVWWWWWWWWWWYKPYYYYYYYYYPYYUUUPPPPPPPPPHHHHHHH
+IOOOOOOOOOOOIIIIIIIIIIIEEEEEEEEEEHHHMMMMMMMMMMYYYMKKKKKKSSFFVVVVVVVVVVVGGXXXXXXXXXXXXXMMMMMMMMVVVWWWWWWWWWKKKKKYYYYYYNNNNPPUPPPPPPPPPPHHHHHH
+IOOOOOOOOOOOIIIIIIIIIEEEEEEEEEEEEEHHHMMMMMQMMMYMYMMTKKKKSFFFVVVVVVVVVVVGGXXXXXXXXXXXXXMMMMMMMCVVVWWWWWWWWWKKGYYYYYYYNNNPPPPPPPPPPPPPPPPPHHHH
+IIIOOOOOOOOOIIIIIIIIIMEEEEEEEEEEEEHHHHMMMMMMMMMMMMMKKKKKFFFFFFVVVVVVVVVGGXXXXXXXXXXXXXXXXXMMMCVVVWWWWWWWWWKKKYYYYYNNNNNPNNPNPPNPPPPPPPPPPHHH
+IIIIOOOOOOOOIIIIIIIIIMEYEEEEEEEEEEEHHHMHMMMMMMMMMMMKKKKFFFFFFFVVVVVVVVVGGXXXXXXXXXXXXXXXXXMMMVVVVWWWWWWWWWKKKKKYYYNYYNNNNDNNPPNNNNPPPPOPPHHP
+IIEIOOOOOOIIIIIIIIMMMMMMMEEEEEEQEEEHHHHHHMYMMMMMMMMMMKKZFFFFFFVVVVVVVVVGGXXXXXXXXXXXXXXXXXXMMMVVVWWWWWWWWWKKKKKYYYYYYNNNNNNNNNNNNNPPPOOPPPHP
+IIEEOEOOAOOOIIIIIIIMMMMMMEEEEEEEEEEHHHHHIMYYYMMMMMMMMMMFFFFFFFFVVVVVVGGGEXXXXXXXXXXXXXXXXXXMMMVVVWWWWWWWWWKKKKKYYYYYVNNNNNNNNNNNNNPPPOOOOPPP
+IIEEEEEOOOOOIIIMMMMMMMMMMEEEEEEEEEEHHHHHHHYYYMAMMMMMMMMFFFFFFFFVVVVVVGNNNEBJJJJJXXXXXXXXXXXXXMVMVWWWWWWWWWKKKKYYYYYYYTNNNNNNNNNNNPPPPPOOPPPP
+IIIIEEEEOOOIIIIMMMMMMMMMMEEEEEEQEEHHHHHHHHHYYMMMMMMMMMMMMFFFFFFFFOOONNNNNNBJJJJJJJJXXXXXXXXXXMMMVVVVVVKKKPKKKKTTTYYTTTFTNNNNNNNNNNPPPPPPPPPP
+IIIEEEEEEEEEYYYMMMMMMMMMMEEQEEEEHHHHHHHHHHHHHMMMMMMMMMMMFFFFFFFFFOOONNNNNPBBJJJJJJJXXXXXXXXXXMMMVVOVVVVVKKKKKKTTTYYTTTTTTNNNNNNNNNPPPPPPPPPP
+IILLEEEEEYYYYYYMMMMMMMMMMMEQQEYYHHHHHHHHHHHYYMMMMMMMMMMMFFFFFFOOOOOOONNNNPBBBJJJJJJXXXXXXXXMMMVVVVVVVVVUKKKKOOTTTTTTTTTNNNNNNNNNNNNPPPPPPPPP
+IILLEJJYYYYYYYYMYMMMMMMMMMMMEEYHHYYYYYHHHYHYYYYMMMMMMMMMMFFFOFOOOOOOONNOOBBBBJJJJJYYYYNYYYYYYMVUUVVUUUVUKUSSSSTTTTTTTTTNNNNNNNNNNNNNPPPPPPPP
+IUULLJJYYYYYYYYRYWYMMMMMMMMMMEYYYYYYYYYYHYYYYYMMMMMMMMMMMMFFOOOOOOOOOOOOOYBYYJJJJJYYYYYYYYYYYYYUUUUUUUUUUUSSSSTTSTTTTTTTNNNNNNNNNNHPPPPPPPPP
+LLLLLJLYYYYYYYYYYYYMYMMMMMMMMYYYNYYYYYYYYYYYYYMMMMMMMMMMMMFOOOOOOOOOOOOOYYYYYYYYJJYYYYYYYYYYYYUUUUUUUUUUUSSSSSTSSSTTTTTIINNIIINNNNPPPPPPPPPP
+LLLLLJLYYYYYYYYYYYYYYMMMMMMMMYNNNNNNNYYYYYYYYYYYYYMMMMMMMMOOOOOOOOOOOOOOLYYYYYYYJYYYYYYYYYYYYUUUUUUUUUUUNSSSSSSSSSTTIITIINIIIISINNPPPPPPPPPP
+LLLLLLLYYYYYYYYYYYYYMMOMMMMMMMNNNNNNNYNNYYYYYHYYYYMBMMMMOOOOOOOOOOOOOOOGLYYYYYYYYYYYYYYYYYYYYUUUUUUUUUUUNNNNSSSSSSSSIIIIINNIIIIINNPPPPPPPPPP
+LLLLLLLYYYYYYYYYYMMMMMOOMOMNMCNNNNNNNNNNYYYYYHYYYYBBBMBMBOOOOOOOOOOOOLLLLYYYYYYYYYYYYYYYYYYYYUUUUFFUUUNNZNNNSSSSSBSSIMIIIIIIIIIIPPPPPVPPPPPP
+LLLLLLLLYYYYYYYYMMMMMMOOOOONMMNNNNNNNNNNYYYYYHYYYYYBBBBBBBOJOOOOOOOOOOLLLYYYYYYYYYYYYYYYYYYYUUUUUUFFFFFNNNNASSSSSSSMMMMIIIIIIIIIXPPPPPPPPPPP
+LLLLLLLYYYSSSSSSSMMMOOOOOOONNNNNNNNNNNTYYYYYHHYBBBBBBBBNNNNOOOOOOOLLLLLLLLYYYYYYYYYYYYYYYYYUUUUUUUFFFFFNNNNNSSSSSSSMMMMMMMMMIIIIPPPPPPPPPPPP
+LLLLLLLYYYSSSSSSSMMMOOOOOONNNNNNNRRRNNYYYYYHHHHHBBBHBBBNVNNNOOOOOLLLLLLLLLLYYYYYYYYYYYYYYYUUBBBBFFFFFFFNNNNNRRRSSSSMMMMMMMMMMDDDDPPLPPPPPPPP
+LLLLLLLLYYSSSSSSSXMXOOOOOOOONNNNNNRZRIIYYYHHHHHHBHHHHHHHHNNNNLOOOLLLLLLLLLLLYYYYYYYYYYYOOYYYZBBBBFFFFFFNNRRRRRRRSSNMMMMMMMMMMMMMPPIIPPPPPPPP
+LLLLLLLLYYSSSSSSSXXXOOOOOOOOOONNNRRRRRYYYYHHHHHHHHHHHHHHHHNNNLOLLLULLLLLLLLYYYIYYYYYYYYOOOOYBBBBBBBFFYYNRRRRRRRNNNNMMMMMMMMMMMMMMIAIPPPPPPPP
+LLLLLLLLYYSSSSSSSSSSSOOOOOOOOONNNRRRRRDDDDHWWJJJHHHHHHHHHHNTTLLLLLLLLLLLLLLLLIIYYLYYYYBOOOBBBBBBBBBRRRRRRRRRRRRRNNNMMMMMMMMMMMMIIIIIIIIPPPPP
+LLLLLLRLYYSSSSSSSSSSSXXOOOOOONNNNRRRRRBDDWWWWWJJHHHHHHHHHHVVVLLLLLLLLLLLLLLLIIILLLLYYYBBBBBBBBBBBBBBRRRRRRRRRRRRNNMMKKMMMMMMMMMMIIIIIIIIIPPP
+BBLLLYYYYYSSSSSSSSSSSXXOXOOOONNNNRRRRRRFFFFWWWJJJWHHHHHHBBVVVVVLLLLLLLLLLLLIIIIILLLYYYBBBBBBBBBBBBBBBRRRRRRRRRRRRNMMKKKKMMMMJMIIIIIIIIIIIIKP
+BBLLMYYYYYSSSSSSSSSSSXXXXXVOOONNNRRRRRRRRRFWWJJWWWHHHHHVBBVVVWWWWWLLLLLLLLLIIIIILLYYYYYBBBBBBBBBBBBBBBRRRRRRRRRRRRKKKKKMMMMJJJIIIIIIIIIIIIKP
+BMLLYYYYYYSSSSSSSSSSSXXXXVVONNNNNNFRRRRRRRWWWWWWWWHHHHHVVVVVVVVVLLLLLLLLLLLLLIIILLLLYYKBBBKBBBBBBBBBBBRRRRRRRRRZZRKKKKKMMMMJJJJJIIIIIIIIIIKK
+MMMMMYYYYYSSSSSSSSSSSXVVVVVVNNNNNFFRRRRRRRWWWWWWWWHHHHVVVVVVVVVRLKKLQLUUULLUIILLLLLLYKKBBKKKBBBBBBBBRBRRRRRRIRRREKKKKKKMMMJJJKJIIIIIIIIIIIKK
+MMMMMMMMYYVVSSSSSSSSSVVVVVVVNNNNFFFFRRRRVWWWWWWWWWUUUUVVVVVVVVVRLUKLQLUUUUUUIILZZZZZKKKKKKKKKBBBBBBBBBSQRRRREREEEKKKKKKMMMJXJKJIIIIIIIIIIKKK
+MMMMMMMMYMMVSSSSSSSSSVVVVVVVVNNFFFFRRRRRRRWWWWWWWUUUUUUVVVVVVVUUUULLLUUUUUUUUUUUZZZZZZZKOKKKKKBBBBBBBSSQQEEEEEEEEEKKKKKKMMUJJJJJIIIIIIIIKKKK
+MMMMMMMMMMMVVXXPSSSSSXVVVVVVVVFFFTTTRRRRRRRWWWWWWWUUUUUVVVVVVVVVUUUUUUUUUUUUUUUUUZZZZZZOOKKKKKJBBBBHHSHQEEEEEEEEEEEEKKJJJJUJJJJJIIIIIIIKKKKK
+MMMMMMMMMMMVXXXXSSSSSAVVVVVVVVVFFFFFRRNNRNNWWWWWWUUUUVVVVVVVVVVVVVTUUTTTUUDDUUUUUZZZOZOOOOKKJJJBBBBHHHHQEEEEEEEEEEEEKKJJJJJJJJJJIIIIIIIKKKKK
+MMMMMMMMMMMMMAAXSSSSSAVVVVVVVNNNFFFFFNNNNNTTKWWWWWUUUVVVVVVJVVVVVTTTTTTUUDDDDUUUUZZZOOOOOOKKKJHHKBBHEHEEEEEEEEEEEEEKKKKJJJJJJJJIIIIIIFKKKKKK
+DMMMMMMMMMMMMMAASSSSSAZZZVVVVNNNFFFFNNNNTTFTTTDDDWUUVVVVVVVJVVVVTTTTTTTUUUDDDUUZZZZZOOOOOOKKJJHHHBHHEEEEEEEEEEEEEEEEEKJJJJJJJJJNIIIBIFFKKKKK
+MMMMMMMMMMMMMMAAAAAAZAAZZNNNNNNNFFFNNNNNTTTTTTTDDWWUVVVVVVVJVVVVTTTTTTUUUUDDDDUZZZZZBBOOOOOOJJHHHHHEEEEEEEEEEEEEEEEJJJJJJJJJJIJJJIIBYFYKKKKK
+MMMMMMMMMMMMMAAAAAZZZZZZZNNNNNNNNNNNNNNNTTTTTTTDDWUUJJJJJJJJVVVVVTTTTTUUUUUUBBBBZZBBBBBOBBJJJJHHHHHHEEEEEEEEEEEEBEECJJJJJJJJJJZZJIYBYYYKKKKK
+CMMMMMMMMMMMMMAAAAZZZZZZNNNNNNNNNNNNNNNTTTTTTTTDDJJJJJJJJJJJVVVVVVVOTUUUUUUUUBBBBBBBBBBBBBJJHHHHHHHHEEEEEEEEEEEEEQEEQQQJJJJJJJZZZYYYYYYYKKKK
+CMMMMMMMMMAAAMAAAAZZAZZZZNNNNNNNNNNTTNNTTTTTTTVTDDDJJJJJJJJJJVVVVVBBBBUUUUUUUBBBBBBBBBBBBEHHHHHHHHHHHHHEEEEEEEEEQQQQQQQQQJJJJJZZZYYYYYYMMKMM
+CCCMMMLLLMMAAAAAAAAZAZZZZNNNNNNNNNNNTTTTTTTTTTTTTTJJJJJJJJUJVVVVVVBBBBUUUUUUUUUBBBBBBBBBBBHHHHHHHHHHHHHHEREEEEEEEQQQQQQQQQJQJJZZZYYYYYYYMMMM
+CCCCMLLLAAAAAAAAAAAAAZZZZZNNNNNNNNNNTTTTTTTTTTTTJTJJJJJJUUUUVVVVVBBBBBUUUUUUUUUBBBBBBBBBHHHHVHHHHHHHHHHHHHEAAEEEEQQQQQQQQQQQJZZZZZYYYYYYMMMM