diff --git a/2015/.envrc b/2015/.envrc
new file mode 100644
index 0000000..e24737b
--- /dev/null
+++ b/2015/.envrc
@@ -0,0 +1 @@
+export ADVENT_OF_CODE_SESSION=53616c7465645f5f92dfbc249005a7e94ec3c6e62cd4e5e9ddf8e368a48c0c80440b6c5e37d836cc0b294e19a9e8a7f1
diff --git a/2015/.formatter.exs b/2015/.formatter.exs
new file mode 100644
index 0000000..d2cda26
--- /dev/null
+++ b/2015/.formatter.exs
@@ -0,0 +1,4 @@
+# Used by "mix format"
+[
+  inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
+]
diff --git a/2015/.gitignore b/2015/.gitignore
new file mode 100644
index 0000000..c927e54
--- /dev/null
+++ b/2015/.gitignore
@@ -0,0 +1,26 @@
+# The directory Mix will write compiled artifacts to.
+/_build/
+
+# If you run "mix test --cover", coverage assets end up here.
+/cover/
+
+# The directory Mix downloads your dependencies sources to.
+/deps/
+
+# Where third-party dependencies like ExDoc output generated docs.
+/doc/
+
+# Ignore .fetch files in case you like to edit your project deps locally.
+/.fetch
+
+# If the VM crashes, it generates a dump, let's ignore it too.
+erl_crash.dump
+
+# Also ignore archive artifacts (built via "mix archive.build").
+*.ez
+
+# Ignore package tarball (built via "mix hex.build").
+advent_of_code_2015-*.tar
+
+# Temporary files, for example, from tests.
+/tmp/
diff --git a/2015/.iex.exs b/2015/.iex.exs
new file mode 100644
index 0000000..795d6b6
--- /dev/null
+++ b/2015/.iex.exs
@@ -0,0 +1 @@
+import AOC.IEx
diff --git a/2015/.tool-versions b/2015/.tool-versions
new file mode 100644
index 0000000..eda65d9
--- /dev/null
+++ b/2015/.tool-versions
@@ -0,0 +1,2 @@
+erlang 24.1.4
+elixir 1.12.3-otp-24
diff --git a/2015/README.md b/2015/README.md
new file mode 100644
index 0000000..337eed7
--- /dev/null
+++ b/2015/README.md
@@ -0,0 +1,20 @@
+# Advent of Code 2015
+
+<details>
+  <summary>Setup</summary>
+
+  Using [asdf](https://asdf-vm.com/#/):
+
+  ```sh
+  asdf plugin add erlang
+  asdf plugin add elixir
+  asdf install
+  ```
+</details>
+
+|  S  |  M  |  T  |  W  |  T  |  F  |  S  |
+| :-: | :-: | :-: | :-: | :-: | :-: | :-: |
+|     |     |  1  |  2  |  3  |  4  |  5  |
+|  6  |  7  |  8  |  9  |  10 | 11  | 12  |
+| 13  | 14  | 15  | 16  | 17  | 18  | 19  |
+| 20  | 21  | 22  | 23  | 24  | 25  |     |
diff --git a/2015/config/config.exs b/2015/config/config.exs
new file mode 100644
index 0000000..8a3be87
--- /dev/null
+++ b/2015/config/config.exs
@@ -0,0 +1,8 @@
+import Config
+
+config :nx, :default_defn_options, compiler: EXLA
+
+config :advent_of_code_utils,
+  year: 2015,
+  auto_reload?: true,
+  session: System.get_env("ADVENT_OF_CODE_SESSION")
diff --git a/2015/input/2015_1.txt b/2015/input/2015_1.txt
new file mode 100644
index 0000000..1855a96
--- /dev/null
+++ b/2015/input/2015_1.txt
@@ -0,0 +1 @@
+()()(()()()(()()((()((()))((()((((()()((((()))()((((())(((((((()(((((((((()(((())(()()(()((()()(()(())(()((((()((()()()((((())((((((()(()(((()())(()((((()))())(())(()(()()))))))))((((((((((((()())()())())(())))(((()()()((((()(((()(()(()()(()(()()(()(((((((())(())(())())))((()())()((((()()((()))(((()()()())))(())))((((())(((()())(())(()))(()((((()())))())((()(())(((()((((()((()(())())))((()))()()(()(()))))((((((((()())((((()()((((()(()())(((((()(()())()))())(((()))()(()(()(()((((()(())(()))(((((()()(()()()(()(((())())(((()()(()()))(((()()(((())())(()(())())()()(())()()()((()(((()(())((()()((())()))((()()))((()()())((((()(()()(()(((()))()(()))))((()(((()()()))(()(((())()(()((()())(()(()()(()())(())()(((()(()())()((((()((()))))())()))((()()()()(())()())()()()((((()))))(()(((()()(((((((())()))()((((()((())()(()())(())()))(()(()())(((((((())))(((()))())))))()))())((())(()()((())()())()))))()((()()())(())((())((((()())())()()()(((()))())))()()))())(()()()(()((((((()()))())()))()(((()(((())((((()()()(()))())()()))))())()))())((())()())(((((())())((())())))(((())(((())(((((()(((((())(()(()())())(()(())(()))(()((((()))())()))))())))((()(()))))())))(((((())()))())()))))()))))(((()))()))))((()))((()((()(()(())()())))(()()()(())()))()((((())))))))(())(()((()()))(()))(()))(()((()))))))()()((((()()))()())()))))))()()()))(()((())(()))((()()()())()(((()((((())())))()((((()(()))))))())))()()())()))(()))))(()())()))))))((())))))))())()))()((())())))(()((()))()))(())))))(()))()())()()))((()(()))()()()()))))())()()))())(())()()))()))((()))))()()(()())))))()()()))((((()))()))))(()(())))(()())))((())())(()))()))))()())))()())()())))))))))()()))))())))((())((()))))())))(((()())))))))(()))()()))(()))()))))()())))))())((((()())))))))())))()()))))))))()))()))))()))))))(())))))))))())))))))))))))))())())((())))))))))()))((())))()))))))))())()(()))))))())))))()()()())()(()()()(()())(()))()()()(()())))())())))()))))())))))))()()()()())(())())()())()))))(()()()()()))))()))())())))((()())()())))()))()))))(()())))()))))))))(((()))()()))))))))))))))))))))(()))(()((()))())))())(()))(()(()(())))))()(()))()))()()))))))))))))()((()())(())())()(())))))())()())((()()))))(()()))))())()(())()))))))))))))))))))))()))(()(()())))))))()()((()))()))))))((())))()))))))))((()))())()()))())()()))((()))())))))))))))(()())()))(())((()(()()))(()())(())))()())(()(())()()))))()))()(()))))))(()))))))))))(()))())))))))))())))))())))(())))))()))))(())())))))))))()(()))))()())))())(()))()())))))))))))))())()()))))()))))))())))))()))))(())(()()()()((())()))())(()))((())()))())())(())(()()))))()))(())()()((())(())))(())))()))())))))))))()(((((())())))(())()))))(())))((()))()(((((((()))))()()))(())))))()(()))))(()()))()))())))))))(()())()))))))))())))(()))())()))(())()((())())()())())(()(()))))()))))))((()())(())()()(()())))()()))(())(())(()))())))()))(()))()()))((((()))))()))((()()()))))()))()))())))(()))()))))(())))()))())()(()))()())))())))))))())))())))()()))))))(()))())())))()))()()())())))))))))))))())))()))(()()))))())))())()(())))())))))))))))))))))()()())())))))()()()((()(()))()()(())()())()))()))))()()()))))))((()))))))))()(()(()((((((()()((()())))))))))))()))())))))((())())(()))())))())))))())()()())(())))())))()())())(())))))))()()(())))()))())))())())())()))))))))()))(()()()())())())))(())())))))))()()())()))))())))())()(())())))))))()())()))(()()(())())))()(()((()()((()()(((((())(()())()))(())()))(())))(())))))))()))()))((()))()))()))))))))()))))))))((()()())(()))(((()))(())))()))((())(((())))()())))())))))((())))))(())())((((((())())()(()))()(()((()())))((())()(()(()))))(())(()()())(())))())((()(((())())))(((()())())))())()(())())((((()()))))())((()))()()()()(())(((((((()()()((()))())(()())))(())())((((()()(()))))()((())))((())()))()(((()))())))()))((()(()))(())(()((((())((((()()(()()))(((())(()))))((((()(()))(())))))((()))(()))((()(((()(()))(()(()((()(())(()(()(()(()()((()))())(((())(()(()))))(()))()()))(())))(())()(((())(()))()((((()()))))())(()))))((())()((((()(((()))())())(((()))()())((())(())())(())()(())()(()()((((((()()))))()()(((()()))))()())()(((()(()))(()(()())(()(()))))(((((()(((())())))))(((((()((()()((())())((((((()(())(()()((()()()()()()()(()()))()(((()))()))(((((((())(((()((()())()((((())(((()(())))()((()(()()()((())((()())()))()))())))())((((((()))(()(()()()))(()((()(()(()))()((()(((()()()((())(((((())()(()))())())((()(())))(()(()())(())((())())())(((()()()(())))))())(()))))))()))))))())((()()()))((()((((((()))(((()((((()()()(((()))())()(()()(((()((()()()()())()()))()()()(()(())((()))))(()))())))))))()(()()(((((())()(()(((((()((()(()()())(()((((((((()((((((())()((((()()()((()((()((((((()))((())))))))())()))((()(()))()(()()(()((())((()()((((((((((((()())(()()()))((((()((((((())(()))())(()()((()()))()(((((((()((()()((((((()(((())))((())))((((((((()()(((((((())(((((()())(((())((())()((((()(((((((()(()(((()((((((()(((()(((((((((((()()((()()(()))((()()(((()(((())))((((())()(()(((())()(()(((())(((((((((((()))())))((((((())((()()((((()())())((((()()))((())(((((()(()()(()()()((())(()((()()((((()(((((()((()(()((((()())((((((()(((((()()(()(()((((())))(())(())(())((((()(()()((((()((((()()((()((((((())))(((((()))))()))(()((((((((()(((())())(((())))(()(()((())(((()((()()(((((()((()()(((())()(()))(((((((())(()(((((()))((()((()((()))(())())((((()((((())()(()))(((()(((((((((((((((())(((((((((()))(((()(()()()()((((((()((())()((((((((()(())(((((((((((()(()((())()((()()(()(()()((((()()((())(()((()()(()()((((()(((((((())))((((())(())()(((()()((()()((((()((()(((()((())(((()()()((((()((((()()(()(()((((((((())(()(((((())(()())(((((((()())()(()((((()((())(()()())((((()()(((()((((())(())(()()(((((((((()()))()(((())(()(()((((((())(()()())(()))()()(((()(((()((())(()(((((((()(()(()((()(((((()(()((()(()((((((()((((()()((((()(((()((())(()(()((()()((((()()(())()(())(((())(()((((((((()())(((((((((()(())()((((())))()))()()(((((()()((((((())(()()(((()(()(((((((()(()(((((((())(())((((()((()(())))((((()()())(()))((()())((((()(((((()(()(())(()(()()())(((((()(((((()((((()()((((((((()()))(()((((((())((((())()(()(((()()()(((()(()(())(())(((((()(())())((((())(())(()(((()(((((())((((())())((()(((((((()(((())(()(()))(((((((((()((()((()()(()((((())(((()((())((((())(()(((()(((()(()((((()(((())(()(((()(()()(()(()((()()(()())(())())((()(()(((()(((()(((()()(((((((((()(((((((((()()(((()(((()())((((()(()(((()()()((())((((((((((())(()(((()((((()())((((()((()))(((()()()(((((()(((((((())((()())(()((((())((((((((())(()((()((((((((((()()((()((()()))(((()())()())()(((()())()()(()(()(((((((())()))(())()))())()()((())()((()((((()((()((())(((((()((((((()(())))(()))())(((()))((()()(()(((()))((((())()(((()))))()(()(())()(((((())(()(()(())(())()((()()()((((()(())((()())(()(()))(()(()(()()(())()()(()((())()((()))))()))((()(()()()()((()())(()))())()(()(((((((((())())((()((()((((((())()((((())(((())((()(()()()((())(()((())(((()((((()()((()(()(((((())()))()((((((()))((())(((()()))(((())(())()))(((((((())(())())()(())(((((()))()((()))()(()()((()()()()()())(((((((
\ No newline at end of file
diff --git a/2015/input/2015_2.txt b/2015/input/2015_2.txt
new file mode 100644
index 0000000..5f3335f
--- /dev/null
+++ b/2015/input/2015_2.txt
@@ -0,0 +1,1000 @@
+29x13x26
+11x11x14
+27x2x5
+6x10x13
+15x19x10
+26x29x15
+8x23x6
+17x8x26
+20x28x3
+23x12x24
+11x17x3
+19x23x28
+25x2x25
+1x15x3
+25x14x4
+23x10x23
+29x19x7
+17x10x13
+26x30x4
+16x7x16
+7x5x27
+8x23x6
+2x20x2
+18x4x24
+30x2x26
+6x14x23
+10x23x9
+29x29x22
+1x21x14
+22x10x13
+10x12x10
+20x13x11
+12x2x14
+2x16x29
+27x18x26
+6x12x20
+18x17x8
+14x25x1
+30x15x22
+17x18x7
+28x23x24
+15x12x25
+14x7x20
+29x23x8
+24x5x22
+6x22x8
+1x15x26
+14x5x1
+24x28x28
+17x23x23
+4x15x7
+23x8x11
+6x15x1
+23x18x13
+17x1x26
+23x13x17
+2x18x8
+22x22x1
+10x22x6
+28x29x20
+22x21x25
+14x8x23
+12x30x14
+8x7x5
+3x30x15
+4x3x29
+25x18x3
+16x7x16
+4x3x8
+9x16x30
+20x28x3
+28x24x6
+4x18x2
+23x18x5
+22x4x30
+15x30x9
+7x12x12
+3x22x29
+12x1x9
+9x2x25
+17x11x10
+25x24x7
+7x27x26
+26x4x12
+29x2x26
+19x24x12
+23x23x3
+26x28x16
+18x4x16
+25x30x18
+29x19x19
+16x3x27
+29x25x29
+18x19x5
+14x21x30
+19x13x26
+19x10x15
+9x4x7
+18x6x6
+24x25x29
+9x12x27
+15x3x22
+30x17x21
+18x19x28
+9x11x12
+8x28x22
+11x3x4
+28x17x20
+24x18x15
+11x12x13
+6x19x24
+28x4x5
+28x22x23
+13x29x2
+9x16x15
+29x28x1
+10x18x30
+19x11x12
+26x28x25
+23x17x13
+25x1x21
+17x1x27
+17x27x28
+28x13x15
+14x13x25
+11x29x7
+22x29x5
+13x6x14
+23x18x13
+25x7x17
+18x9x20
+21x11x2
+28x11x13
+13x25x1
+19x29x25
+16x29x4
+10x21x10
+7x25x17
+5x9x3
+1x15x6
+8x27x29
+23x6x30
+22x22x29
+6x20x30
+26x25x29
+10x19x19
+20x30x9
+5x30x24
+17x10x27
+30x14x30
+8x17x4
+7x18x6
+3x5x4
+24x17x15
+14x20x17
+22x27x15
+18x14x15
+23x9x11
+21x16x29
+7x18x21
+9x3x29
+10x13x4
+2x30x4
+23x20x4
+8x22x21
+29x28x4
+13x16x25
+21x9x11
+7x26x26
+13x23x30
+19x7x10
+9x23x21
+21x9x17
+9x21x15
+20x29x22
+23x13x15
+19x25x2
+12x11x30
+20x21x6
+21x6x17
+24x26x9
+29x21x29
+29x26x16
+6x16x1
+2x12x6
+6x7x20
+7x2x22
+6x22x4
+13x11x27
+25x27x14
+11x8x6
+26x11x14
+30x3x29
+27x21x20
+15x16x26
+6x22x10
+11x9x25
+23x13x6
+13x9x3
+30x22x13
+29x23x14
+25x19x6
+7x29x11
+19x18x5
+29x25x13
+25x24x27
+1x9x12
+22x9x17
+14x12x28
+19x21x17
+13x25x17
+14x25x12
+4x14x30
+7x15x28
+3x6x25
+6x2x16
+15x19x11
+17x30x20
+20x23x7
+26x21x6
+26x29x24
+2x4x30
+4x22x18
+13x3x28
+27x6x21
+5x3x27
+12x7x11
+28x11x9
+12x9x2
+1x22x20
+15x13x28
+14x19x16
+28x20x3
+20x4x9
+26x7x26
+18x19x25
+7x1x13
+20x23x29
+27x26x8
+11x15x15
+10x21x23
+29x2x11
+21x28x20
+3x18x23
+26x17x17
+14x26x17
+20x7x17
+18x12x8
+4x8x8
+8x15x23
+24x29x5
+1x25x8
+1x28x17
+16x18x13
+29x24x22
+13x16x10
+14x7x16
+15x11x29
+12x15x19
+17x6x28
+4x3x9
+15x16x8
+29x27x11
+2x24x20
+4x21x3
+29x24x27
+18x22x22
+7x8x18
+20x7x8
+19x9x2
+20x17x2
+2x29x10
+19x25x1
+28x9x3
+29x27x20
+7x21x7
+10x4x22
+26x8x5
+26x14x1
+5x27x9
+2x18x3
+3x27x17
+30x17x23
+30x11x20
+4x6x7
+6x29x27
+30x16x20
+24x30x28
+19x20x26
+18x1x25
+26x12x12
+19x15x29
+16x21x24
+23x13x26
+25x16x10
+8x9x18
+24x14x1
+24x15x21
+19x9x14
+8x23x11
+22x2x16
+29x9x26
+3x16x25
+15x20x30
+3x11x12
+15x2x3
+13x7x4
+2x7x27
+9x26x11
+30x24x19
+28x17x21
+10x8x2
+11x15x26
+10x12x20
+24x24x27
+25x26x16
+13x4x20
+25x13x11
+12x22x3
+20x7x1
+12x18x6
+26x8x20
+14x2x7
+23x12x1
+26x24x24
+27x26x23
+26x17x5
+17x24x2
+26x5x6
+23x5x1
+5x18x30
+24x21x19
+5x28x11
+21x20x14
+25x4x22
+26x24x11
+7x5x8
+13x1x30
+5x1x6
+14x5x2
+8x11x7
+13x20x1
+17x30x14
+29x22x10
+12x26x3
+27x17x3
+26x27x4
+5x26x17
+22x11x19
+8x26x3
+24x19x22
+7x1x4
+6x27x30
+4x28x14
+16x14x18
+4x5x20
+19x25x4
+15x15x1
+10x14x14
+16x18x24
+21x27x15
+5x5x10
+1x7x13
+16x2x8
+13x15x11
+3x25x10
+20x29x8
+12x3x2
+10x13x12
+25x27x1
+11x30x19
+7x19x13
+27x6x18
+16x21x19
+21x29x5
+16x23x12
+29x19x15
+5x5x10
+27x15x1
+13x16x22
+29x19x5
+8x12x9
+3x18x5
+13x25x3
+5x9x21
+10x20x16
+9x9x11
+23x21x1
+22x2x15
+27x8x13
+23x7x3
+26x30x15
+29x15x16
+16x27x13
+2x18x9
+10x27x8
+20x9x25
+10x2x17
+16x13x13
+21x26x1
+27x26x24
+9x30x16
+19x17x28
+25x15x1
+10x26x6
+10x11x11
+5x26x25
+30x4x15
+9x8x23
+14x25x7
+8x28x8
+28x18x24
+4x4x25
+16x25x11
+17x27x8
+15x16x9
+24x13x21
+17x3x27
+27x5x26
+8x27x12
+29x2x8
+24x23x30
+1x30x21
+6x18x20
+13x14x12
+25x30x23
+24x6x24
+12x7x21
+11x6x8
+8x30x30
+26x3x12
+28x6x5
+18x7x1
+7x6x20
+14x16x18
+11x22x15
+4x20x10
+19x24x19
+8x24x11
+4x9x10
+6x6x22
+10x9x29
+1x5x28
+19x25x29
+20x30x3
+15x13x13
+9x9x24
+20x14x29
+26x24x13
+2x25x8
+10x26x2
+12x19x12
+18x6x20
+4x5x14
+26x27x10
+16x26x20
+3x21x15
+2x26x18
+14x11x17
+26x26x25
+10x1x11
+17x19x19
+27x28x26
+9x2x10
+19x30x15
+23x30x14
+15x3x20
+2x14x22
+21x18x8
+22x4x29
+19x6x29
+9x26x29
+16x10x9
+22x12x22
+13x28x14
+25x14x28
+28x3x30
+10x17x1
+10x27x22
+10x23x19
+14x25x9
+11x24x8
+30x25x10
+22x13x28
+2x7x6
+11x20x8
+9x22x14
+19x16x9
+11x24x4
+11x17x2
+6x4x10
+26x10x10
+12x14x5
+27x10x3
+15x3x6
+11x7x19
+22x10x12
+21x26x10
+13x20x3
+27x8x8
+1x24x23
+24x9x22
+23x17x23
+3x28x19
+2x20x28
+23x17x24
+26x1x4
+4x1x12
+5x6x16
+13x22x13
+25x21x21
+20x21x12
+9x24x25
+17x16x12
+12x28x9
+18x16x27
+29x12x2
+30x12x15
+24x11x10
+4x9x22
+4x24x5
+19x11x5
+6x25x6
+1x20x17
+22x8x21
+11x26x4
+16x19x3
+8x12x8
+13x2x18
+10x5x11
+8x12x17
+21x2x5
+26x17x26
+23x18x17
+28x11x14
+1x4x27
+29x5x28
+5x9x10
+5x7x25
+20x15x27
+15x11x17
+12x14x1
+29x14x4
+18x14x18
+14x25x24
+26x14x18
+13x8x11
+30x1x23
+3x4x12
+12x24x9
+8x6x16
+14x15x30
+12x30x8
+22x11x18
+16x30x28
+17x18x4
+13x14x23
+2x28x8
+3x28x30
+29x30x8
+4x6x26
+6x30x17
+11x30x30
+19x4x3
+12x15x20
+22x28x4
+26x30x2
+6x12x7
+1x10x5
+25x29x7
+17x9x18
+16x21x29
+21x14x7
+15x16x11
+26x6x15
+8x24x7
+2x20x4
+2x9x3
+19x8x13
+18x7x22
+27x14x17
+2x13x8
+18x15x26
+15x27x27
+18x11x15
+1x29x20
+21x12x11
+20x2x15
+28x23x9
+1x1x17
+7x23x9
+30x9x27
+9x16x18
+15x24x28
+30x11x18
+29x26x10
+9x5x25
+2x1x19
+14x3x14
+6x3x6
+30x15x20
+20x17x27
+28x10x9
+14x24x28
+17x11x6
+12x3x6
+8x8x15
+23x14x21
+11x21x7
+5x13x30
+4x29x25
+30x28x24
+18x4x9
+3x15x6
+13x9x19
+30x14x7
+7x9x9
+17x11x26
+24x26x13
+16x21x16
+27x17x25
+2x21x11
+9x11x27
+3x3x7
+13x8x14
+20x20x26
+13x29x22
+30x11x1
+7x10x19
+27x5x9
+23x17x15
+21x6x13
+24x15x16
+18x4x14
+18x16x6
+22x11x18
+14x2x5
+15x3x7
+10x20x29
+16x1x10
+30x23x1
+10x15x11
+17x14x5
+22x8x13
+7x11x28
+26x17x3
+2x23x2
+28x13x19
+18x12x28
+22x23x16
+14x12x1
+20x8x19
+17x19x13
+29x2x12
+2x26x27
+29x16x4
+13x8x18
+16x15x30
+23x16x2
+28x8x27
+21x8x23
+13x20x26
+19x6x17
+17x30x15
+7x4x30
+2x13x30
+18x7x19
+4x13x27
+8x6x5
+18x20x25
+2x3x30
+23x27x13
+22x30x4
+23x25x25
+23x16x19
+25x3x1
+5x6x15
+11x29x12
+25x24x7
+16x7x20
+20x3x2
+12x27x15
+16x10x12
+1x3x14
+22x1x26
+2x24x18
+11x29x16
+15x2x9
+10x1x24
+21x8x11
+30x11x23
+6x30x21
+13x27x29
+14x6x5
+18x29x19
+12x4x28
+29x3x14
+10x30x28
+5x7x15
+14x1x10
+9x25x14
+7x24x18
+28x17x21
+18x13x25
+26x15x1
+21x1x19
+12x16x21
+4x6x13
+7x15x26
+17x19x5
+12x28x2
+1x20x19
+27x7x5
+17x26x8
+12x15x19
+5x23x10
+8x2x8
+16x13x12
+14x27x1
+26x29x3
+24x16x14
+14x13x13
+7x22x23
+2x9x30
+4x27x8
+26x27x15
+23x1x6
+25x29x18
+5x18x1
+20x8x20
+5x10x25
+30x25x15
+7x22x25
+28x26x17
+29x4x1
+21x11x27
+20x9x8
+25x22x12
+2x11x11
+23x2x16
+23x27x20
+2x13x28
+27x2x24
+11x1x17
+12x4x27
+16x20x22
+30x12x10
+5x15x4
+5x2x27
+12x4x25
+1x16x4
+27x4x4
+21x16x3
+27x26x3
+24x6x6
+24x12x12
+20x20x25
+8x29x2
+21x4x5
+2x4x8
+4x13x19
+3x20x10
+12x15x16
+6x5x4
+12x16x20
+22x19x17
+8x17x22
+25x16x15
+7x1x19
+10x1x7
+23x23x5
+28x6x12
+2x25x12
+10x27x12
+24x27x19
+14x14x20
+4x1x5
+16x27x29
+20x20x24
+28x24x30
+6x15x15
+9x15x30
+23x26x3
+17x24x21
+22x25x25
+18x29x10
+20x25x1
+24x11x16
+20x7x21
+20x7x9
+7x26x2
+5x18x1
+16x26x28
+4x10x18
+27x30x21
+26x9x9
+8x16x14
+6x27x8
+28x9x20
+13x13x4
+9x18x16
+18x15x18
+22x19x14
+14x10x17
+25x29x11
+1x18x19
+8x11x26
+18x6x14
+30x24x13
+27x1x27
+15x9x3
+2x29x17
+2x26x21
+22x9x9
+20x20x20
+22x28x2
+26x5x16
+11x3x14
+21x16x16
+18x26x7
+18x30x6
+7x11x12
+15x10x2
+27x2x16
+27x30x24
+28x14x24
+7x4x8
+6x28x15
+13x19x1
+22x26x30
+7x30x24
+2x17x21
+19x26x2
+19x24x15
+14x23x2
+21x27x15
+30x15x14
+21x29x5
+23x30x2
+4x1x2
+15x5x13
+21x2x30
+20x7x16
+1x21x25
+2x25x1
+12x29x5
+28x13x16
+26x3x12
+29x20x23
+28x12x20
+4x30x8
+16x15x16
+6x16x29
+2x28x13
+24x25x2
+26x15x22
+17x20x11
+18x12x7
+19x1x18
+8x27x13
+22x16x8
+19x26x17
+13x11x10
+22x12x3
+13x12x14
+29x17x9
+6x14x10
+14x20x10
+8x26x9
+25x13x22
+3x30x25
+14x28x1
+30x29x12
+3x17x15
+3x24x14
+28x24x22
+16x6x1
+20x25x14
+17x17x13
+6x19x27
+10x15x20
+8x23x20
+7x29x21
+18x9x25
+10x5x22
+2x27x27
+16x18x30
+15x5x12
+26x29x29
+28x11x10
+9x29x28
+24x15x23
+26x9x10
+5x1x25
+22x27x16
+7x29x3
+1x3x5
+8x7x29
+19x21x11
+28x13x30
+17x16x20
+5x10x25
+9x14x15
+15x14x23
+16x4x17
+21x8x2
+9x9x8
+22x22x4
+10x2x27
+12x19x10
+15x29x4
+22x14x7
+29x18x5
+1x7x27
+24x1x15
+23x23x26
+12x17x23
+26x10x24
+8x22x2
+8x1x10
+22x19x12
+2x23x13
+11x27x25
+26x15x27
+27x7x21
+18x9x6
+22x21x22
+7x12x26
+23x21x13
+14x3x8
+5x9x28
+29x29x15
+27x25x23
+12x2x24
+8x2x20
+29x19x4
+12x24x29
+2x27x28
+14x20x9
+28x6x25
+18x29x8
+19x11x30
+15x11x23
+18x7x7
+14x20x14
+26x18x22
+27x25x13
+12x10x30
+30x2x7
+28x10x1
+18x10x30
+22x11x5
+22x16x3
+25x15x9
+5x10x24
+4x28x8
+19x24x18
+3x4x25
+14x4x30
+11x26x3
+12x12x12
+26x7x24
+3x2x14
+1x27x7
+2x2x13
+3x26x26
+12x4x11
+12x17x20
+4x19x30
+5x18x10
+17x6x18
+19x30x20
+11x2x17
+30x13x19
+22x23x7
+17x28x2
+5x17x30
+7x11x4
+21x26x18
+15x28x4
+5x6x27
+12x6x16
+9x17x12
+27x20x5
+14x5x20
+27x14x6
+2x14x21
+4x28x30
+24x5x1
+19x29x29
+11x23x1
+8x16x21
+3x17x19
+10x13x5
+20x21x16
+23x3x6
+27x26x11
+3x2x22
+14x3x5
+10x9x8
diff --git a/2015/input/2015_3.txt b/2015/input/2015_3.txt
new file mode 100644
index 0000000..783e28b
--- /dev/null
+++ b/2015/input/2015_3.txt
@@ -0,0 +1 @@
+>^^v^<>v<<<v<v^>>v^^^<v<>^^><^<<^vv>>>^<<^>><vv<<v^<^^><>>><>v<><>^^<^^^<><>>vv>vv>v<<^>v<>^>v<v^<>v>><>^v<<<<v^vv^><v>v^>>>vv>v^^^<^^<>>v<^^v<>^<vv^^<^><<>^>><^<>>><><vv><>v<<<><><>v><<>^^^^v>>^>^<v<<vv^^<v<^<^>^^v^^^^^v<><^v><<><^v^>v<<>^<>^^v^<>v<v^>v>^^<vv^v><^<>^v<><^><v^><><><<<<>^vv^>^vvvvv><><^<vv^v^v>v<<^<^^v^<>^<vv><v<v^v<<v<<^^>>^^^v^>v<><^vv<<^<>v<v><><v^^><v<>^^>^^>v^>^<<<<v><v<<>v><^v>^>><v^^<^>v<vvvv<>>>>>^v^^>v<v<^<vv>^>^vv^>vv^^v<<^<^^<>v>vv^v>><>>>v^>^>^^v<>^<v<<>^vv>v^<<v>v<<><v>^vvv<v<vvv^v<vv<v^^^>v><<^<>><v^^>^v^>>^v<^<><v<>>v^<>>v<>>v^^^><^>>vvvv>^v<^><<>>^<>^>vv><v<<>>^^>v^^^><^<<^^v>v<^<<>v>^^vvv^v^>v^<>^^<>v^v>v>v<v^>vv>^^v<>v>>^<>><>v>v^<<vvvv<vvv><v^<^>^v<>>^><v>><>^<v>v<v>vv^>>vvv<>v>v<v^>>^>>v<<>^<>^<>>>^v<<<^<^v>vv^>><<><v^>^v^^^v<>^^vv><>><>>^>v^<v<>v<>>^<<^v>^^^<>^v^><>v<<v>vv^>vv<<>>><<^v^<>v<vv>>>^^<>^><<^>vv>>^<<v^^vv<>>><v>v><^<v<<>>>^^<>>^<^v><>vv^^^v>vvv>^><<>^^>^<<v^<v<^v<<>vvv<^<<>^>^v<vv<^>vvv>v>vv^<v^><>>^vv<^^^vv><^vv<v^<><v^vvv><<^>^^><v<<vv^>v<vv<v>^<>^v<<>v<v^v^>^>^>v<<^vvv<<<v>^^>^<<<<>vv>>^<>^>>>v<v>^^<v^<v<>>>vv>^^v<<>>>^^v><<<v<v<^v<>^^><v<^v<<v^><><^<><v<^^v>>><v^^v<<v^><^<><<v^>><^<>v>v^<><^<v>^v^>^>^vv^>^^<<vv^>vv<^vvv<>>^^<^>v^>^>^<v^><v<v>>>v<<<><^v<<><^<vv^v^^^>v<^^<v^vvv<v<><v<vv<^vv<>vv<v^<>>vvvvv<<>^v^v>vv>>>vvv^^<^<^<><>v<v>><^v><^<<<>><<<v>^>v<>^>^v>>^<>v^<^>><<>^<v>^>^^^>^^<v>>>><>^v^v><<<<vv^<vv<>vv>v<>v^<v^>v><>>>v^<><^vvv>vv^<^<<^<^^v>^>>>v<^<^v^^<^<^>>><v>vv>^<<><>^>>v>^<<>><^<>v<>vv^^>^>vvv^v<<^<^^<vv<>^vvv<^^v^vv^>>v<^>^^<v^<>v<^<^vv>v<<vv>vv>^>vvv>>>^^>v<>^v>v^<^>>v>^^v>>>>v^<v>v<^>v<v<<>>^v<^^<v><^<>>^<<vv^>>v<<v>^v<>><^>vv<v<^>>^^<vvvvvvvvv>>>v<v<>v^<>>^vv<v^^v<<^vvv^<<^><>vv<><<>>v>vv^><>>^^v^>>v^v^><<<>>^^<^v<<^<>>>>^<^>v^><<^>v<^v<^>>^^<<<<><^<^v^v<>>^v<^<<vv^<><^^vv><v^v^v>^>>^>^vv^>^v<v^v<<vvv^><>>^v^^><>v>vv><^>>vv<vvv<<<<^<>vvv^v<v>^<v<^>^<^<v<><>v^^^^<<vv<^^vv<v>><<v^><>>><v^>^v><^>^><vv^<><^<v>><<^vv<>>v^<<v<>v><v<><><vv>^>>v^<^<v>^><>>><^><v^v<>>>^^<^>v<v>vvv<>^<<><v^^>^>>v<^v>^>v>>>vv>v>>v^^^<^<vvv^<>^>^<v^<v^v>v>^>vv>vvv<>v<^>v>^^>>^<vv^^v>v^^^^^v^vv><^<><>^>vv<^>>^vvvv^^^>^<vv>^v<<^><^^>^<>^^>^<<v<^>>>^><<^^>v^v>>^>vvvv>^^v><v>>vv><<<vv<^>v>^^^<v>v^vvv<^><<^>^<>^><<<<<v^<<vv^v>^<>v<v>^>^>><>v^v<^vv^^>vv<<v^v>vv^vvv<<<<>^v<v^^v^v>v<<v>^^<>^vv^^>^>^v^vv^>>v^vv^^<vv><<v^v^^v><vv<^vvv<vv^^<<v>v^v^^^^v<^<^>v>^>v>^vv^v^^<v<^vvvv<<<>^<^^^<^^<>^<><vv<^^<<^>>><v^vvvv>^<>>^^>v^^v^<<v^^^<<<><^<v^v^^v<v^<>v><<v<>^v>v<^><^>vv^^<vvv<^v>>v>^<><v^><^^^<v^>>vv<<<<<^<>^v^v>^vv^<>v>v<^>vv<<^vv>vv<v<><>>v>><v<^<^^>><<v^v<<^><v<^<vv<v<<vv^>^<<><^^>^<^>>^<vv>><v<<vvv<^^v^>^^<^v>^v<v<>v><v^v^<<^<><<v<<^v>v<<>>^>v>>v>>v<^<<^<^>>>v>^^^v><^>^^>>v<<>^v><v>vvv^vv<<<>vvv<<>^>>>v<v<v^<^<^>^<^>v^^v<^^<v<>v<>>^^>^v^>v<<<<^<>v^><<<v>>>><<v^<^vv>v>><>>^<<<^<^^>v<>>v<>vv<<^<<><<^>v^^^vv^>vvvv>>v>v^><<v<>vv^<<><<vvv>^>>>^<<<^<^<<v>^>v<>>v>>vv^^><<<<^^^v>><<^><v><v^^><v<<v^^v^^v>>v<><><<>^><v><^<vv>><^v<>v<vvv<>^>><v>>v<^><<v>^<>^v><^><^^<v>^><^^v^<<><>>^>v^<^v^vv<><^>vv^>v^vvv^<>>^><^<^<>^<<v^v<^v><>^v<v>>^>>^v^vv>><vv><v^^<<^v^<>^v<<>^><^>><v>>v<<<v^^vv<>^^v>>><><><<v^<<<v^<^^><v^>v^^vv<v^<>>vv^<^v<>^v>>v^v>v<^^vv><>^v<<>v^<>v^>>v>vvv<^><><^^>^vv^>>v^>^<^^<><>><<>^^^><^v^v><<<><<^v^vv>v>><^>>><v^>v<v><><v^v<>v^^>>v<<>v>v<v<v<^^<><>v^^<>>v<^v<v>v<><v<v>^<<>v>vv^^<>>^^^<>^^>^v>v>>>^v^v><v^^<><v>^^v^v<^<^^><<v<^<^<>^<>><<>^>>^>^^><v><>v<><>><<<>>>>vv>>>^>>^v<^>v^^^v<<vv>><<<^<<<>>>>>^>vv<^v^<>^<v^>^v><v>vvv<>>>^v^^^v<<<<>>^^<vv<^<^^>^<>v<^<<<>><>>v<^<>^<vvv<^<>><><<v>^^^>^^<<v<v^>^^v^>><<^vv><v>^v>>^<v>v>^^>^v>^vvv<>v^v^^<><vv>vv^>>><>v<^><v<v^<><<<>^v>^v<<<^>^>^>v^v<<><vvv<<v^^<><v>^>>><vv>><v>>v^<vv>>vv<<^v^v<<><^v<vv>>>vv<>>>>^vv>v^<>vv>v^v<v^><v<^^^^^>vv<><<vvv^<v><^<vv><^^^vv^<>^^^^<^><^<>v^<v^v<<^v<<^^<>>^<v^^>>>vv<vvv<>v<<>><^vvv^<<^^<<>>>^<>>>v^^><>><<>><v^v>>>>>><>>><v^<<vvv^>v<>>v^<>vv<><^^^^v^<<^<v^vv><<^^>v<^vvv^v>>v>^>>v>^^><<v^<>v<>vv<^v^vv><v><<vv^v>>v^>>v<^^^>^><<v<>^><>v>>>vvv<v<vv<^>>^v<v>^<^^^^^v><>v><>v^v^v<v^vv^v>vvvv<>vv<<<vv<v<<>^<^>^^v^<<>^<v><^><v<v<><<>v^<<^<><vv>v<<^v>>^v<><v>^>>^^><>v^<^<vvv^>^>^<<<<>vv>^v^v<^^^<vv>><>^^<<v<^<^^>>>v^v<<^^^<v<v<^<>^v<v><v^vv^^v^^v^^<vv<>^<><vv^<^v^<<^><<vvv>^^<^^^<^v>^>^vv><<<^v<v>vv>v<>v^v<v^>v^>>>v^v<>^v<<>^vv>v>v>v^<^>v^^<^>^^^^vv>^^><^>vv^>>^^v>><<<<^><>v<>^<v<vv^>^^><<^><v>v^>^^<^>>><>><v^v<v^<v<vv^v^<<^<vvv>>><vv<^^>>^>^><<v^<>>v>v^v^^><<>vv^v>v^<v><^<>^^<^>v>^<><<<v>^<^<^>^>^>^^v^<<^^v^^<^<>><^>v>>^^<>^^^<<<<v^>^v<^vv>^<<<v<><<v<>vv>>>v><>>><>>v<<<vv><>^v>v<^>><^><><v<>^v^>^v>^v<<><<^<>>v>^><>^>><>><^<v^><v^^<><v><^^>^v^^<>v^<v^<^v<v^^^^^v^<<^>^^^<^v><>^^<<<><<<<<^^>v^vvvv>v<>>vv<^>^v^>v<^vv^v<<><<v>v^v>^^><><^<v^>v><vv><>>><<>^vv<>v>>v<^v>>>v<v>v>v>^vv<<>^^vv<v<^v^<v<v>vv<>^<^<vv<v^<^v^^><<>^>><^v>vv^^v<<^^><<>v^^<><><v^^<v^v>^>^>^>v<^<v>^v^^>v<>vvv<^v<v^v><<v^><<^^><^<<v^v^>v<>^>v><><v>^<v<v>^<^^^>^v<<><<><>vv>v^<>v^><v^v<v><><<v>v<vv><<v>>v>^<<<>vv>>vvv>^^vv^v^^<^^<>v^^<>v>>^^>^>^>v>><^>><>>^<<>><^>v<<<<<<<^v^v<v^<v^^>^<><<v<^>v^>v^vv<<^^vv^>>>>^<>v<^v<>v<vv<^>>v^vv>vv><vv<<^>v>><vv>>>vv^<<<<vv^>v<<<<^^>^^v^><<^<v^>v^>^^<v<>vvv^>^<>vvv<v<^^>v^<<v>><>v<v<>^^<vvv>^>vv><><<<^^vv<v^<v<>v<>><<v><^vv^>^<^>^^^<<<v>vv^<^<<>^>^<vv>v><v<<^><^>^^<vv^v^^>>>>vv^><^^vv><>^<v^v>v<vv>v><<<v>v<v>^><v^^><v>v<^v^>>^^<v^>^^>vv>>vv^><^vv^vv<<^>vv>^v<v><vv><v<vvvvv>^^v^v><v>>>^vv<>v>^^^^<^>><>^v^^^>v<^^<<^^v<vv<>vvv<^>><><^>>^><^<>v<v<<><<v><v^v<>><^>v><<v^<v>v<^<vv^v^v^>vvv^^>v>^<vv^>v^v^<>v>^>>vv>><^^<v<<>^vv<><><<^v<v>v<<vv><>><^v<v>>v^>vvv^v^<<^><v<>^vv^>v^<v<^>>v<v><v><v>>^<<<v^<><<>v>^>^^<v<>>^<>^>^><<<^<<^<<^>^v>>><vvv>><<<<v>>>>>>>^<^v<^>v<>vv<><>v>>^>>^>vv^^><<^<v<v>>^^<<^>v<^>>vv>^<>v><^>v<vv>>>>>>^v<^<<<v^><vv<<>>vv<<><v<><<<v<^<v<>>v<^^^^v^^<^^^<^<vv><<^>><>v<<>v<v<>>>><>v^vv>^>^>>vv^v<v<<><^v>vv^><v<<>v^v<^>vv<<^^v><^>>^^vv<^<>>v^^>><v>^v>>>^>>v>v<>v<^vv><>^<<^>vv>>><><>v^><>v^>v>v><^v<><v<v>^v<<^vv^><^^>><^^^<<<^>v>^v>>><^>><^>>>^^^<^>vv<><<<v^>^<^^>>^^^v^v^v>v<v>>>><^>>>v>^vv<<^^^<^^vv>v<<><v<<^^>v>><<v^^><^>^<^>^v^>v><^<^vv>v>><>^<<vv<<v>v<vv<v>^>^>><^^<v>^v^v<><<>vvv<^<v>^><>^>vvv>>>^><<>><v^^<^<<^v>>^v<v<vv>vv^v^>v<<vvv<^^v^v>^<^>>^>v<^>^v<<><<<^>^<^^^>vv<^^^^vv<v<^^v<<<<v<^v^<><v<<^><<>vv>>><^<^<>>>^>^>>^<<<<<^^v>^>^<>vvv^^<^><^>^^v>^vv^><v^<^<<v^<vvv<<^v<><^><^>>>v>^v>^>^v<vv^v>><v><^><v^^>v^>^<><<><>v<v^>vvv^>^>>v<>^><^>^><vvv>^^v^v>v<>^v^><^>>v>v^><<<^>>^<>^<>>v><>>v^>^>^^<>>v^>^<vvvv<^vvvv^>>vv^<v^v>^vv<>v<>^<v<v>v>^^><^>vv^<^v^<<^<^<><vv<^v<^v><>>>^v^<<^><^>vv<v>v<^>vv^>v<<<>^<><v<^^^>v><^^<>^<^<v^vv^<<^>><<v^v<^vvv<<<>>vvvv^v^^^>v<>>><<>vvv<<^^^>v>v>>v<<v<v^v^>^^v>^><^<><<v^<v<v^^^><>v^^^<v>vv<>^>^^vv>^<<^v<^v><v>>>^>>><^<<>^v>>^>vv<<<v<>^<v><v^<^<>v>v^^v^>><<^v<<<<>v>v>v^^<^><>^^<<<v>vv<>>>^>>v<><v^>^<><vv>v>v^v<v^<^>>^>><<^^<^^v<vv<>><<<v<^<<^^^>vvv^<vvv<^>vv><>><<<^<v^v^^<<^vvv^^<^<><<>^<^<>>vvv<>^<>v^v<><>>v^v><<>>>vvv>v<>^>>^><^>vv<<>>v<<^><>v>>^^<v>^>^<<>><^<<vv<^<vv^vv><>>>><^<v>^>vv<v><>^<>vvvvv^vv<<v<>>>^<<><>^^vvv>>>vv<<^^><^v^^v<>^^>^><^>v^^^^v<^<<vv<vv<>vv^^>v^vv>v><>>vv>^<^<v^v^>>v^v^^v>^>vv^>v<vvvv<^v<^v>^v>^^v<<^>^^<<>^><^v>>>vv^>^^>vvvv>>v<^<v>^>>>v^<><^<^^<v>vv^^><v>v^<>^^^>>><^^v>v>^<<>^<v^>vvv^>^^^><v<^>>v<v>>^v><<><<>v<^<<>^><>^>vv>^<v>^^v<<^v^vvv^^>^vv^<^>^>^^v>v^>^<<><<^>v>>vv^vv><v>>^<<^<v^^<^<v^^vv^><^^<^^><v^^>v^^^<^<>^<>>^v<^vvv^^v^<><^>>>>>v><><<<>vv<^v>><<>vvv<><<vv<<<^>v^^>>^>^v>><><^^v<>><>>v^>^<vv><<<>><><<v>^^<>>v<><^<vv>vv<^v>^<<<<v<^<<^^>>^<><^>><<>^>v>^^^v>>^<^^v><v^v>^><<><>>^>>^<<v<>^v<>^>^<v>>vv>^vvv<<v<<^>^>^<<^^<>^^^^vvv<>^vv<vvvvv^^>^^<^>>><>v^<><^<<^>v^^v<>>^vv<>v^^<>>v^vvvvv<<v^<v^^>>><vvvvv>><^>vv>v^v^<v<^>^^><^>^^^^v<><^v<<>v^>v>>vv<<>^<v^^>vvv>^^<v^<>vv^><>><v^^v<>^>>^>v><>>^^v>^>^>>>^>v<^v>v>^<^^^^^>>v<v<>>v<<^>^<v<<>^^>><<^><>v<>^^^vv<>^^>><<^^>v>vv>vv>v^>^v>v^^<>>><<v><v<<>>v><>vvv^^v>^^>^vvvv^>^<>^vvvv><v><v<>>><>^<^vv<>^v<^v<>^vvv<<>><vvv^>>^><<vv^<v^>^<v<<^^>^^<^^v^>v<>v^v><>><v^^>>^vvv><^vv>v^<^<^v>>v^^>^vvv^<v^^v^^>v<^<>>^<>>>^^<><^^vv<>^vv^<>>>>^^<<^^<>vv^^><>^^<v<<v>^<v^^>^v<><><>vvv>^v^>>vv<<^v<<>><v>^><^>>>^<^<^^>vv^<<^<>>^^><><<v>^^<v>>v<<vvvv>^v^vv>><^^<<^>>v>v<^^^<^><^^vv>^vv<^<vv<>v><^<><v><^^^>>^<><^<v>>>>v^<v>>>>>v<><^^>v<^<^>><v<>^>vv>^^v^v^<<v<><<<^v^><<^<><<<<v<^>><<<>v>>vv><vv<><<^<^<><vv>^^^^<>v<<<<v>vv<>vv^^^>><>vv^><>>^vv<<><^^vv<>v^>>^<<>^<v^<^>v<
\ No newline at end of file
diff --git a/2015/input/2015_4.txt b/2015/input/2015_4.txt
new file mode 100644
index 0000000..861f68d
--- /dev/null
+++ b/2015/input/2015_4.txt
@@ -0,0 +1 @@
+ckczppom
diff --git a/2015/input/2015_5.txt b/2015/input/2015_5.txt
new file mode 100644
index 0000000..f3b13a0
--- /dev/null
+++ b/2015/input/2015_5.txt
@@ -0,0 +1,1000 @@
+zgsnvdmlfuplrubt
+vlhagaovgqjmgvwq
+ffumlmqwfcsyqpss
+zztdcqzqddaazdjp
+eavfzjajkjesnlsb
+urrvucyrzzzooxhx
+xdwduffwgcptfwad
+orbryxwrmvkrsxsr
+jzfeybjlgqikjcow
+mayoqiswqqryvqdi
+iiyrkoujhgpgkcvx
+egcgupjkqwfiwsjl
+zbgtglaqqolttgng
+eytquncjituzzhsx
+dtfkgggvqadhqbwb
+zettygjpcoedwyio
+rwgwbwzebsnjmtln
+esbplxhvzzgawctn
+vnvshqgmbotvoine
+wflxwmvbhflkqxvo
+twdjikcgtpvlctte
+minfkyocskvgubvm
+sfxhhdhaopajbzof
+sofkjdtalvhgwpql
+uqfpeauqzumccnrc
+tdflsbtiiepijanf
+dhfespzrhecigzqb
+xobfthcuuzhvhzpn
+olgjglxaotocvrhw
+jhkzpfcskutwlwge
+zurkakkkpchzxjhq
+hekxiofhalvmmkdl
+azvxuwwfmjdpjskj
+arsvmfznblsqngvb
+ldhkzhejofreaucc
+adrphwlkehqkrdmo
+wmveqrezfkaivvaw
+iyphmphgntinfezg
+blomkvgslfnvspem
+cgpaqjvzhbumckwo
+ydhqjcuotkeyurpx
+sbtzboxypnmdaefr
+vxrkhvglynljgqrg
+ttgrkjjrxnxherxd
+hinyfrjdiwytetkw
+sufltffwqbugmozk
+tohmqlzxxqzinwxr
+jbqkhxfokaljgrlg
+fvjeprbxyjemyvuq
+gmlondgqmlselwah
+ubpwixgxdloqnvjp
+lxjfhihcsajxtomj
+qouairhvrgpjorgh
+nloszcwcxgullvxb
+myhsndsttanohnjn
+zjvivcgtjwenyilz
+qaqlyoyouotsmamm
+tadsdceadifqthag
+mafgrbmdhpnlbnks
+aohjxahenxaermrq
+ovvqestjhbuhrwlr
+lnakerdnvequfnqb
+agwpwsgjrtcjjikz
+lhlysrshsmzryzes
+xopwzoaqtlukwwdu
+xsmfrfteyddrqufn
+ohnxbykuvvlbbxpf
+bbdlivmchvzfuhoc
+vtacidimfcfyobhf
+tinyzzddgcnmiabd
+tcjzxftqcqrivqhn
+vgnduqyfpokbmzim
+revkvaxnsxospyow
+ydpgwxxoxlywxcgi
+wzuxupbzlpzmikel
+nscghlafavnsycjh
+xorwbquzmgmcapon
+asmtiycegeobfxrn
+eqjzvgkxgtlyuxok
+mmjrskloposgjoqu
+gceqosugbkvytfto
+khivvoxkvhrgwzjl
+qtmejuxbafroifjt
+ttmukbmpoagthtfl
+bxqkvuzdbehtduwv
+gvblrpzjylanoggj
+cltewhyjxdbmbtqj
+fbkgedqvomdipklj
+uxvuplhenqawfcjt
+fkdjmayiawdkycva
+gnloqfgbnibzyidh
+kyzorvtopjiyyyqg
+drckpekhpgrioblt
+tvhrkmbnpmkkrtki
+khaldwntissbijiz
+aoojqakosnaxosom
+xfptccznbgnpfyqw
+moqdwobwhjxhtrow
+chfwivedutskovri
+gprkyalfnpljcrmi
+pwyshpwjndasykst
+xuejivogihttzimd
+bugepxgpgahtsttl
+zufmkmuujavcskpq
+urybkdyvsrosrfro
+isjxqmlxwtqmulbg
+pxctldxgqjqhulgz
+hclsekryiwhqqhir
+hbuihpalwuidjpcq
+ejyqcxmfczqfhbxa
+xljdvbucuxnnaysv
+irqceqtqwemostbb
+anfziqtpqzqdttnz
+cgfklbljeneeqfub
+zudyqkuqqtdcpmuo
+iuvhylvznmhbkbgg
+mpgppmgfdzihulnd
+argwmgcvqqkxkrdi
+pdhrfvdldkfihlou
+cbvqnjrvrsnqzfob
+lkvovtsqanohzcmm
+vxoxjdyoylqcnyzt
+kurdpaqiaagiwjle
+gwklwnazaxfkuekn
+rbaamufphjsjhbdl
+tzbrvaqvizhsisbd
+pbcqlbfjvlideiub
+hiwoetbfywaeddtx
+fjirczxtuupfywyf
+omeoegeyyospreem
+ozbbpupqpsskvrjh
+pzvcxkvjdiyeyhxa
+odclumkenabcsfzr
+npdyqezqdjqaszvm
+yodkwzmrhtexfrqa
+rjcmmggjtactfrxz
+mioxfingsfoimual
+aqskaxjjborspfaa
+wientdsttkevjtkf
+tdaswkzckmxnfnct
+voucjhzvkkhuwoqk
+boaaruhalgaamqmh
+iufzxutxymorltvb
+pfbyvbayvnrpijpo
+obztirulgyfthgcg
+ntrenvhwxypgtjwy
+ephlkipjfnjfjrns
+pkjhurzbmobhszpx
+gqbnjvienzqfbzvj
+wjelolsrbginwnno
+votanpqpccxqricj
+bxyuyiglnmbtvehi
+qyophcjfknbcbjrb
+anoqkkbcdropskhj
+tcnyqaczcfffkrtl
+rsvqimuqbuddozrf
+meppxdrenexxksdt
+tyfhfiynzwadcord
+wayrnykevdmywycf
+mhowloqnppswyzbu
+tserychksuwrgkxz
+xycjvvsuaxsbrqal
+fkrdsgaoqdcqwlpn
+vrabcmlhuktigecp
+xgxtdsvpaymzhurx
+ciabcqymnchhsxkc
+eqxadalcxzocsgtr
+tsligrgsjtrnzrex
+qeqgmwipbspkbbfq
+vzkzsjujltnqwliw
+ldrohvodgbxokjxz
+jkoricsxhipcibrq
+qzquxawqmupeujrr
+mizpuwqyzkdbahvk
+suupfxbtoojqvdca
+ywfmuogvicpywpwm
+uevmznxmsxozhobl
+vjbyhsemwfwdxfxk
+iyouatgejvecmtin
+tcchwpuouypllcxe
+lgnacnphdiobdsef
+uoxjfzmdrmpojgbf
+lqbxsxbqqhpjhfxj
+knpwpcnnimyjlsyz
+fezotpoicsrshfnh
+dkiwkgpmhudghyhk
+yzptxekgldksridv
+pckmzqzyiyzdbcts
+oqshafncvftvwvsi
+yynihvdywxupqmbt
+iwmbeunfiuhjaaic
+pkpkrqjvgocvaxjs
+ieqspassuvquvlyz
+xshhahjaxjoqsjtl
+fxrrnaxlqezdcdvd
+pksrohfwlaqzpkdd
+ravytrdnbxvnnoyy
+atkwaifeobgztbgo
+inkcabgfdobyeeom
+ywpfwectajohqizp
+amcgorhxjcybbisv
+mbbwmnznhafsofvr
+wofcubucymnhuhrv
+mrsamnwvftzqcgta
+tlfyqoxmsiyzyvgv
+ydceguvgotylwtea
+btyvcjqhsygunvle
+usquiquspcdppqeq
+kifnymikhhehgote
+ybvkayvtdpgxfpyn
+oulxagvbavzmewnx
+tvvpekhnbhjskzpj
+azzxtstaevxurboa
+nfmwtfgrggmqyhdf
+ynyzypdmysfwyxgr
+iaobtgubrcyqrgmk
+uyxcauvpyzabbzgv
+fbasfnwiguasoedc
+mgmjoalkbvtljilq
+szgkxiqkufdvtksb
+xgfzborpavdmhiuj
+hmuiwnsonvfgcrva
+zolcffdtobfntifb
+mvzgcsortkugvqjr
+pbbpgraaldqvzwhs
+zvsxegchksgnhpuv
+kdpdboaxsuxfswhx
+jdfggigejfupabth
+tpeddioybqemyvqz
+mxsntwuesonybjby
+tzltdsiojfvocige
+ubtdrneozoejiqrv
+fusyucnhncoxqzql
+nlifgomoftdvkpby
+pyikzbxoapffbqjw
+hzballplvzcsgjug
+ymjyigsfehmdsvgz
+vpqgyxknniunksko
+ffkmaqsjxgzclsnq
+jcuxthbedplxhslk
+ymlevgofmharicfs
+nyhbejkndhqcoisy
+rjntxasfjhnlizgm
+oqlnuxtzhyiwzeto
+tntthdowhewszitu
+rmxyoceuwhsvfcua
+qpgsjzwenzbxyfgw
+sumguxpdkocyagpu
+ymfrbxwrawejkduu
+hetgrtmojolbmsuf
+qzqizpiyfasgttex
+qnmoemcpuckzsshx
+ddyqiihagcmnxccu
+oirwxyfxxyktgheo
+phpaoozbdogbushy
+uctjdavsimsrnvjn
+aurbbphvjtzipnuh
+hpbtrubopljmltep
+pyyvkthqfsxqhrxg
+jdxaiqzkepxbfejk
+ukgnwbnysrzvqzlw
+lfkatkvcssnlpthd
+ucsyecgshklhqmsc
+rwdcbdchuahkvmga
+rxkgqakawgpwokum
+hbuyxeylddfgorgu
+tbllspqozaqzglkz
+rqfwizjlbwngdvvi
+xuxduyzscovachew
+kouiuxckkvmetvdy
+ycyejrpwxyrweppd
+trctlytzwiisjamx
+vtvpjceydunjdbez
+gmtlejdsrbfofgqy
+jgfbgtkzavcjlffj
+tyudxlpgraxzchdk
+gyecxacqitgozzgd
+rxaocylfabmmjcvt
+tornfzkzhjyofzqa
+kocjcrqcsvagmfqv
+zfrswnskuupivzxb
+cunkuvhbepztpdug
+pmpfnmklqhcmrtmf
+tfebzovjwxzumxap
+xpsxgaswavnzkzye
+lmwijdothmxclqbr
+upqxhmctbltxkarl
+axspehytmyicthmq
+xdwrhwtuooikehbk
+tpggalqsytvmwerj
+jodysbwnymloeqjf
+rxbazvwuvudqlydn
+ibizqysweiezhlqa
+uexgmotsqjfauhzp
+ldymyvumyhyamopg
+vbxvlvthgzgnkxnf
+pyvbrwlnatxigbrp
+azxynqididtrwokb
+lwafybyhpfvoawto
+ogqoivurfcgspytw
+cinrzzradwymqcgu
+sgruxdvrewgpmypu
+snfnsbywuczrshtd
+xfzbyqtyxuxdutpw
+fmpvjwbulmncykbo
+ljnwoslktrrnffwo
+ceaouqquvvienszn
+yjomrunrxjyljyge
+xpmjsapbnsdnbkdi
+uetoytptktkmewre
+eixsvzegkadkfbua
+afaefrwhcosurprw
+bwzmmvkuaxiymzwc
+gejyqhhzqgsrybni
+gjriqsfrhyguoiiw
+gtfyomppzsruhuac
+ogemfvmsdqqkfymr
+jgzbipsygirsnydh
+zghvlhpjnvqmocgr
+ngvssuwrbtoxtrka
+ietahyupkbuisekn
+gqxqwjizescbufvl
+eiprekzrygkncxzl
+igxfnxtwpyaamkxf
+soqjdkxcupevbren
+fspypobyzdwstxak
+qstcgawvqwtyyidf
+gsccjacboqvezxvd
+bfsblokjvrqzphmc
+srezeptvjmncqkec
+opmopgyabjjjoygt
+msvbufqexfrtecbf
+uiaqweyjiulplelu
+pbkwhjsibtwjvswi
+xwwzstmozqarurrq
+nytptwddwivtbgyq
+ejxvsufbzwhzpabr
+jouozvzuwlfqzdgh
+gfgugjihbklbenrk
+lwmnnhiuxqsfvthv
+bzvwbknfmaeahzhi
+cgyqswikclozyvnu
+udmkpvrljsjiagzi
+zzuhqokgmisguyna
+ekwcdnjzuctsdoua
+eueqkdrnzqcaecyd
+lnibwxmokbxhlris
+fdrbftgjljpzwhea
+iabvuhhjsxmqfwld
+qgogzkynrgejakta
+mfcqftytemgnpupp
+klvhlhuqhosvjuqk
+gdokmxcgoqvzvaup
+juududyojcazzgvr
+fyszciheodgmnotg
+yfpngnofceqfvtfs
+cahndkfehjumwavc
+dxsvscqukljxcqyi
+cqukcjtucxwrusji
+vevmmqlehvgebmid
+ahswsogfrumzdofy
+ftasbklvdquaxhxb
+tsdeumygukferuif
+ybfgbwxaaitpwryg
+djyaoycbymezglio
+trzrgxdjqnmlnzpn
+rumwchfihhihpqui
+ffrvnsgrnzemksif
+oizlksxineqknwzd
+cirqcprftpjzrxhk
+zrhemeqegmzrpufd
+kqgatudhxgzlgkey
+syjugymeajlzffhq
+nlildhmgnwlopohp
+flcszztfbesqhnyz
+ohzicmqsajyqptrw
+ebyszucgozsjbelq
+enxbgvvcuqeloxud
+ubwnvecbsmhkxwuk
+noifliyxvlkqphbo
+hazlqpetgugxxsiz
+ihdzoerqwqhgajzb
+ivrdwdquxzhdrzar
+synwycdvrupablib
+mqkdjkntblnmtvxj
+qmmvoylxymyovrnq
+pjtuxskkowutltlq
+gchrqtloggkrjciz
+namzqovvsdipazae
+yfokqhkmakyjzmys
+iapxlbuoiwqfnozm
+fbcmlcekgfdurqxe
+ednzgtczbplwxjlq
+gdvsltzpywffelsp
+oaitrrmpqdvduqej
+gseupzwowmuuibjo
+dfzsffsqpaqoixhh
+tclhzqpcvbshxmgx
+cfqkptjrulxiabgo
+iraiysmwcpmtklhf
+znwjlzodhktjqwlm
+lcietjndlbgxzjht
+gdkcluwjhtaaprfo
+vbksxrfznjzwvmmt
+vpfftxjfkeltcojl
+thrmzmeplpdespnh
+yafopikiqswafsit
+xxbqgeblfruklnhs
+qiufjijzbcpfdgig
+ikksmllfyvhyydmi
+sknufchjdvccccta
+wpdcrramajdoisxr
+grnqkjfxofpwjmji
+lkffhxonjskyccoh
+npnzshnoaqayhpmb
+fqpvaamqbrnatjia
+oljkoldhfggkfnfc
+ihpralzpqfrijynm
+gvaxadkuyzgbjpod
+onchdguuhrhhspen
+uefjmufwlioenaus
+thifdypigyihgnzo
+ugqblsonqaxycvkg
+yevmbiyrqdqrmlbw
+bvpvwrhoyneorcmm
+gbyjqzcsheaxnyib
+knhsmdjssycvuoqf
+nizjxiwdakpfttyh
+nwrkbhorhfqqoliz
+ynsqwvwuwzqpzzwp
+yitscrgexjfclwwh
+dhajwxqdbtrfltzz
+bmrfylxhthiaozpv
+frvatcvgknjhcndw
+xlvtdmpvkpcnmhya
+pxpemuzuqzjlmtoc
+dijdacfteteypkoq
+knrcdkrvywagglnf
+fviuajtspnvnptia
+xvlqzukmwbcjgwho
+bazlsjdsjoeuvgoz
+nslzmlhosrjarndj
+menvuwiuymknunwm
+uavfnvyrjeiwqmuu
+yrfowuvasupngckz
+taevqhlrcohlnwye
+skcudnogbncusorn
+omtnmkqnqedsajfv
+yqmgsqdgsuysqcts
+odsnbtyimikkbmdd
+vuryaohxdvjllieb
+dhaxldeywwsfamlo
+opobvtchezqnxpak
+pzfnegouvsrfgvro
+rzkcgpxdslzrdktu
+ksztdtqzxvhuryam
+ctnqnhkcooqipgkh
+pyqbbvrzdittqbgm
+koennvmolejeftij
+rvzlreqikqlgyczj
+xrnujfoyhonzkdgd
+mmsmhkxaiqupfjil
+ypjwoemqizddvyfd
+qgugcxnbhvgahykj
+cviodlsrtimbkgmy
+xbfbbechhmrjxhnw
+psuipaoucfczfxkp
+hdhwcpeuptgqqvim
+gsxlruhjeaareilr
+vgyqonnljuznyrhk
+eewezahlumervpyu
+iiolebrxfadtnigy
+tdadlrodykrdfscn
+ocvdtzjxrhtjurpo
+gidljbuvuovkhhrf
+qwfcpilbjwzboohd
+xzohxonlezuiupbg
+vslpbkkqgvgbcbix
+pivzqrzfxosbstzn
+fyqcfboevcqmbhhs
+yqsrneacnlxswojx
+heicqpxxyrwcbsjz
+yzynmnnoumkmlbeh
+bncadbjdvvmczylw
+hlnjskgfzbgmigfn
+fphpszymugpcykka
+zbifcktanxpmufvy
+saklpkhoyfeqbguy
+nqtqfcfxmpivnjyo
+locygrwerxlsvzqm
+qqflecydqvlogjme
+njklmixvgkzpgppf
+ugzkpjwjflaswyma
+lriousvkbeftslcy
+nsvsauxzfbbotgmh
+tblcpuhjyybrlica
+hqwshxcilwtmxrsf
+xojwroydfeoqupup
+tikuzsrogpnohpib
+layenyqgxdfggloc
+nqsvjvbrpuxkqvmq
+ivchgxkdlfjdzxmk
+uoghiuosiiwiwdws
+twsgsfzyszsfinlc
+waixcmadmhtqvcmd
+zkgitozgrqehtjkw
+xbkmyxkzqyktmpfi
+qlyapfmlybmatwxn
+ntawlvcpuaebuypf
+clhebxqdkcyndyof
+nrcxuceywiklpemc
+lmurgiminxpapzmq
+obalwqlkykzflxou
+huvcudpiryefbcye
+zlxbddpnyuyapach
+gqfwzfislmwzyegy
+jhynkjtxedmemlob
+hmrnvjodnsfiukex
+pstmikjykzyavfef
+wuwpnscrwzsyalyt
+hksvadripgdgwynm
+tvpfthzjleqfxwkh
+xpmrxxepkrosnrco
+qjkqecsnevlhqsly
+jjnrfsxzzwkhnwdm
+pehmzrzsjngccale
+bsnansnfxduritrr
+ejzxkefwmzmbxhlb
+pceatehnizeujfrs
+jtidrtgxopyeslzl
+sytaoidnamfwtqcr
+iabjnikomkgmyirr
+eitavndozoezojsi
+wtsbhaftgrbqfsmm
+vvusvrivsmhtfild
+qifbtzszfyzsjzyx
+ifhhjpaqatpbxzau
+etjqdimpyjxiuhty
+fvllmbdbsjozxrip
+tjtgkadqkdtdlkpi
+xnydmjleowezrecn
+vhcbhxqalroaryfn
+scgvfqsangfbhtay
+lbufpduxwvdkwhmb
+tshipehzspkhmdoi
+gtszsebsulyajcfl
+dlrzswhxajcivlgg
+kgjruggcikrfrkrw
+xxupctxtmryersbn
+hljjqfjrubzozxts
+giaxjhcwazrenjzs
+tyffxtpufpxylpye
+jfugdxxyfwkzqmgv
+kbgufbosjghahacw
+xpbhhssgegmthwxb
+npefofiharjypyzk
+velxsseyxuhrpycy
+sglslryxsiwwqzfw
+susohnlpelojhklv
+lfnpqfvptqhogdmk
+vtcrzetlekguqyle
+jlyggqdtamcjiuxn
+olxxqfgizjmvigvl
+cyypypveppxxxfuq
+hewmxtlzfqoqznwd
+jzgxxybfeqfyzsmp
+xzvvndrhuejnzesx
+esiripjpvtqqwjkv
+xnhrwhjtactofwrd
+knuzpuogbzplofqx
+tihycsdwqggxntqk
+xkfywvvugkdalehs
+cztwdivxagtqjjel
+dsaslcagopsbfioy
+gmowqtkgrlqjimbl
+ctcomvdbiatdvbsd
+gujyrnpsssxmqjhz
+nygeovliqjfauhjf
+mmgmcvnuppkbnonz
+bhipnkoxhzcotwel
+wkwpgedgxvpltqid
+mliajvpdocyzcbot
+kqjhsipuibyjuref
+zqdczykothbgxwsy
+koirtljkuqzxioaz
+audpjvhmqzvhzqas
+cxyhxlhntyidldfx
+iasgocejboxjgtkx
+abehujmqotwcufxp
+fmlrzqmazajxeedl
+knswpkekbacuxfby
+yvyalnvrxgstqhxm
+sjnrljfrfuyqfwuw
+ssaqruwarlvxrqzm
+iaxbpeqqzlcwfqjz
+uwyxshjutkanvvsc
+uxwrlwbblcianvnb
+nodtifgrxdojhneh
+mloxjfusriktxrms
+lkfzrwulbctupggc
+gcrjljatfhitcgfj
+tkdfxeanwskaivqs
+ypyjxqtmitwubbgt
+ssxbygzbjsltedjj
+zdrsnoorwqfalnha
+xlgmissaiqmowppd
+azhbwhiopwpguiuo
+fydlahgxtekbweet
+qtaveuqpifprdoiy
+kpubqyepxqleucem
+wlqrgqmnupwiuory
+rwyocktuqkuhdwxz
+abzjfsdevoygctqv
+zsofhaqqghncmzuw
+lqbjwjqxqbfgdckc
+bkhyxjkrqbbunido
+yepxfjnnhldidsjb
+builayfduxbppafc
+wedllowzeuswkuez
+gverfowxwtnvgrmo
+tpxycfumxdqgntwf
+lqzokaoglwnfcolw
+yqsksyheyspmcdqt
+vufvchcjjcltwddl
+saeatqmuvnoacddt
+dxjngeydvsjbobjs
+ucrcxoakevhsgcep
+cajgwjsfxkasbayt
+hknzmteafsfemwuv
+xxwhxwiinchqqudr
+usfenmavvuevevgr
+kxcobcwhsgyizjok
+vhqnydeboeunnvyk
+bgxbwbxypnxvaacw
+bwjzdypacwgervgk
+rrioqjluawwwnjcr
+fiaeyggmgijnasot
+xizotjsoqmkvhbzm
+uzphtrpxwfnaiidz
+kihppzgvgyoncptg
+hfbkfrxwejdeuwbz
+zgqthtuaqyrxicdy
+zitqdjnnwhznftze
+jnzlplsrwovxlqsn
+bmwrobuhwnwivpca
+uuwsvcdnoyovxuhn
+nmfvoqgoppoyosaj
+hxjkcppaisezygpe
+icvnysgixapvtoos
+vbvzajjgrmjygkhu
+jinptbqkyqredaos
+dpmknzhkhleawfvz
+ouwwkfhcedsgqqxe
+owroouiyptrijzgv
+bewnckpmnbrmhfyu
+evdqxevdacsbfbjb
+catppmrovqavxstn
+dqsbjibugjkhgazg
+mkcldhjochtnvvne
+sblkmhtifwtfnmsx
+lynnaujghehmpfpt
+vrseaozoheawffoq
+ytysdzbpbazorqes
+sezawbudymfvziff
+vrlfhledogbgxbau
+bipdlplesdezbldn
+ermaenjunjtbekeo
+eyaedubkthdecxjq
+gbzurepoojlwucuy
+rsiaqiiipjlouecx
+beqjhvroixhiemtw
+buzlowghhqbcbdwv
+ldexambveeosaimo
+fpyjzachgrhxcvnx
+komgvqejojpnykol
+fxebehjoxdujwmfu
+jnfgvheocgtvmvkx
+qmcclxxgnclkuspx
+rsbelzrfdblatmzu
+vexzwqjqrsenlrhm
+tnfbkclwetommqmh
+lzoskleonvmprdri
+nnahplxqscvtgfwi
+ubqdsflhnmiayzrp
+xtiyqxhfyqonqzrn
+omdtmjeqhmlfojfr
+cnimgkdbxkkcnmkb
+tapyijgmxzbmqnks
+byacsxavjboovukk
+awugnhcrygaoppjq
+yxcnwrvhojpuxehg
+btjdudofhxmgqbao
+nzqlfygiysfuilou
+nubwfjdxavunrliq
+vqxmmhsbmhlewceh
+ygavmcybepzfevrp
+kgflmrqsvxprkqgq
+iaqyqmcaedscmakk
+cvbojnbfmrawxzkh
+jjjrprbnlijzatuw
+lcsudrrfnnggbrmk
+qzgxbiavunawfibc
+gnnalgfvefdfdwwg
+nokmiitzrigxavsc
+etzoxwzxqkkhvais
+urxxfacgjccieufi
+lqrioqhuvgcotuec
+dydbaeyoypsbftra
+hhrotenctylggzaf
+evctqvzjnozpdxzu
+tbpvithmorujxlcp
+pllbtcbrtkfpvxcw
+fzyxdqilyvqreowv
+xdleeddxwvqjfmmt
+fcldzthqqpbswoin
+sgomzrpjfmvgwlzi
+axjyskmtdjbxpwoz
+hcvaevqxsmabvswh
+lfdlsfcwkwicizfk
+isjbwpzdognhoxvm
+oqnexibqxlyxpluh
+zqfbgodsfzwgcwuf
+kvmnwruwsjllbldz
+kghazimdyiyhmokj
+uiktgpsxpoahofxn
+zkdwawxargcmidct
+ftbixlyiprshrjup
+nofhmbxififwroeg
+mcdaqrhplffxrcdt
+fbjxnwojcvlawmlb
+rizoftvwfdhiwyac
+eduogrtyhxfwyars
+zoikunqxgjwfqqwr
+zxwbbpmvctzezaqh
+nghujwyeabwdqnop
+vcxamijpoyyksogn
+jnckdbuteoqlsdae
+jurfqqawafmsiqwv
+inepmztrzehfafie
+tznzkyvzodbrtscf
+xewbavjeppflwscl
+ucndzsorexjlnplo
+jpxbctscngxgusvu
+mfmygcllauzuoaok
+oibkuxhjmhxhhzby
+zjkslwagmeoisunw
+avnnxmopdgvmukuu
+jmaargejcwboqhkt
+yacmpeosarsrfkrv
+iqhgupookcaovwgh
+ebjkdnxwtikqzufc
+imdhbarytcscbsvb
+ifyibukeffkbqvcr
+aloighmyvwybtxhx
+yszqwrutbkiwkxjg
+xyholyzlltjhsuhp
+gykhmrwucneoxcrf
+badkdgqrpjzbabet
+sunaucaucykwtkjj
+pumqkglgfdhneero
+usgtyuestahlydxq
+xmfhflphzeudjsjm
+knywgmclisgpootg
+mtojnyrnvxtweuzb
+uuxufbwfegysabww
+vobhwwocqttlbsik
+yuydfezeqgqxqmnd
+wbqgqkwbibiilhzc
+sfdmgxsbuzsawush
+ilhbxcfgordyxwvp
+ahqoavuysblnqaeg
+plwgtvpgotskmsey
+ewjcmzkcnautrrmp
+tyekgzbznlikcyqj
+bqzctiuaxpriuiga
+bimvbfjkiupyqiys
+mpqtbcxfhwymxncw
+htemlptvqhharjgb
+mqbsmsruwzzxgcxc
+zjyedjwhnvteuaid
+pzoelkoidwglpttc
+efydnsvlfimvwxhx
+gfyhgoeiyjcgfyze
+deqtomhwopmzvjlt
+casafubtkoopuaju
+yylsfarntbucfulg
+mgjwsormkjsrrxan
+lkkenpupgmjpnqqd
+tegweszyohsoluot
+lihsfdwxmxvwdxna
+rrefrjjxerphejwb
+guuazonjoebhymtm
+ysofqzmfmyneziki
+lmjgaliatcpduoal
+qzthcpjwtgahbebr
+wvakvephyukmpemm
+simxacxxzfoaeddw
+aetgqmiqzxbvbviz
+jxlmhdmqggevrxes
+mmuglnjmuddzgaik
+svopsqhtrslgycgc
+xnvcsiiqrcjkvecn
+kkvumxtvashxcops
+bduflsdyeectvcgl
+vfrxbwmmytjvqnsj
+eeqtdneiyiaiofxw
+crtbgknfacjtwkfl
+uuutuoxdsxolpbhd
+lcrztwzreaswovtn
+htorkvnvujmjdqzj
+wttzuzvrzlyhfzyf
+oraewznfwgdsnhuk
+rctlkqqvkwbgrcgk
+cfehrsrqhzyiwtmz
+kbvxwcumjkhvjpui
+xxlocexbmniiakfo
+gtknkkzvykmlqghl
+kcjuxvkuimhwqrtk
+vohekwkuyuoacuww
+vorctgughscysyfo
+zmjevqplngzswxyq
+qhswdrhrijnatkyo
+joakcwpfggtitizs
+juzlwjijcmtswdtq
+icbyaqohpkemhkip
+rpdxgpzxncedmvzh
+rozkmimbqhbhcddv
+wkkypomlvyglpfpf
+jcaqyaqvsefwtaya
+ghvmtecoxlebdwnf
+lqrcyiykkkpkxvqt
+eqlarfazchmzotev
+vqwndafvmpguggef
+dbfxzrdkkrusmdke
+cmjpjjgndozcmefj
+hbrdcwjuyxapyhlo
+mmforetykbosdwce
+zynfntqwblbnfqik
+sodwujfwlasznaiz
+yyvrivjiqnxzqkfp
+uldbskmmjbqllpnm
+fyhhrmrsukeptynl
+hpfjekktvdkgdkzl
+bozhkoekcxzeorob
+uvpptyfrzkvmtoky
+hkhfprmjdpjvfkcb
+igxzwktwsqhsivqu
+qceomwysgkcylipb
+cglateoynluyeqgc
+xcsdfkpeguxgvpfh
+owjhxlcncdgkqyia
+rpbmrpcesiakqpna
+lueszxiourxsmezb
+zelvsowimzkxliwc
+vzxbttoobtvdtkca
+pfxvzphzwscqkzsi
+edsjorainowytbzu
+ipsegdaluoiphmnz
+mkhueokfpemywvuw
+urxdnumhylpafdlc
+ggluurzavsxkvwkl
+ctclphidqgteakox
+tfobosynxsktajuk
+jzrmemhxqmzhllif
+eemwekimdfvqslsx
+yjkwpzrbanoaajgq
+rlxghzanuyeimfhx
+hozbgdoorhthlqpv
+obkbmflhyanxilnx
+xojrippyxjmpzmsz
+ukykmbfheixuviue
+qivlmdexwucqkres
+rmyxxipqkarpjmox
+fgaftctbvcvnrror
+raawxozucfqvasru
+dinpjbdfjfizexdh
+gybxubwnnbuyvjcr
+qrqitdvyoneqyxcg
+jqzcfggayzyoqteo
+cikqpvxizpdbmppm
+stfpldgyhfmucjjv
+slzbcuihmimpduri
+aufajwfrsorqqsnl
+iylmzraibygmgmqj
+lcdyfpcqlktudfmu
+pmomzzsdpvgkkliw
+zpplirgtscfhbrkj
+mvhyerxfiljlotjl
+ofkvrorwwhusyxjx
+xngzmvcgkqfltjpe
+yxfxaqipmysahqqq
+sdqafdzgfdjuabup
+qcqajmerahcdgxfv
+xqimrqtupbapawro
+qfvkqwidzzrehsbl
+himixxvueksiqfdf
+vgtfqpuzxxmhrvvd
+adiioqeiejguaost
+jnzxuycjxvxehbvm
+xedbpxdhphamoodk
+jsrioscmwlsfuxrg
+mtsynnfxunuohbnf
+enamqzfzjunnnkpe
+uwcvfecunobyhces
+ciygixtgbsccpftq
+ewjgcronizkcsfjy
+wztjkoipxsikoimv
+jrgalyvfelwxforw
+imylyalawbqwkrwb
+yflwqfnuuvgjsgcj
+wkysyzusldlojoue
+zopllxnidcffcuau
+bscgwxuprxaerskj
+zvnvprxxjkhnkkpq
+nejwxbhjxxdbenid
+chryiccsebdbcnkc
+guoeefaeafhlgvxh
+nzapxrfrrqhsingx
+mkzvquzvqvwsejqs
+kozmlmbchydtxeeo
+keylygnoqhmfzrfp
+srwzoxccndoxylxe
+uqjzalppoorosxxo
+potmkinyuqxsfdfw
+qkkwrhpbhypxhiun
+wgfvnogarjmdbxyh
+gkidtvepcvxopzuf
+atwhvmmdvmewhzty
+pybxizvuiwwngqej
+zfumwnazxwwxtiry
+keboraqttctosemx
+vtlzxaqdetbhclib
+wjiecykptzexuayl
+ejatfnyjjdawepyk
+mpcrobansyssvmju
+gqukndzganeueabm
+ukzscvomorucdnqd
+wfydhtbzehgwfazx
+mtwqdzlephqvxqmx
+dltmlfxbjopefibh
+atcfrowdflluqtbi
+vowawlophlxaqonw
+vblgdjzvwnocdipw
+uzerzksmkvnlvlhm
+ytjwhpaylohorvxd
+siprvfxvnxcdgofz
+cbhjupewcyjhvtgs
+apqtozaofusmfqli
+tmssrtlxfouowqnr
+ntutrvwnzzgmokes
+zrsgpwdzokztdpis
+nrobvmsxtfmrqdhv
+kadkaftffaziqdze
+yrovbgcyqtlsnoux
+modheiwuhntdecqs
+gzhjypwddizemnys
+gaputpwpcsvzxjho
+bgmouxwoajgaozau
+oxuapfrjcpyakiwt
+kntwbvhuaahdixzj
+epqjdjbnkxdnaccx
+dspltdvznhypykri
+tdrgqmbnagrxdwtt
+njfqawzjggmemtbg
+chpemsgwpzjpdnkk
+fpsrobmbqbmigmwk
+flxptsrqaazmprnl
+nzdunrxlcbfklshm
+miuwljvtkgzdlbnn
+xbhjakklmbhsdmdt
+xwxhsbnrwnegwcov
+pwosflhodjaiexwq
+fhgepuluczttfvqh
+tldxcacbvxyamvkt
+gffxatrjglkcehim
+tzotkdrpxkucsdps
+wxheftdepysvmzbe
+qfooyczdzoewrmku
+rvlwikuqdbpjuvoo
+bcbrnbtfrdgijtzt
+vaxqmvuogsxonlgq
+ibsolflngegravgo
+txntccjmqakcoorp
+vrrbmqaxfbarmlmc
+dzspqmttgsuhczto
+pikcscjunxlwqtiw
+lwzyogwxqitqfqlv
+gsgjsuaqejtzglym
+feyeqguxbgmcmgpp
+gmttebyebdwvprkn
+mzuuwbhzdjfdryxu
+fganrbnplymqbzjx
+cvsrbdcvhtxxdmro
+scmgkjlkqukoamyp
+fkgrqbyqpqcworqc
+hjsrvkdibdjarxxb
+sztzziuqroeidcus
+pxdfvcpvwaddrzwv
+phdqqxleqdjfgfbg
+cqfikbgxvjmnfncy
diff --git a/2015/input/2015_6.txt b/2015/input/2015_6.txt
new file mode 100644
index 0000000..df10465
--- /dev/null
+++ b/2015/input/2015_6.txt
@@ -0,0 +1,300 @@
+turn on 489,959 through 759,964
+turn off 820,516 through 871,914
+turn off 427,423 through 929,502
+turn on 774,14 through 977,877
+turn on 410,146 through 864,337
+turn on 931,331 through 939,812
+turn off 756,53 through 923,339
+turn off 313,787 through 545,979
+turn off 12,823 through 102,934
+toggle 756,965 through 812,992
+turn off 743,684 through 789,958
+toggle 120,314 through 745,489
+toggle 692,845 through 866,994
+turn off 587,176 through 850,273
+turn off 674,321 through 793,388
+toggle 749,672 through 973,965
+turn on 943,30 through 990,907
+turn on 296,50 through 729,664
+turn on 212,957 through 490,987
+toggle 171,31 through 688,88
+turn off 991,989 through 994,998
+turn off 913,943 through 958,953
+turn off 278,258 through 367,386
+toggle 275,796 through 493,971
+turn off 70,873 through 798,923
+toggle 258,985 through 663,998
+turn on 601,259 through 831,486
+turn off 914,94 through 941,102
+turn off 558,161 through 994,647
+turn on 119,662 through 760,838
+toggle 378,775 through 526,852
+turn off 384,670 through 674,972
+turn off 249,41 through 270,936
+turn on 614,742 through 769,780
+turn on 427,70 through 575,441
+turn on 410,478 through 985,753
+turn off 619,46 through 931,342
+turn on 284,55 through 768,922
+turn off 40,592 through 728,685
+turn on 825,291 through 956,950
+turn on 147,843 through 592,909
+turn off 218,675 through 972,911
+toggle 249,291 through 350,960
+turn off 556,80 through 967,675
+toggle 609,148 through 968,279
+toggle 217,605 through 961,862
+toggle 407,177 through 548,910
+toggle 400,936 through 599,938
+turn off 721,101 through 925,455
+turn on 268,631 through 735,814
+toggle 549,969 through 612,991
+toggle 553,268 through 689,432
+turn off 817,668 through 889,897
+toggle 801,544 through 858,556
+toggle 615,729 through 832,951
+turn off 427,477 through 958,948
+turn on 164,49 through 852,946
+turn on 542,449 through 774,776
+turn off 923,196 through 980,446
+toggle 90,310 through 718,846
+turn off 657,215 through 744,252
+turn off 800,239 through 811,712
+turn on 502,90 through 619,760
+toggle 649,512 through 862,844
+turn off 334,903 through 823,935
+turn off 630,233 through 839,445
+turn on 713,67 through 839,865
+turn on 932,50 through 982,411
+turn off 480,729 through 984,910
+turn on 100,219 through 796,395
+turn on 758,108 through 850,950
+turn off 427,276 through 439,938
+turn on 178,284 through 670,536
+toggle 540,27 through 625,102
+turn off 906,722 through 936,948
+toggle 345,418 through 859,627
+toggle 175,775 through 580,781
+toggle 863,28 through 929,735
+turn off 824,858 through 905,973
+toggle 752,312 through 863,425
+turn on 985,716 through 988,852
+turn off 68,504 through 763,745
+toggle 76,209 through 810,720
+turn off 657,607 through 676,664
+toggle 596,869 through 896,921
+turn off 915,411 through 968,945
+turn off 368,39 through 902,986
+turn on 11,549 through 393,597
+turn off 842,893 through 976,911
+toggle 274,106 through 581,329
+toggle 406,403 through 780,950
+toggle 408,988 through 500,994
+toggle 217,73 through 826,951
+turn on 917,872 through 961,911
+toggle 394,34 through 510,572
+toggle 424,603 through 583,626
+toggle 106,159 through 755,738
+turn off 244,610 through 472,709
+turn on 350,265 through 884,690
+turn on 688,184 through 928,280
+toggle 279,443 through 720,797
+turn off 615,493 through 888,610
+toggle 118,413 through 736,632
+turn on 798,782 through 829,813
+turn off 250,934 through 442,972
+turn on 68,503 through 400,949
+toggle 297,482 through 313,871
+toggle 710,3 through 839,859
+turn on 125,300 through 546,888
+toggle 482,39 through 584,159
+turn off 536,89 through 765,962
+turn on 530,518 through 843,676
+turn on 994,467 through 994,676
+turn on 623,628 through 744,927
+toggle 704,912 through 837,983
+turn on 154,364 through 517,412
+toggle 344,409 through 780,524
+turn off 578,740 through 725,879
+turn on 251,933 through 632,957
+turn on 827,705 through 971,789
+toggle 191,282 through 470,929
+toggle 324,525 through 446,867
+toggle 534,343 through 874,971
+toggle 550,650 through 633,980
+toggle 837,404 through 881,915
+toggle 338,881 through 845,905
+turn on 469,462 through 750,696
+turn on 741,703 through 892,870
+turn off 570,215 through 733,562
+turn on 445,576 through 870,775
+turn on 466,747 through 554,878
+turn off 820,453 through 868,712
+turn off 892,706 through 938,792
+turn off 300,238 through 894,746
+turn off 306,44 through 457,444
+turn off 912,569 through 967,963
+toggle 109,756 through 297,867
+turn on 37,546 through 41,951
+turn on 321,637 through 790,910
+toggle 66,50 through 579,301
+toggle 933,221 through 933,791
+turn on 486,676 through 878,797
+turn on 417,231 through 556,317
+toggle 904,468 through 981,873
+turn on 417,675 through 749,712
+turn on 692,371 through 821,842
+toggle 324,73 through 830,543
+turn on 912,490 through 977,757
+turn off 634,872 through 902,949
+toggle 266,779 through 870,798
+turn on 772,982 through 990,996
+turn off 607,46 through 798,559
+turn on 295,602 through 963,987
+turn on 657,86 through 944,742
+turn off 334,639 through 456,821
+turn off 997,667 through 997,670
+turn off 725,832 through 951,945
+turn off 30,120 through 952,984
+turn on 860,965 through 917,976
+toggle 471,997 through 840,998
+turn off 319,307 through 928,504
+toggle 823,631 through 940,908
+toggle 969,984 through 981,993
+turn off 691,319 through 865,954
+toggle 911,926 through 938,929
+turn on 953,937 through 968,991
+toggle 914,643 through 975,840
+turn on 266,982 through 436,996
+turn off 101,896 through 321,932
+turn off 193,852 through 751,885
+turn off 576,532 through 863,684
+turn on 761,456 through 940,783
+turn on 20,290 through 398,933
+turn off 435,335 through 644,652
+turn on 830,569 through 905,770
+turn off 630,517 through 905,654
+turn on 664,53 through 886,976
+toggle 275,416 through 408,719
+turn on 370,621 through 515,793
+turn on 483,373 through 654,749
+turn on 656,786 through 847,928
+turn off 532,752 through 945,974
+toggle 301,150 through 880,792
+turn off 951,488 through 958,952
+turn on 207,729 through 882,828
+toggle 694,532 through 973,961
+toggle 676,639 through 891,802
+turn off 653,6 through 905,519
+toggle 391,109 through 418,312
+turn on 877,423 through 957,932
+turn on 340,145 through 563,522
+turn off 978,467 through 988,895
+turn off 396,418 through 420,885
+turn off 31,308 through 816,316
+turn on 107,675 through 758,824
+turn on 61,82 through 789,876
+turn on 750,743 through 754,760
+toggle 88,733 through 736,968
+turn off 754,349 through 849,897
+toggle 157,50 through 975,781
+turn off 230,231 through 865,842
+turn off 516,317 through 630,329
+turn off 697,820 through 829,903
+turn on 218,250 through 271,732
+toggle 56,167 through 404,431
+toggle 626,891 through 680,927
+toggle 370,207 through 791,514
+toggle 860,74 through 949,888
+turn on 416,527 through 616,541
+turn off 745,449 through 786,908
+turn on 485,554 through 689,689
+turn on 586,62 through 693,141
+toggle 506,759 through 768,829
+turn on 473,109 through 929,166
+turn on 760,617 through 773,789
+toggle 595,683 through 618,789
+turn off 210,775 through 825,972
+toggle 12,426 through 179,982
+turn on 774,539 through 778,786
+turn on 102,498 through 121,807
+turn off 706,897 through 834,965
+turn off 678,529 through 824,627
+turn on 7,765 through 615,870
+turn off 730,872 through 974,943
+turn off 595,626 through 836,711
+turn off 215,424 through 841,959
+toggle 341,780 through 861,813
+toggle 507,503 through 568,822
+turn on 252,603 through 349,655
+toggle 93,521 through 154,834
+turn on 565,682 through 951,954
+turn on 544,318 through 703,418
+toggle 756,953 through 891,964
+turn on 531,123 through 856,991
+turn on 148,315 through 776,559
+turn off 925,835 through 963,971
+turn on 895,944 through 967,964
+turn off 102,527 through 650,747
+toggle 626,105 through 738,720
+turn off 160,75 through 384,922
+toggle 813,724 through 903,941
+turn on 207,107 through 982,849
+toggle 750,505 through 961,697
+toggle 105,410 through 885,819
+turn on 226,104 through 298,283
+turn off 224,604 through 508,762
+turn on 477,368 through 523,506
+turn off 477,901 through 627,936
+turn off 887,131 through 889,670
+turn on 896,994 through 938,999
+toggle 401,580 through 493,728
+toggle 987,184 through 991,205
+turn on 821,643 through 882,674
+toggle 784,940 through 968,959
+turn off 251,293 through 274,632
+turn off 339,840 through 341,844
+turn off 675,351 through 675,836
+toggle 918,857 through 944,886
+toggle 70,253 through 918,736
+turn off 612,604 through 772,680
+turn off 277,40 through 828,348
+toggle 692,139 through 698,880
+toggle 124,446 through 883,453
+toggle 969,932 through 990,945
+toggle 855,692 through 993,693
+toggle 722,472 through 887,899
+toggle 978,149 through 985,442
+toggle 837,540 through 916,889
+turn off 612,2 through 835,82
+toggle 560,767 through 878,856
+turn on 461,734 through 524,991
+toggle 206,824 through 976,912
+turn on 826,610 through 879,892
+turn on 577,699 through 956,933
+turn off 9,250 through 50,529
+turn off 77,657 through 817,677
+turn on 68,419 through 86,426
+turn on 991,720 through 992,784
+turn on 668,20 through 935,470
+turn off 133,418 through 613,458
+turn off 487,286 through 540,328
+toggle 247,874 through 840,955
+toggle 301,808 through 754,970
+turn off 34,194 through 578,203
+turn off 451,49 through 492,921
+turn on 907,256 through 912,737
+turn off 479,305 through 702,587
+turn on 545,583 through 732,749
+toggle 11,16 through 725,868
+turn on 965,343 through 986,908
+turn on 674,953 through 820,965
+toggle 398,147 through 504,583
+turn off 778,194 through 898,298
+turn on 179,140 through 350,852
+turn off 241,118 through 530,832
+turn off 41,447 through 932,737
+turn off 820,663 through 832,982
+turn on 550,460 through 964,782
+turn on 31,760 through 655,892
+toggle 628,958 through 811,992
diff --git a/2015/input/2015_7.txt b/2015/input/2015_7.txt
new file mode 100644
index 0000000..56cae92
--- /dev/null
+++ b/2015/input/2015_7.txt
@@ -0,0 +1,339 @@
+af AND ah -> ai
+NOT lk -> ll
+hz RSHIFT 1 -> is
+NOT go -> gp
+du OR dt -> dv
+x RSHIFT 5 -> aa
+at OR az -> ba
+eo LSHIFT 15 -> es
+ci OR ct -> cu
+b RSHIFT 5 -> f
+fm OR fn -> fo
+NOT ag -> ah
+v OR w -> x
+g AND i -> j
+an LSHIFT 15 -> ar
+1 AND cx -> cy
+jq AND jw -> jy
+iu RSHIFT 5 -> ix
+gl AND gm -> go
+NOT bw -> bx
+jp RSHIFT 3 -> jr
+hg AND hh -> hj
+bv AND bx -> by
+er OR es -> et
+kl OR kr -> ks
+et RSHIFT 1 -> fm
+e AND f -> h
+u LSHIFT 1 -> ao
+he RSHIFT 1 -> hx
+eg AND ei -> ej
+bo AND bu -> bw
+dz OR ef -> eg
+dy RSHIFT 3 -> ea
+gl OR gm -> gn
+da LSHIFT 1 -> du
+au OR av -> aw
+gj OR gu -> gv
+eu OR fa -> fb
+lg OR lm -> ln
+e OR f -> g
+NOT dm -> dn
+NOT l -> m
+aq OR ar -> as
+gj RSHIFT 5 -> gm
+hm AND ho -> hp
+ge LSHIFT 15 -> gi
+jp RSHIFT 1 -> ki
+hg OR hh -> hi
+lc LSHIFT 1 -> lw
+km OR kn -> ko
+eq LSHIFT 1 -> fk
+1 AND am -> an
+gj RSHIFT 1 -> hc
+aj AND al -> am
+gj AND gu -> gw
+ko AND kq -> kr
+ha OR gz -> hb
+bn OR by -> bz
+iv OR jb -> jc
+NOT ac -> ad
+bo OR bu -> bv
+d AND j -> l
+bk LSHIFT 1 -> ce
+de OR dk -> dl
+dd RSHIFT 1 -> dw
+hz AND ik -> im
+NOT jd -> je
+fo RSHIFT 2 -> fp
+hb LSHIFT 1 -> hv
+lf RSHIFT 2 -> lg
+gj RSHIFT 3 -> gl
+ki OR kj -> kk
+NOT ak -> al
+ld OR le -> lf
+ci RSHIFT 3 -> ck
+1 AND cc -> cd
+NOT kx -> ky
+fp OR fv -> fw
+ev AND ew -> ey
+dt LSHIFT 15 -> dx
+NOT ax -> ay
+bp AND bq -> bs
+NOT ii -> ij
+ci AND ct -> cv
+iq OR ip -> ir
+x RSHIFT 2 -> y
+fq OR fr -> fs
+bn RSHIFT 5 -> bq
+0 -> c
+14146 -> b
+d OR j -> k
+z OR aa -> ab
+gf OR ge -> gg
+df OR dg -> dh
+NOT hj -> hk
+NOT di -> dj
+fj LSHIFT 15 -> fn
+lf RSHIFT 1 -> ly
+b AND n -> p
+jq OR jw -> jx
+gn AND gp -> gq
+x RSHIFT 1 -> aq
+ex AND ez -> fa
+NOT fc -> fd
+bj OR bi -> bk
+as RSHIFT 5 -> av
+hu LSHIFT 15 -> hy
+NOT gs -> gt
+fs AND fu -> fv
+dh AND dj -> dk
+bz AND cb -> cc
+dy RSHIFT 1 -> er
+hc OR hd -> he
+fo OR fz -> ga
+t OR s -> u
+b RSHIFT 2 -> d
+NOT jy -> jz
+hz RSHIFT 2 -> ia
+kk AND kv -> kx
+ga AND gc -> gd
+fl LSHIFT 1 -> gf
+bn AND by -> ca
+NOT hr -> hs
+NOT bs -> bt
+lf RSHIFT 3 -> lh
+au AND av -> ax
+1 AND gd -> ge
+jr OR js -> jt
+fw AND fy -> fz
+NOT iz -> ja
+c LSHIFT 1 -> t
+dy RSHIFT 5 -> eb
+bp OR bq -> br
+NOT h -> i
+1 AND ds -> dt
+ab AND ad -> ae
+ap LSHIFT 1 -> bj
+br AND bt -> bu
+NOT ca -> cb
+NOT el -> em
+s LSHIFT 15 -> w
+gk OR gq -> gr
+ff AND fh -> fi
+kf LSHIFT 15 -> kj
+fp AND fv -> fx
+lh OR li -> lj
+bn RSHIFT 3 -> bp
+jp OR ka -> kb
+lw OR lv -> lx
+iy AND ja -> jb
+dy OR ej -> ek
+1 AND bh -> bi
+NOT kt -> ku
+ao OR an -> ap
+ia AND ig -> ii
+NOT ey -> ez
+bn RSHIFT 1 -> cg
+fk OR fj -> fl
+ce OR cd -> cf
+eu AND fa -> fc
+kg OR kf -> kh
+jr AND js -> ju
+iu RSHIFT 3 -> iw
+df AND dg -> di
+dl AND dn -> do
+la LSHIFT 15 -> le
+fo RSHIFT 1 -> gh
+NOT gw -> gx
+NOT gb -> gc
+ir LSHIFT 1 -> jl
+x AND ai -> ak
+he RSHIFT 5 -> hh
+1 AND lu -> lv
+NOT ft -> fu
+gh OR gi -> gj
+lf RSHIFT 5 -> li
+x RSHIFT 3 -> z
+b RSHIFT 3 -> e
+he RSHIFT 2 -> hf
+NOT fx -> fy
+jt AND jv -> jw
+hx OR hy -> hz
+jp AND ka -> kc
+fb AND fd -> fe
+hz OR ik -> il
+ci RSHIFT 1 -> db
+fo AND fz -> gb
+fq AND fr -> ft
+gj RSHIFT 2 -> gk
+cg OR ch -> ci
+cd LSHIFT 15 -> ch
+jm LSHIFT 1 -> kg
+ih AND ij -> ik
+fo RSHIFT 3 -> fq
+fo RSHIFT 5 -> fr
+1 AND fi -> fj
+1 AND kz -> la
+iu AND jf -> jh
+cq AND cs -> ct
+dv LSHIFT 1 -> ep
+hf OR hl -> hm
+km AND kn -> kp
+de AND dk -> dm
+dd RSHIFT 5 -> dg
+NOT lo -> lp
+NOT ju -> jv
+NOT fg -> fh
+cm AND co -> cp
+ea AND eb -> ed
+dd RSHIFT 3 -> df
+gr AND gt -> gu
+ep OR eo -> eq
+cj AND cp -> cr
+lf OR lq -> lr
+gg LSHIFT 1 -> ha
+et RSHIFT 2 -> eu
+NOT jh -> ji
+ek AND em -> en
+jk LSHIFT 15 -> jo
+ia OR ig -> ih
+gv AND gx -> gy
+et AND fe -> fg
+lh AND li -> lk
+1 AND io -> ip
+kb AND kd -> ke
+kk RSHIFT 5 -> kn
+id AND if -> ig
+NOT ls -> lt
+dw OR dx -> dy
+dd AND do -> dq
+lf AND lq -> ls
+NOT kc -> kd
+dy AND ej -> el
+1 AND ke -> kf
+et OR fe -> ff
+hz RSHIFT 5 -> ic
+dd OR do -> dp
+cj OR cp -> cq
+NOT dq -> dr
+kk RSHIFT 1 -> ld
+jg AND ji -> jj
+he OR hp -> hq
+hi AND hk -> hl
+dp AND dr -> ds
+dz AND ef -> eh
+hz RSHIFT 3 -> ib
+db OR dc -> dd
+hw LSHIFT 1 -> iq
+he AND hp -> hr
+NOT cr -> cs
+lg AND lm -> lo
+hv OR hu -> hw
+il AND in -> io
+NOT eh -> ei
+gz LSHIFT 15 -> hd
+gk AND gq -> gs
+1 AND en -> eo
+NOT kp -> kq
+et RSHIFT 5 -> ew
+lj AND ll -> lm
+he RSHIFT 3 -> hg
+et RSHIFT 3 -> ev
+as AND bd -> bf
+cu AND cw -> cx
+jx AND jz -> ka
+b OR n -> o
+be AND bg -> bh
+1 AND ht -> hu
+1 AND gy -> gz
+NOT hn -> ho
+ck OR cl -> cm
+ec AND ee -> ef
+lv LSHIFT 15 -> lz
+ks AND ku -> kv
+NOT ie -> if
+hf AND hl -> hn
+1 AND r -> s
+ib AND ic -> ie
+hq AND hs -> ht
+y AND ae -> ag
+NOT ed -> ee
+bi LSHIFT 15 -> bm
+dy RSHIFT 2 -> dz
+ci RSHIFT 2 -> cj
+NOT bf -> bg
+NOT im -> in
+ev OR ew -> ex
+ib OR ic -> id
+bn RSHIFT 2 -> bo
+dd RSHIFT 2 -> de
+bl OR bm -> bn
+as RSHIFT 1 -> bl
+ea OR eb -> ec
+ln AND lp -> lq
+kk RSHIFT 3 -> km
+is OR it -> iu
+iu RSHIFT 2 -> iv
+as OR bd -> be
+ip LSHIFT 15 -> it
+iw OR ix -> iy
+kk RSHIFT 2 -> kl
+NOT bb -> bc
+ci RSHIFT 5 -> cl
+ly OR lz -> ma
+z AND aa -> ac
+iu RSHIFT 1 -> jn
+cy LSHIFT 15 -> dc
+cf LSHIFT 1 -> cz
+as RSHIFT 3 -> au
+cz OR cy -> da
+kw AND ky -> kz
+lx -> a
+iw AND ix -> iz
+lr AND lt -> lu
+jp RSHIFT 5 -> js
+aw AND ay -> az
+jc AND je -> jf
+lb OR la -> lc
+NOT cn -> co
+kh LSHIFT 1 -> lb
+1 AND jj -> jk
+y OR ae -> af
+ck AND cl -> cn
+kk OR kv -> kw
+NOT cv -> cw
+kl AND kr -> kt
+iu OR jf -> jg
+at AND az -> bb
+jp RSHIFT 2 -> jq
+iv AND jb -> jd
+jn OR jo -> jp
+x OR ai -> aj
+ba AND bc -> bd
+jl OR jk -> jm
+b RSHIFT 1 -> v
+o AND q -> r
+NOT p -> q
+k AND m -> n
+as RSHIFT 2 -> at
diff --git a/2015/lib/2015/1.ex b/2015/lib/2015/1.ex
new file mode 100644
index 0000000..2cc6e16
--- /dev/null
+++ b/2015/lib/2015/1.ex
@@ -0,0 +1,26 @@
+import AOC
+
+aoc 2015, 1 do
+  def input_chars(), do: input_string() |> String.split("", trim: true)
+
+  def p1 do
+    input_chars()
+    |> Enum.reduce(0, fn
+      "(", floor -> floor + 1
+      ")", floor -> floor - 1
+    end)
+  end
+
+  def p2 do
+    input_string()
+    |> find_step_entering_basement(0, 0)
+  end
+
+  defp find_step_entering_basement(")" <> _, 0, step), do: step + 1
+
+  defp find_step_entering_basement("(" <> rest, floor, step),
+    do: find_step_entering_basement(rest, floor + 1, step + 1)
+
+  defp find_step_entering_basement(")" <> rest, floor, step),
+    do: find_step_entering_basement(rest, floor - 1, step + 1)
+end
diff --git a/2015/lib/2015/2.ex b/2015/lib/2015/2.ex
new file mode 100644
index 0000000..8b6ca3b
--- /dev/null
+++ b/2015/lib/2015/2.ex
@@ -0,0 +1,32 @@
+import AOC
+
+aoc 2015, 2 do
+  def dimensions_stream(),
+    do:
+      input_stream()
+      |> Stream.map(fn line ->
+        [l, w, h] = String.split(line, "x") |> Enum.map(&String.to_integer/1)
+        {l, w, h}
+      end)
+
+  def p1 do
+    dimensions_stream()
+    |> Stream.map(fn {l, w, h} ->
+      a = l * w
+      b = w * h
+      c = h * l
+      2 * a + 2 * b + 2 * c + Enum.min([a, b, c])
+    end)
+    |> Enum.sum()
+  end
+
+  def p2 do
+    dimensions_stream()
+    |> Stream.map(fn {l, w, h} ->
+      [x, y | _] = Enum.sort([l, w, h])
+
+      2 * x + 2 * y + l * w * h
+    end)
+    |> Enum.sum()
+  end
+end
diff --git a/2015/lib/2015/3.ex b/2015/lib/2015/3.ex
new file mode 100644
index 0000000..4c3f602
--- /dev/null
+++ b/2015/lib/2015/3.ex
@@ -0,0 +1,46 @@
+import AOC
+
+aoc 2015, 3 do
+  def input_chars(), do: input_string() |> String.split("", trim: true)
+
+  def p1 do
+    input_chars()
+    |> run()
+    |> then(fn {visited, _} -> MapSet.size(visited) end)
+  end
+
+  def p2 do
+    {santa, robo_santa} =
+      input_chars()
+      |> Enum.with_index()
+      |> Enum.split_with(fn {_, i} -> Integer.mod(i, 2) == 0 end)
+      |> then(fn {santa, robo_santa} ->
+        {without_index(santa), without_index(robo_santa)}
+      end)
+
+    {visited, _} = run(santa)
+    {visited, _} = run(robo_santa, visited)
+
+    MapSet.size(visited)
+  end
+
+  defp op("^"), do: {1, 0}
+  defp op(">"), do: {0, 1}
+  defp op("v"), do: {-1, 0}
+  defp op("<"), do: {0, -1}
+
+  defp add({x, y}, {a, b}), do: {x + a, y + b}
+
+  defp run(inst, visited \\ MapSet.new()) do
+    starting_position = {0, 0}
+    visited = MapSet.put(visited, starting_position)
+
+    Enum.reduce(inst, {visited, starting_position}, fn command, {visited, current_position} ->
+      current_position = add(current_position, op(command))
+      visited = MapSet.put(visited, current_position)
+      {visited, current_position}
+    end)
+  end
+
+  defp without_index(enum), do: Enum.map(enum, &elem(&1, 0))
+end
diff --git a/2015/lib/2015/4.ex b/2015/lib/2015/4.ex
new file mode 100644
index 0000000..f1e4bed
--- /dev/null
+++ b/2015/lib/2015/4.ex
@@ -0,0 +1,31 @@
+import AOC
+
+aoc 2015, 4 do
+  def p1 do
+    input_string()
+    |> String.trim()
+    |> mine_advent_coin(5)
+  end
+
+  defp mine_advent_coin(key, difficulty, nonce \\ 0)
+
+  defp mine_advent_coin(key, 5, nonce) do
+    case :erlang.md5(key <> Integer.to_string(nonce)) do
+      <<0::20, _::108>> -> nonce
+      _ -> mine_advent_coin(key, 5, nonce + 1)
+    end
+  end
+
+  defp mine_advent_coin(key, 6, nonce) do
+    case :erlang.md5(key <> Integer.to_string(nonce)) do
+      <<0::24, _::104>> -> nonce
+      _ -> mine_advent_coin(key, 6, nonce + 1)
+    end
+  end
+
+  def p2 do
+    input_string()
+    |> String.trim()
+    |> mine_advent_coin(6)
+  end
+end
diff --git a/2015/lib/2015/5.ex b/2015/lib/2015/5.ex
new file mode 100644
index 0000000..f941cdf
--- /dev/null
+++ b/2015/lib/2015/5.ex
@@ -0,0 +1,29 @@
+import AOC
+
+aoc 2015, 5 do
+  @deny_list ~w(ab cd pq xy)
+
+  def p1 do
+    input_stream()
+    |> Stream.filter(&is_string_nice_p1?/1)
+    |> Enum.count()
+  end
+
+  defp is_string_nice_p1?(str) do
+    contains_at_least_three_vowels = String.match?(str, ~r/(?:[aeiou].*){3}/)
+    contains_double_letter = String.match?(str, ~r/(\w)\1/)
+    does_not_contain_denylist = not Enum.any?(@deny_list, &String.contains?(str, &1))
+
+    contains_at_least_three_vowels and contains_double_letter and does_not_contain_denylist
+  end
+
+  def p2 do
+    input_stream()
+    |> Stream.filter(&is_string_nice_p2?/1)
+    |> Enum.count()
+  end
+
+  defp is_string_nice_p2?(str) do
+    String.match?(str, ~r/(\w)(\w).*\1\2/) and String.match?(str, ~r/(\w)\w\1/)
+  end
+end
diff --git a/2015/lib/2015/6.ex b/2015/lib/2015/6.ex
new file mode 100644
index 0000000..f3b8f55
--- /dev/null
+++ b/2015/lib/2015/6.ex
@@ -0,0 +1,82 @@
+import AOC
+
+aoc 2015, 6 do
+  import NimbleParsec
+
+  defparsec(
+    :coord,
+    integer(min: 1)
+    |> ignore(string(","))
+    |> integer(min: 1)
+    |> label("coordinate pair")
+  )
+
+  defparsec(
+    :command,
+    choice([
+      string("turn on"),
+      string("turn off"),
+      string("toggle")
+    ])
+    |> ignore(string(" "))
+    |> parsec(:coord)
+    |> ignore(string(" through "))
+    |> parsec(:coord)
+  )
+
+  def parse_command(line) do
+    command(line)
+    |> then(fn {:ok, v, _, _, _, _} -> v end)
+    |> then(fn
+      ["turn on", x1, y1, x2, y2] -> {:turn_on, {x1, y1}, {x2, y2}}
+      ["turn off", x1, y1, x2, y2] -> {:turn_off, {x1, y1}, {x2, y2}}
+      ["toggle", x1, y1, x2, y2] -> {:toggle, {x1, y1}, {x2, y2}}
+    end)
+  end
+
+  def command_stream(), do: input_stream() |> Stream.map(&parse_command/1)
+
+  def p1 do
+    lights = for x <- 0..999, y <- 0..999, into: %{}, do: {{x, y}, 0}
+
+    command_stream()
+    |> Enum.reduce(lights, fn
+      {:turn_on, from, to}, lights ->
+        set_range(lights, from, to, 1)
+
+      {:turn_off, from, to}, lights ->
+        set_range(lights, from, to, 0)
+
+      {:toggle, from, to}, lights ->
+        update_range(lights, from, to, fn
+          0 -> 1
+          1 -> 0
+        end)
+    end)
+    |> Map.values()
+    |> Enum.sum()
+  end
+
+  def p2 do
+    lights = for x <- 0..999, y <- 0..999, into: %{}, do: {{x, y}, 0}
+
+    command_stream()
+    |> Enum.reduce(lights, fn
+      {:turn_on, from, to}, lights -> update_range(lights, from, to, &(&1 + 1))
+      {:turn_off, from, to}, lights -> update_range(lights, from, to, &max(0, &1 - 1))
+      {:toggle, from, to}, lights -> update_range(lights, from, to, &(&1 + 2))
+    end)
+    |> Map.values()
+    |> Enum.sum()
+  end
+
+  def set_range(map, from, to, value), do: update_range(map, from, to, always(value))
+
+  def update_range(map, {x1, y1}, {x2, y2}, fun) do
+    for x <- x1..x2, y <- y1..y2, reduce: map do
+      map -> Map.update!(map, {x, y}, fun)
+    end
+  end
+
+  def always(v), do: fn _ -> v end
+end
diff --git a/2015/lib/2015/7.ex b/2015/lib/2015/7.ex
new file mode 100644
index 0000000..a166bc7
--- /dev/null
+++ b/2015/lib/2015/7.ex
@@ -0,0 +1,14 @@
+import AOC
+
+aoc 2015, 7 do
+  import NimbleParsec
+
+  def parse_inst(line) do
+  end
+
+  def p1 do
+  end
+
+  def p2 do
+  end
+end
diff --git a/2015/lib/advent_of_code2015.ex b/2015/lib/advent_of_code2015.ex
new file mode 100644
index 0000000..645ed7b
--- /dev/null
+++ b/2015/lib/advent_of_code2015.ex
@@ -0,0 +1,18 @@
+defmodule AdventOfCode2015 do
+  @moduledoc """
+  Documentation for `AdventOfCode2015`.
+  """
+
+  @doc """
+  Hello world.
+
+  ## Examples
+
+      iex> AdventOfCode2015.hello()
+      :world
+
+  """
+  def hello do
+    :world
+  end
+end
diff --git a/2015/mix.exs b/2015/mix.exs
new file mode 100644
index 0000000..02415aa
--- /dev/null
+++ b/2015/mix.exs
@@ -0,0 +1,30 @@
+defmodule AdventOfCode2015.MixProject do
+  use Mix.Project
+
+  def project do
+    [
+      app: :advent_of_code_2015,
+      version: "0.1.0",
+      elixir: "~> 1.12",
+      start_permanent: Mix.env() == :prod,
+      deps: deps()
+    ]
+  end
+
+  # Run "mix help compile.app" to learn about applications.
+  def application do
+    [
+      extra_applications: [:logger]
+    ]
+  end
+
+  # Run "mix help deps" to learn about dependencies.
+  defp deps do
+    [
+      {:advent_of_code_utils, "~> 1.0"},
+      {:exla, "~> 0.1.0-dev", github: "elixir-nx/nx", sparse: "exla"},
+      {:nimble_parsec, "~> 1.0"},
+      {:nx, "~> 0.1.0-dev", github: "elixir-nx/nx", sparse: "nx", override: true}
+    ]
+  end
+end
diff --git a/2015/mix.lock b/2015/mix.lock
new file mode 100644
index 0000000..767627d
--- /dev/null
+++ b/2015/mix.lock
@@ -0,0 +1,8 @@
+%{
+  "advent_of_code_utils": {:hex, :advent_of_code_utils, "1.0.0", "e9ce8be22988e095991168e9d2dde802afc213aaae64491e9fde84dd877db41c", [:mix], [], "hexpm", "1fa5217ccb95a38ce2312dd7ea6057b0d0002a3eba7490feab704df4b8a94038"},
+  "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
+  "exla": {:git, "https://github.com/elixir-nx/nx.git", "e23a678bf0ebcbbafe03f1b5ed78623f052ad486", [sparse: "exla"]},
+  "nimble_parsec": {:hex, :nimble_parsec, "1.2.0", "b44d75e2a6542dcb6acf5d71c32c74ca88960421b6874777f79153bbbbd7dccc", [:mix], [], "hexpm", "52b2871a7515a5ac49b00f214e4165a40724cf99798d8e4a65e4fd64ebd002c1"},
+  "nx": {:git, "https://github.com/elixir-nx/nx.git", "e23a678bf0ebcbbafe03f1b5ed78623f052ad486", [sparse: "nx"]},
+  "xla": {:hex, :xla, "0.2.0", "689887888afb22587168d461f0e9ff83d7b06040273ea7082dbf9ff7eca33dcc", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "a2e7b81413db49a159eabfb12dbd784a7c04b5c68c7b4057238d5ec9b110f2ec"},
+}
diff --git a/2015/test/advent_of_code2015_test.exs b/2015/test/advent_of_code2015_test.exs
new file mode 100644
index 0000000..5c9ee79
--- /dev/null
+++ b/2015/test/advent_of_code2015_test.exs
@@ -0,0 +1,8 @@
+defmodule AdventOfCode2015Test do
+  use ExUnit.Case
+  doctest AdventOfCode2015
+
+  test "greets the world" do
+    assert AdventOfCode2015.hello() == :world
+  end
+end
diff --git a/2015/test/test_helper.exs b/2015/test/test_helper.exs
new file mode 100644
index 0000000..869559e
--- /dev/null
+++ b/2015/test/test_helper.exs
@@ -0,0 +1 @@
+ExUnit.start()