summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--2016/.gitignore1
-rw-r--r--2016/aoc1/Cargo.lock4
-rw-r--r--2016/aoc1/Cargo.toml6
-rw-r--r--2016/aoc1/input.txt1
-rw-r--r--2016/aoc1/src/main.rs98
-rw-r--r--2016/aoc10/Cargo.lock98
-rw-r--r--2016/aoc10/Cargo.toml7
-rw-r--r--2016/aoc10/input.txt231
-rw-r--r--2016/aoc10/src/main.rs155
-rw-r--r--2016/aoc11/Cargo.lock4
-rw-r--r--2016/aoc11/Cargo.toml7
-rw-r--r--2016/aoc11/input.txt4
-rw-r--r--2016/aoc11/src/main.rs166
-rw-r--r--2016/aoc12/Cargo.lock98
-rw-r--r--2016/aoc12/Cargo.toml7
-rw-r--r--2016/aoc12/input.txt23
-rw-r--r--2016/aoc12/src/main.rs136
-rw-r--r--2016/aoc13/Cargo.lock98
-rw-r--r--2016/aoc13/Cargo.toml7
-rw-r--r--2016/aoc13/src/main.rs64
-rw-r--r--2016/aoc14/Cargo.lock14
-rw-r--r--2016/aoc14/Cargo.toml7
-rw-r--r--2016/aoc14/src/main.rs84
-rw-r--r--2016/aoc15/Cargo.lock98
-rw-r--r--2016/aoc15/Cargo.toml7
-rw-r--r--2016/aoc15/input.txt7
-rw-r--r--2016/aoc15/src/main.rs35
-rw-r--r--2016/aoc16/Cargo.lock4
-rw-r--r--2016/aoc16/Cargo.toml6
-rw-r--r--2016/aoc16/src/main.rs68
-rw-r--r--2016/aoc17/Cargo.lock14
-rw-r--r--2016/aoc17/Cargo.toml7
-rw-r--r--2016/aoc17/src/main.rs98
-rw-r--r--2016/aoc18/Cargo.lock4
-rw-r--r--2016/aoc18/Cargo.toml6
-rw-r--r--2016/aoc18/src/main.rs20
-rw-r--r--2016/aoc19/Cargo.lock4
-rw-r--r--2016/aoc19/Cargo.toml6
-rw-r--r--2016/aoc19/src/main.rs42
-rw-r--r--2016/aoc2/Cargo.lock4
-rw-r--r--2016/aoc2/Cargo.toml6
-rw-r--r--2016/aoc2/input.txt5
-rw-r--r--2016/aoc2/src/main.rs61
-rw-r--r--2016/aoc20/Cargo.lock4
-rw-r--r--2016/aoc20/Cargo.toml6
-rw-r--r--2016/aoc20/input.txt1104
-rw-r--r--2016/aoc20/src/main.rs114
-rw-r--r--2016/aoc21/Cargo.lock98
-rw-r--r--2016/aoc21/Cargo.toml7
-rw-r--r--2016/aoc21/input.txt100
-rw-r--r--2016/aoc21/src/main.rs233
-rw-r--r--2016/aoc22/Cargo.lock98
-rw-r--r--2016/aoc22/Cargo.toml7
-rw-r--r--2016/aoc22/input.txt1017
-rw-r--r--2016/aoc22/src/main.rs198
-rw-r--r--2016/aoc23/Cargo.lock98
-rw-r--r--2016/aoc23/Cargo.toml7
-rw-r--r--2016/aoc23/input.txt26
-rw-r--r--2016/aoc23/src/main.rs247
-rw-r--r--2016/aoc24/Cargo.lock4
-rw-r--r--2016/aoc24/Cargo.toml6
-rw-r--r--2016/aoc24/input.txt39
-rw-r--r--2016/aoc24/src/main.rs135
-rw-r--r--2016/aoc25/Cargo.lock98
-rw-r--r--2016/aoc25/Cargo.toml7
-rw-r--r--2016/aoc25/input.txt30
-rw-r--r--2016/aoc25/src/main.rs284
-rw-r--r--2016/aoc3/Cargo.lock4
-rw-r--r--2016/aoc3/Cargo.toml6
-rw-r--r--2016/aoc3/input.txt1734
-rw-r--r--2016/aoc3/src/main.rs64
-rw-r--r--2016/aoc4/Cargo.lock4
-rw-r--r--2016/aoc4/Cargo.toml6
-rw-r--r--2016/aoc4/input.txt1091
-rw-r--r--2016/aoc4/src/main.rs83
-rw-r--r--2016/aoc5/Cargo.lock12
-rw-r--r--2016/aoc5/Cargo.toml7
-rw-r--r--2016/aoc5/src/main.rs49
-rw-r--r--2016/aoc6/Cargo.lock4
-rw-r--r--2016/aoc6/Cargo.toml6
-rw-r--r--2016/aoc6/input.txt624
-rw-r--r--2016/aoc6/src/main.rs27
-rw-r--r--2016/aoc6/test_input.txt16
-rw-r--r--2016/aoc7/Cargo.lock4
-rw-r--r--2016/aoc7/Cargo.toml6
-rw-r--r--2016/aoc7/input.txt2000
-rw-r--r--2016/aoc7/src/main.rs95
-rw-r--r--2016/aoc7/test_input.txt4
-rw-r--r--2016/aoc8/Cargo.lock98
-rw-r--r--2016/aoc8/Cargo.toml7
-rw-r--r--2016/aoc8/input.txt194
-rw-r--r--2016/aoc8/src/main.rs117
-rw-r--r--2016/aoc9/Cargo.lock98
-rw-r--r--2016/aoc9/Cargo.toml7
-rw-r--r--2016/aoc9/input.txt1
-rw-r--r--2016/aoc9/src/main.rs143
-rw-r--r--2017/Cargo.toml10
-rw-r--r--2017/LICENSE21
-rw-r--r--2017/inputs/day_1.txt1
-rw-r--r--2017/inputs/day_10.txt1
-rw-r--r--2017/inputs/day_11.txt1
-rw-r--r--2017/inputs/day_12.txt2000
-rw-r--r--2017/inputs/day_13.txt43
-rw-r--r--2017/inputs/day_13_example.txt5
-rw-r--r--2017/inputs/day_14.txt2
-rw-r--r--2017/inputs/day_14_example.txt1
-rw-r--r--2017/inputs/day_15.txt2
-rw-r--r--2017/inputs/day_16.txt1
-rw-r--r--2017/inputs/day_17.txt1
-rw-r--r--2017/inputs/day_18.txt41
-rw-r--r--2017/inputs/day_19.txt201
-rw-r--r--2017/inputs/day_2.txt16
-rw-r--r--2017/inputs/day_20.txt1000
-rw-r--r--2017/inputs/day_21.txt108
-rw-r--r--2017/inputs/day_21_example.txt2
-rw-r--r--2017/inputs/day_22.txt25
-rw-r--r--2017/inputs/day_22_example.txt3
-rw-r--r--2017/inputs/day_23.txt32
-rw-r--r--2017/inputs/day_24.txt57
-rw-r--r--2017/inputs/day_25.txt62
-rw-r--r--2017/inputs/day_3.txt1
-rw-r--r--2017/inputs/day_4.txt512
-rw-r--r--2017/inputs/day_5.txt1070
-rw-r--r--2017/inputs/day_6.txt1
-rw-r--r--2017/inputs/day_7.txt1091
-rw-r--r--2017/inputs/day_8.txt1000
-rw-r--r--2017/inputs/day_9.txt1
-rw-r--r--2017/src/bin/day_1.rs24
-rw-r--r--2017/src/bin/day_10.rs63
-rw-r--r--2017/src/bin/day_11.rs57
-rw-r--r--2017/src/bin/day_12.rs52
-rw-r--r--2017/src/bin/day_13.rs46
-rw-r--r--2017/src/bin/day_14.rs52
-rw-r--r--2017/src/bin/day_15.rs40
-rw-r--r--2017/src/bin/day_16.rs87
-rw-r--r--2017/src/bin/day_17.rs47
-rw-r--r--2017/src/bin/day_18.rs207
-rw-r--r--2017/src/bin/day_19.rs78
-rw-r--r--2017/src/bin/day_2.rs26
-rw-r--r--2017/src/bin/day_20.rs89
-rw-r--r--2017/src/bin/day_21.rs200
-rw-r--r--2017/src/bin/day_22.rs73
-rw-r--r--2017/src/bin/day_23.rs168
-rw-r--r--2017/src/bin/day_24.rs60
-rw-r--r--2017/src/bin/day_25.rs125
-rw-r--r--2017/src/bin/day_3.rs62
-rw-r--r--2017/src/bin/day_4.rs37
-rw-r--r--2017/src/bin/day_5.rs25
-rw-r--r--2017/src/bin/day_6.rs61
-rw-r--r--2017/src/bin/day_7.rs62
-rw-r--r--2017/src/bin/day_8.rs99
-rw-r--r--2017/src/bin/day_9.rs42
-rw-r--r--2017/src/lib.rs225
-rw-r--r--2018/Cargo.toml11
-rw-r--r--2018/inputs/1.txt968
-rw-r--r--2018/inputs/10.txt369
-rw-r--r--2018/inputs/12.txt34
-rw-r--r--2018/inputs/13.txt150
-rw-r--r--2018/inputs/15.txt32
-rw-r--r--2018/inputs/16_1.txt3143
-rw-r--r--2018/inputs/16_2.txt1014
-rw-r--r--2018/inputs/17.txt1713
-rw-r--r--2018/inputs/18.txt50
-rw-r--r--2018/inputs/19.txt37
-rw-r--r--2018/inputs/2.txt250
-rw-r--r--2018/inputs/20.txt1
-rw-r--r--2018/inputs/21.txt32
-rw-r--r--2018/inputs/22.txt2
-rw-r--r--2018/inputs/23.txt1000
-rw-r--r--2018/inputs/24.txt23
-rw-r--r--2018/inputs/25.txt1248
-rw-r--r--2018/inputs/3.txt1385
-rw-r--r--2018/inputs/4.txt1088
-rw-r--r--2018/inputs/5.txt1
-rw-r--r--2018/inputs/6.txt50
-rw-r--r--2018/inputs/7.txt101
-rw-r--r--2018/inputs/8.txt1
-rw-r--r--2018/inputs/9.txt1
-rw-r--r--2018/license.org21
-rw-r--r--2018/readme.org38
-rw-r--r--2018/src/bin/day_1.rs32
-rw-r--r--2018/src/bin/day_10.rs82
-rw-r--r--2018/src/bin/day_11.rs66
-rw-r--r--2018/src/bin/day_12.rs102
-rw-r--r--2018/src/bin/day_13.rs249
-rw-r--r--2018/src/bin/day_14.rs111
-rw-r--r--2018/src/bin/day_15.rs272
-rw-r--r--2018/src/bin/day_16.rs205
-rw-r--r--2018/src/bin/day_17.rs175
-rw-r--r--2018/src/bin/day_18.rs123
-rw-r--r--2018/src/bin/day_19.rs139
-rw-r--r--2018/src/bin/day_2.rs53
-rw-r--r--2018/src/bin/day_20.rs137
-rw-r--r--2018/src/bin/day_21.rs137
-rw-r--r--2018/src/bin/day_22.rs165
-rw-r--r--2018/src/bin/day_23.rs114
-rw-r--r--2018/src/bin/day_24.rs217
-rw-r--r--2018/src/bin/day_25.rs47
-rw-r--r--2018/src/bin/day_3.rs76
-rw-r--r--2018/src/bin/day_4.rs116
-rw-r--r--2018/src/bin/day_5.rs53
-rw-r--r--2018/src/bin/day_6.rs103
-rw-r--r--2018/src/bin/day_7.rs135
-rw-r--r--2018/src/bin/day_8.rs66
-rw-r--r--2018/src/bin/day_9.rs91
-rw-r--r--2018/src/lib.rs31
-rw-r--r--2019/Cargo.lock580
-rw-r--r--2019/Cargo.toml19
-rw-r--r--2019/inputs/day_1.txt100
-rw-r--r--2019/inputs/day_10.txt24
-rw-r--r--2019/inputs/day_11.txt1
-rw-r--r--2019/inputs/day_12.txt4
-rw-r--r--2019/inputs/day_13.txt1
-rw-r--r--2019/inputs/day_14.txt59
-rw-r--r--2019/inputs/day_15.txt1
-rw-r--r--2019/inputs/day_16.txt1
-rw-r--r--2019/inputs/day_17.txt1
-rw-r--r--2019/inputs/day_18.txt81
-rw-r--r--2019/inputs/day_18_2.txt81
-rw-r--r--2019/inputs/day_19.txt1
-rw-r--r--2019/inputs/day_2.txt1
-rw-r--r--2019/inputs/day_20.txt113
-rw-r--r--2019/inputs/day_21.txt1
-rw-r--r--2019/inputs/day_22.txt100
-rw-r--r--2019/inputs/day_23.txt1
-rw-r--r--2019/inputs/day_24.txt5
-rw-r--r--2019/inputs/day_25.txt1
-rw-r--r--2019/inputs/day_3.txt2
-rw-r--r--2019/inputs/day_4.txt2
-rw-r--r--2019/inputs/day_5.txt1
-rw-r--r--2019/inputs/day_6.txt2306
-rw-r--r--2019/inputs/day_7.txt1
-rw-r--r--2019/inputs/day_8.txt1
-rw-r--r--2019/inputs/day_9.txt1
-rw-r--r--2019/readme.org26
-rw-r--r--2019/src/bin/day_1.rs93
-rw-r--r--2019/src/bin/day_10.rs158
-rw-r--r--2019/src/bin/day_11.rs205
-rw-r--r--2019/src/bin/day_12.rs205
-rw-r--r--2019/src/bin/day_13.rs149
-rw-r--r--2019/src/bin/day_14.rs221
-rw-r--r--2019/src/bin/day_15.rs183
-rw-r--r--2019/src/bin/day_16.rs112
-rw-r--r--2019/src/bin/day_17.rs78
-rw-r--r--2019/src/bin/day_18.rs365
-rw-r--r--2019/src/bin/day_19.rs102
-rw-r--r--2019/src/bin/day_2.rs96
-rw-r--r--2019/src/bin/day_20.rs310
-rw-r--r--2019/src/bin/day_21.rs109
-rw-r--r--2019/src/bin/day_22.rs325
-rw-r--r--2019/src/bin/day_23.rs211
-rw-r--r--2019/src/bin/day_24.rs239
-rw-r--r--2019/src/bin/day_25.dot43
-rw-r--r--2019/src/bin/day_25.rs110
-rw-r--r--2019/src/bin/day_3.rs333
-rw-r--r--2019/src/bin/day_4.rs55
-rw-r--r--2019/src/bin/day_5.rs45
-rw-r--r--2019/src/bin/day_6.rs251
-rw-r--r--2019/src/bin/day_7.rs175
-rw-r--r--2019/src/bin/day_8.rs135
-rw-r--r--2019/src/bin/day_9.rs1
-rw-r--r--2019/src/lib.rs438
-rw-r--r--2019/src/main.rs12
-rw-r--r--2020/Cargo.lock3654
-rw-r--r--2020/Cargo.toml11
-rw-r--r--2020/inputs/day_1.txt200
-rw-r--r--2020/inputs/day_10.txt111
-rw-r--r--2020/inputs/day_11.txt90
-rw-r--r--2020/inputs/day_12.txt755
-rw-r--r--2020/inputs/day_2.txt1000
-rw-r--r--2020/inputs/day_3.txt323
-rw-r--r--2020/inputs/day_4.txt1023
-rw-r--r--2020/inputs/day_5.txt901
-rw-r--r--2020/inputs/day_6.txt2199
-rw-r--r--2020/inputs/day_7.txt594
-rw-r--r--2020/inputs/day_8.txt626
-rw-r--r--2020/inputs/day_9.txt1000
-rw-r--r--2020/src/bin/day_1.rs83
-rw-r--r--2020/src/bin/day_10.rs124
-rw-r--r--2020/src/bin/day_11.rs209
-rw-r--r--2020/src/bin/day_12.rs233
-rw-r--r--2020/src/bin/day_2.rs104
-rw-r--r--2020/src/bin/day_3.rs205
-rw-r--r--2020/src/bin/day_4.rs222
-rw-r--r--2020/src/bin/day_5.rs157
-rw-r--r--2020/src/bin/day_6.rs102
-rw-r--r--2020/src/bin/day_7.rs137
-rw-r--r--2020/src/bin/day_8.rs154
-rw-r--r--2020/src/bin/day_9.rs120
-rw-r--r--2020/src/lib.rs1
-rw-r--r--2020/src/main.rs3
292 files changed, 60195 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 53eaa21..ea8c4bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
/target
-**/*.rs.bk
diff --git a/2016/.gitignore b/2016/.gitignore
new file mode 100644
index 0000000..9f97022
--- /dev/null
+++ b/2016/.gitignore
@@ -0,0 +1 @@
+target/ \ No newline at end of file
diff --git a/2016/aoc1/Cargo.lock b/2016/aoc1/Cargo.lock
new file mode 100644
index 0000000..b771521
--- /dev/null
+++ b/2016/aoc1/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc1"
+version = "0.1.0"
+
diff --git a/2016/aoc1/Cargo.toml b/2016/aoc1/Cargo.toml
new file mode 100644
index 0000000..096aad6
--- /dev/null
+++ b/2016/aoc1/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc1"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
diff --git a/2016/aoc1/input.txt b/2016/aoc1/input.txt
new file mode 100644
index 0000000..456904d
--- /dev/null
+++ b/2016/aoc1/input.txt
@@ -0,0 +1 @@
+R4, R5, L5, L5, L3, R2, R1, R1, L5, R5, R2, L1, L3, L4, R3, L1, L1, R2, R3, R3, R1, L3, L5, R3, R1, L1, R1, R2, L1, L4, L5, R4, R2, L192, R5, L2, R53, R1, L5, R73, R5, L5, R186, L3, L2, R1, R3, L3, L3, R1, L4, L2, R3, L5, R4, R3, R1, L1, R5, R2, R1, R1, R1, R3, R2, L1, R5, R1, L5, R2, L2, L4, R3, L1, R4, L5, R4, R3, L5, L3, R4, R2, L5, L5, R2, R3, R5, R4, R2, R1, L1, L5, L2, L3, L4, L5, L4, L5, L1, R3, R4, R5, R3, L5, L4, L3, L1, L4, R2, R5, R5, R4, L2, L4, R3, R1, L2, R5, L5, R1, R1, L1, L5, L5, L2, L1, R5, R2, L4, L1, R4, R3, L3, R1, R5, L1, L4, R2, L3, R5, R3, R1, L3
diff --git a/2016/aoc1/src/main.rs b/2016/aoc1/src/main.rs
new file mode 100644
index 0000000..e9b4138
--- /dev/null
+++ b/2016/aoc1/src/main.rs
@@ -0,0 +1,98 @@
+use std::io::Read;
+use std::fs::File;
+
+#[derive(Clone, Copy, Debug)]
+enum Direction {
+ Up,
+ Left,
+ Down,
+ Right
+}
+
+impl Direction {
+ fn turn_right(self) -> Direction {
+ match self {
+ Direction::Up => Direction::Right,
+ Direction::Right => Direction::Down,
+ Direction::Down => Direction::Left,
+ Direction::Left => Direction::Up
+ }
+ }
+ fn turn_left(self) -> Direction {
+ //not an ambiturner
+ self.turn_right().turn_right().turn_right()
+ }
+
+ fn as_vector(self, dist: i32) -> (i32,i32) {
+ match self {
+ Direction::Up => (0, -dist),
+ Direction::Right => (dist, 0),
+ Direction::Down => (0, dist),
+ Direction::Left => (-dist, 0)
+ }
+ }
+}
+
+fn main() {
+ let content = read_file().expect("Failed to read file");
+ let (_, dist_x, dist_y) = first_repeated_dest(content);
+ println!("Total: ({}, {})", dist_x, dist_y);
+ println!("Net: {}", dist_x+dist_y);
+}
+
+fn net_distance(content: String) -> (Direction, i32, i32) {
+ content.trim().split(", ")
+ .map(|action|
+ (
+ action.chars().nth(0).unwrap(),
+ action.chars().skip(1).collect::<String>().parse::<i32>().unwrap()
+ ))
+ .fold((Direction::Up, 0,0), |(facing, acc_x, acc_y), (dir, dist)| {
+ let new_facing = match dir {
+ 'R' => facing.turn_right(),
+ 'L' => facing.turn_left(),
+ _ => panic!("bad input")
+ };
+
+ let (new_x, new_y) = new_facing.as_vector(dist);
+ (new_facing, acc_x+new_x, acc_y+new_y)
+ })
+}
+
+fn first_repeated_dest(content: String) -> (Direction, i32, i32) {
+ let mut stops: Vec<(i32, i32)> = Vec::new();
+ let actions = content.trim().split(", ")
+ .map(|action|
+ (
+ action.chars().nth(0).unwrap(),
+ action.chars().skip(1).collect::<String>().parse::<i32>().unwrap()
+ ));
+ let mut current_facing = Direction::Up;
+ let (mut acc_x, mut acc_y) = (0, 0);
+ for (dir, dist) in actions {
+ current_facing = match dir {
+ 'R' => current_facing.turn_right(),
+ 'L' => current_facing.turn_left(),
+ _ => panic!("bad input")
+ };
+
+ for _ in 0..dist {
+ let (new_x, new_y) = current_facing.as_vector(1);
+ acc_x += new_x;
+ acc_y += new_y;
+
+ if stops.iter().any(|&(x, y)| x==acc_x && y==acc_y) {
+ return (current_facing, acc_x, acc_y);
+ }
+ stops.push((acc_x, acc_y));
+ }
+ }
+ (current_facing, acc_x, acc_y)
+}
+
+fn read_file() -> Result<String, String> {
+ let mut file = try!(File::open("input.txt").map_err(|e| e.to_string()));
+ let mut content = String::new();
+ try!(file.read_to_string(&mut content).map_err(|e| e.to_string()));
+ Ok(content)
+}
diff --git a/2016/aoc10/Cargo.lock b/2016/aoc10/Cargo.lock
new file mode 100644
index 0000000..f8f7189
--- /dev/null
+++ b/2016/aoc10/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc10"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc10/Cargo.toml b/2016/aoc10/Cargo.toml
new file mode 100644
index 0000000..d6abdaf
--- /dev/null
+++ b/2016/aoc10/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc10"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc10/input.txt b/2016/aoc10/input.txt
new file mode 100644
index 0000000..aeda3b5
--- /dev/null
+++ b/2016/aoc10/input.txt
@@ -0,0 +1,231 @@
+bot 59 gives low to bot 176 and high to bot 120
+bot 92 gives low to bot 42 and high to bot 187
+value 31 goes to bot 114
+bot 182 gives low to bot 49 and high to bot 176
+bot 17 gives low to bot 181 and high to bot 162
+bot 36 gives low to bot 118 and high to bot 121
+bot 118 gives low to bot 164 and high to bot 55
+bot 172 gives low to bot 79 and high to bot 123
+bot 51 gives low to bot 60 and high to bot 31
+bot 48 gives low to bot 107 and high to bot 58
+bot 142 gives low to output 6 and high to bot 35
+bot 133 gives low to output 4 and high to bot 47
+bot 134 gives low to bot 122 and high to bot 66
+bot 106 gives low to bot 155 and high to bot 99
+bot 77 gives low to bot 93 and high to bot 84
+bot 9 gives low to bot 173 and high to bot 197
+bot 64 gives low to bot 123 and high to bot 48
+bot 177 gives low to bot 21 and high to bot 132
+bot 94 gives low to bot 6 and high to bot 25
+bot 126 gives low to bot 193 and high to bot 56
+bot 74 gives low to bot 187 and high to bot 125
+bot 80 gives low to bot 41 and high to bot 191
+bot 62 gives low to bot 157 and high to bot 138
+bot 66 gives low to bot 1 and high to bot 209
+bot 90 gives low to bot 104 and high to bot 34
+bot 68 gives low to bot 23 and high to bot 87
+bot 121 gives low to bot 55 and high to bot 126
+bot 122 gives low to bot 137 and high to bot 1
+bot 209 gives low to bot 168 and high to bot 26
+bot 141 gives low to bot 170 and high to bot 6
+bot 149 gives low to bot 62 and high to bot 13
+bot 120 gives low to bot 179 and high to bot 71
+bot 160 gives low to bot 194 and high to bot 151
+bot 86 gives low to bot 96 and high to bot 106
+value 13 goes to bot 9
+bot 180 gives low to bot 189 and high to bot 27
+value 67 goes to bot 88
+bot 169 gives low to bot 99 and high to bot 159
+bot 56 gives low to bot 98 and high to bot 147
+bot 197 gives low to bot 174 and high to bot 81
+bot 57 gives low to bot 113 and high to bot 179
+bot 39 gives low to bot 115 and high to bot 3
+bot 79 gives low to bot 22 and high to bot 40
+bot 161 gives low to output 14 and high to bot 185
+bot 21 gives low to bot 114 and high to bot 119
+bot 136 gives low to bot 28 and high to bot 158
+bot 105 gives low to bot 89 and high to bot 19
+bot 168 gives low to bot 126 and high to bot 26
+bot 193 gives low to bot 64 and high to bot 98
+bot 186 gives low to bot 86 and high to bot 178
+value 11 goes to bot 165
+bot 33 gives low to bot 116 and high to bot 150
+bot 32 gives low to bot 154 and high to bot 206
+bot 166 gives low to bot 33 and high to bot 139
+value 7 goes to bot 63
+bot 203 gives low to bot 172 and high to bot 64
+bot 200 gives low to bot 94 and high to bot 25
+value 43 goes to bot 76
+bot 145 gives low to bot 103 and high to bot 128
+bot 119 gives low to bot 186 and high to bot 97
+bot 12 gives low to bot 31 and high to bot 4
+bot 23 gives low to bot 198 and high to bot 171
+bot 34 gives low to bot 10 and high to bot 20
+bot 198 gives low to bot 43 and high to bot 17
+bot 50 gives low to output 1 and high to bot 127
+bot 155 gives low to bot 191 and high to bot 32
+bot 206 gives low to bot 12 and high to bot 43
+bot 96 gives low to bot 80 and high to bot 155
+bot 93 gives low to bot 44 and high to bot 70
+bot 24 gives low to bot 85 and high to bot 83
+bot 30 gives low to bot 159 and high to bot 68
+bot 55 gives low to bot 203 and high to bot 193
+bot 199 gives low to bot 68 and high to bot 135
+bot 170 gives low to bot 97 and high to bot 5
+bot 65 gives low to bot 152 and high to bot 194
+bot 43 gives low to bot 4 and high to bot 181
+bot 113 gives low to output 9 and high to bot 161
+bot 81 gives low to bot 141 and high to bot 94
+value 29 goes to bot 7
+bot 46 gives low to bot 175 and high to bot 195
+value 47 goes to bot 21
+value 23 goes to bot 42
+bot 13 gives low to bot 138 and high to bot 61
+bot 135 gives low to bot 87 and high to bot 111
+bot 194 gives low to bot 190 and high to bot 82
+value 73 goes to bot 109
+bot 154 gives low to bot 51 and high to bot 12
+bot 1 gives low to bot 18 and high to bot 209
+bot 98 gives low to bot 48 and high to bot 45
+bot 147 gives low to bot 45 and high to bot 95
+bot 47 gives low to output 19 and high to bot 152
+bot 26 gives low to bot 56 and high to bot 147
+bot 179 gives low to bot 161 and high to bot 71
+bot 148 gives low to bot 204 and high to bot 137
+bot 5 gives low to bot 67 and high to bot 85
+bot 174 gives low to bot 132 and high to bot 141
+bot 8 gives low to bot 13 and high to bot 75
+bot 82 gives low to bot 146 and high to bot 22
+bot 123 gives low to bot 40 and high to bot 107
+bot 99 gives low to bot 32 and high to bot 201
+bot 41 gives low to bot 196 and high to bot 192
+bot 139 gives low to bot 150 and high to bot 153
+bot 11 gives low to output 16 and high to bot 113
+bot 72 gives low to bot 65 and high to bot 160
+bot 195 gives low to bot 133 and high to bot 183
+bot 54 gives low to output 12 and high to output 10
+bot 158 gives low to bot 102 and high to bot 110
+bot 112 gives low to bot 19 and high to bot 118
+bot 31 gives low to bot 208 and high to bot 143
+bot 167 gives low to bot 7 and high to bot 96
+bot 63 gives low to bot 92 and high to bot 74
+bot 116 gives low to bot 20 and high to bot 131
+bot 184 gives low to bot 39 and high to bot 3
+bot 162 gives low to bot 205 and high to bot 39
+bot 108 gives low to output 11 and high to bot 175
+value 53 goes to bot 207
+bot 111 gives low to bot 202 and high to bot 184
+bot 25 gives low to bot 24 and high to bot 83
+value 71 goes to bot 77
+bot 69 gives low to bot 142 and high to bot 0
+bot 146 gives low to output 13 and high to bot 53
+bot 7 gives low to bot 76 and high to bot 80
+bot 131 gives low to bot 73 and high to bot 204
+bot 102 gives low to bot 195 and high to bot 117
+bot 76 gives low to bot 165 and high to bot 41
+bot 153 gives low to bot 148 and high to bot 122
+bot 208 gives low to bot 90 and high to bot 163
+bot 70 gives low to bot 144 and high to bot 78
+bot 125 gives low to bot 8 and high to bot 156
+bot 83 gives low to bot 199 and high to bot 135
+bot 75 gives low to bot 61 and high to bot 104
+bot 67 gives low to bot 169 and high to bot 30
+bot 14 gives low to bot 81 and high to bot 200
+bot 159 gives low to bot 201 and high to bot 23
+value 3 goes to bot 93
+bot 110 gives low to bot 117 and high to bot 89
+bot 128 gives low to bot 129 and high to bot 182
+bot 87 gives low to bot 171 and high to bot 111
+bot 45 gives low to bot 58 and high to bot 95
+bot 4 gives low to bot 143 and high to bot 166
+bot 60 gives low to bot 156 and high to bot 208
+bot 27 gives low to bot 108 and high to bot 46
+bot 42 gives low to bot 207 and high to bot 149
+bot 117 gives low to bot 183 and high to bot 72
+bot 115 gives low to bot 153 and high to bot 134
+bot 140 gives low to bot 125 and high to bot 60
+bot 173 gives low to bot 177 and high to bot 174
+bot 138 gives low to bot 180 and high to bot 52
+bot 100 gives low to bot 38 and high to bot 59
+value 41 goes to bot 173
+value 59 goes to bot 177
+bot 165 gives low to bot 63 and high to bot 196
+bot 84 gives low to bot 70 and high to bot 78
+bot 2 gives low to bot 160 and high to bot 91
+value 61 goes to bot 29
+bot 114 gives low to bot 109 and high to bot 186
+bot 205 gives low to bot 139 and high to bot 115
+bot 175 gives low to output 17 and high to bot 133
+bot 176 gives low to bot 57 and high to bot 120
+bot 107 gives low to bot 124 and high to bot 15
+bot 52 gives low to bot 27 and high to bot 28
+bot 103 gives low to bot 50 and high to bot 129
+bot 150 gives low to bot 131 and high to bot 148
+bot 16 gives low to output 20 and high to bot 189
+bot 190 gives low to output 18 and high to bot 146
+bot 157 gives low to bot 16 and high to bot 180
+bot 10 gives low to bot 158 and high to bot 130
+bot 202 gives low to bot 162 and high to bot 184
+bot 88 gives low to bot 77 and high to bot 84
+bot 188 gives low to bot 128 and high to bot 38
+bot 58 gives low to bot 15 and high to bot 101
+bot 171 gives low to bot 17 and high to bot 202
+bot 97 gives low to bot 178 and high to bot 67
+bot 163 gives low to bot 34 and high to bot 116
+bot 124 gives low to bot 0 and high to bot 145
+bot 71 gives low to bot 185 and high to bot 54
+bot 78 gives low to bot 14 and high to bot 200
+bot 101 gives low to bot 188 and high to bot 100
+bot 189 gives low to output 7 and high to bot 108
+bot 95 gives low to bot 101 and high to bot 100
+bot 0 gives low to bot 35 and high to bot 103
+bot 207 gives low to bot 37 and high to bot 62
+bot 49 gives low to bot 11 and high to bot 57
+bot 85 gives low to bot 30 and high to bot 199
+bot 89 gives low to bot 72 and high to bot 2
+bot 3 gives low to bot 134 and high to bot 66
+bot 181 gives low to bot 166 and high to bot 205
+bot 91 gives low to bot 151 and high to bot 172
+value 17 goes to bot 167
+bot 20 gives low to bot 130 and high to bot 73
+bot 196 gives low to bot 74 and high to bot 140
+bot 18 gives low to bot 121 and high to bot 168
+bot 185 gives low to output 15 and high to bot 54
+bot 178 gives low to bot 106 and high to bot 169
+bot 129 gives low to bot 127 and high to bot 49
+bot 19 gives low to bot 2 and high to bot 164
+bot 15 gives low to bot 145 and high to bot 188
+bot 144 gives low to bot 197 and high to bot 14
+bot 201 gives low to bot 206 and high to bot 198
+bot 164 gives low to bot 91 and high to bot 203
+bot 73 gives low to bot 105 and high to bot 112
+bot 191 gives low to bot 192 and high to bot 154
+bot 109 gives low to bot 167 and high to bot 86
+bot 151 gives low to bot 82 and high to bot 79
+bot 53 gives low to output 2 and high to bot 142
+bot 37 gives low to bot 29 and high to bot 157
+value 2 goes to bot 44
+bot 204 gives low to bot 112 and high to bot 36
+bot 40 gives low to bot 69 and high to bot 124
+bot 22 gives low to bot 53 and high to bot 69
+bot 104 gives low to bot 136 and high to bot 10
+value 19 goes to bot 88
+bot 127 gives low to output 5 and high to bot 11
+bot 183 gives low to bot 47 and high to bot 65
+bot 192 gives low to bot 140 and high to bot 51
+bot 38 gives low to bot 182 and high to bot 59
+bot 61 gives low to bot 52 and high to bot 136
+bot 156 gives low to bot 75 and high to bot 90
+value 37 goes to bot 37
+bot 28 gives low to bot 46 and high to bot 102
+bot 187 gives low to bot 149 and high to bot 8
+bot 132 gives low to bot 119 and high to bot 170
+bot 44 gives low to bot 9 and high to bot 144
+bot 29 gives low to output 0 and high to bot 16
+bot 6 gives low to bot 5 and high to bot 24
+bot 137 gives low to bot 36 and high to bot 18
+bot 130 gives low to bot 110 and high to bot 105
+value 5 goes to bot 92
+bot 35 gives low to output 3 and high to bot 50
+bot 152 gives low to output 8 and high to bot 190
+bot 143 gives low to bot 163 and high to bot 33
diff --git a/2016/aoc10/src/main.rs b/2016/aoc10/src/main.rs
new file mode 100644
index 0000000..c2c18be
--- /dev/null
+++ b/2016/aoc10/src/main.rs
@@ -0,0 +1,155 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::cmp;
+
+#[derive(Debug, Clone)]
+struct Bot {
+ low: Option<i32>,
+ high: Option<i32>,
+ low_dest: Option<Dest>,
+ high_dest: Option<Dest>
+}
+
+#[derive(Debug, Clone)]
+enum Dest {
+ Bot(usize),
+ Output(usize)
+}
+
+impl Bot {
+ fn new() -> Bot {
+ Bot {low: None, high: None, low_dest: None, high_dest: None}
+ }
+
+ fn add_input(&mut self, input: i32) {
+ if self.low.is_none() {
+ self.low = Some(input);
+ }
+ else {
+ let other = self.low.unwrap(); //already handled none case
+ self.low = Some(cmp::min(input,other));
+ self.high = Some(cmp::max(input,other));
+ }
+ }
+ fn ready(&self) -> bool {
+ self.low.is_some() && self.high.is_some() &&
+ self.low_dest.is_some() && self.high_dest.is_some()
+ }
+ fn clear(&mut self) {
+ self.low = None;
+ self.high = None;
+ }
+}
+
+
+fn main() {
+ let mut bots = build_bots_graph();
+ let outputs = find_outputs(&mut bots);
+ println!("Outputs {:?}", outputs);
+}
+
+fn find_outputs(bots: &mut Vec<Bot>) -> Vec<i32> {
+ let mut output = Vec::new();
+
+ let mut is_stable = false;
+ while !is_stable {
+ is_stable = true;
+
+ for i in 0..bots.len() {
+ if bots[i].ready() {
+ is_stable = false;
+
+ let low = bots[i].low.unwrap();
+ let high = bots[i].high.unwrap();
+ bots[i].clear();
+
+ match bots[i].low_dest {
+ Some(Dest::Bot(j)) => {
+ bots[j].add_input(low);
+ },
+ Some(Dest::Output(j)) => {
+ check_add_output(&mut output, j);
+ output[j] = low;
+ },
+ _ => {}
+ };
+ match bots[i].high_dest {
+ Some(Dest::Bot(j)) => {
+ bots[j].add_input(high);
+ },
+ Some(Dest::Output(j)) => {
+ check_add_output(&mut output, j);
+ output[j] = high;
+ },
+ _ => {}
+ };
+ }
+ }
+ }
+
+ output
+}
+
+fn build_bots_graph() -> Vec<Bot> {
+ let lines = read_file();
+ let mut bots = Vec::new();
+
+ let value_regex = Regex::new(r"^value (\d+) goes to bot (\d+)$").unwrap();
+ let give_regex = Regex::new(r"^bot (\d+) gives low to (output|bot) (\d+) and high to (output|bot) (\d+)$").unwrap();
+
+ for line in lines {
+ if value_regex.is_match(line.as_ref()) {
+ let cap = value_regex.captures(line.as_ref()).unwrap();
+ let value = cap.at(1).unwrap().parse().unwrap();
+ let bot_index = cap.at(2).unwrap().parse().unwrap();
+ check_add_bot(&mut bots, bot_index);
+ bots[bot_index].add_input(value);
+ }
+ else if give_regex.is_match(line.as_ref()) {
+ let cap = give_regex.captures(line.as_ref()).unwrap();
+ let give_bot_index = cap.at(1).unwrap().parse().unwrap();
+ let low_is_to_output = cap.at(2).unwrap() == "output";
+ let low_dest = cap.at(3).unwrap().parse().unwrap();
+ let high_is_to_output = cap.at(4).unwrap() == "output";
+ let high_dest = cap.at(5).unwrap().parse().unwrap();
+
+ check_add_bot(&mut bots, give_bot_index);
+ bots[give_bot_index].low_dest = if low_is_to_output {
+ Some(Dest::Output(low_dest))
+ } else {
+ Some(Dest::Bot(low_dest))
+ };
+ bots[give_bot_index].high_dest = if high_is_to_output {
+ Some(Dest::Output(high_dest))
+ } else {
+ Some(Dest::Bot(high_dest))
+ };
+ }
+ }
+
+ bots
+}
+
+fn check_add_bot(bots: &mut Vec<Bot>, index: usize) {
+ while index >= bots.len() {
+ bots.push(Bot::new());
+ }
+}
+
+fn check_add_output(outputs: &mut Vec<i32>, index: usize) {
+ while index >= outputs.len() {
+ outputs.push(0);
+ }
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
diff --git a/2016/aoc11/Cargo.lock b/2016/aoc11/Cargo.lock
new file mode 100644
index 0000000..b423029
--- /dev/null
+++ b/2016/aoc11/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc11"
+version = "0.1.0"
+
diff --git a/2016/aoc11/Cargo.toml b/2016/aoc11/Cargo.toml
new file mode 100644
index 0000000..e0b3f68
--- /dev/null
+++ b/2016/aoc11/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc11"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+
diff --git a/2016/aoc11/input.txt b/2016/aoc11/input.txt
new file mode 100644
index 0000000..d453804
--- /dev/null
+++ b/2016/aoc11/input.txt
@@ -0,0 +1,4 @@
+The first floor contains a strontium generator, a strontium-compatible microchip, a plutonium generator, and a plutonium-compatible microchip.
+The second floor contains a thulium generator, a ruthenium generator, a ruthenium-compatible microchip, a curium generator, and a curium-compatible microchip.
+The third floor contains a thulium-compatible microchip.
+The fourth floor contains nothing relevant.
diff --git a/2016/aoc11/src/main.rs b/2016/aoc11/src/main.rs
new file mode 100644
index 0000000..39a6e2f
--- /dev/null
+++ b/2016/aoc11/src/main.rs
@@ -0,0 +1,166 @@
+
+use std::collections::HashMap;
+
+//const MICROS: usize = 2; //example
+const MICROS: usize = 7;
+
+#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
+struct State {
+ microchips: [[bool; MICROS]; 4],
+ generators: [[bool; MICROS]; 4],
+ elevator: usize
+}
+
+impl State {
+ fn is_final(&self) -> bool {
+ let floor = 3;
+
+ for i in 0..MICROS {
+ if !self.microchips[floor][i] || !self.generators[floor][i] {
+ return false;
+ }
+ }
+ true
+ }
+
+ fn is_safe(&self) -> bool {
+ for floor in 0..4 {
+ for i in 0..MICROS {
+ for j in 0..MICROS {
+ //need to be on same floor, if any other micro is there
+ if self.generators[floor][j] && !self.generators[floor][i] && self.microchips[floor][i] {
+ return false;
+ }
+ }
+ }
+ }
+ true
+ }
+
+ fn valid_moves(&self) -> Vec<State> {
+ let mut moves = Vec::new();
+
+ let mut new_floors = Vec::new();
+ if self.elevator > 0 {
+ new_floors.push(self.elevator-1);
+ }
+ if self.elevator < 3 {
+ new_floors.push(self.elevator+1);
+ }
+ for &new_floor in new_floors.iter() {
+
+ //items to take can be: one micro, one generator, two micros, two generator, one of each
+
+ //one micro
+ for i in 0..MICROS {
+ if self.microchips[self.elevator][i] {
+ moves.push(self.move_micro(i, self.elevator, new_floor));
+ }
+ }
+ //one generator
+ for i in 0..MICROS {
+ if self.generators[self.elevator][i] {
+ moves.push(self.move_generator(i, self.elevator, new_floor));
+ }
+ }
+ //two micros
+ for i in 0..MICROS {
+ for j in i+1..MICROS {
+ if self.microchips[self.elevator][i] && self.microchips[self.elevator][j] {
+ moves.push(self.move_micro(i, self.elevator, new_floor).move_micro(j, self.elevator, new_floor));
+ }
+ }
+ }
+ //two generators
+ for i in 0..MICROS {
+ for j in i+1..MICROS {
+ if self.generators[self.elevator][i] && self.generators[self.elevator][j] {
+ moves.push(self.move_generator(i, self.elevator, new_floor).move_generator(j, self.elevator, new_floor));
+ }
+ }
+ }
+ //one of each
+ for i in 0..MICROS {
+ for j in 0..MICROS {
+ if self.microchips[self.elevator][i] && self.generators[self.elevator][j] {
+ moves.push(self.move_micro(i, self.elevator, new_floor).move_generator(j, self.elevator, new_floor));
+ }
+ }
+ }
+ }
+
+ moves.iter().filter(|x| x.is_safe()).cloned().collect()
+ }
+
+ fn move_micro(&self, micro: usize, floor: usize, new_floor: usize) -> State {
+ let mut new_state = self.clone();
+ new_state.microchips[floor][micro] = false;
+ new_state.microchips[new_floor][micro] = true;
+ new_state.elevator = new_floor;
+ new_state
+ }
+ fn move_generator(&self, gen: usize, floor: usize, new_floor: usize) -> State {
+ let mut new_state = self.clone();
+ new_state.generators[floor][gen] = false;
+ new_state.generators[new_floor][gen] = true;
+ new_state.elevator = new_floor;
+ new_state
+ }
+}
+
+fn main() {
+ //Stronium, plutonium, thulium, ruthenium, curium, electrium, dilithium
+ let initial = State {
+ microchips:
+ [[true, true, false, false, false, true, true],
+ [false, false, false, true, true, false, false],
+ [false, false, true, false, false, false, false],
+ [false, false, false, false, false, false, false]],
+ generators:
+ [[true, true, false, false, false, true, true],
+ [false, false, true, true, true, false, false],
+ [false, false, false, false, false, false, false],
+ [false, false, false, false, false, false, false]],
+ elevator: 0
+ };
+
+ /*
+ //example
+ let initial = State {
+ microchips:
+ [[true, true],
+ [false, false],
+ [false, false],
+ [false, false]],
+ generators:
+ [[false, false],
+ [true, false],
+ [false, true],
+ [false, false]],
+ elevator: 0
+ };
+ */
+
+ let mut states: HashMap<State, u32> = HashMap::new();
+ states.insert(initial, 0);
+
+ let mut moves = 0;
+ loop {
+ if states.iter().any(|(state, _)| state.is_final()) {
+ break;
+ }
+
+ let new_states: Vec<State> = states.iter().filter(|&(_, &x)| x == moves).flat_map(|(state, _)| state.valid_moves()).collect();
+
+ moves += 1;
+
+ for state in new_states {
+ if !states.contains_key(&state) {
+ states.insert(state, moves);
+ }
+ }
+ }
+
+
+ println!("Moves required: {}", moves);
+}
diff --git a/2016/aoc12/Cargo.lock b/2016/aoc12/Cargo.lock
new file mode 100644
index 0000000..24237f4
--- /dev/null
+++ b/2016/aoc12/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc12"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc12/Cargo.toml b/2016/aoc12/Cargo.toml
new file mode 100644
index 0000000..f224921
--- /dev/null
+++ b/2016/aoc12/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc12"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc12/input.txt b/2016/aoc12/input.txt
new file mode 100644
index 0000000..bb2a2ff
--- /dev/null
+++ b/2016/aoc12/input.txt
@@ -0,0 +1,23 @@
+cpy 1 a
+cpy 1 b
+cpy 26 d
+jnz c 2
+jnz 1 5
+cpy 7 c
+inc d
+dec c
+jnz c -2
+cpy a c
+inc a
+dec b
+jnz b -2
+cpy c b
+dec d
+jnz d -6
+cpy 17 c
+cpy 18 d
+inc a
+dec d
+jnz d -2
+dec c
+jnz c -5
diff --git a/2016/aoc12/src/main.rs b/2016/aoc12/src/main.rs
new file mode 100644
index 0000000..2356402
--- /dev/null
+++ b/2016/aoc12/src/main.rs
@@ -0,0 +1,136 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+enum Instruction {
+ CpyLit(i32, usize),
+ CpyReg(usize, usize),
+ Inc(usize),
+ Dec(usize),
+ Jnz(usize, i32),
+ Jmp(i32),
+ Noop
+}
+
+impl Instruction {
+ fn parse(line: &str) -> Instruction {
+ let cpy_lit: Regex = Regex::new(r"cpy ([-\d]+) (a|b|c|d)").unwrap();
+ let cpy_reg = Regex::new(r"cpy (a|b|c|d) (a|b|c|d)").unwrap();
+ let inc = Regex::new(r"inc (a|b|c|d)").unwrap();
+ let dec = Regex::new(r"dec (a|b|c|d)").unwrap();
+ let jnz_lit = Regex::new(r"jnz ([-\d]+) ([-\d]+)").unwrap();
+ let jnz_reg = Regex::new(r"jnz (a|b|c|d) ([-\d]+)").unwrap();
+
+ let cpy_lit_match = cpy_lit.captures(line);
+ let cpy_reg_match = cpy_reg.captures(line);
+ let inc_match = inc.captures(line);
+ let dec_match = dec.captures(line);
+ let jnz_lit_match = jnz_lit.captures(line);
+ let jnz_reg_match = jnz_reg.captures(line);
+
+ if cpy_lit_match.is_some() {
+ let cap = cpy_lit_match.unwrap();
+ let src: i32 = cap.at(1).unwrap().parse().unwrap();
+ let dest = to_register_index(cap.at(2).unwrap());
+ Instruction::CpyLit(src, dest)
+ }
+ else if cpy_reg_match.is_some() {
+ let cap = cpy_reg_match.unwrap();
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = to_register_index(cap.at(2).unwrap());
+ Instruction::CpyReg(src, dest)
+ }
+ else if inc_match.is_some() {
+ let cap = inc_match.unwrap();
+ let dest = to_register_index(cap.at(1).unwrap());
+ Instruction::Inc(dest)
+ }
+ else if dec_match.is_some() {
+ let cap = dec_match.unwrap();
+ let dest = to_register_index(cap.at(1).unwrap());
+ Instruction::Dec(dest)
+ }
+ else if jnz_lit_match.is_some() {
+ let cap = jnz_lit_match.unwrap();
+ let condition: i32 = cap.at(1).unwrap().parse().unwrap();
+ let offset: i32 = cap.at(2).unwrap().parse().unwrap();
+ if condition != 0 {
+ Instruction::Jmp(offset)
+ }
+ else {
+ Instruction::Noop
+ }
+ }
+ else if jnz_reg_match.is_some() {
+ let cap = jnz_reg_match.unwrap();
+ let condition = to_register_index(cap.at(1).unwrap());
+ let offset: i32 = cap.at(2).unwrap().parse().unwrap();
+ Instruction::Jnz(condition, offset)
+ }
+ else {
+ panic!("Invalid instruction line")
+ }
+ }
+}
+
+fn main() {
+ let program = read_file();
+
+ let mut registers: [i32; 4] = [0, 0, 1, 0];
+ let mut pc: usize = 0;
+
+ while pc < program.len() {
+ let mut pc_next: usize = pc+1;
+
+ match program[pc] {
+ Instruction::CpyLit(src, dest) => {
+ registers[dest] = src;
+ },
+ Instruction::CpyReg(src, dest) => {
+ registers[dest] = registers[src];
+ },
+ Instruction::Inc(dest) => {
+ registers[dest] += 1;
+ },
+ Instruction::Dec(dest) => {
+ registers[dest] -= 1;
+ },
+ Instruction::Jnz(condition, offset) => {
+ if registers[condition] != 0 {
+ pc_next = (pc as i32 + offset) as usize;
+ }
+ },
+ Instruction::Jmp(offset) => {
+ pc_next = (pc as i32 + offset) as usize
+ },
+ Instruction::Noop => {}
+ }
+
+ pc = pc_next;
+ }
+
+ println!("a: {}, b: {}, c: {}, d: {}", registers[0], registers[1], registers[2], registers[3]);
+
+}
+
+fn to_register_index(name: &str) -> usize {
+ match name {
+ "a" => 0,
+ "b" => 1,
+ "c" => 2,
+ "d" => 3,
+ _ => panic!("Invalid register provided")
+ }
+}
+
+fn read_file() -> Vec<Instruction> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap())
+ .filter(|line| line.len() > 0)
+ .map(|line| Instruction::parse(line.trim()))
+ .collect()
+}
diff --git a/2016/aoc13/Cargo.lock b/2016/aoc13/Cargo.lock
new file mode 100644
index 0000000..d60f2c7
--- /dev/null
+++ b/2016/aoc13/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc13"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc13/Cargo.toml b/2016/aoc13/Cargo.toml
new file mode 100644
index 0000000..347a1a4
--- /dev/null
+++ b/2016/aoc13/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc13"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc13/src/main.rs b/2016/aoc13/src/main.rs
new file mode 100644
index 0000000..2c0e70e
--- /dev/null
+++ b/2016/aoc13/src/main.rs
@@ -0,0 +1,64 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::collections::HashMap;
+
+fn main() {
+ //let target = (7, 4);
+ let target = (31,39);
+
+ let mut states: HashMap<(i32, i32), u32> = HashMap::new();
+ states.insert((1, 1), 0);
+ let mut moves = 0;
+ while moves < 50 {
+/* if states.iter().any(|(&state, _)| state == target) {
+ break;
+ }
+*/
+ let new_states: Vec<(i32, i32)> = states.iter().filter(|&(_, &x)| x == moves).flat_map(|(state, _)| available_steps(state)).collect();
+
+ moves += 1;
+
+ for state in new_states {
+ if !states.contains_key(&state) {
+ states.insert(state, moves);
+ }
+ }
+ }
+
+ println!("Moves required: {}", moves);
+ println!("Possible destinations: {}", states.iter().count());
+}
+
+
+fn available_steps(current: &(i32, i32)) -> Vec<(i32, i32)> {
+ let &(x0, y0) = current;
+ let mut results = Vec::new();
+ for &(x, y) in [(x0-1, y0), (x0+1, y0), (x0, y0-1), (x0, y0+1)].iter() {
+ if x >= 0 && y >= 0 && !is_wall(x, y) {
+ results.push((x, y));
+ }
+ }
+ results
+}
+
+fn print_map() {
+ for y in 0..10 {
+ for x in 0..10 {
+ print!("{}", if is_wall(x, y) {'#'} else {'.'});
+ }
+ println!("");
+ }
+}
+
+fn is_wall(x: i32, y: i32) -> bool {
+// let favourite_number = 10;
+ let favourite_number = 1352;
+ let funny_num = x*x + 3*x + 2*x*y + y + y*y + favourite_number;
+ let bin = format!("{:b}", funny_num);
+ let number_of_ones = bin.chars().filter(|&c| c == '1').count();
+ number_of_ones % 2 == 1
+}
diff --git a/2016/aoc14/Cargo.lock b/2016/aoc14/Cargo.lock
new file mode 100644
index 0000000..a889c91
--- /dev/null
+++ b/2016/aoc14/Cargo.lock
@@ -0,0 +1,14 @@
+[root]
+name = "aoc14"
+version = "0.1.0"
+dependencies = [
+ "md5 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "md5"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum md5 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7df230903ccdffd6b3b4ec21624498ea64c912ce50297846907f0b8e1bb249dd"
diff --git a/2016/aoc14/Cargo.toml b/2016/aoc14/Cargo.toml
new file mode 100644
index 0000000..eb3f92d
--- /dev/null
+++ b/2016/aoc14/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc14"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+md5 = "^0.2" \ No newline at end of file
diff --git a/2016/aoc14/src/main.rs b/2016/aoc14/src/main.rs
new file mode 100644
index 0000000..d9410ce
--- /dev/null
+++ b/2016/aoc14/src/main.rs
@@ -0,0 +1,84 @@
+extern crate md5;
+
+use std::collections::HashMap;
+
+fn main() {
+// let input = "abc";
+ let input = "yjdafjpo";
+ let mut index = 0;
+ let mut results_found = 0;
+
+ let mut hash_memo = HashMap::new();
+ while results_found < 64 {
+ let hash = stretched_hash(format!("{}{}", input, index), &mut hash_memo);
+
+ let threes = find_concurrent_symbols(&hash, 3, true);
+ if threes.len() > 0 {
+// println!("Found three at {} -> {}", index, hash);
+ for i in 1..1001 {
+ let hash = stretched_hash(format!("{}{}", input, index+i), &mut hash_memo);
+ let fives = find_concurrent_symbols(&hash, 5, false);
+ if fives.iter().any(|c| threes.contains(c)) {
+ results_found += 1;
+// println!("Five found at {} -> {}", index+i, hash);
+ println!("Found hash {} at index {}", results_found, index);
+ break;
+ }
+ }
+ }
+ index += 1;
+ }
+
+}
+
+fn find_concurrent_symbols(hash: &String, count: u8, exit_early: bool) -> Vec<char> {
+ let mut last_symbol = None;
+ let mut last_symbol_run = 0;
+ let mut matches = Vec::new();
+ for c in hash.chars() {
+ let symbol_matches = match last_symbol {
+ Some(s) => s == c,
+ None => false
+ };
+
+ if symbol_matches {
+ last_symbol_run += 1;
+ if last_symbol_run >= count && !matches.contains(&c) {
+ matches.push(c);
+ if exit_early {
+ break;
+ }
+ }
+ } else {
+ last_symbol = Some(c);
+ last_symbol_run = 1;
+ }
+ }
+
+ matches
+}
+
+fn hash_to_string(hash: &[u8; 16]) -> String {
+ let mut result = String::with_capacity(32);
+
+ for &byte in hash.iter() {
+ result.push_str(format!("{:02x}", byte).as_ref());
+ }
+ result
+}
+
+fn stretched_hash(input: String, memo: &mut HashMap<String, String>) -> String {
+ memo.entry(input.clone()).or_insert_with(|| {
+ let mut result = input;
+ for _ in 0..2017 {
+ result = string_hash(result);
+ }
+ result
+ }).clone()
+}
+
+fn string_hash(input: String) -> String {
+ let bytes_to_hash = input.into_bytes();
+ let hash = md5::compute(bytes_to_hash.as_slice());
+ hash_to_string(&hash)
+}
diff --git a/2016/aoc15/Cargo.lock b/2016/aoc15/Cargo.lock
new file mode 100644
index 0000000..38f1d9c
--- /dev/null
+++ b/2016/aoc15/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc15"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc15/Cargo.toml b/2016/aoc15/Cargo.toml
new file mode 100644
index 0000000..eb75c1d
--- /dev/null
+++ b/2016/aoc15/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc15"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc15/input.txt b/2016/aoc15/input.txt
new file mode 100644
index 0000000..c4cf544
--- /dev/null
+++ b/2016/aoc15/input.txt
@@ -0,0 +1,7 @@
+Disc #1 has 17 positions; at time=0, it is at position 5.
+Disc #2 has 19 positions; at time=0, it is at position 8.
+Disc #3 has 7 positions; at time=0, it is at position 1.
+Disc #4 has 13 positions; at time=0, it is at position 7.
+Disc #5 has 5 positions; at time=0, it is at position 1.
+Disc #6 has 3 positions; at time=0, it is at position 0.
+Disc #7 has 11 positions; at time=0, it is at position 0.
diff --git a/2016/aoc15/src/main.rs b/2016/aoc15/src/main.rs
new file mode 100644
index 0000000..a7f0f64
--- /dev/null
+++ b/2016/aoc15/src/main.rs
@@ -0,0 +1,35 @@
+extern crate regex;
+
+use regex::Regex;
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+
+fn main() {
+ let gears = read_file();
+ let pass = (0..).find(|&i| can_pass(&gears, i)).expect("Reached end of infinite range without finding output");
+ println!("First pass at t={}", pass);
+}
+
+fn can_pass(gears: &Vec<(i32, i32, i32)>, time: i32) -> bool {
+ gears.iter().all(|&(time_offset, init_pos, gear_size)| (init_pos + time_offset + time) % gear_size == 0)
+}
+
+fn read_file() -> Vec<(i32, i32, i32)> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ let line_regex = Regex::new(r"Disc #(\d+) has (\d+) positions; at time=0, it is at position (\d+).").unwrap();
+ file.lines()
+ .filter_map(|line| {
+ line_regex.captures(line.unwrap().as_ref()).and_then(|cap| {
+ let time_offset = cap.at(1).and_then(|s| s.parse::<i32>().ok());
+ let init_pos = cap.at(3).and_then(|s| s.parse::<i32>().ok());
+ let gear_size = cap.at(2).and_then(|s| s.parse::<i32>().ok());
+ match (time_offset, init_pos, gear_size) {
+ (Some(a), Some(b), Some(c)) => Some((a,b,c)),
+ _ => None
+ }
+ })
+ })
+ .collect()
+}
diff --git a/2016/aoc16/Cargo.lock b/2016/aoc16/Cargo.lock
new file mode 100644
index 0000000..af71beb
--- /dev/null
+++ b/2016/aoc16/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc16"
+version = "0.1.0"
+
diff --git a/2016/aoc16/Cargo.toml b/2016/aoc16/Cargo.toml
new file mode 100644
index 0000000..3e56892
--- /dev/null
+++ b/2016/aoc16/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc16"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc16/src/main.rs b/2016/aoc16/src/main.rs
new file mode 100644
index 0000000..c5ecd10
--- /dev/null
+++ b/2016/aoc16/src/main.rs
@@ -0,0 +1,68 @@
+fn main() {
+ let data = initial();
+ let expanded = expand_to_size(data, 35651584);
+ let check = checksum(expanded);
+ print(&check);
+}
+
+fn initial() -> Vec<bool> {
+ to_bit_vec("10001001100000001")
+}
+
+fn to_bit_vec(input: &str) -> Vec<bool> {
+ input.chars().map(|c| c == '1').collect()
+}
+
+fn expand(a: Vec<bool>) -> Vec<bool> {
+ let mut b = a.clone();
+ b.reverse();
+ b = b.iter().map(|x| !x).collect();
+
+ let mut out = a.clone();
+ out.push(false);
+ out.append(&mut b);
+ out
+}
+
+fn expand_to_size(init: Vec<bool>, size: usize) -> Vec<bool> {
+ let mut out = init.clone();
+ while out.len() < size {
+ out = expand(out);
+ }
+ out.truncate(size);
+ out
+}
+
+fn checksum(data: Vec<bool>) -> Vec<bool> {
+ let mut check: Vec<bool> = data.chunks(2).map(|x| x[0] == x[1]).collect();
+ if check.len() % 2 == 0 {
+ check = checksum(check);
+ }
+ check
+}
+
+fn print(data: &Vec<bool>) {
+ for &bit in data {
+ print!("{}", if bit {'1'} else {'0'});
+ }
+ println!("");
+}
+
+#[test]
+fn test_expand() {
+ assert_eq!(expand(to_bit_vec("1")), to_bit_vec("100"));
+ assert_eq!(expand(to_bit_vec("0")), to_bit_vec("001"));
+ assert_eq!(expand(to_bit_vec("11111")), to_bit_vec("11111000000"));
+ assert_eq!(expand(to_bit_vec("111100001010")), to_bit_vec("1111000010100101011110000"));
+}
+
+#[test]
+fn test_expand_to_size() {
+ assert_eq!(expand_to_size(to_bit_vec("10000"), 20), to_bit_vec("10000011110010000111"));
+}
+
+#[test]
+fn test_checksum() {
+ assert_eq!(checksum(to_bit_vec("10000011110010000111")), to_bit_vec("01100"));
+}
+
diff --git a/2016/aoc17/Cargo.lock b/2016/aoc17/Cargo.lock
new file mode 100644
index 0000000..488e59b
--- /dev/null
+++ b/2016/aoc17/Cargo.lock
@@ -0,0 +1,14 @@
+[root]
+name = "aoc17"
+version = "0.1.0"
+dependencies = [
+ "md5 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "md5"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum md5 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7df230903ccdffd6b3b4ec21624498ea64c912ce50297846907f0b8e1bb249dd"
diff --git a/2016/aoc17/Cargo.toml b/2016/aoc17/Cargo.toml
new file mode 100644
index 0000000..88c211c
--- /dev/null
+++ b/2016/aoc17/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc17"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+md5 = "^0.2" \ No newline at end of file
diff --git a/2016/aoc17/src/main.rs b/2016/aoc17/src/main.rs
new file mode 100644
index 0000000..77fdf2e
--- /dev/null
+++ b/2016/aoc17/src/main.rs
@@ -0,0 +1,98 @@
+extern crate md5;
+
+#[derive(Clone)]
+struct State {
+ input: String,
+ path: String,
+ x: i8,
+ y: i8
+}
+
+impl State {
+ fn open_directions(&self) -> Vec<(char, i8, i8)> {
+ let hash_input = format!("{}{}", self.input, self.path);
+ let hash = md5::compute(hash_input.into_bytes().as_slice());
+
+ let mut results = Vec::new();
+ if hash[0]/16 > 10 && self.y > 0 {
+ results.push(('U', 0, -1));
+ }
+ if hash[0]%16 > 10 && self.y < 3 {
+ results.push(('D', 0, 1));
+ }
+ if hash[1]/16 > 10 && self.x > 0 {
+ results.push(('L', -1, 0));
+ }
+ if hash[1]%16 > 10 && self.x < 3 {
+ results.push(('R', 1, 0));
+ }
+
+ results
+ }
+
+ fn next_states(&self) -> Vec<State> {
+ self.open_directions().iter()
+ .map(|&(dir, dx, dy)| State {
+ input: self.input.clone(),
+ path: {
+ let mut p = self.path.clone();
+ p.push(dir);
+ p
+ },
+ x: self.x + dx,
+ y: self.y + dy
+ }).collect()
+ }
+
+ fn is_final(&self) -> bool {
+ self.x == 3 && self.y == 3
+ }
+}
+
+fn main() {
+ let initial = State {
+ input: "lpvhkcbi".to_string(),
+ path: String::new(),
+ x: 0,
+ y: 0
+ };
+
+ let final_state = find_final_state(initial.clone());
+ let longest_path = find_longest_path(initial);
+
+ println!("Final State Path: {}", final_state.path);
+ println!("Longest Path: {}", longest_path);
+}
+
+fn find_final_state(initial: State) -> State {
+ let mut states = vec!(initial);
+
+ loop {
+ match states.iter().find(|s| s.is_final()) {
+ Some(final_state) => {return final_state.clone();},
+ None => {}
+ };
+
+ states = states.iter().flat_map(|s| s.next_states()).collect();
+ }
+}
+
+fn find_longest_path(initial: State) -> u32 {
+ let mut states = vec!(initial);
+ let mut current_longest = 0;
+
+ while states.len() > 0 {
+
+ match states.iter().find(|s| s.is_final()) {
+ Some(final_state) => {current_longest = final_state.path.len() as u32;},
+ None => {}
+ };
+
+ states = states.iter()
+ .filter(|s| !s.is_final())
+ .flat_map(|s| s.next_states())
+ .collect();
+ }
+
+ current_longest
+}
diff --git a/2016/aoc18/Cargo.lock b/2016/aoc18/Cargo.lock
new file mode 100644
index 0000000..d26659d
--- /dev/null
+++ b/2016/aoc18/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc18"
+version = "0.1.0"
+
diff --git a/2016/aoc18/Cargo.toml b/2016/aoc18/Cargo.toml
new file mode 100644
index 0000000..5eadfea
--- /dev/null
+++ b/2016/aoc18/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc18"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc18/src/main.rs b/2016/aoc18/src/main.rs
new file mode 100644
index 0000000..52ad7a9
--- /dev/null
+++ b/2016/aoc18/src/main.rs
@@ -0,0 +1,20 @@
+fn main() {
+ let init: Vec<char> = ".^^..^...^..^^.^^^.^^^.^^^^^^.^.^^^^.^^.^^^^^^.^...^......^...^^^..^^^.....^^^^^^^^^....^^...^^^^..^".chars().collect();
+
+ let mut map = Vec::new();
+ map.push(init);
+
+ for _ in 1..400000 {
+ let last = map.last().unwrap().clone();
+ let mut next = Vec::new();
+ for i in 0..last.len() {
+ let left = if i == 0 { '.' } else { last[i-1] };
+ let right = if i == last.len()-1 { '.' } else { last[i+1] };
+ next.push(if left == right { '.' } else { '^' });
+ }
+ map.push(next);
+ }
+
+ let safe_count = map.iter().map(|row| row.iter().filter(|&&c| c=='.').count() as u32).sum::<u32>();
+ println!("Safe tiles: {}", safe_count);
+}
diff --git a/2016/aoc19/Cargo.lock b/2016/aoc19/Cargo.lock
new file mode 100644
index 0000000..7dc8a26
--- /dev/null
+++ b/2016/aoc19/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc19"
+version = "0.1.0"
+
diff --git a/2016/aoc19/Cargo.toml b/2016/aoc19/Cargo.toml
new file mode 100644
index 0000000..17889e3
--- /dev/null
+++ b/2016/aoc19/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc19"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc19/src/main.rs b/2016/aoc19/src/main.rs
new file mode 100644
index 0000000..1930d8d
--- /dev/null
+++ b/2016/aoc19/src/main.rs
@@ -0,0 +1,42 @@
+fn main() {
+ part1();
+ part2();
+}
+
+fn part1() {
+ let mut elves = (0..3017957).map(|i| i+1).collect::<Vec<_>>();
+
+ let mut eliminate_mod = 1;
+
+ while elves.len() > 1 {
+ let next_mod = if elves.len() % 2 == eliminate_mod { 0 } else { 1 };
+ elves = elves.iter()
+ .enumerate()
+ .filter(|&(i, _)| i % 2 != eliminate_mod)
+ .map(|(_, &e)| e)
+ .collect();
+ eliminate_mod = next_mod;
+ }
+
+ let elf = elves[0];
+ println!("Elf {} gets all the presents in part 1", elf);
+}
+
+fn part2() {
+ let mut elves = (0..3017957).map(|i| i+1).collect::<Vec<_>>();
+
+ let mut i = 0;
+ while elves.len() > 1 {
+ i = i % elves.len();
+ let to_eliminate = (i + elves.len() / 2) % elves.len();
+// println!("Elf {} is taking presents from elf {}", elves[i], elves[to_eliminate]);
+ elves.remove(to_eliminate);
+ if to_eliminate > i {
+ i += 1;
+ }
+ }
+
+ let elf = elves[0];
+ println!("Elf {} gets all the presents in part 2", elf);
+
+}
diff --git a/2016/aoc2/Cargo.lock b/2016/aoc2/Cargo.lock
new file mode 100644
index 0000000..b0dbf6e
--- /dev/null
+++ b/2016/aoc2/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc2"
+version = "0.1.0"
+
diff --git a/2016/aoc2/Cargo.toml b/2016/aoc2/Cargo.toml
new file mode 100644
index 0000000..e4dcc6f
--- /dev/null
+++ b/2016/aoc2/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc2"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
diff --git a/2016/aoc2/input.txt b/2016/aoc2/input.txt
new file mode 100644
index 0000000..ba5a73d
--- /dev/null
+++ b/2016/aoc2/input.txt
@@ -0,0 +1,5 @@
+RUDULRLLUULRURDDRRUDURULLLDRLRLUDDLUDUDDUDRRDUDULDUUULLRULLRLDDLDLDDRLRRRRUDLLDDUULDRLLUDDRRUURLULRRRDLLURRUUDURUDDURLUDDDLUDDUUDUURUDLRDRDRLRDRLDRUDRUUDLRDDRRURDDLRDDRRURDUDDLULLUDRURURRRLRRUDUULULULRRLDLUDUURRLLRUDLLDRDDLRRRULRUDLULDDLLLULDLRUDLLLLRDDLRDRLDRLLRDRRDLRDULULRLLLDRUDRRRUULRUULDRURLUDRURRDLLDLRDLDDDDRRLUDLRRLUUUURDRDDLRRURURRDUULLRLURLURUDDDRDURDUUDRLRLRRLDDLDLDLDDDUDDULURLDDLLRLRRDULUDDLULRLUDDLDLRULUUUDRLDRUDURLUDDRLLRUULDLRRRRDLLLLURULLRDRRUDLUULRRDLLRLRLUDLDDULLDLLRDLDLL
+LLUUUUUUDUDRLRDRDLDURRRLLRRLRURLLUURRLLUDUDLULUURUUURDLUDLDDLULLRDLRUULDLRDUDURLLDDUDUDULLUDDUULLLUULRRRLULRURRDLRUDUDDURRRDRUURDURLLULLRULLDRUULLURLDRDUUDDDDDDRRLDRLRRRLULDDUURRLLLLDRURLURDRDRDURUDUURRDUDUDRLLUUDDRLUDDDRDLDLRLDRURRDLLRULDRLLURURRLUULLRLRRURDDRDRUUURUURUUUDLLRRLUDRLDLRLURLDLUDDUDDDLDUDRRLDLRURULRLLRDUULURRRULDLLLRLDDDUURRRRDULLRURRLULULDLRRUDUDDLRUURDLDUDDUDRRDLRRRDUDUUUDLLDDDDLURLURRRUUULLLULRRLLLLLLULDUUDLRUDRRDLRDUUDUDLLRLDLLRUURDUUURUUUDDLLUUDLULDURLULULUUUDRUDULLURRULRULLRDLDDU
+RLUUURULLDLRLDUDRDURRDUURLLUDDDUULRRRLRLURDDRUULUDULDUUDDDDUDDDDRUDDLDUUDRUDLRRRLLRDDLLLRLLRUULRUULDDRURRLURRLRLULDDRRRDDURDDRDRDULRUDRUUDULRLLULDLRLLDRULRDDRRDDUDLRLLUDRDRRRLUDULRDLRDDURRUUDDRRUDURRUUUDDRRDUDURLUUDUDUURDDDLURLULLUULULURUDUUDRUDULLUUULURDLDUULLDDLLDULRLRLRDUUURUUDLRLDURUDRLDULLUDLDLLRDUURRDUDURLUUUDLLRRULRLULRLDLLURDURRULRLLRRDUDLLRDRRRRDLUUDRUUUDDLRLUDDDDDDRURRRUUURRDLLRURLDDLLDLRRLLLDRRULRRUDLDRDDRRLULURLLUURURURRRRUUUUURUDURLRLLLULULDLLDLRDRRULUDUDRDRRDRDRRDUDLLLRUDRUDDDULRULRRRDRLRUUUURUDURDUUULLULRUDDULDUUDLDURRD
+ULRULDDLDLULLLRRRLRUDDDDDLLDDUDLRRDULUUDRDLRRURDRRLUULRURUDRRULDLLLUDRUUDULULUDDRUDDDRDURRRDRDUUURLRDULUDRDRLDRUDDLLLDRRULUDLUDLDLLRRUDUULULDLDLLUURDLDDLLUUDURLURLLLDRDLDRRLRULUURRDRULRUUURULRRUDDDDLLDLDDLLRRLRRRRDUUDUDLDRDRRURDLRURULDLRDLLLLRUDRLLRDLRLRDURDRUDURRRLRDRDLLRLUDDDDRLRLLDUURRURLUURUULUDLUURDRRUDDLUDUDDDURRDRUDRLRULDULUUUUUUDDUDRUDUUURUDRRDLUDLUUDUULUDURDLDDDLLURRURUUDUDDRRDRLLULULDRLRURRDDDRDUUURDDDRULUDRDDLDURRLDDDLRRRLDDRDURULDLUDLLLURLURRLRRULDLLDDUDRRULDRRRRLURRUULRRRUDLURDLLDLLDULUUDRRLDLLLDRLRUDLUULDLDRUDUDURDRUDRDDDLRLULLUR
+LRLUUURRLRRRRRUURRLLULRLULLDLUDLUDRDDRLDLRLULLURDURLURDLLRLDUUDDURRRRLDLLRULLRLDLLUUDRLDDLLDRULDRLLRURDLRURRUDLULLRURDLURRURUDULLDRLLUUULUDRURRUUDUDULUUULRLDDULDRDLUDDUDDDLRURULLDLLLRLLUURDLRUDLLLLDLLRLRUUUDDRUUUUDLDLRDDURLDURUULLLUUDLLLLDULRRRLLDLDRRDRLUDRUDURLLUDLRLLUDUDRDDDRDLRDLRULUULDRLUDLRLDUURLRRLUDDDUUDDDUDRLDLDUDLURUULLDDDURUUULRLUDLDURUUDRDRURUDDUURDUUUDLLDLDLDURUURLLLLRURUURURULRULLRUDLRRUUUUUDRRLLRDDUURDRDRDDDUDRLURDRRRUDLLLDURDLUUDLLUDDULUUDLDUUULLDRDLRURUURRDURRDLURRRRLLUUULRDULDDLDUURRDLDLLULRRLLUDLDUDLUUL
diff --git a/2016/aoc2/src/main.rs b/2016/aoc2/src/main.rs
new file mode 100644
index 0000000..f4c3bfd
--- /dev/null
+++ b/2016/aoc2/src/main.rs
@@ -0,0 +1,61 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+fn main() {
+ let lines = read_file();
+ let mut current = 5;
+ for line in lines {
+ current = line.chars().fold(current, |current, dir| move_char_hex(current, dir));
+ println!("{:X}", current);
+ }
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
+
+
+//assume current in 1-9 range, and char is in UDLR
+fn move_char(current: i32, dir: char) -> i32 {
+ match dir {
+ 'U' => if current <= 3 { current } else { current - 3},
+ 'D' => if current >= 7 { current } else { current + 3},
+ 'L' => if current%3 == 1 { current } else { current - 1},
+ 'R' => if current%3 == 0 { current } else { current + 1},
+ _ => panic!("Bad direction character")
+ }
+}
+
+// 1
+// 2 3 4
+// 5 6 7 8 9
+// A B C
+// D
+fn move_char_hex(current: i32, dir: char) -> i32 {
+ match dir {
+ 'U' => match current {
+ 1|2|4|5|9 => current,
+ 3|13 => current - 2,
+ _ => current - 4
+ },
+ 'D' => match current {
+ 5|10|13|12|9 => current,
+ 1|11 => current + 1,
+ _ => current + 4
+ },
+ 'L' => match current {
+ 1|2|5|10|13 => current,
+ _ => current - 1
+ },
+ 'R' => match current {
+ 1|4|9|12|13 => current,
+ _ => current + 1
+ },
+ _ => panic!("Bad direction character")
+ }
+}
diff --git a/2016/aoc20/Cargo.lock b/2016/aoc20/Cargo.lock
new file mode 100644
index 0000000..26be916
--- /dev/null
+++ b/2016/aoc20/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc20"
+version = "0.1.0"
+
diff --git a/2016/aoc20/Cargo.toml b/2016/aoc20/Cargo.toml
new file mode 100644
index 0000000..4c1e873
--- /dev/null
+++ b/2016/aoc20/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc20"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc20/input.txt b/2016/aoc20/input.txt
new file mode 100644
index 0000000..c3e912f
--- /dev/null
+++ b/2016/aoc20/input.txt
@@ -0,0 +1,1104 @@
+272152717-281364173
+480675455-489214207
+3562619188-3566180938
+474796666-476679929
+1859288016-1859426304
+3500809029-3520779986
+1711620671-1724624325
+376497036-379822744
+2334350029-2336872286
+2880314906-2881510051
+257912946-260566708
+2964360275-2973540924
+889696219-900080622
+2727172832-2737372242
+33674001-51133436
+2718782366-2736816045
+41293631-52546854
+1064827080-1071610531
+1373807967-1374769067
+3261078460-3268114587
+1583129312-1602482863
+1605269651-1617971405
+365345542-377782493
+2858099254-2862714857
+1147380159-1156709753
+1087934555-1093750979
+998603437-1001868893
+234297440-245049936
+427084952-449321291
+3115490453-3126172818
+0-166475
+2859739533-2864404117
+2879116214-2888999956
+4166942312-4169074982
+2693533587-2694200673
+84162473-84534337
+2164071501-2168305216
+3745751095-3750043362
+2647427848-2647977897
+2028900925-2034847596
+876886411-878398110
+2589041333-2589873869
+876959837-878627172
+431139724-458304869
+1877994382-1887344924
+473575203-475773145
+252091135-257535969
+177110001-177143710
+2722497928-2723521816
+2208127-2536514
+1748077674-1751224226
+2362936907-2381045647
+2020385448-2029519771
+3108825744-3123438032
+872292652-885764819
+305053947-314709696
+2717924562-2718755692
+48149217-51160833
+2149726170-2150134226
+1729844094-1745733187
+1375741284-1378782323
+3744515388-3761146958
+78523085-78634151
+1634372345-1650424418
+3199349237-3209140394
+2011853949-2039316392
+769580925-794759455
+3841896290-3862358298
+3360393034-3379747723
+1120644472-1134516526
+815948131-837832345
+1590411139-1596337230
+2894381219-2935549329
+3688775236-3725245783
+963257634-966114246
+3566641344-3578334024
+1402589368-1434296916
+2742164387-2746045182
+3336884060-3357139723
+1529922302-1532912060
+812048355-820600359
+3535903629-3546917858
+3793132304-3794479774
+2441870431-2446591046
+790688046-795287265
+1094905232-1100177740
+2745878705-2749992348
+119256353-127273572
+3046258846-3057351205
+1754142948-1755600336
+1439035504-1441512409
+2099760008-2108426979
+2336936249-2337901885
+886155227-897744302
+278389264-304413122
+2261948686-2274345666
+3650645303-3661861270
+574462284-588550773
+1759196520-1782105094
+965026392-968307163
+2946755906-2963417308
+1766330775-1797112785
+1200115116-1225710522
+2080628180-2093783866
+2259186780-2265576012
+3422484974-3431403368
+2617357126-2619542029
+3535424340-3544236729
+1159703397-1178419333
+3695852451-3731387995
+2624409231-2626475102
+2462304649-2486546066
+1991659530-1991878310
+3675781139-3676295005
+3077370804-3098240471
+2410139047-2412323245
+1441379095-1464833739
+4254940654-4257828865
+3134602505-3135787446
+1531285367-1533939508
+1982248547-1989219645
+3717359312-3718050739
+1149793223-1159703395
+1718841131-1723739366
+1338353885-1363179561
+432322947-450369838
+3592044590-3598404106
+2783263665-2802135338
+2743201911-2758731127
+2940668500-2946140977
+3588363275-3594330069
+3675945049-3679197388
+154488705-187446525
+1653195306-1670854086
+2771303647-2772439896
+84146114-84264353
+1593778990-1622000763
+1580746474-1580917737
+801556682-801983712
+2268279290-2282899033
+3429390560-3432646573
+1355690206-1364432183
+3364827834-3370027309
+1343867080-1356033542
+2769747098-2802096717
+2451978746-2499145061
+3181481071-3202130015
+149287453-193454621
+2907925124-2933668261
+3525815495-3531996642
+892781900-902374081
+801983714-808209514
+1205516416-1207518863
+3475944050-3479276890
+1680662691-1693249318
+441188152-451875207
+3866263742-3869203885
+872306827-886155226
+3641638239-3656867109
+1292372277-1314188693
+1062559245-1064950825
+2334198700-2335529918
+1122962410-1136372412
+623323144-625918342
+2425193847-2429793856
+373315052-379611660
+2418007458-2424289401
+2149571480-2150070836
+1991878311-1994706041
+3043381174-3046887777
+497434379-500148281
+1825422529-1838184381
+137450473-139095016
+248808686-249748629
+1989969134-1990676913
+960553017-960915199
+2336374612-2337150925
+3369599561-3390928276
+113852260-145672651
+2986681144-2989530365
+3856382204-3873203604
+1657674792-1663548211
+2650185850-2651060935
+1647983099-1662799191
+1082357088-1112329267
+3793767754-3794336046
+3705877748-3728561957
+2769813898-2772369413
+3794164058-3801441915
+623200755-625407322
+1241966895-1253020214
+450369839-463131291
+2717038617-2723107862
+961267447-962353699
+193454623-196340979
+4253667440-4261704870
+3269563154-3275293388
+1505893371-1506880655
+3873203606-3889412741
+443548825-444733658
+3045753812-3049382630
+732764611-733035245
+961034623-961300670
+1373470559-1373526698
+2860192109-2867276065
+3312623058-3313008029
+3942424007-3951811891
+1197857710-1214225356
+458105388-462489469
+4259123154-4263336824
+960863927-961733781
+44819071-52470556
+957158383-958041099
+2543986743-2554322396
+339721933-346413740
+1010736956-1030771663
+4288781458-4289261456
+3687051286-3722932714
+2420813443-2424860115
+1989395087-1989698527
+3473694511-3476125935
+2408526816-2412196386
+1989398215-1991201331
+1526350090-1542206580
+2394556084-2399639414
+3510330656-3522250181
+137874061-144376880
+4167095310-4177987517
+2785359721-2785427263
+15024863-23531388
+1625174667-1658679299
+974122151-995631685
+1540947566-1554930456
+2424921025-2429636819
+1993822183-1994839237
+1094823818-1097108689
+69796587-71291314
+37126017-49427721
+3793022166-3794100162
+908189684-911496714
+2911211968-2917349047
+1227212686-1234159311
+3776286544-3783635666
+3531996644-3536250992
+3396302214-3406687062
+1476456536-1478818018
+2443497737-2447228620
+962292354-965288690
+1833703443-1843811212
+998277195-1000562480
+883225973-896212798
+2202815121-2215802598
+3557733372-3563107357
+2648035823-2649474134
+2723831559-2734044916
+1714279973-1738575730
+110217-574651
+1398965758-1409470798
+2330603686-2335139291
+1506286657-1511280423
+3365567975-3371386015
+466326205-480223737
+1989219647-1989438488
+3008188882-3010347685
+1070925288-1071665482
+2111554226-2123836945
+2137226110-2138852181
+1081261041-1091870264
+1081552237-1090538414
+2000657198-2037677988
+2718009384-2720142472
+925940762-939052067
+4179143261-4191765704
+3426378774-3430410036
+3676393933-3680167774
+3271833171-3277125583
+274414401-283893852
+3124560226-3128380638
+1208163309-1215074110
+2465798305-2494706753
+3050317115-3058897888
+1302678331-1315210828
+1751224227-1758206846
+931444766-948598982
+151669773-180559543
+255864690-255985990
+1556987318-1563743144
+16294070-23923782
+1415762720-1421421169
+3853344243-3864268114
+1280237454-1286328218
+2944350248-2976813361
+2187770126-2203436268
+3505239916-3517301515
+3232015564-3235367871
+2146211145-2166090499
+910952647-911877073
+1579658725-1581392690
+1237242317-1258610777
+2589766513-2598433041
+3449310840-3449858133
+745819525-755688297
+3776094116-3783478049
+2108426981-2124149170
+3449389881-3462604413
+2301503968-2324628965
+1005263513-1027181473
+1952664131-1969650551
+1285113553-1288652959
+3896408883-3908694324
+1920600328-1921999554
+1025403493-1031247416
+3905769594-3930128244
+1031247417-1047578444
+3885007170-3895219247
+3598377658-3599404192
+1697890477-1697912613
+954538505-957768997
+2816494072-2842728200
+492165035-498202012
+3137181704-3152588209
+1755735260-1759196518
+1371495492-1371550991
+2501923864-2514064340
+305959083-311818120
+4250019192-4275532230
+114168261-116414851
+2447228622-2451978745
+766211517-801556681
+3376445798-3394303381
+3501155911-3526104374
+2548986102-2564634962
+3263667615-3270390046
+1807095399-1824137700
+856041972-859823687
+3887315148-3892355947
+1030764665-1045428052
+638833662-640333593
+2121184882-2129744090
+2881011537-2885878144
+3588560066-3597713320
+3124980377-3134500989
+489214209-512240639
+3760702359-3764383643
+1090166392-1096894006
+917419134-922706929
+1296067761-1309424658
+689572986-696039127
+2660085630-2660431880
+680230992-716886780
+1592087783-1598197492
+1530767294-1575862739
+2082087967-2085220519
+2424541691-2426736024
+113504564-116385542
+1916132714-1932780572
+503684477-512284558
+2615977363-2622859043
+4035141786-4047227590
+1663548212-1680662689
+3047614614-3051657189
+2634680042-2641014306
+2583260376-2591896929
+2645275066-2647436256
+64047546-86026817
+1071039399-1072162085
+2594771897-2599508024
+83962861-84534191
+902374083-941216585
+2586806577-2599448524
+1274245593-1274516893
+4031038177-4040911753
+983068813-998624841
+534906133-573925401
+3329216543-3336884059
+4125892395-4138236492
+3807924665-3812644495
+1774911-2450996
+446418646-455236779
+2877486448-2884177700
+1373832888-1373901196
+370639181-384962937
+12016954-19316517
+3134500991-3134627688
+1373501126-1373590483
+1777703220-1777741597
+3743473590-3769013947
+2353521003-2362936906
+2468617254-2477279185
+78550601-78698869
+1273031112-1274488766
+968052409-969178069
+3907082563-3913084150
+3322437732-3338709909
+970661335-978617986
+2985507999-2990149897
+1499815926-1518480568
+2047086312-2056763544
+3154050192-3178489168
+1544927329-1559460655
+614918489-621719308
+3733606954-3743473589
+1499734003-1505336823
+1765493480-1780907733
+1112329269-1144192156
+1908189573-1916132712
+2978158245-2980295974
+854842773-855564041
+3851762797-3856667050
+2987912828-2988480807
+3845355673-3864117699
+2372563028-2379155071
+4164107384-4175248779
+206495443-209268583
+2893360924-2906330615
+1374122783-1374244946
+1315210829-1323332739
+2819221138-2820241142
+2987725800-2988399994
+3420480297-3426061444
+1745733189-1750260936
+2771579434-2772910814
+1721651362-1731098010
+1200223043-1222602885
+3431337889-3434193062
+2412323247-2441870430
+3756861847-3771488683
+853629069-857835277
+3744664061-3763198907
+1371491558-1371529465
+1932780573-1939156498
+3661861272-3662675926
+2648267077-2650619730
+3366486664-3371903512
+1268371412-1276470615
+2691106038-2691272785
+3227264064-3240740070
+1906133184-1910990608
+3853470102-3865286420
+2646285040-2646358000
+2196926231-2206264598
+4257710901-4257836607
+242078367-255972629
+4198987003-4201086361
+1240990629-1248211769
+2749992349-2760767131
+2787866331-2806708160
+809302575-853629067
+3032053776-3036049062
+2943717702-2946230991
+4288724821-4289568650
+3215397670-3224618461
+1858955725-1859353621
+2083864513-2101037055
+694973182-718973623
+4168983031-4174451494
+2807055496-2816494071
+1055347167-1064190974
+3424907263-3427071583
+859417782-872292650
+1467661058-1474811610
+2393002352-2403005964
+4197417217-4208856131
+3370246481-3375696999
+1373468974-1373569404
+2905152772-2910933373
+1980855826-1983920990
+732863279-733152241
+4285742284-4286129026
+1614476697-1614835826
+2635427600-2644232203
+1470741851-1479153638
+2944130276-2951908714
+4291064131-4293894991
+1990921080-1991701381
+4227850767-4244632336
+1807565528-1814396331
+2361860677-2376637038
+2943119919-2945768965
+2172859679-2221926662
+249198701-250135569
+2652844144-2657371637
+1885639221-1900413603
+1509729634-1512261818
+3004310417-3011080364
+1694482383-1697891607
+4177987519-4212820708
+4161048921-4161074968
+476220543-480675454
+2588894890-2592105515
+2757311298-2758434349
+4050934926-4082396822
+2034604741-2043305856
+2331464398-2333528059
+1066956928-1067355622
+2646313639-2648035821
+2066636902-2067863299
+2332503976-2334659414
+3180110462-3204410296
+577236362-586064251
+256418607-258764997
+2233705634-2248146735
+3716569187-3719939659
+1386717710-1439035502
+1859175593-1859580659
+3708021302-3722129580
+3976120818-4005662251
+304413124-306709976
+1395309937-1427985546
+4226665082-4232713677
+4212820709-4214429692
+1693249319-1711620669
+2499145063-2503398930
+3721989699-3733606952
+1717757397-1721218576
+1127769041-1132781724
+3644972707-3646872069
+2077152015-2084609524
+1990599678-1991511335
+2335139292-2353521001
+4088569210-4091483373
+1642017342-1657864055
+2588719725-2589121881
+2903005844-2913683635
+194715771-196440167
+3963719430-3974518407
+4288320832-4289172749
+3151726457-3165427383
+23507982-23800784
+2895160172-2940456225
+1001177233-1005263511
+43609109-48863103
+1144192157-1157514424
+734439882-765944362
+695965351-719454865
+856803507-869754401
+1890217805-1904089509
+3300131715-3305283163
+1529237006-1529595328
+2753090359-2757523819
+828668586-831203389
+3427619213-3428732628
+2967859507-2976560941
+2329569453-2332265395
+2239885549-2252296728
+1293808207-1320485733
+2604175022-2624108715
+2697882453-2723829703
+2463205201-2470677980
+3888353469-3890883045
+400102191-427084950
+4150245199-4164107383
+1395492363-1406000929
+3675122217-3676808853
+116414852-148746047
+787563761-789069064
+3197100188-3202418404
+1373782716-1373895006
+2617111647-2617819575
+2550216289-2557881293
+1851804917-1852370216
+2617793199-2618721355
+1939113565-1942772474
+1066259539-1066964651
+2536515-2749485
+3851513911-3872830251
+3315330215-3350319238
+1372313956-1373952939
+270099979-278389263
+2861061889-2874958905
+2982764434-2982918860
+1225710523-1232594859
+3080849793-3087237669
+2168507276-2172859677
+2554045929-2558669015
+2715737041-2742164385
+2564405335-2570912208
+3111405671-3131810967
+1881537985-1906133183
+2327518639-2329278606
+1695964017-1700687554
+2325334299-2328665915
+2329084251-2329569451
+2526389631-2574332443
+2716903062-2718451591
+177141073-177775415
+177103338-177124151
+1072162087-1081552236
+3178535948-3199349236
+2293206667-2314675667
+1889288474-1903754822
+4251848410-4278329656
+697896245-706915923
+1811201479-1827334058
+102113146-112076690
+2390223078-2399260655
+829332527-848880205
+3861878449-3866482364
+1213011864-1220748067
+3580711167-3587101215
+1286680169-1311818230
+3608853495-3610981230
+1511277091-1513257838
+3450147668-3459285977
+2780989504-2803855679
+3882846313-3888163900
+941216586-953952178
+2983401144-2988059936
+2624108716-2624926759
+3402309579-3420480295
+3312749262-3314042171
+3399699391-3418732708
+4105670961-4129433645
+4257493527-4284962279
+23923784-47709067
+953952180-957049748
+2876724088-2878697891
+2416003985-2423463911
+740946393-742024905
+1380318986-1386717709
+2026496387-2041982393
+3072950856-3095969673
+196440168-234297438
+3324520138-3350841770
+1184551931-1197857708
+3723507322-3732029196
+1781641387-1785877866
+2407131596-2409544298
+5689429-5741644
+1739110416-1741141505
+2548794765-2558310137
+808209515-836691306
+2657455751-2663837619
+790539346-793059170
+568516293-569131984
+3321930331-3346790026
+472011317-479941460
+857857646-863011064
+4168502125-4170164107
+588550774-597747807
+1637815642-1662350209
+2460793334-2466026338
+958041100-970661333
+2139217624-2146211143
+2539598-2830629
+1266192646-1268371411
+1323332741-1335959162
+1439736912-1446610546
+4061001198-4065392221
+2524105557-2526389630
+2222452808-2225462596
+1388815777-1397555491
+3612936376-3650645302
+3045926276-3065706826
+3574212945-3575594696
+2827277916-2836024368
+1991475869-1991926125
+3505806023-3528702608
+2414724634-2430851599
+3021588078-3028285988
+2574332445-2592271496
+2057264136-2059202053
+3244432520-3248685694
+1712738962-1729844093
+56528833-64047545
+2971719660-2977620581
+3605787690-3611524810
+3851574035-3854062441
+1235784822-1266192644
+3006793176-3021032700
+3900016789-3922138525
+1234159313-1235784821
+455883118-466326203
+1053312381-1063953379
+2820222101-2821175967
+2502044549-2506260381
+568736374-569251939
+1578664897-1579658724
+344106424-350103368
+1590175536-1595299212
+2273779785-2277363906
+3984562197-4010152611
+45721618-54860968
+3394303383-3402309578
+1511624839-1512608254
+3884829071-3890292172
+2038966626-2047086310
+4103290900-4119641469
+3357139725-3360393033
+2780813493-2807055494
+2225462598-2252329658
+2592271497-2604175020
+1049541136-1055392314
+1533973152-1578664895
+3209140396-3244432519
+3135787447-3178535946
+1873694527-1911946735
+3716488307-3717917511
+1863079077-1868159650
+1852620713-1869463034
+2340761-6722844
+4010806326-4011637774
+2335714002-2344955062
+2503398931-2516105578
+4096488349-4097750835
+495702052-499886980
+2633949022-2643879390
+2230563996-2248676097
+1992368509-1995459736
+725466259-734439880
+3284564906-3289305182
+3006621951-3015555807
+2221926663-2224742001
+1807424325-1816026389
+1876686839-1880758503
+2691158517-2691387740
+3757816372-3758051212
+2956964132-2972741344
+2636000153-2638744402
+678819639-679798433
+250063049-250516719
+3855876124-3866454360
+3312438883-3313193146
+82686086-84339480
+1092916631-1107918456
+1843811214-1852620712
+3809172487-3830073502
+2616993454-2620553751
+2682855477-2715737040
+3863648987-3866503080
+1271724277-1275741880
+2384026814-2393286163
+2957501262-2965749150
+4213745292-4214551645
+2556715457-2565699508
+2263615-2555032
+2510926180-2524105555
+2198333368-2201790504
+983311745-991202543
+326387197-344106423
+3087807140-3088895982
+86026819-109305037
+2504533668-2507452669
+1371550992-1377668791
+1656901715-1676675657
+130445224-140364961
+875328099-885585914
+2299489843-2306253705
+3450835271-3481339653
+4014358521-4031038176
+2340311395-2351064022
+2883149064-2887845481
+2259592077-2278614136
+3810542228-3827200634
+3056035363-3068664010
+722584522-723699159
+1735688023-1740818227
+3537763412-3542953759
+2366293314-2375211143
+1411814377-1424672790
+3100999210-3102484531
+4284962281-4294967295
+1446610547-1465468961
+2874958907-2877486447
+1765556195-1793446949
+4218980804-4226442852
+494048500-497170493
+360027343-374159699
+2651399811-2665409613
+1047578446-1052368079
+2362920294-2374232484
+2570748019-2571266639
+3256410480-3277105765
+3771488685-3794388011
+722551086-722999678
+741060508-762846249
+1479919768-1481248209
+614971153-617471673
+2982621961-2982812184
+2087732105-2106406062
+2302394373-2326071906
+886110869-893987869
+864175670-867272025
+2119076394-2126808897
+1051546928-1062419089
+678814708-679604844
+2168305217-2172141567
+2943803911-2945854166
+321232218-329790306
+391378250-412099930
+539629846-568721146
+3794388012-3806424827
+2894304683-2915255653
+856495621-857857645
+2743551156-2751996369
+1024955451-1026100964
+177078688-177123406
+4018256524-4039886263
+3945209398-3956309725
+2364930647-2378530823
+1006976522-1021887240
+3757741995-3757947507
+1421470109-1432888460
+3160832331-3169658872
+177045468-177087638
+1090463009-1104430857
+1274373481-1274578120
+2626475104-2640453818
+3284290551-3288427229
+1981618690-1984277097
+1186456381-1195032668
+5052363-7502553
+1509795877-1512150519
+3579924616-3582548171
+4121363479-4137513284
+1488580398-1503472581
+2423275742-2439608584
+2138662322-2138915998
+1382223606-1410305514
+3832391075-3853706505
+1614422103-1614651523
+3369142704-3373032779
+719454867-725466258
+2084732810-2095200322
+1442897307-1457439380
+2112887248-2129529980
+4023595164-4025287662
+611715160-617013605
+778751841-791194910
+3293566719-3305859750
+1772772441-1797304174
+1589764874-1592539287
+1373791581-1374176540
+1590792815-1594025491
+1981551967-1982435626
+1520347646-1542585100
+3099494317-3115490452
+3098240473-3103804691
+3264851832-3269554326
+766110784-766211515
+2019539430-2044044979
+3266317108-3273234008
+1274283817-1274437178
+2650371073-2672921107
+2672921108-2679629874
+2673449969-2682855475
+765944363-766205817
+3853706506-3859959741
+1508362252-1513253382
+876916046-879636492
+3809955806-3810745183
+1274121584-1274542630
+3157351170-3166046719
+1053524276-1064827079
+3791652757-3800601148
+2842728202-2853639142
+3571512615-3579166854
+679353613-679923926
+3809191752-3810740480
+2817388396-2819591739
+2852317315-2861061888
+4256942395-4260208971
+3501898903-3512880687
+3882475326-3886137014
+1966578885-1968167855
+410700018-415718837
+3806424829-3821851233
+1518480570-1533973151
+3147464447-3158958125
+197786374-207567591
+3535028299-3539195436
+4184714120-4186894005
+448892515-456388417
+671686622-678352726
+1360272787-1363580702
+2164873145-2165892440
+3361616306-3375689123
+3091164847-3093370647
+3297273994-3311056250
+398273343-404652855
+1782105095-1803766701
+1484145894-1503189992
+2160023298-2160172849
+2919583395-2932229908
+2812705686-2830443941
+2855216236-2865262494
+148746049-149287452
+589888575-595456264
+314410823-316970816
+2060986022-2063938184
+1803766703-1825422528
+2128237894-2139217623
+4248957737-4257018408
+3561933398-3574109426
+1614389854-1614749576
+468854062-476024564
+436179755-463764255
+589811734-589875676
+673967863-678814706
+979844884-993353080
+1945908845-1980551520
+1990017551-1992668548
+1252508632-1256783095
+2946230992-2982621959
+3954810178-3972017471
+3396778325-3399315311
+3331661742-3344656790
+3072306192-3077370803
+4093061872-4094625093
+2876543933-2878230248
+2854310965-2859128779
+4193316980-4200095285
+730205666-732782756
+3676211467-3676732582
+666890880-674578243
+1371568734-1380318984
+4184744194-4187112660
+1481248211-1499734002
+3379867668-3385527932
+1622428665-1625174665
+3671900758-3678171048
+3705951043-3716692751
+1465468963-1479919767
+1580610051-1583129310
+350103370-365345541
+3900102077-3919890024
+2940456227-2945966226
+3248685696-3284290550
+544295457-564157394
+4016705659-4021147057
+791731732-797225629
+1165689597-1184551930
+3289305184-3312438882
+4097750837-4102130426
+4055841302-4077041304
+3441155355-3450835270
+3314042173-3333554945
+597747809-623200754
+356234097-366220597
+2381045649-2408455595
+4047227592-4049208360
+4092327831-4093008849
+3986217544-4010716485
+3587101217-3589409982
+3939796675-3976120816
+1335959163-1365648715
+3809562980-3810806981
+1374160507-1375189297
+1229723962-1229853859
+2978027850-2978555872
+1081232290-1096685438
+3431403369-3441155353
+3058481098-3072306190
+3615995822-3647806423
+626772256-671686621
+1922970278-1932303880
+687812741-696977728
+3664395391-3676520369
+2073554869-2099760007
+512240640-534906131
+47709068-56528831
+255985991-270099977
+3481339655-3501155910
+2238475796-2249793376
+3866035083-3867269474
+4093117795-4094756619
+4285929403-4287400825
+702714634-707275982
+3036049064-3058481097
+1027080396-1032733050
+113815262-115324511
+2256577067-2275122653
+1990217023-1991256560
+109305038-113504562
+978617987-1000518126
+4057509129-4071389442
+3739975721-3747173973
+320182613-320260227
+1770166-1994691
+291087466-296873313
+4086243810-4096488348
+1276470617-1302918078
+4009439486-4012738003
+4229206868-4234285011
+50143427-53071093
+404422891-410359316
+4161013486-4161053283
+911138009-929609461
+689609396-696731723
+2252329659-2256577065
+613133080-613942155
+4795688-12016953
+641672798-650081964
+389776265-420161914
+3625922134-3642274972
+1846384495-1862435820
+2275122654-2286941521
+4005662252-4011759888
+1579087992-1581111352
+574652-1770165
+1442180635-1450176908
+2760767133-2771395260
+1928232572-1932533591
+102995855-104909244
+4049179426-4050691624
+2830630-3651339
+3552827772-3568200782
+2149613227-2163021264
+1355394428-1371491556
+1697279405-1703102679
+2056763545-2073554867
+3935325191-3944187216
+3553082925-3579924615
+471239627-477134321
+3651340-4795687
+336457769-347991249
+93183635-111293337
+2192128388-2196145589
+2584811687-2598361179
+2772743660-2798530311
+966574237-968633571
+4234775226-4245296919
+3662498499-3663349534
+1373549652-1374239894
+58302860-63670232
+1942772476-1980855825
+3367790115-3376760130
+153092723-163571711
+729975675-730335988
+2192513622-2204700032
+809609217-841628900
+1180032684-1187000735
+1179227554-1195640753
+4232727143-4234293540
+1127122996-1154171178
+314709697-321232216
+324796849-347951368
+1095126621-1109642108
+384962939-400102190
+363929652-366175319
+3821851234-3832391073
+338713138-348077886
+817486506-837487497
+1051940232-1067333023
+19243172-19587047
+257512323-261464746
+1753791137-1753975241
+202493249-230688701
+1579363284-1580767164
+2763246325-2780813492
+2242297310-2249800231
+1995459738-2019539429
+573925402-574462282
+3673851405-3681451655
+3423327301-3428356692
+3681451657-3695852450
+3717161710-3718982299
+2043127586-2043244031
+2888999958-2894304682
+2061236903-2067109739
+2643879391-2646512593
+1139540259-1146292375
+3544236730-3552827770
+2287385837-2325334298
+3598404107-3612936374
+3623885184-3631095478
+1752497514-1756572770
+2817718245-2824409717
+679569338-680230991
+4102130427-4150245197
+1869463036-1881600179
+286732642-289325518
+2995454654-3032053775
+1274816430-1274830828
+4008677258-4014358519
+248491486-248842325
+1622000764-1625125474
+1165689487-1187305806
+3937241402-3968405869
+4050691625-4086243808
+3663349535-3676933438
+2982918861-2995454652
+1372603515-1379417540
+2408455596-2411739453
+201820937-227275418
+1753934804-1754073983
+2280075243-2287385835
+2905919817-2917493149
+2757562598-2759204124
+1444583282-1458937548
+1699259773-1707790200
+1579284365-1579540410
+624710045-626772254
+2971742099-2980188298
+3895219248-3896408881
+1637216769-1663878490
+1606776283-1612157133
+1527331165-1569579671
+1468822607-1477434547
+3930477156-3939796674
+4214551647-4234775225
+1469208064-1469259449
+4245296921-4257493526
+3930128245-3930477154
diff --git a/2016/aoc20/src/main.rs b/2016/aoc20/src/main.rs
new file mode 100644
index 0000000..ee14583
--- /dev/null
+++ b/2016/aoc20/src/main.rs
@@ -0,0 +1,114 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::u32;
+
+#[derive(Debug)]
+struct IpRange {
+ start: u32,
+ end: u32
+}
+
+impl IpRange {
+ fn new(start: u32, end: u32) -> IpRange {
+ IpRange {
+ start: start,
+ end: end
+ }
+ }
+
+ fn contains(&self, other: u32) -> bool {
+ self.start <= other && other <= self.end
+ }
+
+ fn try_combine(&self, other: &IpRange) -> Option<IpRange> {
+ if self.contains(other.start) && self.contains(other.end) {
+ Some(IpRange::new(self.start, self.end))
+ }
+ else if other.contains(self.start) && other.contains(self.end) {
+ Some(IpRange::new(other.start, other.end))
+ }
+ else if self.contains(other.start) && other.contains(self.end) {
+ Some(IpRange::new(self.start, other.end))
+ }
+ else if other.contains(self.start) && self.contains(other.end) {
+ Some(IpRange::new(other.start, self.end))
+ }
+ else {
+ None
+ }
+ }
+}
+
+fn main() {
+ let mut ranges = read_file();
+ optimize_ranges(&mut ranges);
+
+ let mut allowed = Vec::new();
+
+ // current will be in the u32 range while it's in the loop, but
+ // needs to be a u64 to pass u32::MAX. Otherwise it will just
+ // overflow and run forever.
+ let mut current: u64 = 0;
+ while current <= u32::MAX as u64 {
+ match ranges.iter().find(|range| range.contains(current as u32)) {
+ Some(blacklisting_range) => {
+ current = blacklisting_range.end as u64 + 1;
+ },
+ None => {
+ allowed.push(current as u32);
+ current += 1;
+ }
+ }
+ }
+
+ let min_not_in_range = allowed[0];
+ let allowed_count = allowed.len();
+
+ println!("Min not in any range: {}", min_not_in_range);
+ println!("Allowed count: {}", allowed_count);
+}
+
+fn read_file() -> Vec<IpRange> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .filter_map(|line| {
+ let line = line.unwrap();
+ let mut split = line.split('-');
+ let start = split.next();
+ let end = split.next();
+ match (start, end) {
+ (Some(start), Some(end)) => Some(IpRange {
+ start: start.parse().unwrap(),
+ end: end.parse().unwrap()
+ }),
+ _ => None
+ }
+ })
+ .collect()
+}
+
+fn optimize_ranges(ranges: &mut Vec<IpRange>) {
+ let mut before_count = ranges.len();
+ let mut after_count = 0;
+ while before_count != after_count {
+ before_count = ranges.len();
+ ranges.sort_by_key(|r| r.start);
+
+ let mut i = 0;
+ while i < ranges.len()-1 {
+ match ranges[i].try_combine(&ranges[i+1]) {
+ Some(combined) => {
+ ranges[i] = combined;
+ ranges.remove(i+1);
+ },
+ None => {}
+ }
+ i += 1;
+ }
+
+ after_count = ranges.len();
+
+ println!("Number of ranges {} => {}", before_count, after_count);
+ }
+}
diff --git a/2016/aoc21/Cargo.lock b/2016/aoc21/Cargo.lock
new file mode 100644
index 0000000..9a1075b
--- /dev/null
+++ b/2016/aoc21/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc21"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc21/Cargo.toml b/2016/aoc21/Cargo.toml
new file mode 100644
index 0000000..bc0d468
--- /dev/null
+++ b/2016/aoc21/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc21"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc21/input.txt b/2016/aoc21/input.txt
new file mode 100644
index 0000000..ebd7d52
--- /dev/null
+++ b/2016/aoc21/input.txt
@@ -0,0 +1,100 @@
+rotate based on position of letter d
+move position 1 to position 6
+swap position 3 with position 6
+rotate based on position of letter c
+swap position 0 with position 1
+rotate right 5 steps
+rotate left 3 steps
+rotate based on position of letter b
+swap position 0 with position 2
+rotate based on position of letter g
+rotate left 0 steps
+reverse positions 0 through 3
+rotate based on position of letter a
+rotate based on position of letter h
+rotate based on position of letter a
+rotate based on position of letter g
+rotate left 5 steps
+move position 3 to position 7
+rotate right 5 steps
+rotate based on position of letter f
+rotate right 7 steps
+rotate based on position of letter a
+rotate right 6 steps
+rotate based on position of letter a
+swap letter c with letter f
+reverse positions 2 through 6
+rotate left 1 step
+reverse positions 3 through 5
+rotate based on position of letter f
+swap position 6 with position 5
+swap letter h with letter e
+move position 1 to position 3
+swap letter c with letter h
+reverse positions 4 through 7
+swap letter f with letter h
+rotate based on position of letter f
+rotate based on position of letter g
+reverse positions 3 through 4
+rotate left 7 steps
+swap letter h with letter a
+rotate based on position of letter e
+rotate based on position of letter f
+rotate based on position of letter g
+move position 5 to position 0
+rotate based on position of letter c
+reverse positions 3 through 6
+rotate right 4 steps
+move position 1 to position 2
+reverse positions 3 through 6
+swap letter g with letter a
+rotate based on position of letter d
+rotate based on position of letter a
+swap position 0 with position 7
+rotate left 7 steps
+rotate right 2 steps
+rotate right 6 steps
+rotate based on position of letter b
+rotate right 2 steps
+swap position 7 with position 4
+rotate left 4 steps
+rotate left 3 steps
+swap position 2 with position 7
+move position 5 to position 4
+rotate right 3 steps
+rotate based on position of letter g
+move position 1 to position 2
+swap position 7 with position 0
+move position 4 to position 6
+move position 3 to position 0
+rotate based on position of letter f
+swap letter g with letter d
+swap position 1 with position 5
+reverse positions 0 through 2
+swap position 7 with position 3
+rotate based on position of letter g
+swap letter c with letter a
+rotate based on position of letter g
+reverse positions 3 through 5
+move position 6 to position 3
+swap letter b with letter e
+reverse positions 5 through 6
+move position 6 to position 7
+swap letter a with letter e
+swap position 6 with position 2
+move position 4 to position 5
+rotate left 5 steps
+swap letter a with letter d
+swap letter e with letter g
+swap position 3 with position 7
+reverse positions 0 through 5
+swap position 5 with position 7
+swap position 1 with position 7
+swap position 1 with position 7
+rotate right 7 steps
+swap letter f with letter a
+reverse positions 0 through 7
+rotate based on position of letter d
+reverse positions 2 through 4
+swap position 7 with position 1
+swap letter a with letter h
diff --git a/2016/aoc21/src/main.rs b/2016/aoc21/src/main.rs
new file mode 100644
index 0000000..1366f1e
--- /dev/null
+++ b/2016/aoc21/src/main.rs
@@ -0,0 +1,233 @@
+extern crate regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::collections::VecDeque;
+
+use regex::Regex;
+
+fn main() {
+ let password = "abcdefgh".to_string();
+ let program = read_file();
+ let scrambled = scramble_password(password, &program);
+ println!("Scrambled password is {}", scrambled);
+ let unscrambled = unscramble_password(scrambled, &program);
+ println!("Which unscrambles to {}", unscrambled);
+
+ let other_scrambled = "fbgdceah".to_string();
+ let other_unscrambled = unscramble_password(other_scrambled, &program);
+
+ println!("Decrypted easter bunny password is {}", other_unscrambled);
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
+
+fn scramble_password(password: String, program: &Vec<String>) -> String {
+ let mut pass = password.chars().collect::<VecDeque<_>>();
+
+ let instructions = scramble_instruction_set();
+
+ for line in program {
+ for &(ref reg, ref func) in &instructions {
+ let captures = reg.captures(line.as_ref());
+ if captures.is_some() {
+ func(&mut pass, captures.unwrap());
+ }
+ }
+ }
+
+ pass.iter().cloned().collect()
+}
+
+fn unscramble_password(password: String, program: &Vec<String>) -> String {
+ let mut pass = password.chars().collect::<VecDeque<_>>();
+
+ let instructions = unscramble_instruction_set();
+
+ let mut backwards_program = program.clone();
+ backwards_program.reverse();
+ for line in backwards_program {
+ for &(ref reg, ref func) in &instructions {
+ let captures = reg.captures(line.as_ref());
+ if captures.is_some() {
+ func(&mut pass, captures.unwrap());
+ }
+ }
+ }
+
+ pass.iter().cloned().collect()
+}
+
+fn scramble_instruction_set() -> Vec<(Regex, fn(&mut VecDeque<char>, regex::Captures))> {
+ let mut instructions : Vec<(Regex, fn(&mut VecDeque<char>, regex::Captures))> = Vec::new();
+ instructions.push((Regex::new(r"swap position (\d+) with position (\d+)").unwrap(), swap_pos));
+ instructions.push((Regex::new(r"swap letter ([a-z]) with letter ([a-z])").unwrap(), swap_let));
+ instructions.push((Regex::new(r"rotate left (\d+) step").unwrap(), rotate_left));
+ instructions.push((Regex::new(r"rotate right (\d+) step").unwrap(), rotate_right));
+ instructions.push((Regex::new(r"rotate based on position of letter ([a-z])").unwrap(), rotate_pos));
+ instructions.push((Regex::new(r"reverse positions (\d+) through (\d+)").unwrap(), reverse_sub));
+ instructions.push((Regex::new(r"move position (\d+) to position (\d+)").unwrap(), move_pos));
+
+ instructions
+}
+
+fn unscramble_instruction_set() -> Vec<(Regex, fn(&mut VecDeque<char>, regex::Captures))> {
+ let mut instructions : Vec<(Regex, fn(&mut VecDeque<char>, regex::Captures))> = Vec::new();
+ instructions.push((Regex::new(r"swap position (\d+) with position (\d+)").unwrap(), swap_pos));
+ instructions.push((Regex::new(r"swap letter ([a-z]) with letter ([a-z])").unwrap(), swap_let));
+ instructions.push((Regex::new(r"rotate left (\d+) step").unwrap(), rotate_right));
+ instructions.push((Regex::new(r"rotate right (\d+) step").unwrap(), rotate_left));
+ instructions.push((Regex::new(r"rotate based on position of letter ([a-z])").unwrap(), undo_rotate_pos));
+ instructions.push((Regex::new(r"reverse positions (\d+) through (\d+)").unwrap(), reverse_sub));
+ instructions.push((Regex::new(r"move position (\d+) to position (\d+)").unwrap(), undo_move_pos));
+
+ instructions
+}
+
+fn swap_pos(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let src = cap.at(1).unwrap().parse::<usize>().unwrap();
+ let dest = cap.at(2).unwrap().parse::<usize>().unwrap();
+ pass.swap(src, dest);
+}
+
+fn swap_let(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let src = cap.at(1).unwrap().chars().next().unwrap();
+ let dest = cap.at(2).unwrap().chars().next().unwrap();
+ let src_position = pass.iter().position(|&c| c == src);
+ let dest_position = pass.iter().position(|&c| c == dest);
+ match (src_position, dest_position) {
+ (Some(src_pos), Some(dest_pos)) => {
+ pass.swap(src_pos, dest_pos);
+ },
+ _ => {}
+ };
+}
+
+fn rotate_left(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let steps = cap.at(1).unwrap().parse::<usize>().unwrap();
+ for _ in 0..steps {
+ let c = pass.pop_front().unwrap();
+ pass.push_back(c);
+ }
+}
+
+fn rotate_right(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let steps = cap.at(1).unwrap().parse::<usize>().unwrap();
+ for _ in 0..steps {
+ let c = pass.pop_back().unwrap();
+ pass.push_front(c);
+ }
+}
+
+fn rotate_pos(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let letter = cap.at(1).unwrap().chars().next().unwrap();
+ let pos = pass.iter().position(|&c| c == letter).unwrap();
+ let steps = 1 + pos + if pos >=4 { 1 } else { 0 };
+ for _ in 0..steps {
+ let c = pass.pop_back().unwrap();
+ pass.push_front(c);
+ }
+}
+
+fn move_pos(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let src = cap.at(1).unwrap().parse::<usize>().unwrap();
+ let dest = cap.at(2).unwrap().parse::<usize>().unwrap();
+ let c = pass.remove(src).unwrap();
+ pass.insert(dest, c);
+}
+
+fn reverse_sub(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let mut start = cap.at(1).unwrap().parse::<usize>().unwrap();
+ let mut end = cap.at(2).unwrap().parse::<usize>().unwrap();
+ while start < end {
+ pass.swap(start, end);
+ start += 1;
+ end -= 1;
+ }
+}
+
+fn undo_rotate_pos(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let letter = cap.at(1).unwrap().chars().next().unwrap();
+ let dest_pos = pass.iter().position(|&c| c == letter).unwrap();
+ let mut pos = dest_pos;
+
+ loop {
+ let c = pass.pop_front().unwrap();
+ pass.push_back(c);
+ pos -= 1;
+ let steps = 1 + pos + if pos >=4 { 1 } else { 0 };
+ if (pos + steps) % pass.len() == dest_pos {
+ break;
+ }
+ }
+}
+
+fn undo_move_pos(pass: &mut VecDeque<char>, cap: regex::Captures) {
+ let src = cap.at(1).unwrap().parse::<usize>().unwrap();
+ let dest = cap.at(2).unwrap().parse::<usize>().unwrap();
+ let c = pass.remove(dest).unwrap();
+ pass.insert(src, c);
+}
+
+#[test]
+fn swap_pos_example() {
+ let instructions = vec!("swap position 4 with position 0".to_string());
+ let password = "abcde".to_string();
+ assert_eq!("ebcda".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn swap_let_example() {
+ let instructions = vec!("swap letter d with letter b".to_string());
+ let password = "ebcda".to_string();
+ assert_eq!("edcba".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn reverse_example() {
+ let instructions = vec!("reverse positions 0 through 4".to_string());
+ let password = "edcba".to_string();
+ assert_eq!("abcde".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn rotate_left_example() {
+ let instructions = vec!("rotate left 1 step".to_string());
+ let password = "abcde".to_string();
+ assert_eq!("bcdea".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn move_example() {
+ let instructions = vec!("move position 3 to position 0".to_string());
+ let password = "bdeac".to_string();
+ assert_eq!("abdec".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn rotate_pos_example_1() {
+ let instructions = vec!("rotate based on position of letter b".to_string());
+ let password = "abdec".to_string();
+ assert_eq!("ecabd".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn rotate_pos_example_2() {
+ let instructions = vec!("rotate based on position of letter d".to_string());
+ let password = "ecabd".to_string();
+ assert_eq!("decab".to_string(), scramble_password(password, instructions));
+}
+
+#[test]
+fn rotate_right_example() {
+ let instructions = vec!("rotate right 2 steps".to_string());
+ let password = "decab".to_string();
+ assert_eq!("abdec".to_string(), scramble_password(password, instructions));
+}
diff --git a/2016/aoc22/Cargo.lock b/2016/aoc22/Cargo.lock
new file mode 100644
index 0000000..81a7213
--- /dev/null
+++ b/2016/aoc22/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc22"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc22/Cargo.toml b/2016/aoc22/Cargo.toml
new file mode 100644
index 0000000..074ccd5
--- /dev/null
+++ b/2016/aoc22/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc22"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc22/input.txt b/2016/aoc22/input.txt
new file mode 100644
index 0000000..08e9843
--- /dev/null
+++ b/2016/aoc22/input.txt
@@ -0,0 +1,1017 @@
+root@ebhq-gridcenter# df -h
+Filesystem Size Used Avail Use%
+/dev/grid/node-x0-y0 89T 65T 24T 73%
+/dev/grid/node-x0-y1 92T 64T 28T 69%
+/dev/grid/node-x0-y2 85T 70T 15T 82%
+/dev/grid/node-x0-y3 90T 64T 26T 71%
+/dev/grid/node-x0-y4 86T 72T 14T 83%
+/dev/grid/node-x0-y5 90T 68T 22T 75%
+/dev/grid/node-x0-y6 94T 64T 30T 68%
+/dev/grid/node-x0-y7 87T 72T 15T 82%
+/dev/grid/node-x0-y8 90T 65T 25T 72%
+/dev/grid/node-x0-y9 90T 65T 25T 72%
+/dev/grid/node-x0-y10 89T 66T 23T 74%
+/dev/grid/node-x0-y11 94T 70T 24T 74%
+/dev/grid/node-x0-y12 90T 65T 25T 72%
+/dev/grid/node-x0-y13 91T 72T 19T 79%
+/dev/grid/node-x0-y14 85T 70T 15T 82%
+/dev/grid/node-x0-y15 89T 70T 19T 78%
+/dev/grid/node-x0-y16 90T 66T 24T 73%
+/dev/grid/node-x0-y17 86T 64T 22T 74%
+/dev/grid/node-x0-y18 88T 65T 23T 73%
+/dev/grid/node-x0-y19 85T 68T 17T 80%
+/dev/grid/node-x0-y20 93T 70T 23T 75%
+/dev/grid/node-x0-y21 89T 64T 25T 71%
+/dev/grid/node-x0-y22 87T 67T 20T 77%
+/dev/grid/node-x0-y23 90T 73T 17T 81%
+/dev/grid/node-x0-y24 92T 68T 24T 73%
+/dev/grid/node-x0-y25 88T 69T 19T 78%
+/dev/grid/node-x0-y26 88T 69T 19T 78%
+/dev/grid/node-x0-y27 86T 72T 14T 83%
+/dev/grid/node-x0-y28 92T 71T 21T 77%
+/dev/grid/node-x1-y0 89T 73T 16T 82%
+/dev/grid/node-x1-y1 89T 68T 21T 76%
+/dev/grid/node-x1-y2 94T 70T 24T 74%
+/dev/grid/node-x1-y3 90T 68T 22T 75%
+/dev/grid/node-x1-y4 89T 67T 22T 75%
+/dev/grid/node-x1-y5 90T 70T 20T 77%
+/dev/grid/node-x1-y6 92T 71T 21T 77%
+/dev/grid/node-x1-y7 92T 71T 21T 77%
+/dev/grid/node-x1-y8 86T 73T 13T 84%
+/dev/grid/node-x1-y9 87T 69T 18T 79%
+/dev/grid/node-x1-y10 87T 66T 21T 75%
+/dev/grid/node-x1-y11 85T 72T 13T 84%
+/dev/grid/node-x1-y12 90T 69T 21T 76%
+/dev/grid/node-x1-y13 89T 67T 22T 75%
+/dev/grid/node-x1-y14 90T 65T 25T 72%
+/dev/grid/node-x1-y15 94T 65T 29T 69%
+/dev/grid/node-x1-y16 85T 70T 15T 82%
+/dev/grid/node-x1-y17 93T 64T 29T 68%
+/dev/grid/node-x1-y18 87T 68T 19T 78%
+/dev/grid/node-x1-y19 85T 66T 19T 77%
+/dev/grid/node-x1-y20 90T 72T 18T 80%
+/dev/grid/node-x1-y21 89T 73T 16T 82%
+/dev/grid/node-x1-y22 90T 65T 25T 72%
+/dev/grid/node-x1-y23 91T 72T 19T 79%
+/dev/grid/node-x1-y24 87T 70T 17T 80%
+/dev/grid/node-x1-y25 91T 64T 27T 70%
+/dev/grid/node-x1-y26 90T 64T 26T 71%
+/dev/grid/node-x1-y27 93T 69T 24T 74%
+/dev/grid/node-x1-y28 89T 65T 24T 73%
+/dev/grid/node-x2-y0 89T 72T 17T 80%
+/dev/grid/node-x2-y1 92T 69T 23T 75%
+/dev/grid/node-x2-y2 91T 65T 26T 71%
+/dev/grid/node-x2-y3 86T 73T 13T 84%
+/dev/grid/node-x2-y4 90T 69T 21T 76%
+/dev/grid/node-x2-y5 86T 68T 18T 79%
+/dev/grid/node-x2-y6 91T 70T 21T 76%
+/dev/grid/node-x2-y7 86T 64T 22T 74%
+/dev/grid/node-x2-y8 88T 65T 23T 73%
+/dev/grid/node-x2-y9 94T 73T 21T 77%
+/dev/grid/node-x2-y10 89T 71T 18T 79%
+/dev/grid/node-x2-y11 88T 64T 24T 72%
+/dev/grid/node-x2-y12 92T 71T 21T 77%
+/dev/grid/node-x2-y13 86T 69T 17T 80%
+/dev/grid/node-x2-y14 87T 69T 18T 79%
+/dev/grid/node-x2-y15 93T 71T 22T 76%
+/dev/grid/node-x2-y16 91T 65T 26T 71%
+/dev/grid/node-x2-y17 93T 65T 28T 69%
+/dev/grid/node-x2-y18 86T 69T 17T 80%
+/dev/grid/node-x2-y19 87T 69T 18T 79%
+/dev/grid/node-x2-y20 86T 72T 14T 83%
+/dev/grid/node-x2-y21 86T 73T 13T 84%
+/dev/grid/node-x2-y22 505T 499T 6T 98%
+/dev/grid/node-x2-y23 89T 65T 24T 73%
+/dev/grid/node-x2-y24 92T 64T 28T 69%
+/dev/grid/node-x2-y25 94T 64T 30T 68%
+/dev/grid/node-x2-y26 87T 73T 14T 83%
+/dev/grid/node-x2-y27 87T 69T 18T 79%
+/dev/grid/node-x2-y28 94T 71T 23T 75%
+/dev/grid/node-x3-y0 88T 66T 22T 75%
+/dev/grid/node-x3-y1 91T 69T 22T 75%
+/dev/grid/node-x3-y2 91T 69T 22T 75%
+/dev/grid/node-x3-y3 86T 67T 19T 77%
+/dev/grid/node-x3-y4 90T 64T 26T 71%
+/dev/grid/node-x3-y5 89T 72T 17T 80%
+/dev/grid/node-x3-y6 87T 66T 21T 75%
+/dev/grid/node-x3-y7 90T 68T 22T 75%
+/dev/grid/node-x3-y8 91T 66T 25T 72%
+/dev/grid/node-x3-y9 89T 64T 25T 71%
+/dev/grid/node-x3-y10 92T 67T 25T 72%
+/dev/grid/node-x3-y11 86T 64T 22T 74%
+/dev/grid/node-x3-y12 94T 65T 29T 69%
+/dev/grid/node-x3-y13 91T 70T 21T 76%
+/dev/grid/node-x3-y14 89T 72T 17T 80%
+/dev/grid/node-x3-y15 89T 64T 25T 71%
+/dev/grid/node-x3-y16 85T 73T 12T 85%
+/dev/grid/node-x3-y17 89T 65T 24T 73%
+/dev/grid/node-x3-y18 88T 71T 17T 80%
+/dev/grid/node-x3-y19 89T 69T 20T 77%
+/dev/grid/node-x3-y20 91T 68T 23T 74%
+/dev/grid/node-x3-y21 90T 72T 18T 80%
+/dev/grid/node-x3-y22 505T 498T 7T 98%
+/dev/grid/node-x3-y23 85T 65T 20T 76%
+/dev/grid/node-x3-y24 94T 72T 22T 76%
+/dev/grid/node-x3-y25 90T 68T 22T 75%
+/dev/grid/node-x3-y26 90T 65T 25T 72%
+/dev/grid/node-x3-y27 87T 66T 21T 75%
+/dev/grid/node-x3-y28 90T 66T 24T 73%
+/dev/grid/node-x4-y0 86T 67T 19T 77%
+/dev/grid/node-x4-y1 92T 67T 25T 72%
+/dev/grid/node-x4-y2 91T 71T 20T 78%
+/dev/grid/node-x4-y3 94T 69T 25T 73%
+/dev/grid/node-x4-y4 90T 64T 26T 71%
+/dev/grid/node-x4-y5 93T 70T 23T 75%
+/dev/grid/node-x4-y6 93T 67T 26T 72%
+/dev/grid/node-x4-y7 91T 71T 20T 78%
+/dev/grid/node-x4-y8 90T 70T 20T 77%
+/dev/grid/node-x4-y9 89T 66T 23T 74%
+/dev/grid/node-x4-y10 94T 64T 30T 68%
+/dev/grid/node-x4-y11 94T 70T 24T 74%
+/dev/grid/node-x4-y12 89T 69T 20T 77%
+/dev/grid/node-x4-y13 90T 72T 18T 80%
+/dev/grid/node-x4-y14 88T 69T 19T 78%
+/dev/grid/node-x4-y15 85T 64T 21T 75%
+/dev/grid/node-x4-y16 86T 71T 15T 82%
+/dev/grid/node-x4-y17 90T 65T 25T 72%
+/dev/grid/node-x4-y18 88T 65T 23T 73%
+/dev/grid/node-x4-y19 91T 71T 20T 78%
+/dev/grid/node-x4-y20 94T 71T 23T 75%
+/dev/grid/node-x4-y21 91T 65T 26T 71%
+/dev/grid/node-x4-y22 510T 491T 19T 96%
+/dev/grid/node-x4-y23 86T 72T 14T 83%
+/dev/grid/node-x4-y24 91T 69T 22T 75%
+/dev/grid/node-x4-y25 93T 64T 29T 68%
+/dev/grid/node-x4-y26 92T 65T 27T 70%
+/dev/grid/node-x4-y27 91T 67T 24T 73%
+/dev/grid/node-x4-y28 93T 66T 27T 70%
+/dev/grid/node-x5-y0 85T 70T 15T 82%
+/dev/grid/node-x5-y1 90T 71T 19T 78%
+/dev/grid/node-x5-y2 94T 68T 26T 72%
+/dev/grid/node-x5-y3 88T 73T 15T 82%
+/dev/grid/node-x5-y4 85T 71T 14T 83%
+/dev/grid/node-x5-y5 92T 67T 25T 72%
+/dev/grid/node-x5-y6 92T 68T 24T 73%
+/dev/grid/node-x5-y7 86T 69T 17T 80%
+/dev/grid/node-x5-y8 90T 64T 26T 71%
+/dev/grid/node-x5-y9 88T 71T 17T 80%
+/dev/grid/node-x5-y10 91T 65T 26T 71%
+/dev/grid/node-x5-y11 92T 65T 27T 70%
+/dev/grid/node-x5-y12 87T 66T 21T 75%
+/dev/grid/node-x5-y13 87T 71T 16T 81%
+/dev/grid/node-x5-y14 90T 67T 23T 74%
+/dev/grid/node-x5-y15 92T 70T 22T 76%
+/dev/grid/node-x5-y16 94T 66T 28T 70%
+/dev/grid/node-x5-y17 88T 68T 20T 77%
+/dev/grid/node-x5-y18 86T 69T 17T 80%
+/dev/grid/node-x5-y19 94T 66T 28T 70%
+/dev/grid/node-x5-y20 90T 69T 21T 76%
+/dev/grid/node-x5-y21 88T 71T 17T 80%
+/dev/grid/node-x5-y22 509T 496T 13T 97%
+/dev/grid/node-x5-y23 87T 67T 20T 77%
+/dev/grid/node-x5-y24 91T 64T 27T 70%
+/dev/grid/node-x5-y25 93T 69T 24T 74%
+/dev/grid/node-x5-y26 93T 73T 20T 78%
+/dev/grid/node-x5-y27 88T 70T 18T 79%
+/dev/grid/node-x5-y28 87T 73T 14T 83%
+/dev/grid/node-x6-y0 87T 65T 22T 74%
+/dev/grid/node-x6-y1 85T 64T 21T 75%
+/dev/grid/node-x6-y2 91T 72T 19T 79%
+/dev/grid/node-x6-y3 90T 64T 26T 71%
+/dev/grid/node-x6-y4 93T 66T 27T 70%
+/dev/grid/node-x6-y5 93T 67T 26T 72%
+/dev/grid/node-x6-y6 89T 64T 25T 71%
+/dev/grid/node-x6-y7 89T 64T 25T 71%
+/dev/grid/node-x6-y8 86T 72T 14T 83%
+/dev/grid/node-x6-y9 87T 68T 19T 78%
+/dev/grid/node-x6-y10 94T 73T 21T 77%
+/dev/grid/node-x6-y11 88T 65T 23T 73%
+/dev/grid/node-x6-y12 88T 70T 18T 79%
+/dev/grid/node-x6-y13 93T 66T 27T 70%
+/dev/grid/node-x6-y14 87T 68T 19T 78%
+/dev/grid/node-x6-y15 87T 68T 19T 78%
+/dev/grid/node-x6-y16 87T 73T 14T 83%
+/dev/grid/node-x6-y17 87T 70T 17T 80%
+/dev/grid/node-x6-y18 87T 69T 18T 79%
+/dev/grid/node-x6-y19 85T 67T 18T 78%
+/dev/grid/node-x6-y20 91T 71T 20T 78%
+/dev/grid/node-x6-y21 86T 72T 14T 83%
+/dev/grid/node-x6-y22 503T 497T 6T 98%
+/dev/grid/node-x6-y23 93T 72T 21T 77%
+/dev/grid/node-x6-y24 91T 72T 19T 79%
+/dev/grid/node-x6-y25 85T 67T 18T 78%
+/dev/grid/node-x6-y26 86T 65T 21T 75%
+/dev/grid/node-x6-y27 92T 67T 25T 72%
+/dev/grid/node-x6-y28 87T 72T 15T 82%
+/dev/grid/node-x7-y0 88T 67T 21T 76%
+/dev/grid/node-x7-y1 85T 64T 21T 75%
+/dev/grid/node-x7-y2 90T 67T 23T 74%
+/dev/grid/node-x7-y3 87T 65T 22T 74%
+/dev/grid/node-x7-y4 92T 70T 22T 76%
+/dev/grid/node-x7-y5 89T 67T 22T 75%
+/dev/grid/node-x7-y6 90T 65T 25T 72%
+/dev/grid/node-x7-y7 88T 66T 22T 75%
+/dev/grid/node-x7-y8 88T 65T 23T 73%
+/dev/grid/node-x7-y9 93T 72T 21T 77%
+/dev/grid/node-x7-y10 91T 70T 21T 76%
+/dev/grid/node-x7-y11 90T 70T 20T 77%
+/dev/grid/node-x7-y12 89T 68T 21T 76%
+/dev/grid/node-x7-y13 91T 65T 26T 71%
+/dev/grid/node-x7-y14 90T 65T 25T 72%
+/dev/grid/node-x7-y15 85T 65T 20T 76%
+/dev/grid/node-x7-y16 91T 65T 26T 71%
+/dev/grid/node-x7-y17 89T 72T 17T 80%
+/dev/grid/node-x7-y18 88T 65T 23T 73%
+/dev/grid/node-x7-y19 94T 72T 22T 76%
+/dev/grid/node-x7-y20 85T 73T 12T 85%
+/dev/grid/node-x7-y21 85T 68T 17T 80%
+/dev/grid/node-x7-y22 507T 497T 10T 98%
+/dev/grid/node-x7-y23 91T 69T 22T 75%
+/dev/grid/node-x7-y24 93T 68T 25T 73%
+/dev/grid/node-x7-y25 90T 72T 18T 80%
+/dev/grid/node-x7-y26 91T 70T 21T 76%
+/dev/grid/node-x7-y27 93T 65T 28T 69%
+/dev/grid/node-x7-y28 91T 64T 27T 70%
+/dev/grid/node-x8-y0 86T 71T 15T 82%
+/dev/grid/node-x8-y1 88T 69T 19T 78%
+/dev/grid/node-x8-y2 90T 64T 26T 71%
+/dev/grid/node-x8-y3 92T 67T 25T 72%
+/dev/grid/node-x8-y4 86T 71T 15T 82%
+/dev/grid/node-x8-y5 88T 68T 20T 77%
+/dev/grid/node-x8-y6 90T 71T 19T 78%
+/dev/grid/node-x8-y7 86T 70T 16T 81%
+/dev/grid/node-x8-y8 87T 72T 15T 82%
+/dev/grid/node-x8-y9 93T 67T 26T 72%
+/dev/grid/node-x8-y10 93T 65T 28T 69%
+/dev/grid/node-x8-y11 94T 66T 28T 70%
+/dev/grid/node-x8-y12 92T 70T 22T 76%
+/dev/grid/node-x8-y13 91T 68T 23T 74%
+/dev/grid/node-x8-y14 93T 72T 21T 77%
+/dev/grid/node-x8-y15 90T 71T 19T 78%
+/dev/grid/node-x8-y16 87T 73T 14T 83%
+/dev/grid/node-x8-y17 86T 73T 13T 84%
+/dev/grid/node-x8-y18 89T 68T 21T 76%
+/dev/grid/node-x8-y19 88T 67T 21T 76%
+/dev/grid/node-x8-y20 87T 64T 23T 73%
+/dev/grid/node-x8-y21 90T 71T 19T 78%
+/dev/grid/node-x8-y22 505T 497T 8T 98%
+/dev/grid/node-x8-y23 92T 72T 20T 78%
+/dev/grid/node-x8-y24 86T 70T 16T 81%
+/dev/grid/node-x8-y25 92T 69T 23T 75%
+/dev/grid/node-x8-y26 93T 71T 22T 76%
+/dev/grid/node-x8-y27 91T 70T 21T 76%
+/dev/grid/node-x8-y28 92T 0T 92T 0%
+/dev/grid/node-x9-y0 87T 69T 18T 79%
+/dev/grid/node-x9-y1 90T 69T 21T 76%
+/dev/grid/node-x9-y2 91T 69T 22T 75%
+/dev/grid/node-x9-y3 92T 71T 21T 77%
+/dev/grid/node-x9-y4 91T 66T 25T 72%
+/dev/grid/node-x9-y5 92T 65T 27T 70%
+/dev/grid/node-x9-y6 87T 71T 16T 81%
+/dev/grid/node-x9-y7 88T 68T 20T 77%
+/dev/grid/node-x9-y8 85T 67T 18T 78%
+/dev/grid/node-x9-y9 86T 65T 21T 75%
+/dev/grid/node-x9-y10 88T 64T 24T 72%
+/dev/grid/node-x9-y11 90T 70T 20T 77%
+/dev/grid/node-x9-y12 88T 64T 24T 72%
+/dev/grid/node-x9-y13 85T 69T 16T 81%
+/dev/grid/node-x9-y14 85T 71T 14T 83%
+/dev/grid/node-x9-y15 92T 70T 22T 76%
+/dev/grid/node-x9-y16 92T 65T 27T 70%
+/dev/grid/node-x9-y17 89T 66T 23T 74%
+/dev/grid/node-x9-y18 85T 69T 16T 81%
+/dev/grid/node-x9-y19 94T 69T 25T 73%
+/dev/grid/node-x9-y20 92T 66T 26T 71%
+/dev/grid/node-x9-y21 88T 70T 18T 79%
+/dev/grid/node-x9-y22 507T 498T 9T 98%
+/dev/grid/node-x9-y23 86T 68T 18T 79%
+/dev/grid/node-x9-y24 90T 69T 21T 76%
+/dev/grid/node-x9-y25 87T 65T 22T 74%
+/dev/grid/node-x9-y26 86T 71T 15T 82%
+/dev/grid/node-x9-y27 85T 65T 20T 76%
+/dev/grid/node-x9-y28 87T 70T 17T 80%
+/dev/grid/node-x10-y0 91T 64T 27T 70%
+/dev/grid/node-x10-y1 92T 65T 27T 70%
+/dev/grid/node-x10-y2 89T 66T 23T 74%
+/dev/grid/node-x10-y3 94T 64T 30T 68%
+/dev/grid/node-x10-y4 92T 69T 23T 75%
+/dev/grid/node-x10-y5 91T 64T 27T 70%
+/dev/grid/node-x10-y6 86T 72T 14T 83%
+/dev/grid/node-x10-y7 87T 66T 21T 75%
+/dev/grid/node-x10-y8 90T 73T 17T 81%
+/dev/grid/node-x10-y9 91T 73T 18T 80%
+/dev/grid/node-x10-y10 94T 71T 23T 75%
+/dev/grid/node-x10-y11 94T 71T 23T 75%
+/dev/grid/node-x10-y12 92T 67T 25T 72%
+/dev/grid/node-x10-y13 92T 66T 26T 71%
+/dev/grid/node-x10-y14 86T 66T 20T 76%
+/dev/grid/node-x10-y15 93T 73T 20T 78%
+/dev/grid/node-x10-y16 92T 66T 26T 71%
+/dev/grid/node-x10-y17 92T 71T 21T 77%
+/dev/grid/node-x10-y18 86T 65T 21T 75%
+/dev/grid/node-x10-y19 92T 68T 24T 73%
+/dev/grid/node-x10-y20 87T 66T 21T 75%
+/dev/grid/node-x10-y21 90T 65T 25T 72%
+/dev/grid/node-x10-y22 501T 494T 7T 98%
+/dev/grid/node-x10-y23 87T 66T 21T 75%
+/dev/grid/node-x10-y24 85T 69T 16T 81%
+/dev/grid/node-x10-y25 90T 72T 18T 80%
+/dev/grid/node-x10-y26 94T 69T 25T 73%
+/dev/grid/node-x10-y27 86T 69T 17T 80%
+/dev/grid/node-x10-y28 90T 68T 22T 75%
+/dev/grid/node-x11-y0 90T 65T 25T 72%
+/dev/grid/node-x11-y1 90T 70T 20T 77%
+/dev/grid/node-x11-y2 94T 69T 25T 73%
+/dev/grid/node-x11-y3 92T 72T 20T 78%
+/dev/grid/node-x11-y4 93T 67T 26T 72%
+/dev/grid/node-x11-y5 89T 70T 19T 78%
+/dev/grid/node-x11-y6 87T 66T 21T 75%
+/dev/grid/node-x11-y7 92T 70T 22T 76%
+/dev/grid/node-x11-y8 93T 71T 22T 76%
+/dev/grid/node-x11-y9 93T 68T 25T 73%
+/dev/grid/node-x11-y10 85T 65T 20T 76%
+/dev/grid/node-x11-y11 90T 72T 18T 80%
+/dev/grid/node-x11-y12 89T 65T 24T 73%
+/dev/grid/node-x11-y13 86T 69T 17T 80%
+/dev/grid/node-x11-y14 93T 73T 20T 78%
+/dev/grid/node-x11-y15 93T 68T 25T 73%
+/dev/grid/node-x11-y16 92T 72T 20T 78%
+/dev/grid/node-x11-y17 85T 71T 14T 83%
+/dev/grid/node-x11-y18 90T 68T 22T 75%
+/dev/grid/node-x11-y19 90T 69T 21T 76%
+/dev/grid/node-x11-y20 85T 73T 12T 85%
+/dev/grid/node-x11-y21 93T 68T 25T 73%
+/dev/grid/node-x11-y22 504T 491T 13T 97%
+/dev/grid/node-x11-y23 87T 69T 18T 79%
+/dev/grid/node-x11-y24 88T 65T 23T 73%
+/dev/grid/node-x11-y25 94T 67T 27T 71%
+/dev/grid/node-x11-y26 92T 73T 19T 79%
+/dev/grid/node-x11-y27 87T 64T 23T 73%
+/dev/grid/node-x11-y28 89T 70T 19T 78%
+/dev/grid/node-x12-y0 88T 73T 15T 82%
+/dev/grid/node-x12-y1 90T 68T 22T 75%
+/dev/grid/node-x12-y2 85T 65T 20T 76%
+/dev/grid/node-x12-y3 94T 71T 23T 75%
+/dev/grid/node-x12-y4 86T 68T 18T 79%
+/dev/grid/node-x12-y5 89T 67T 22T 75%
+/dev/grid/node-x12-y6 89T 71T 18T 79%
+/dev/grid/node-x12-y7 85T 68T 17T 80%
+/dev/grid/node-x12-y8 94T 68T 26T 72%
+/dev/grid/node-x12-y9 91T 71T 20T 78%
+/dev/grid/node-x12-y10 91T 65T 26T 71%
+/dev/grid/node-x12-y11 91T 71T 20T 78%
+/dev/grid/node-x12-y12 85T 65T 20T 76%
+/dev/grid/node-x12-y13 89T 71T 18T 79%
+/dev/grid/node-x12-y14 85T 70T 15T 82%
+/dev/grid/node-x12-y15 92T 73T 19T 79%
+/dev/grid/node-x12-y16 94T 66T 28T 70%
+/dev/grid/node-x12-y17 90T 72T 18T 80%
+/dev/grid/node-x12-y18 90T 64T 26T 71%
+/dev/grid/node-x12-y19 87T 72T 15T 82%
+/dev/grid/node-x12-y20 89T 70T 19T 78%
+/dev/grid/node-x12-y21 90T 66T 24T 73%
+/dev/grid/node-x12-y22 506T 497T 9T 98%
+/dev/grid/node-x12-y23 90T 67T 23T 74%
+/dev/grid/node-x12-y24 85T 67T 18T 78%
+/dev/grid/node-x12-y25 85T 72T 13T 84%
+/dev/grid/node-x12-y26 94T 71T 23T 75%
+/dev/grid/node-x12-y27 92T 64T 28T 69%
+/dev/grid/node-x12-y28 90T 65T 25T 72%
+/dev/grid/node-x13-y0 85T 72T 13T 84%
+/dev/grid/node-x13-y1 93T 67T 26T 72%
+/dev/grid/node-x13-y2 94T 64T 30T 68%
+/dev/grid/node-x13-y3 85T 71T 14T 83%
+/dev/grid/node-x13-y4 93T 71T 22T 76%
+/dev/grid/node-x13-y5 85T 67T 18T 78%
+/dev/grid/node-x13-y6 91T 68T 23T 74%
+/dev/grid/node-x13-y7 92T 66T 26T 71%
+/dev/grid/node-x13-y8 88T 66T 22T 75%
+/dev/grid/node-x13-y9 91T 72T 19T 79%
+/dev/grid/node-x13-y10 89T 72T 17T 80%
+/dev/grid/node-x13-y11 90T 68T 22T 75%
+/dev/grid/node-x13-y12 89T 65T 24T 73%
+/dev/grid/node-x13-y13 90T 69T 21T 76%
+/dev/grid/node-x13-y14 86T 64T 22T 74%
+/dev/grid/node-x13-y15 91T 65T 26T 71%
+/dev/grid/node-x13-y16 86T 72T 14T 83%
+/dev/grid/node-x13-y17 85T 71T 14T 83%
+/dev/grid/node-x13-y18 85T 68T 17T 80%
+/dev/grid/node-x13-y19 91T 69T 22T 75%
+/dev/grid/node-x13-y20 87T 70T 17T 80%
+/dev/grid/node-x13-y21 94T 65T 29T 69%
+/dev/grid/node-x13-y22 503T 492T 11T 97%
+/dev/grid/node-x13-y23 91T 70T 21T 76%
+/dev/grid/node-x13-y24 91T 66T 25T 72%
+/dev/grid/node-x13-y25 88T 64T 24T 72%
+/dev/grid/node-x13-y26 87T 70T 17T 80%
+/dev/grid/node-x13-y27 91T 66T 25T 72%
+/dev/grid/node-x13-y28 86T 68T 18T 79%
+/dev/grid/node-x14-y0 85T 67T 18T 78%
+/dev/grid/node-x14-y1 87T 70T 17T 80%
+/dev/grid/node-x14-y2 92T 67T 25T 72%
+/dev/grid/node-x14-y3 87T 64T 23T 73%
+/dev/grid/node-x14-y4 92T 73T 19T 79%
+/dev/grid/node-x14-y5 86T 66T 20T 76%
+/dev/grid/node-x14-y6 89T 69T 20T 77%
+/dev/grid/node-x14-y7 89T 67T 22T 75%
+/dev/grid/node-x14-y8 89T 70T 19T 78%
+/dev/grid/node-x14-y9 91T 70T 21T 76%
+/dev/grid/node-x14-y10 87T 70T 17T 80%
+/dev/grid/node-x14-y11 86T 66T 20T 76%
+/dev/grid/node-x14-y12 92T 67T 25T 72%
+/dev/grid/node-x14-y13 87T 68T 19T 78%
+/dev/grid/node-x14-y14 94T 65T 29T 69%
+/dev/grid/node-x14-y15 93T 68T 25T 73%
+/dev/grid/node-x14-y16 87T 66T 21T 75%
+/dev/grid/node-x14-y17 90T 70T 20T 77%
+/dev/grid/node-x14-y18 90T 66T 24T 73%
+/dev/grid/node-x14-y19 89T 71T 18T 79%
+/dev/grid/node-x14-y20 85T 72T 13T 84%
+/dev/grid/node-x14-y21 90T 66T 24T 73%
+/dev/grid/node-x14-y22 504T 491T 13T 97%
+/dev/grid/node-x14-y23 90T 71T 19T 78%
+/dev/grid/node-x14-y24 94T 68T 26T 72%
+/dev/grid/node-x14-y25 91T 73T 18T 80%
+/dev/grid/node-x14-y26 88T 68T 20T 77%
+/dev/grid/node-x14-y27 86T 66T 20T 76%
+/dev/grid/node-x14-y28 92T 70T 22T 76%
+/dev/grid/node-x15-y0 91T 73T 18T 80%
+/dev/grid/node-x15-y1 85T 65T 20T 76%
+/dev/grid/node-x15-y2 88T 67T 21T 76%
+/dev/grid/node-x15-y3 91T 66T 25T 72%
+/dev/grid/node-x15-y4 92T 65T 27T 70%
+/dev/grid/node-x15-y5 94T 66T 28T 70%
+/dev/grid/node-x15-y6 90T 67T 23T 74%
+/dev/grid/node-x15-y7 91T 72T 19T 79%
+/dev/grid/node-x15-y8 88T 65T 23T 73%
+/dev/grid/node-x15-y9 90T 66T 24T 73%
+/dev/grid/node-x15-y10 86T 69T 17T 80%
+/dev/grid/node-x15-y11 89T 67T 22T 75%
+/dev/grid/node-x15-y12 86T 67T 19T 77%
+/dev/grid/node-x15-y13 85T 65T 20T 76%
+/dev/grid/node-x15-y14 92T 68T 24T 73%
+/dev/grid/node-x15-y15 85T 73T 12T 85%
+/dev/grid/node-x15-y16 86T 65T 21T 75%
+/dev/grid/node-x15-y17 92T 69T 23T 75%
+/dev/grid/node-x15-y18 87T 72T 15T 82%
+/dev/grid/node-x15-y19 92T 64T 28T 69%
+/dev/grid/node-x15-y20 92T 71T 21T 77%
+/dev/grid/node-x15-y21 86T 71T 15T 82%
+/dev/grid/node-x15-y22 501T 494T 7T 98%
+/dev/grid/node-x15-y23 93T 65T 28T 69%
+/dev/grid/node-x15-y24 85T 71T 14T 83%
+/dev/grid/node-x15-y25 90T 66T 24T 73%
+/dev/grid/node-x15-y26 87T 67T 20T 77%
+/dev/grid/node-x15-y27 90T 70T 20T 77%
+/dev/grid/node-x15-y28 89T 71T 18T 79%
+/dev/grid/node-x16-y0 91T 72T 19T 79%
+/dev/grid/node-x16-y1 91T 65T 26T 71%
+/dev/grid/node-x16-y2 90T 64T 26T 71%
+/dev/grid/node-x16-y3 87T 67T 20T 77%
+/dev/grid/node-x16-y4 86T 66T 20T 76%
+/dev/grid/node-x16-y5 88T 73T 15T 82%
+/dev/grid/node-x16-y6 85T 68T 17T 80%
+/dev/grid/node-x16-y7 86T 66T 20T 76%
+/dev/grid/node-x16-y8 91T 69T 22T 75%
+/dev/grid/node-x16-y9 87T 66T 21T 75%
+/dev/grid/node-x16-y10 86T 72T 14T 83%
+/dev/grid/node-x16-y11 90T 66T 24T 73%
+/dev/grid/node-x16-y12 85T 72T 13T 84%
+/dev/grid/node-x16-y13 88T 71T 17T 80%
+/dev/grid/node-x16-y14 90T 70T 20T 77%
+/dev/grid/node-x16-y15 91T 71T 20T 78%
+/dev/grid/node-x16-y16 86T 70T 16T 81%
+/dev/grid/node-x16-y17 86T 73T 13T 84%
+/dev/grid/node-x16-y18 88T 66T 22T 75%
+/dev/grid/node-x16-y19 92T 67T 25T 72%
+/dev/grid/node-x16-y20 92T 73T 19T 79%
+/dev/grid/node-x16-y21 94T 71T 23T 75%
+/dev/grid/node-x16-y22 507T 498T 9T 98%
+/dev/grid/node-x16-y23 92T 72T 20T 78%
+/dev/grid/node-x16-y24 85T 72T 13T 84%
+/dev/grid/node-x16-y25 88T 66T 22T 75%
+/dev/grid/node-x16-y26 92T 67T 25T 72%
+/dev/grid/node-x16-y27 94T 64T 30T 68%
+/dev/grid/node-x16-y28 86T 66T 20T 76%
+/dev/grid/node-x17-y0 88T 65T 23T 73%
+/dev/grid/node-x17-y1 85T 66T 19T 77%
+/dev/grid/node-x17-y2 88T 70T 18T 79%
+/dev/grid/node-x17-y3 89T 68T 21T 76%
+/dev/grid/node-x17-y4 89T 68T 21T 76%
+/dev/grid/node-x17-y5 94T 69T 25T 73%
+/dev/grid/node-x17-y6 85T 66T 19T 77%
+/dev/grid/node-x17-y7 93T 67T 26T 72%
+/dev/grid/node-x17-y8 87T 67T 20T 77%
+/dev/grid/node-x17-y9 94T 67T 27T 71%
+/dev/grid/node-x17-y10 92T 64T 28T 69%
+/dev/grid/node-x17-y11 94T 68T 26T 72%
+/dev/grid/node-x17-y12 85T 66T 19T 77%
+/dev/grid/node-x17-y13 87T 68T 19T 78%
+/dev/grid/node-x17-y14 89T 65T 24T 73%
+/dev/grid/node-x17-y15 94T 69T 25T 73%
+/dev/grid/node-x17-y16 90T 69T 21T 76%
+/dev/grid/node-x17-y17 85T 66T 19T 77%
+/dev/grid/node-x17-y18 91T 68T 23T 74%
+/dev/grid/node-x17-y19 89T 73T 16T 82%
+/dev/grid/node-x17-y20 94T 66T 28T 70%
+/dev/grid/node-x17-y21 91T 68T 23T 74%
+/dev/grid/node-x17-y22 509T 499T 10T 98%
+/dev/grid/node-x17-y23 89T 69T 20T 77%
+/dev/grid/node-x17-y24 91T 64T 27T 70%
+/dev/grid/node-x17-y25 89T 66T 23T 74%
+/dev/grid/node-x17-y26 91T 72T 19T 79%
+/dev/grid/node-x17-y27 93T 69T 24T 74%
+/dev/grid/node-x17-y28 87T 73T 14T 83%
+/dev/grid/node-x18-y0 85T 69T 16T 81%
+/dev/grid/node-x18-y1 90T 65T 25T 72%
+/dev/grid/node-x18-y2 85T 69T 16T 81%
+/dev/grid/node-x18-y3 89T 66T 23T 74%
+/dev/grid/node-x18-y4 88T 69T 19T 78%
+/dev/grid/node-x18-y5 90T 70T 20T 77%
+/dev/grid/node-x18-y6 90T 69T 21T 76%
+/dev/grid/node-x18-y7 92T 67T 25T 72%
+/dev/grid/node-x18-y8 85T 64T 21T 75%
+/dev/grid/node-x18-y9 86T 68T 18T 79%
+/dev/grid/node-x18-y10 89T 66T 23T 74%
+/dev/grid/node-x18-y11 87T 70T 17T 80%
+/dev/grid/node-x18-y12 93T 68T 25T 73%
+/dev/grid/node-x18-y13 89T 67T 22T 75%
+/dev/grid/node-x18-y14 91T 66T 25T 72%
+/dev/grid/node-x18-y15 91T 65T 26T 71%
+/dev/grid/node-x18-y16 90T 66T 24T 73%
+/dev/grid/node-x18-y17 85T 69T 16T 81%
+/dev/grid/node-x18-y18 93T 70T 23T 75%
+/dev/grid/node-x18-y19 93T 64T 29T 68%
+/dev/grid/node-x18-y20 87T 70T 17T 80%
+/dev/grid/node-x18-y21 87T 73T 14T 83%
+/dev/grid/node-x18-y22 503T 498T 5T 99%
+/dev/grid/node-x18-y23 92T 68T 24T 73%
+/dev/grid/node-x18-y24 88T 68T 20T 77%
+/dev/grid/node-x18-y25 94T 64T 30T 68%
+/dev/grid/node-x18-y26 93T 66T 27T 70%
+/dev/grid/node-x18-y27 90T 67T 23T 74%
+/dev/grid/node-x18-y28 89T 67T 22T 75%
+/dev/grid/node-x19-y0 91T 67T 24T 73%
+/dev/grid/node-x19-y1 87T 64T 23T 73%
+/dev/grid/node-x19-y2 94T 64T 30T 68%
+/dev/grid/node-x19-y3 90T 71T 19T 78%
+/dev/grid/node-x19-y4 88T 66T 22T 75%
+/dev/grid/node-x19-y5 93T 69T 24T 74%
+/dev/grid/node-x19-y6 89T 73T 16T 82%
+/dev/grid/node-x19-y7 91T 68T 23T 74%
+/dev/grid/node-x19-y8 89T 67T 22T 75%
+/dev/grid/node-x19-y9 90T 72T 18T 80%
+/dev/grid/node-x19-y10 93T 73T 20T 78%
+/dev/grid/node-x19-y11 88T 70T 18T 79%
+/dev/grid/node-x19-y12 89T 67T 22T 75%
+/dev/grid/node-x19-y13 91T 65T 26T 71%
+/dev/grid/node-x19-y14 92T 67T 25T 72%
+/dev/grid/node-x19-y15 88T 69T 19T 78%
+/dev/grid/node-x19-y16 93T 72T 21T 77%
+/dev/grid/node-x19-y17 88T 64T 24T 72%
+/dev/grid/node-x19-y18 88T 67T 21T 76%
+/dev/grid/node-x19-y19 85T 65T 20T 76%
+/dev/grid/node-x19-y20 90T 68T 22T 75%
+/dev/grid/node-x19-y21 88T 65T 23T 73%
+/dev/grid/node-x19-y22 508T 498T 10T 98%
+/dev/grid/node-x19-y23 93T 65T 28T 69%
+/dev/grid/node-x19-y24 85T 67T 18T 78%
+/dev/grid/node-x19-y25 92T 65T 27T 70%
+/dev/grid/node-x19-y26 92T 67T 25T 72%
+/dev/grid/node-x19-y27 91T 65T 26T 71%
+/dev/grid/node-x19-y28 91T 73T 18T 80%
+/dev/grid/node-x20-y0 86T 64T 22T 74%
+/dev/grid/node-x20-y1 89T 68T 21T 76%
+/dev/grid/node-x20-y2 92T 71T 21T 77%
+/dev/grid/node-x20-y3 86T 68T 18T 79%
+/dev/grid/node-x20-y4 86T 66T 20T 76%
+/dev/grid/node-x20-y5 94T 66T 28T 70%
+/dev/grid/node-x20-y6 91T 73T 18T 80%
+/dev/grid/node-x20-y7 87T 68T 19T 78%
+/dev/grid/node-x20-y8 94T 66T 28T 70%
+/dev/grid/node-x20-y9 89T 64T 25T 71%
+/dev/grid/node-x20-y10 92T 68T 24T 73%
+/dev/grid/node-x20-y11 94T 66T 28T 70%
+/dev/grid/node-x20-y12 88T 73T 15T 82%
+/dev/grid/node-x20-y13 91T 67T 24T 73%
+/dev/grid/node-x20-y14 93T 66T 27T 70%
+/dev/grid/node-x20-y15 88T 72T 16T 81%
+/dev/grid/node-x20-y16 93T 68T 25T 73%
+/dev/grid/node-x20-y17 91T 68T 23T 74%
+/dev/grid/node-x20-y18 87T 73T 14T 83%
+/dev/grid/node-x20-y19 94T 70T 24T 74%
+/dev/grid/node-x20-y20 88T 67T 21T 76%
+/dev/grid/node-x20-y21 88T 68T 20T 77%
+/dev/grid/node-x20-y22 503T 499T 4T 99%
+/dev/grid/node-x20-y23 88T 67T 21T 76%
+/dev/grid/node-x20-y24 92T 68T 24T 73%
+/dev/grid/node-x20-y25 85T 69T 16T 81%
+/dev/grid/node-x20-y26 87T 70T 17T 80%
+/dev/grid/node-x20-y27 86T 70T 16T 81%
+/dev/grid/node-x20-y28 93T 65T 28T 69%
+/dev/grid/node-x21-y0 90T 67T 23T 74%
+/dev/grid/node-x21-y1 85T 66T 19T 77%
+/dev/grid/node-x21-y2 93T 73T 20T 78%
+/dev/grid/node-x21-y3 88T 71T 17T 80%
+/dev/grid/node-x21-y4 94T 71T 23T 75%
+/dev/grid/node-x21-y5 92T 69T 23T 75%
+/dev/grid/node-x21-y6 94T 66T 28T 70%
+/dev/grid/node-x21-y7 94T 65T 29T 69%
+/dev/grid/node-x21-y8 85T 71T 14T 83%
+/dev/grid/node-x21-y9 87T 69T 18T 79%
+/dev/grid/node-x21-y10 86T 68T 18T 79%
+/dev/grid/node-x21-y11 92T 68T 24T 73%
+/dev/grid/node-x21-y12 89T 68T 21T 76%
+/dev/grid/node-x21-y13 88T 73T 15T 82%
+/dev/grid/node-x21-y14 86T 67T 19T 77%
+/dev/grid/node-x21-y15 87T 72T 15T 82%
+/dev/grid/node-x21-y16 87T 70T 17T 80%
+/dev/grid/node-x21-y17 87T 71T 16T 81%
+/dev/grid/node-x21-y18 88T 72T 16T 81%
+/dev/grid/node-x21-y19 93T 65T 28T 69%
+/dev/grid/node-x21-y20 92T 70T 22T 76%
+/dev/grid/node-x21-y21 91T 70T 21T 76%
+/dev/grid/node-x21-y22 510T 493T 17T 96%
+/dev/grid/node-x21-y23 89T 69T 20T 77%
+/dev/grid/node-x21-y24 94T 72T 22T 76%
+/dev/grid/node-x21-y25 91T 70T 21T 76%
+/dev/grid/node-x21-y26 89T 65T 24T 73%
+/dev/grid/node-x21-y27 85T 72T 13T 84%
+/dev/grid/node-x21-y28 93T 72T 21T 77%
+/dev/grid/node-x22-y0 89T 67T 22T 75%
+/dev/grid/node-x22-y1 85T 65T 20T 76%
+/dev/grid/node-x22-y2 93T 64T 29T 68%
+/dev/grid/node-x22-y3 93T 71T 22T 76%
+/dev/grid/node-x22-y4 85T 65T 20T 76%
+/dev/grid/node-x22-y5 85T 67T 18T 78%
+/dev/grid/node-x22-y6 90T 64T 26T 71%
+/dev/grid/node-x22-y7 87T 69T 18T 79%
+/dev/grid/node-x22-y8 94T 72T 22T 76%
+/dev/grid/node-x22-y9 87T 71T 16T 81%
+/dev/grid/node-x22-y10 87T 65T 22T 74%
+/dev/grid/node-x22-y11 93T 72T 21T 77%
+/dev/grid/node-x22-y12 86T 72T 14T 83%
+/dev/grid/node-x22-y13 89T 66T 23T 74%
+/dev/grid/node-x22-y14 90T 67T 23T 74%
+/dev/grid/node-x22-y15 92T 70T 22T 76%
+/dev/grid/node-x22-y16 92T 66T 26T 71%
+/dev/grid/node-x22-y17 91T 66T 25T 72%
+/dev/grid/node-x22-y18 91T 68T 23T 74%
+/dev/grid/node-x22-y19 88T 71T 17T 80%
+/dev/grid/node-x22-y20 90T 69T 21T 76%
+/dev/grid/node-x22-y21 90T 68T 22T 75%
+/dev/grid/node-x22-y22 502T 490T 12T 97%
+/dev/grid/node-x22-y23 91T 67T 24T 73%
+/dev/grid/node-x22-y24 93T 71T 22T 76%
+/dev/grid/node-x22-y25 92T 65T 27T 70%
+/dev/grid/node-x22-y26 93T 69T 24T 74%
+/dev/grid/node-x22-y27 85T 72T 13T 84%
+/dev/grid/node-x22-y28 93T 64T 29T 68%
+/dev/grid/node-x23-y0 92T 73T 19T 79%
+/dev/grid/node-x23-y1 90T 64T 26T 71%
+/dev/grid/node-x23-y2 93T 65T 28T 69%
+/dev/grid/node-x23-y3 88T 72T 16T 81%
+/dev/grid/node-x23-y4 92T 70T 22T 76%
+/dev/grid/node-x23-y5 90T 66T 24T 73%
+/dev/grid/node-x23-y6 86T 66T 20T 76%
+/dev/grid/node-x23-y7 89T 71T 18T 79%
+/dev/grid/node-x23-y8 89T 64T 25T 71%
+/dev/grid/node-x23-y9 90T 64T 26T 71%
+/dev/grid/node-x23-y10 94T 70T 24T 74%
+/dev/grid/node-x23-y11 85T 64T 21T 75%
+/dev/grid/node-x23-y12 86T 66T 20T 76%
+/dev/grid/node-x23-y13 86T 64T 22T 74%
+/dev/grid/node-x23-y14 92T 68T 24T 73%
+/dev/grid/node-x23-y15 94T 70T 24T 74%
+/dev/grid/node-x23-y16 91T 69T 22T 75%
+/dev/grid/node-x23-y17 93T 70T 23T 75%
+/dev/grid/node-x23-y18 87T 65T 22T 74%
+/dev/grid/node-x23-y19 86T 64T 22T 74%
+/dev/grid/node-x23-y20 94T 66T 28T 70%
+/dev/grid/node-x23-y21 92T 64T 28T 69%
+/dev/grid/node-x23-y22 507T 491T 16T 96%
+/dev/grid/node-x23-y23 88T 73T 15T 82%
+/dev/grid/node-x23-y24 87T 69T 18T 79%
+/dev/grid/node-x23-y25 91T 71T 20T 78%
+/dev/grid/node-x23-y26 90T 71T 19T 78%
+/dev/grid/node-x23-y27 87T 70T 17T 80%
+/dev/grid/node-x23-y28 91T 70T 21T 76%
+/dev/grid/node-x24-y0 86T 67T 19T 77%
+/dev/grid/node-x24-y1 94T 67T 27T 71%
+/dev/grid/node-x24-y2 89T 71T 18T 79%
+/dev/grid/node-x24-y3 86T 67T 19T 77%
+/dev/grid/node-x24-y4 87T 73T 14T 83%
+/dev/grid/node-x24-y5 86T 64T 22T 74%
+/dev/grid/node-x24-y6 92T 68T 24T 73%
+/dev/grid/node-x24-y7 85T 68T 17T 80%
+/dev/grid/node-x24-y8 86T 65T 21T 75%
+/dev/grid/node-x24-y9 87T 73T 14T 83%
+/dev/grid/node-x24-y10 91T 68T 23T 74%
+/dev/grid/node-x24-y11 94T 67T 27T 71%
+/dev/grid/node-x24-y12 94T 67T 27T 71%
+/dev/grid/node-x24-y13 88T 71T 17T 80%
+/dev/grid/node-x24-y14 91T 70T 21T 76%
+/dev/grid/node-x24-y15 89T 72T 17T 80%
+/dev/grid/node-x24-y16 92T 69T 23T 75%
+/dev/grid/node-x24-y17 87T 70T 17T 80%
+/dev/grid/node-x24-y18 94T 69T 25T 73%
+/dev/grid/node-x24-y19 91T 66T 25T 72%
+/dev/grid/node-x24-y20 90T 64T 26T 71%
+/dev/grid/node-x24-y21 86T 65T 21T 75%
+/dev/grid/node-x24-y22 508T 494T 14T 97%
+/dev/grid/node-x24-y23 89T 72T 17T 80%
+/dev/grid/node-x24-y24 94T 66T 28T 70%
+/dev/grid/node-x24-y25 88T 64T 24T 72%
+/dev/grid/node-x24-y26 86T 64T 22T 74%
+/dev/grid/node-x24-y27 92T 65T 27T 70%
+/dev/grid/node-x24-y28 89T 72T 17T 80%
+/dev/grid/node-x25-y0 93T 70T 23T 75%
+/dev/grid/node-x25-y1 91T 73T 18T 80%
+/dev/grid/node-x25-y2 89T 65T 24T 73%
+/dev/grid/node-x25-y3 86T 69T 17T 80%
+/dev/grid/node-x25-y4 90T 70T 20T 77%
+/dev/grid/node-x25-y5 89T 65T 24T 73%
+/dev/grid/node-x25-y6 92T 71T 21T 77%
+/dev/grid/node-x25-y7 91T 65T 26T 71%
+/dev/grid/node-x25-y8 91T 67T 24T 73%
+/dev/grid/node-x25-y9 94T 73T 21T 77%
+/dev/grid/node-x25-y10 94T 73T 21T 77%
+/dev/grid/node-x25-y11 91T 70T 21T 76%
+/dev/grid/node-x25-y12 91T 71T 20T 78%
+/dev/grid/node-x25-y13 86T 67T 19T 77%
+/dev/grid/node-x25-y14 88T 67T 21T 76%
+/dev/grid/node-x25-y15 90T 67T 23T 74%
+/dev/grid/node-x25-y16 92T 64T 28T 69%
+/dev/grid/node-x25-y17 94T 68T 26T 72%
+/dev/grid/node-x25-y18 87T 73T 14T 83%
+/dev/grid/node-x25-y19 86T 73T 13T 84%
+/dev/grid/node-x25-y20 92T 72T 20T 78%
+/dev/grid/node-x25-y21 93T 73T 20T 78%
+/dev/grid/node-x25-y22 504T 491T 13T 97%
+/dev/grid/node-x25-y23 91T 72T 19T 79%
+/dev/grid/node-x25-y24 85T 70T 15T 82%
+/dev/grid/node-x25-y25 85T 73T 12T 85%
+/dev/grid/node-x25-y26 85T 67T 18T 78%
+/dev/grid/node-x25-y27 89T 69T 20T 77%
+/dev/grid/node-x25-y28 86T 66T 20T 76%
+/dev/grid/node-x26-y0 91T 72T 19T 79%
+/dev/grid/node-x26-y1 86T 68T 18T 79%
+/dev/grid/node-x26-y2 88T 70T 18T 79%
+/dev/grid/node-x26-y3 88T 66T 22T 75%
+/dev/grid/node-x26-y4 85T 71T 14T 83%
+/dev/grid/node-x26-y5 90T 66T 24T 73%
+/dev/grid/node-x26-y6 90T 66T 24T 73%
+/dev/grid/node-x26-y7 89T 73T 16T 82%
+/dev/grid/node-x26-y8 85T 65T 20T 76%
+/dev/grid/node-x26-y9 90T 72T 18T 80%
+/dev/grid/node-x26-y10 86T 64T 22T 74%
+/dev/grid/node-x26-y11 90T 64T 26T 71%
+/dev/grid/node-x26-y12 92T 73T 19T 79%
+/dev/grid/node-x26-y13 85T 72T 13T 84%
+/dev/grid/node-x26-y14 91T 73T 18T 80%
+/dev/grid/node-x26-y15 92T 69T 23T 75%
+/dev/grid/node-x26-y16 90T 72T 18T 80%
+/dev/grid/node-x26-y17 90T 68T 22T 75%
+/dev/grid/node-x26-y18 90T 73T 17T 81%
+/dev/grid/node-x26-y19 94T 64T 30T 68%
+/dev/grid/node-x26-y20 86T 73T 13T 84%
+/dev/grid/node-x26-y21 86T 66T 20T 76%
+/dev/grid/node-x26-y22 510T 491T 19T 96%
+/dev/grid/node-x26-y23 87T 66T 21T 75%
+/dev/grid/node-x26-y24 91T 64T 27T 70%
+/dev/grid/node-x26-y25 94T 66T 28T 70%
+/dev/grid/node-x26-y26 85T 68T 17T 80%
+/dev/grid/node-x26-y27 85T 71T 14T 83%
+/dev/grid/node-x26-y28 94T 64T 30T 68%
+/dev/grid/node-x27-y0 88T 73T 15T 82%
+/dev/grid/node-x27-y1 94T 67T 27T 71%
+/dev/grid/node-x27-y2 90T 73T 17T 81%
+/dev/grid/node-x27-y3 93T 71T 22T 76%
+/dev/grid/node-x27-y4 89T 70T 19T 78%
+/dev/grid/node-x27-y5 90T 66T 24T 73%
+/dev/grid/node-x27-y6 87T 73T 14T 83%
+/dev/grid/node-x27-y7 87T 66T 21T 75%
+/dev/grid/node-x27-y8 86T 69T 17T 80%
+/dev/grid/node-x27-y9 88T 73T 15T 82%
+/dev/grid/node-x27-y10 92T 64T 28T 69%
+/dev/grid/node-x27-y11 87T 69T 18T 79%
+/dev/grid/node-x27-y12 91T 64T 27T 70%
+/dev/grid/node-x27-y13 94T 68T 26T 72%
+/dev/grid/node-x27-y14 89T 68T 21T 76%
+/dev/grid/node-x27-y15 87T 67T 20T 77%
+/dev/grid/node-x27-y16 90T 72T 18T 80%
+/dev/grid/node-x27-y17 94T 65T 29T 69%
+/dev/grid/node-x27-y18 90T 72T 18T 80%
+/dev/grid/node-x27-y19 88T 73T 15T 82%
+/dev/grid/node-x27-y20 88T 71T 17T 80%
+/dev/grid/node-x27-y21 88T 64T 24T 72%
+/dev/grid/node-x27-y22 504T 490T 14T 97%
+/dev/grid/node-x27-y23 93T 66T 27T 70%
+/dev/grid/node-x27-y24 85T 67T 18T 78%
+/dev/grid/node-x27-y25 94T 64T 30T 68%
+/dev/grid/node-x27-y26 85T 72T 13T 84%
+/dev/grid/node-x27-y27 85T 73T 12T 85%
+/dev/grid/node-x27-y28 89T 70T 19T 78%
+/dev/grid/node-x28-y0 93T 66T 27T 70%
+/dev/grid/node-x28-y1 86T 71T 15T 82%
+/dev/grid/node-x28-y2 94T 73T 21T 77%
+/dev/grid/node-x28-y3 91T 72T 19T 79%
+/dev/grid/node-x28-y4 87T 69T 18T 79%
+/dev/grid/node-x28-y5 85T 70T 15T 82%
+/dev/grid/node-x28-y6 85T 72T 13T 84%
+/dev/grid/node-x28-y7 89T 72T 17T 80%
+/dev/grid/node-x28-y8 90T 73T 17T 81%
+/dev/grid/node-x28-y9 94T 64T 30T 68%
+/dev/grid/node-x28-y10 85T 73T 12T 85%
+/dev/grid/node-x28-y11 89T 70T 19T 78%
+/dev/grid/node-x28-y12 94T 67T 27T 71%
+/dev/grid/node-x28-y13 87T 68T 19T 78%
+/dev/grid/node-x28-y14 94T 72T 22T 76%
+/dev/grid/node-x28-y15 92T 66T 26T 71%
+/dev/grid/node-x28-y16 91T 64T 27T 70%
+/dev/grid/node-x28-y17 86T 69T 17T 80%
+/dev/grid/node-x28-y18 88T 69T 19T 78%
+/dev/grid/node-x28-y19 90T 70T 20T 77%
+/dev/grid/node-x28-y20 89T 69T 20T 77%
+/dev/grid/node-x28-y21 90T 67T 23T 74%
+/dev/grid/node-x28-y22 506T 491T 15T 97%
+/dev/grid/node-x28-y23 89T 70T 19T 78%
+/dev/grid/node-x28-y24 90T 73T 17T 81%
+/dev/grid/node-x28-y25 86T 65T 21T 75%
+/dev/grid/node-x28-y26 93T 73T 20T 78%
+/dev/grid/node-x28-y27 88T 69T 19T 78%
+/dev/grid/node-x28-y28 92T 68T 24T 73%
+/dev/grid/node-x29-y0 88T 70T 18T 79%
+/dev/grid/node-x29-y1 89T 68T 21T 76%
+/dev/grid/node-x29-y2 85T 73T 12T 85%
+/dev/grid/node-x29-y3 89T 73T 16T 82%
+/dev/grid/node-x29-y4 86T 68T 18T 79%
+/dev/grid/node-x29-y5 91T 70T 21T 76%
+/dev/grid/node-x29-y6 86T 70T 16T 81%
+/dev/grid/node-x29-y7 86T 64T 22T 74%
+/dev/grid/node-x29-y8 90T 73T 17T 81%
+/dev/grid/node-x29-y9 92T 65T 27T 70%
+/dev/grid/node-x29-y10 89T 72T 17T 80%
+/dev/grid/node-x29-y11 85T 66T 19T 77%
+/dev/grid/node-x29-y12 89T 73T 16T 82%
+/dev/grid/node-x29-y13 90T 72T 18T 80%
+/dev/grid/node-x29-y14 86T 69T 17T 80%
+/dev/grid/node-x29-y15 85T 64T 21T 75%
+/dev/grid/node-x29-y16 88T 69T 19T 78%
+/dev/grid/node-x29-y17 92T 64T 28T 69%
+/dev/grid/node-x29-y18 86T 65T 21T 75%
+/dev/grid/node-x29-y19 92T 70T 22T 76%
+/dev/grid/node-x29-y20 94T 64T 30T 68%
+/dev/grid/node-x29-y21 87T 64T 23T 73%
+/dev/grid/node-x29-y22 509T 497T 12T 97%
+/dev/grid/node-x29-y23 91T 67T 24T 73%
+/dev/grid/node-x29-y24 90T 67T 23T 74%
+/dev/grid/node-x29-y25 86T 65T 21T 75%
+/dev/grid/node-x29-y26 94T 68T 26T 72%
+/dev/grid/node-x29-y27 89T 69T 20T 77%
+/dev/grid/node-x29-y28 87T 71T 16T 81%
+/dev/grid/node-x30-y0 92T 64T 28T 69%
+/dev/grid/node-x30-y1 93T 67T 26T 72%
+/dev/grid/node-x30-y2 93T 66T 27T 70%
+/dev/grid/node-x30-y3 93T 67T 26T 72%
+/dev/grid/node-x30-y4 86T 70T 16T 81%
+/dev/grid/node-x30-y5 91T 67T 24T 73%
+/dev/grid/node-x30-y6 89T 66T 23T 74%
+/dev/grid/node-x30-y7 89T 72T 17T 80%
+/dev/grid/node-x30-y8 93T 69T 24T 74%
+/dev/grid/node-x30-y9 94T 68T 26T 72%
+/dev/grid/node-x30-y10 89T 69T 20T 77%
+/dev/grid/node-x30-y11 94T 64T 30T 68%
+/dev/grid/node-x30-y12 93T 65T 28T 69%
+/dev/grid/node-x30-y13 85T 72T 13T 84%
+/dev/grid/node-x30-y14 88T 68T 20T 77%
+/dev/grid/node-x30-y15 94T 64T 30T 68%
+/dev/grid/node-x30-y16 92T 73T 19T 79%
+/dev/grid/node-x30-y17 92T 73T 19T 79%
+/dev/grid/node-x30-y18 87T 68T 19T 78%
+/dev/grid/node-x30-y19 93T 64T 29T 68%
+/dev/grid/node-x30-y20 94T 67T 27T 71%
+/dev/grid/node-x30-y21 89T 67T 22T 75%
+/dev/grid/node-x30-y22 507T 491T 16T 96%
+/dev/grid/node-x30-y23 91T 64T 27T 70%
+/dev/grid/node-x30-y24 87T 65T 22T 74%
+/dev/grid/node-x30-y25 85T 65T 20T 76%
+/dev/grid/node-x30-y26 91T 68T 23T 74%
+/dev/grid/node-x30-y27 90T 67T 23T 74%
+/dev/grid/node-x30-y28 94T 66T 28T 70%
+/dev/grid/node-x31-y0 92T 67T 25T 72%
+/dev/grid/node-x31-y1 93T 68T 25T 73%
+/dev/grid/node-x31-y2 92T 66T 26T 71%
+/dev/grid/node-x31-y3 89T 64T 25T 71%
+/dev/grid/node-x31-y4 90T 71T 19T 78%
+/dev/grid/node-x31-y5 89T 68T 21T 76%
+/dev/grid/node-x31-y6 85T 72T 13T 84%
+/dev/grid/node-x31-y7 88T 65T 23T 73%
+/dev/grid/node-x31-y8 86T 66T 20T 76%
+/dev/grid/node-x31-y9 90T 72T 18T 80%
+/dev/grid/node-x31-y10 86T 67T 19T 77%
+/dev/grid/node-x31-y11 89T 72T 17T 80%
+/dev/grid/node-x31-y12 90T 73T 17T 81%
+/dev/grid/node-x31-y13 91T 70T 21T 76%
+/dev/grid/node-x31-y14 94T 67T 27T 71%
+/dev/grid/node-x31-y15 94T 73T 21T 77%
+/dev/grid/node-x31-y16 86T 71T 15T 82%
+/dev/grid/node-x31-y17 86T 73T 13T 84%
+/dev/grid/node-x31-y18 89T 65T 24T 73%
+/dev/grid/node-x31-y19 86T 72T 14T 83%
+/dev/grid/node-x31-y20 88T 64T 24T 72%
+/dev/grid/node-x31-y21 90T 64T 26T 71%
+/dev/grid/node-x31-y22 505T 496T 9T 98%
+/dev/grid/node-x31-y23 90T 73T 17T 81%
+/dev/grid/node-x31-y24 91T 73T 18T 80%
+/dev/grid/node-x31-y25 94T 69T 25T 73%
+/dev/grid/node-x31-y26 92T 64T 28T 69%
+/dev/grid/node-x31-y27 91T 66T 25T 72%
+/dev/grid/node-x31-y28 85T 65T 20T 76%
+/dev/grid/node-x32-y0 85T 69T 16T 81%
+/dev/grid/node-x32-y1 93T 67T 26T 72%
+/dev/grid/node-x32-y2 93T 73T 20T 78%
+/dev/grid/node-x32-y3 94T 71T 23T 75%
+/dev/grid/node-x32-y4 90T 70T 20T 77%
+/dev/grid/node-x32-y5 92T 68T 24T 73%
+/dev/grid/node-x32-y6 94T 64T 30T 68%
+/dev/grid/node-x32-y7 86T 72T 14T 83%
+/dev/grid/node-x32-y8 85T 73T 12T 85%
+/dev/grid/node-x32-y9 89T 69T 20T 77%
+/dev/grid/node-x32-y10 89T 73T 16T 82%
+/dev/grid/node-x32-y11 87T 65T 22T 74%
+/dev/grid/node-x32-y12 94T 67T 27T 71%
+/dev/grid/node-x32-y13 93T 67T 26T 72%
+/dev/grid/node-x32-y14 93T 66T 27T 70%
+/dev/grid/node-x32-y15 86T 72T 14T 83%
+/dev/grid/node-x32-y16 89T 69T 20T 77%
+/dev/grid/node-x32-y17 93T 67T 26T 72%
+/dev/grid/node-x32-y18 87T 64T 23T 73%
+/dev/grid/node-x32-y19 85T 69T 16T 81%
+/dev/grid/node-x32-y20 85T 69T 16T 81%
+/dev/grid/node-x32-y21 91T 65T 26T 71%
+/dev/grid/node-x32-y22 503T 491T 12T 97%
+/dev/grid/node-x32-y23 94T 71T 23T 75%
+/dev/grid/node-x32-y24 87T 64T 23T 73%
+/dev/grid/node-x32-y25 91T 73T 18T 80%
+/dev/grid/node-x32-y26 93T 67T 26T 72%
+/dev/grid/node-x32-y27 86T 71T 15T 82%
+/dev/grid/node-x32-y28 91T 64T 27T 70%
+/dev/grid/node-x33-y0 86T 73T 13T 84%
+/dev/grid/node-x33-y1 88T 71T 17T 80%
+/dev/grid/node-x33-y2 90T 66T 24T 73%
+/dev/grid/node-x33-y3 85T 64T 21T 75%
+/dev/grid/node-x33-y4 87T 66T 21T 75%
+/dev/grid/node-x33-y5 91T 68T 23T 74%
+/dev/grid/node-x33-y6 93T 68T 25T 73%
+/dev/grid/node-x33-y7 92T 70T 22T 76%
+/dev/grid/node-x33-y8 91T 64T 27T 70%
+/dev/grid/node-x33-y9 85T 72T 13T 84%
+/dev/grid/node-x33-y10 89T 65T 24T 73%
+/dev/grid/node-x33-y11 91T 66T 25T 72%
+/dev/grid/node-x33-y12 87T 68T 19T 78%
+/dev/grid/node-x33-y13 89T 70T 19T 78%
+/dev/grid/node-x33-y14 86T 68T 18T 79%
+/dev/grid/node-x33-y15 85T 69T 16T 81%
+/dev/grid/node-x33-y16 94T 66T 28T 70%
+/dev/grid/node-x33-y17 92T 68T 24T 73%
+/dev/grid/node-x33-y18 88T 72T 16T 81%
+/dev/grid/node-x33-y19 90T 73T 17T 81%
+/dev/grid/node-x33-y20 89T 64T 25T 71%
+/dev/grid/node-x33-y21 92T 71T 21T 77%
+/dev/grid/node-x33-y22 502T 497T 5T 99%
+/dev/grid/node-x33-y23 94T 67T 27T 71%
+/dev/grid/node-x33-y24 93T 64T 29T 68%
+/dev/grid/node-x33-y25 90T 66T 24T 73%
+/dev/grid/node-x33-y26 87T 72T 15T 82%
+/dev/grid/node-x33-y27 85T 73T 12T 85%
+/dev/grid/node-x33-y28 86T 72T 14T 83%
+/dev/grid/node-x34-y0 89T 66T 23T 74%
+/dev/grid/node-x34-y1 94T 64T 30T 68%
+/dev/grid/node-x34-y2 92T 69T 23T 75%
+/dev/grid/node-x34-y3 93T 70T 23T 75%
+/dev/grid/node-x34-y4 88T 64T 24T 72%
+/dev/grid/node-x34-y5 94T 67T 27T 71%
+/dev/grid/node-x34-y6 89T 68T 21T 76%
+/dev/grid/node-x34-y7 94T 71T 23T 75%
+/dev/grid/node-x34-y8 88T 69T 19T 78%
+/dev/grid/node-x34-y9 89T 72T 17T 80%
+/dev/grid/node-x34-y10 90T 69T 21T 76%
+/dev/grid/node-x34-y11 91T 65T 26T 71%
+/dev/grid/node-x34-y12 88T 69T 19T 78%
+/dev/grid/node-x34-y13 90T 69T 21T 76%
+/dev/grid/node-x34-y14 92T 66T 26T 71%
+/dev/grid/node-x34-y15 94T 70T 24T 74%
+/dev/grid/node-x34-y16 87T 69T 18T 79%
+/dev/grid/node-x34-y17 86T 67T 19T 77%
+/dev/grid/node-x34-y18 94T 66T 28T 70%
+/dev/grid/node-x34-y19 94T 69T 25T 73%
+/dev/grid/node-x34-y20 91T 67T 24T 73%
+/dev/grid/node-x34-y21 87T 72T 15T 82%
+/dev/grid/node-x34-y22 501T 495T 6T 98%
+/dev/grid/node-x34-y23 93T 71T 22T 76%
+/dev/grid/node-x34-y24 92T 73T 19T 79%
+/dev/grid/node-x34-y25 90T 73T 17T 81%
+/dev/grid/node-x34-y26 89T 69T 20T 77%
+/dev/grid/node-x34-y27 89T 72T 17T 80%
+/dev/grid/node-x34-y28 87T 66T 21T 75%
diff --git a/2016/aoc22/src/main.rs b/2016/aoc22/src/main.rs
new file mode 100644
index 0000000..bd374d5
--- /dev/null
+++ b/2016/aoc22/src/main.rs
@@ -0,0 +1,198 @@
+extern crate regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::collections::HashMap;
+use std::collections::HashSet;
+
+use regex::Regex;
+
+use std::str::FromStr;
+
+#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
+struct Node {
+ x: i8,
+ y: i8,
+ size: i16,
+ used: i16,
+ avail: i16,
+ blocker: bool
+}
+
+impl FromStr for Node {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let reg = Regex::new(r"/dev/grid/node-x(\d+)-y(\d+) +(\d+)T +(\d+)T +(\d+)T +(\d+)%").unwrap();
+ let cap = match reg.captures(s) {
+ Some(cap) => cap,
+ None => return Err("Does not match regex".to_string())
+ };
+ Ok(Node {
+ x: cap.at(1).unwrap().parse().unwrap(),
+ y: cap.at(2).unwrap().parse().unwrap(),
+ size: cap.at(3).unwrap().parse().unwrap(),
+ used: cap.at(4).unwrap().parse().unwrap(),
+ avail: cap.at(5).unwrap().parse().unwrap(),
+ blocker: false
+ })
+ }
+}
+
+impl Node {
+ fn is_viable_pair(&self, other: &Node) -> bool {
+ (self.x != other.x || self.y != other.y) && self.used > 0 && self.used <= other.avail
+ }
+
+ fn recalculate_avail(&mut self) {
+ self.avail = self.size - self.used;
+ debug_assert!(self.avail >= 0);
+ debug_assert!(self.used >= 0);
+ }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq)]
+struct Grid {
+ nodes: Vec<Vec<Node>>,
+ goal_x: i8,
+ goal_y: i8
+}
+
+impl Grid {
+ fn new(nodes: Vec<Node>) -> Grid {
+ let mut grid_nodes = Vec::new();
+ let mut next_col = Vec::new();
+
+ let mut current_x = 0;
+
+ for node in nodes {
+ if current_x != node.x {
+ grid_nodes.push(next_col);
+ next_col = Vec::new();
+ current_x += 1;
+ }
+
+ next_col.push(node);
+ }
+ grid_nodes.push(next_col);
+ grid_nodes = Grid::normalize(grid_nodes);
+
+ Grid {
+ nodes: grid_nodes,
+ goal_x: current_x,
+ goal_y: 0
+ }
+ }
+
+ fn normalize(mut nodes: Vec<Vec<Node>>) -> Vec<Vec<Node>> {
+ for x in 0..nodes.len() {
+ for y in 0..nodes[x].len() {
+ nodes[x][y].size = ((nodes[x][y].size + 50)/100) * 100;
+ nodes[x][y].used = ((nodes[x][y].used + 50)/100) * 100;
+ nodes[x][y].avail = ((nodes[x][y].avail + 50)/100) * 100;
+ }
+ }
+ nodes
+ }
+
+ fn is_final(&self) -> bool {
+ self.goal_x == 0 && self.goal_y == 0
+ }
+
+ fn make_move(&self, x: i8, y: i8, dx: i8, dy: i8) -> Option<Grid> {
+ if x+dx < 0 || x+dx >= self.nodes.len() as i8 || y+dy < 0 || y+dy >= self.nodes[x as usize].len() as i8 {
+ return None;
+ }
+ if !self.nodes[x as usize][y as usize].is_viable_pair(&self.nodes[(x+dx) as usize][(y+dy) as usize]) {
+ return None;
+ }
+
+ let mut new_grid = self.clone();
+ new_grid.nodes[(x+dx) as usize][(y+dy) as usize].used += new_grid.nodes[x as usize][y as usize].used;
+ new_grid.nodes[(x+dx) as usize][(y+dy) as usize].recalculate_avail();
+ new_grid.nodes[x as usize][y as usize].used = 0;
+ new_grid.nodes[x as usize][y as usize].recalculate_avail();
+
+ if new_grid.goal_x == x && new_grid.goal_y == y {
+ new_grid.goal_x = x+dx;
+ new_grid.goal_y = y+dy;
+ }
+
+ Some(new_grid)
+ }
+
+ fn available_moves(&self) -> Vec<Grid> {
+ let mut moves = Vec::with_capacity(4);
+
+ for x in 0..self.nodes.len() as i8 {
+ for y in 0..self.nodes[x as usize].len() as i8 {
+ match self.make_move(x, y, -1, 0) {
+ Some(grid) => { moves.push(grid); },
+ None => {}
+ };
+ match self.make_move(x, y, 0, -1) {
+ Some(grid) => { moves.push(grid); },
+ None => {}
+ };
+ match self.make_move(x, y, 1, 0) {
+ Some(grid) => { moves.push(grid); },
+ None => {}
+ };
+ match self.make_move(x, y, 0, 1) {
+ Some(grid) => { moves.push(grid); },
+ None => {}
+ };
+ }
+ }
+
+ moves
+ }
+}
+
+
+fn main() {
+ let nodes = read_input();
+
+ let initial = Grid::new(nodes);
+ println!("Initial grid has {} possible moves", initial.available_moves().len());
+
+ let mut explored: HashSet<Grid> = HashSet::new();
+ let mut frontier: HashMap<Grid, u32> = HashMap::new();
+ frontier.insert(initial, 0);
+ let mut found_final = false;
+
+ while !found_final {
+ let (best_frontier, moves) = find_best_frontiers(&frontier);
+
+ let new_states = best_frontier.available_moves();
+ found_final = new_states.iter().any(|ref s| s.is_final());
+
+ for state in new_states {
+ if !(explored.contains(&state) || frontier.contains_key(&state)) {
+ frontier.insert(state, moves+1);
+ }
+ }
+
+ frontier.remove(&best_frontier);
+ explored.insert(best_frontier);
+ }
+
+ let (final_frontier, moves) = frontier.iter().find(|&(s, _)| s.is_final()).unwrap();
+ println!("It took {} moves to get the data", moves);
+}
+
+fn read_input() -> Vec<Node> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+
+ file.lines()
+ .skip(2)
+ .filter_map(|line| Node::from_str(line.unwrap().as_ref()).ok())
+ .collect()
+}
+
+fn find_best_frontiers(frontier: &HashMap<Grid, u32>) -> (Grid, u32) {
+ frontier.iter().min_by_key(|&(ref grid, &moves)| {
+ grid.goal_x as u32 + grid.goal_y as u32 + moves
+ }).map(|(&ref grid, &moves)| (grid.clone(), moves.clone())).unwrap()
+}
diff --git a/2016/aoc23/Cargo.lock b/2016/aoc23/Cargo.lock
new file mode 100644
index 0000000..c6ab041
--- /dev/null
+++ b/2016/aoc23/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc23"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc23/Cargo.toml b/2016/aoc23/Cargo.toml
new file mode 100644
index 0000000..39fd06e
--- /dev/null
+++ b/2016/aoc23/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc23"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc23/input.txt b/2016/aoc23/input.txt
new file mode 100644
index 0000000..3ff0460
--- /dev/null
+++ b/2016/aoc23/input.txt
@@ -0,0 +1,26 @@
+cpy a b
+dec b
+cpy a d
+cpy 0 a
+cpy b c
+inc a
+dec c
+jnz c -2
+dec d
+jnz d -5
+dec b
+cpy b c
+cpy c d
+dec d
+inc c
+jnz d -2
+tgl c
+cpy -16 c
+jnz 1 c
+cpy 90 c
+jnz 90 d
+inc a
+inc d
+jnz d -2
+inc c
+jnz c -5
diff --git a/2016/aoc23/src/main.rs b/2016/aoc23/src/main.rs
new file mode 100644
index 0000000..a12fa18
--- /dev/null
+++ b/2016/aoc23/src/main.rs
@@ -0,0 +1,247 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+enum Instruction {
+ Inc(usize),
+ Dec(usize),
+
+ TglLit(i32),
+ TglReg(usize),
+
+ CpyLitReg(i32, usize),
+ CpyRegReg(usize, usize),
+ CpyLitLit(i32, i32),
+ CpyRegLit(usize, i32),
+
+ JnzLitLit(i32, i32),
+ JnzRegLit(usize, i32),
+ JnzLitReg(i32, usize),
+ JnzRegReg(usize, usize),
+
+ Noop
+}
+
+impl Instruction {
+ fn parse(line: &str) -> Instruction {
+ match Regex::new(r"inc (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::Inc(reg);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"dec (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::Dec(reg);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"tgl (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::TglReg(reg);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"tgl ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let lit = cap.at(1).unwrap().parse().unwrap();
+ return Instruction::TglLit(lit);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"cpy ([-\d]+) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::CpyLitReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy (a|b|c|d) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::CpyRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy ([-\d]+) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::CpyLitLit(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy (a|b|c|d) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::CpyRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"jnz ([-\d]+) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::JnzLitReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz (a|b|c|d) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::JnzRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz ([-\d]+) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::JnzLitLit(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz (a|b|c|d) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::JnzRegLit(src, dest);
+ },
+ _ => {}
+ }
+
+ panic!("Invalid instruction line");
+ }
+
+ fn toggle(&self) -> Self {
+ match *self {
+ Instruction::Inc(a) => Instruction::Dec(a),
+ Instruction::Dec(a) => Instruction::Inc(a),
+
+ Instruction::TglLit(_) => Instruction::Noop,
+ Instruction::TglReg(a) => Instruction::Inc(a),
+
+ Instruction::CpyLitReg(a, b) => Instruction::JnzLitReg(a, b),
+ Instruction::CpyRegReg(a, b) => Instruction::JnzRegReg(a, b),
+ Instruction::CpyLitLit(a, b) => Instruction::JnzLitLit(a, b),
+ Instruction::CpyRegLit(a, b) => Instruction::JnzRegLit(a, b),
+
+ Instruction::JnzLitLit(a, b) => Instruction::CpyLitLit(a, b),
+ Instruction::JnzRegLit(a, b) => Instruction::CpyRegLit(a, b),
+ Instruction::JnzLitReg(a, b) => Instruction::CpyLitReg(a, b),
+ Instruction::JnzRegReg(a, b) => Instruction::CpyRegReg(a, b),
+ Instruction::Noop => Instruction::Noop
+ }
+ }
+}
+
+fn main() {
+ let mut program = read_file();
+
+ let mut registers: [i32; 4] = [12, 0, 0, 0];
+ let mut pc: usize = 0;
+
+ while pc < program.len() {
+ let mut pc_next: usize = pc+1;
+
+ match program[pc] {
+ Instruction::Inc(dest) => {
+ registers[dest] += 1;
+ },
+ Instruction::Dec(dest) => {
+ registers[dest] -= 1;
+ },
+
+ Instruction::TglReg(offset) => {
+ let line_to_toggle = (pc as i32 + registers[offset]) as usize;
+ if line_to_toggle > 0 && line_to_toggle < program.len() {
+ program[line_to_toggle] = program[line_to_toggle].toggle();
+ }
+ },
+ Instruction::TglLit(offset) => {
+ let line_to_toggle = (pc as i32 + offset) as usize;
+ if line_to_toggle > 0 && line_to_toggle < program.len() {
+ program[line_to_toggle] = program[line_to_toggle].toggle();
+ }
+ },
+
+ Instruction::CpyLitReg(src, dest) => {
+ registers[dest] = src;
+ },
+ Instruction::CpyRegReg(src, dest) => {
+ registers[dest] = registers[src];
+ },
+ Instruction::CpyLitLit(_, _) | Instruction::CpyRegLit(_, _) => {},
+
+ Instruction::JnzRegLit(condition, offset) => {
+ if registers[condition] != 0 {
+ pc_next = (pc as i32 + offset) as usize;
+ }
+ },
+ Instruction::JnzLitLit(condition, offset) => {
+ if condition != 0 {
+ pc_next = (pc as i32 + offset) as usize;
+ }
+ },
+ Instruction::JnzRegReg(condition, offset) => {
+ if registers[condition] != 0 {
+ pc_next = (pc as i32 + registers[offset]) as usize;
+ }
+ },
+ Instruction::JnzLitReg(condition, offset) => {
+ if condition != 0 {
+ pc_next = (pc as i32 + registers[offset]) as usize;
+ }
+ },
+ Instruction::Noop => {}
+ }
+
+ pc = pc_next;
+ }
+
+ println!("a: {}, b: {}, c: {}, d: {}", registers[0], registers[1], registers[2], registers[3]);
+
+}
+
+fn to_register_index(name: &str) -> usize {
+ match name {
+ "a" => 0,
+ "b" => 1,
+ "c" => 2,
+ "d" => 3,
+ _ => panic!("Invalid register provided")
+ }
+}
+
+fn read_file() -> Vec<Instruction> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap())
+ .filter(|line| line.len() > 0)
+ .map(|line| Instruction::parse(line.trim()))
+ .collect()
+}
diff --git a/2016/aoc24/Cargo.lock b/2016/aoc24/Cargo.lock
new file mode 100644
index 0000000..d8b394a
--- /dev/null
+++ b/2016/aoc24/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc24"
+version = "0.1.0"
+
diff --git a/2016/aoc24/Cargo.toml b/2016/aoc24/Cargo.toml
new file mode 100644
index 0000000..26becbd
--- /dev/null
+++ b/2016/aoc24/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc24"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc24/input.txt b/2016/aoc24/input.txt
new file mode 100644
index 0000000..cc45a4f
--- /dev/null
+++ b/2016/aoc24/input.txt
@@ -0,0 +1,39 @@
+#######################################################################################################################################################################################
+#...........#.....#...........#.#.......#.....#.#...............#.....#.....#.......#.......#.......#.....................#.........#.....#...#3......#...#.#.............#.......#...#
+#####.#.#.###.###.#####.#.#####.#.###.###.###.#.#.#.#.#.#.###.#.###.###.###.#.#######.#.#.#.###.###.#.#.#.#####.#.#.#####.###.#.#######.#############.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#
+#...#.#.#.#.....#.#...#...#.....#.....#.#...#.........#.....................#.....#...#...#.......#.....#.#.........#.#.#.#.#.......................#...#...#.#.#.#.....#.#.........#.#
+#.#.#.#.#.#####.#.#.#.#.#.#.#.#.###.#.#.###.#.#.#.#.#.#########.#.###.###.#.#.###.###.#.#.#.#.###.#.#.#.#.#.#.#####.#.#.###.###.#######.#.#.#.###.#.###.#.#.#####.#####.#.#.###.#.#.#.#
+#.#.#...#.....#.#.....#...#.#...#.#...#.......#...........#...#...#...#.#.....#.#...#...........#.#.......#...#...#.#.........#...#.......#.#...#.....#...#.......#.#.#.............#.#
+#.#######.#.#.###.#.#.#####.#.#.#.#.###.#####.#.#.###.#.#.#.#.#.#.#.#.#.#.###.#.#.#.###.#######.#######.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#.###.#.#####.#.#.#.#.#.#.#.#.#.###.#.#####.#.#
+#.#...#.....#.......#.......#.#.......#...#.#.....#.#.#.#.#.#.......#...#.....#.#.#.#.#.........#...#...#...#.......#...#...#.....#.....#...#.........#...#.#...#...#...#.........#.#.#
+#.#.#.#.###.###.#.#.#.###.###.#.#.###.#.#.#.#####.#.###.#.#####.#####.###.#.#.#.#.###.#.#.#.###.###.#.#.#.#.#.#####.#.###.#.#.###.#.#.#.#.###.###.#######.#.###.###.#.#######.#.#.#.#.#
+#.#...#...#...............#...#...#...#.#.........#.#...#...#.#...#.#.....#...#.#...#.#.#...#.#.#.#.#.....#...#...#.......#.#...#.........#.#.....#.#...#.....#.#...#.#2#.....#.......#
+#.#.#####.#########.#.###.#.#####.#.#.#.#######.#.###.#.#.#.#.###.#.#.###.#.###.#.#.#.#.#.###.###.#.#.#######.#.###.#.#.#.#.#.#.#.#####.###.#.###.#.#####.#.#.###.#.#.#.###.#.###.###.#
+#...#...........#.....#.......#...#0..........#...#.....#.#...#.#...#.#.#...#.#.......#.........#...#.#...#.#.#.......#...#.#.........#.#.....................#.#.#.#.....#.#.....#...#
+#.###.#.#.#.#.#.###.#.#.#.#.#.###.#.#.###.#.#.#.###.###.#.#####.#.#.#.#.###.#.#.###.#.#.###.###.#.#####.#.#.#.###.#.#######.#######.#.#.#.###.#.#.#.#.#.#######.#.#.#####.#.###.###.#.#
+#...#...#...#.#...........#...#.#.....#...#...#.....#.#.............#...#.........#...#.....#...#.......#...#.#.............#.........#...#.#.....#.#.........#.............#...#.....#
+#.#.#.###.#.###.#.#.#.###.#.###.#######.#.#.###.#.#.#.#.###.#.###.#.#.#.#.#####.#.#.#.#####.#.#####.#.#.#.#.###.###.#.###.###.###.#.#.#.###.#.#.###.#.#.###.#########.#####.#.#.#.#####
+#.#...#.#.......#...#.....#.....#...#...#.....#...#...#.........#.....#.#.........#.....#.....#.........#...#.#.....#.#...#...#.#.#...#.#...#.........#.#...#.........#.#.......#.....#
+#.#####.#.###.#.#.#.###.#.#.#.#.#.#.###.#.#.#.###.###.#.###.#.###.#.#.#.###.#.#####.###.#.#.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.###.#.#.#
+#.....#...#...........#...#...........#.#.....#...#.....#...#.#.#.#...#.....#...#...#...............#...#.........#...#.....#...#.#...#.#...#.....#.....#.....#...#.#...#...#.#.......#
+###.###.#.#.#####.###.#####.#.###.#.#.#####.#.###.#.###.#.###.#.#.#.#.###.#.###.#.#.#.#.###.#.###.#.#.#.#.#.#.###.#.#.#.###.###.#.#.###.#########.#.#####.###########.#.###.###.#####.#
+#...#1#...#...#.......#...#...#.#...#...#...........#.#.......#.......#.#.........#.#...#...#...............#...#.....#.#...#.#.....#.........#...#.....#.#...#...#.....#.#.#.#...#...#
+#.###.###.#.#.#.#####.#.#.#.#.#.#.#####.#####.#.#####.#.#.#.#.###.#.#.#.###.#.###.#.###.#.#.#####.#.#.#####.#.#.###.#.###.#.#.#.#.#.#.#####.#.#.#.#.###.#.#.###.#.#.#.#.#.#.#.###.#.#.#
+#.....#.#.#.#.........#.#.#.....#.....#...#.....#...#.............#...#...#.....#...#.......#.......#.#.....#...#...#.#...#.....#.#...#.....#.#.#.#.#.#.#.......#...........#.#5#.....#
+#.###.#.#.###.###.###.#.#####.#.#.###.###.#.###.#############.#######.#.###.#.###.#.#####.#.#.#.#####.#.#.#####.#.#.#.#.#.#######.#.#.###########.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#
+#.....#...#...................#.......#...#...#.#.....#.............#.....#...#.....#.......#.#.#.........#.........#.......#.......#...#.........#.#...#...#.....#.#.....#...#...#.#.#
+#.###.###.###########.###.#####.#####.###.#.#.#.#.#.#.###.#.###.#.#######.#.#.#.#.#.#.###.#.#.#####.#.#.#.#######.#.###.#.#.###.#.#.#.###.#####.#####.#.#.#.#.###.#.###.###########.#.#
+#.#.#.#...#...#.....#.....#.#.......#.....#.....#...........#.#...#.........#.#.#.#.....#.#.#...........#...#...#...#.......#...#.........#.....#.....#.....#.......#...#...#.#...#...#
+#.#.#.#.#.#########.#.#.###.#.#.###.###.#.#.#.###.#####.#.#.#.#.#.#.#######.#.#.#######.#.###.#.###.###.#.###.#.#.#.#######.#######.#.#.#.#####.#.###.#.#####.#.###.#.#.###.#.#######.#
+#.#...#...#.#...................#.#...#.#...#.......#.#...#.#...#.#.#.....#.#...#...#...#.#.............#.....#...........#.........#...#.#.#.....#.......#.......#.....#...#.#...#...#
+###.#.#.#.#.#.#.###.#.###.#####.#.#####.#.#.###.#.#.#.#####.#.###.#####.#.#.#.#.#.#.#.###.#.#.#####.###.#.###.#####.#.#.#.#####.###.#.#.#.#.#.#######.###.#.#.#########.###.#.#######.#
+#.....#...................#...#.#...#...#...........#.#.......#.#.....#.#.....#...........#.....#.........#.#...........#...#.....#...#.....#.............#.#.#.........#.#.#.#.......#
+#.#.#.#.#.###.#.#.#.#.#########.###.#.#.#.#########.#.#.#.#.#.#.###########.#.#.###.###.###.#.#.#.#.#.###.#.###.#.###.#.###.###.#.###.#.#.#####.#.#.#######.#.#.###.###.#.#.#.###.#####
+#...#.#.#....7#.#...#.#.........#.....#...#.#.......#.....#...........#.#...#.......#.#...#.#...#...........#...#.#...#.....#...#.#.#...........#...#.#...#...#4....#...#...#...#.....#
+###.#.#.###.#####.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###.#######.#.#.###.#.#####.#.#####.###.#.###.#.#.#.#.#####.###.#.###.#.#.#.#.###.#.#.###.#.#.###.#.###.#########.#.###.#.#.#.#.#.#.#
+#.....#.#.#.......#.#.#.......#.#.#.............#...#.........#.......#.#.#...........#.....#.....#...#...#.#.....#...#.....#.#.#...#...#...#.....#...#...#.#...#...#.#.#.....#...#.#.#
+#.###.#.#.#########.#.#.#.#######.#.#.#.#.###.###.#####.#.#.#.#.#.###.#.#.#.#.#####.#.#.###.#.#.#.#.###.###.###.#.#.#######.#.#.###.#####.#.#.###.#.#.#####.###.#.#.###.#.#########.###
+#.......#...#...#...#...#.#...#...#.#.#...#.#...........#.........#...#.#.#.#.....#...#.....#.#.....#...#...#...#.#.#.#...#...#.#...#.....#...........#.#.........#.....#.#.#...#.....#
+#####.###.#####.#.#####.#######.#.#.#.###.#.#######.###.#####.###.#.#.#.#.#.#####.#####.###.###.###.#.#.###.#.#.#.###.#.#.###.#.#.#####.#.###.#.#.#.###.#.#.#.#.#.###.###.#.#.###.#.#.#
+#.....#.#.#.......#...#.#.#.....#.........#...#.....#6......#...#.#...........#.......#.............#...#...#...#...#.#...#...#...#.....#.........#.#...#.....#.#.#.......#...#.#.#...#
+#######################################################################################################################################################################################
diff --git a/2016/aoc24/src/main.rs b/2016/aoc24/src/main.rs
new file mode 100644
index 0000000..c4d620e
--- /dev/null
+++ b/2016/aoc24/src/main.rs
@@ -0,0 +1,135 @@
+use std::io::BufReader;
+use std::io::BufRead;
+use std::fs::File;
+use std::collections::HashMap;
+
+struct Map {
+ walls: Vec<Vec<bool>>,
+ destinations: Vec<(usize, usize)>,
+ start: (usize, usize)
+}
+
+impl Map {
+ fn new(input: &[String]) -> Map {
+ let mut walls = Vec::with_capacity(input.len());
+ let mut start = (0, 0);
+ let mut destinations = Vec::new();
+
+ let mut y = 0;
+
+ for line in input {
+ let mut x = 0;
+ let mut wall_row = Vec::with_capacity(line.len());
+ for c in line.chars() {
+ wall_row.push(c == '#');
+ if c == '0' {
+ start = (y, x);
+ }
+ else if c.is_numeric() {
+ destinations.push((y, x));
+ }
+
+ x += 1;
+ }
+
+ walls.push(wall_row);
+ y += 1;
+ }
+
+ Map {
+ walls: walls,
+ destinations: destinations,
+ start: start
+ }
+ }
+
+ fn is_valid_position(&self, y: i32, x: i32) -> bool {
+ y > 0 &&
+ x > 0 &&
+ (y as usize) < self.walls.len() &&
+ (x as usize) < self.walls[y as usize].len() &&
+ !self.walls[y as usize][x as usize]
+ }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq)]
+struct State {
+ robot_location: (usize, usize),
+ destinations_hit: Vec<bool>
+}
+
+impl State {
+ fn new(map: &Map) -> State {
+ State {
+ robot_location: map.start,
+ destinations_hit: map.destinations.iter().map(|_| false).collect()
+ }
+ }
+
+ fn next_state(&self, movement: (i32, i32), map: &Map) -> Option<State> {
+ let (y, x) = self.robot_location;
+ let (dy, dx) = movement;
+ let y2 = y as i32 + dy;
+ let x2 = x as i32 + dx;
+
+ if !map.is_valid_position(y2, x2) {
+ return None;
+ }
+
+ let y2 = y2 as usize;
+ let x2 = x2 as usize;
+
+ Some(State {
+ robot_location: (y2, x2),
+ destinations_hit: self.destinations_hit.iter()
+ .zip(map.destinations.iter())
+ .map(|(&hit, &(dest_y, dest_x))| hit || (dest_y == y2 && dest_x == x2))
+ .collect()
+ })
+ }
+
+ fn next_states(&self, map: &Map) -> Vec<State> {
+ [(-1, 0), (1, 0), (0, -1), (0, 1)].iter()
+ .filter_map(|&movement| self.next_state(movement, &map))
+ .collect()
+ }
+
+ fn is_complete(&self, map: &Map) -> bool {
+ self.destinations_hit.iter().all(|&x| x) && self.robot_location == map.start
+ }
+}
+
+fn main() {
+ let map = Map::new(&read_file());
+ let initial = State::new(&map);
+
+ let mut states = HashMap::new();
+ states.insert(initial, 0);
+
+ let mut moves = 0;
+
+ while !states.iter().any(|(&ref s, _)| s.is_complete(&map)) {
+ let new_states = states.iter()
+ .filter(|&(_, &m)| m == moves)
+ .flat_map(|(&ref s, _)| s.next_states(&map))
+ .collect::<Vec<_>>();
+
+ moves += 1;
+
+ for state in new_states {
+ if !states.contains_key(&state) {
+ states.insert(state, moves);
+ }
+ }
+ }
+
+ println!("Final state found in {} moves", moves);
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
diff --git a/2016/aoc25/Cargo.lock b/2016/aoc25/Cargo.lock
new file mode 100644
index 0000000..c4553c9
--- /dev/null
+++ b/2016/aoc25/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc25"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc25/Cargo.toml b/2016/aoc25/Cargo.toml
new file mode 100644
index 0000000..aa84af4
--- /dev/null
+++ b/2016/aoc25/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc25"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc25/input.txt b/2016/aoc25/input.txt
new file mode 100644
index 0000000..a9734a4
--- /dev/null
+++ b/2016/aoc25/input.txt
@@ -0,0 +1,30 @@
+cpy a d
+cpy 7 c
+cpy 362 b
+inc d
+dec b
+jnz b -2
+dec c
+jnz c -5
+cpy d a
+jnz 0 0
+cpy a b
+cpy 0 a
+cpy 2 c
+jnz b 2
+jnz 1 6
+dec b
+dec c
+jnz c -4
+inc a
+jnz 1 -7
+cpy 2 b
+jnz c 2
+jnz 1 4
+dec b
+dec c
+jnz 1 -4
+jnz 0 0
+out b
+jnz a -19
+jnz 1 -21
diff --git a/2016/aoc25/src/main.rs b/2016/aoc25/src/main.rs
new file mode 100644
index 0000000..7db2ce5
--- /dev/null
+++ b/2016/aoc25/src/main.rs
@@ -0,0 +1,284 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+enum Instruction {
+ Inc(usize),
+ Dec(usize),
+
+ TglLit(i32),
+ TglReg(usize),
+
+ OutLit(i32),
+ OutReg(usize),
+
+ CpyLitReg(i32, usize),
+ CpyRegReg(usize, usize),
+ CpyLitLit(i32, i32),
+ CpyRegLit(usize, i32),
+
+ JnzLitLit(i32, i32),
+ JnzRegLit(usize, i32),
+ JnzLitReg(i32, usize),
+ JnzRegReg(usize, usize),
+
+ Noop
+}
+
+impl Instruction {
+ fn parse(line: &str) -> Instruction {
+ match Regex::new(r"inc (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::Inc(reg);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"dec (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::Dec(reg);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"tgl (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::TglReg(reg);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"tgl ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let lit = cap.at(1).unwrap().parse().unwrap();
+ return Instruction::TglLit(lit);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"out (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let reg = to_register_index(cap.at(1).unwrap());
+ return Instruction::OutReg(reg);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"out ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let lit = cap.at(1).unwrap().parse().unwrap();
+ return Instruction::OutLit(lit);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"cpy ([-\d]+) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::CpyLitReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy (a|b|c|d) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::CpyRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy ([-\d]+) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::CpyLitLit(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"cpy (a|b|c|d) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::CpyRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+
+ match Regex::new(r"jnz ([-\d]+) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::JnzLitReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz (a|b|c|d) (a|b|c|d)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = to_register_index(cap.at(2).unwrap());
+ return Instruction::JnzRegReg(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz ([-\d]+) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = cap.at(1).unwrap().parse().unwrap();
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::JnzLitLit(src, dest);
+ },
+ _ => {}
+ }
+
+ match Regex::new(r"jnz (a|b|c|d) ([-\d]+)").unwrap().captures(line) {
+ Some(cap) => {
+ let src = to_register_index(cap.at(1).unwrap());
+ let dest = cap.at(2).unwrap().parse().unwrap();
+ return Instruction::JnzRegLit(src, dest);
+ },
+ _ => {}
+ }
+
+ panic!("Invalid instruction line");
+ }
+
+ fn toggle(&self) -> Self {
+ match *self {
+ Instruction::Inc(a) => Instruction::Dec(a),
+ Instruction::Dec(a) => Instruction::Inc(a),
+
+ Instruction::TglLit(_) => Instruction::Noop,
+ Instruction::TglReg(a) => Instruction::Inc(a),
+
+ Instruction::OutLit(_) => Instruction::Noop,
+ Instruction::OutReg(a) => Instruction::Inc(a),
+
+ Instruction::CpyLitReg(a, b) => Instruction::JnzLitReg(a, b),
+ Instruction::CpyRegReg(a, b) => Instruction::JnzRegReg(a, b),
+ Instruction::CpyLitLit(a, b) => Instruction::JnzLitLit(a, b),
+ Instruction::CpyRegLit(a, b) => Instruction::JnzRegLit(a, b),
+
+ Instruction::JnzLitLit(a, b) => Instruction::CpyLitLit(a, b),
+ Instruction::JnzRegLit(a, b) => Instruction::CpyRegLit(a, b),
+ Instruction::JnzLitReg(a, b) => Instruction::CpyLitReg(a, b),
+ Instruction::JnzRegReg(a, b) => Instruction::CpyRegReg(a, b),
+ Instruction::Noop => Instruction::Noop
+ }
+ }
+}
+
+fn main() {
+ let expected_output = vec!(0, 1, 0, 1, 0, 1, 0, 1, 0, 1);
+ let min_input = (0..).find(|&i| run_program(i) == expected_output).unwrap();
+ println!("{}", min_input);
+}
+
+
+fn run_program(input: i32) -> Vec<i32> {
+ let mut transmission = Vec::new();
+ let mut program = read_file();
+
+ let mut registers: [i32; 4] = [input, 0, 0, 0];
+ let mut pc: usize = 0;
+
+ while pc < program.len() && transmission.len() < 10 {
+ let mut pc_next: usize = pc+1;
+
+ match program[pc] {
+ Instruction::Inc(dest) => {
+ registers[dest] += 1;
+ },
+ Instruction::Dec(dest) => {
+ registers[dest] -= 1;
+ },
+
+ Instruction::TglReg(offset) => {
+ let line_to_toggle = (pc as i32 + registers[offset]) as usize;
+ if line_to_toggle > 0 && line_to_toggle < program.len() {
+ program[line_to_toggle] = program[line_to_toggle].toggle();
+ }
+ },
+ Instruction::TglLit(offset) => {
+ let line_to_toggle = (pc as i32 + offset) as usize;
+ if line_to_toggle > 0 && line_to_toggle < program.len() {
+ program[line_to_toggle] = program[line_to_toggle].toggle();
+ }
+ },
+
+ Instruction::OutReg(output) => {
+ transmission.push(registers[output]);
+ },
+ Instruction::OutLit(output) => {
+ transmission.push(output);
+ },
+
+ Instruction::CpyLitReg(src, dest) => {
+ registers[dest] = src;
+ },
+ Instruction::CpyRegReg(src, dest) => {
+ registers[dest] = registers[src];
+ },
+ Instruction::CpyLitLit(_, _) | Instruction::CpyRegLit(_, _) => {},
+
+ Instruction::JnzRegLit(condition, offset) => {
+ if registers[condition] != 0 {
+ pc_next = (pc as i32 + offset) as usize;
+ }
+ },
+ Instruction::JnzLitLit(condition, offset) => {
+ if condition != 0 {
+ pc_next = (pc as i32 + offset) as usize;
+ }
+ },
+ Instruction::JnzRegReg(condition, offset) => {
+ if registers[condition] != 0 {
+ pc_next = (pc as i32 + registers[offset]) as usize;
+ }
+ },
+ Instruction::JnzLitReg(condition, offset) => {
+ if condition != 0 {
+ pc_next = (pc as i32 + registers[offset]) as usize;
+ }
+ },
+ Instruction::Noop => {}
+ }
+
+ pc = pc_next;
+ }
+
+ transmission
+}
+
+fn to_register_index(name: &str) -> usize {
+ match name {
+ "a" => 0,
+ "b" => 1,
+ "c" => 2,
+ "d" => 3,
+ _ => panic!("Invalid register provided")
+ }
+}
+
+fn read_file() -> Vec<Instruction> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap())
+ .filter(|line| line.len() > 0)
+ .map(|line| Instruction::parse(line.trim()))
+ .collect()
+}
diff --git a/2016/aoc3/Cargo.lock b/2016/aoc3/Cargo.lock
new file mode 100644
index 0000000..f581b3c
--- /dev/null
+++ b/2016/aoc3/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc3"
+version = "0.1.0"
+
diff --git a/2016/aoc3/Cargo.toml b/2016/aoc3/Cargo.toml
new file mode 100644
index 0000000..c8a1b62
--- /dev/null
+++ b/2016/aoc3/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc3"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc3/input.txt b/2016/aoc3/input.txt
new file mode 100644
index 0000000..1458df8
--- /dev/null
+++ b/2016/aoc3/input.txt
@@ -0,0 +1,1734 @@
+ 330 143 338
+ 769 547 83
+ 930 625 317
+ 669 866 147
+ 15 881 210
+ 662 15 70
+ 273 277 707
+ 50 592 770
+ 280 313 407
+ 642 487 372
+ 94 619 295
+ 734 243 141
+ 220 141 515
+ 198 824 745
+ 210 787 964
+ 213 627 601
+ 918 4 447
+ 805 630 802
+ 711 237 987
+ 938 552 388
+ 643 405 779
+ 803 747 525
+ 917 832 631
+ 899 292 843
+ 81 206 445
+ 141 874 465
+ 177 974 54
+ 520 725 814
+ 271 958 554
+ 779 579 264
+ 358 18 257
+ 978 77 270
+ 984 88 131
+ 475 702 940
+ 183 756 160
+ 383 941 820
+ 806 142 646
+ 793 275 804
+ 53 272 368
+ 942 821 785
+ 863 830 902
+ 219 52 199
+ 473 479 351
+ 860 522 361
+ 890 240 216
+ 94 756 407
+ 310 189 468
+ 234 909 178
+ 889 667 756
+ 429 485 730
+ 825 405 30
+ 943 806 253
+ 98 455 365
+ 998 454 290
+ 971 576 223
+ 64 429 273
+ 945 779 63
+ 352 960 59
+ 672 948 577
+ 782 43 567
+ 460 315 719
+ 825 604 183
+ 453 442 788
+ 694 632 334
+ 569 619 317
+ 337 49 17
+ 878 468 660
+ 393 598 717
+ 550 827 159
+ 540 362 346
+ 66 713 380
+ 491 477 44
+ 411 114 320
+ 554 96 250
+ 306 67 196
+ 769 553 333
+ 762 436 382
+ 278 322 153
+ 894 603 334
+ 539 441 844
+ 486 162 927
+ 197 9 218
+ 94 221 804
+ 250 220 913
+ 557 626 486
+ 562 705 630
+ 968 922 285
+ 518 36 468
+ 18 608 83
+ 512 611 530
+ 534 37 65
+ 621 136 90
+ 239 113 139
+ 371 640 956
+ 629 54 959
+ 531 620 338
+ 682 499 810
+ 798 170 968
+ 187 640 645
+ 660 535 332
+ 663 530 314
+ 64 26 65
+ 55 285 488
+ 620 288 52
+ 642 474 450
+ 455 9 962
+ 51 760 489
+ 426 760 833
+ 304 783 772
+ 498 765 695
+ 635 53 126
+ 44 430 774
+ 979 943 838
+ 962 892 64
+ 494 709 614
+ 7 695 120
+ 503 114 606
+ 362 340 689
+ 509 367 389
+ 673 410 664
+ 773 262 558
+ 897 958 245
+ 140 773 483
+ 965 468 584
+ 546 209 668
+ 856 381 184
+ 274 237 762
+ 888 677 906
+ 871 516 405
+ 102 529 912
+ 285 724 885
+ 352 501 53
+ 774 139 245
+ 380 309 594
+ 813 185 765
+ 530 645 965
+ 958 618 120
+ 851 202 957
+ 737 476 131
+ 595 546 108
+ 716 113 66
+ 327 215 318
+ 397 343 390
+ 351 143 103
+ 138 91 31
+ 108 224 919
+ 230 276 896
+ 426 975 177
+ 327 975 918
+ 238 365 764
+ 328 799 775
+ 590 906 967
+ 578 460 338
+ 507 619 647
+ 711 617 867
+ 933 478 734
+ 820 760 721
+ 199 711 824
+ 983 214 228
+ 382 150 648
+ 415 782 242
+ 615 754 445
+ 693 689 590
+ 382 784 482
+ 997 181 322
+ 682 241 172
+ 587 302 252
+ 184 135 254
+ 574 104 549
+ 88 738 796
+ 486 715 861
+ 62 491 815
+ 463 434 569
+ 519 622 310
+ 199 443 782
+ 572 657 85
+ 763 517 844
+ 750 175 835
+ 228 269 710
+ 611 316 551
+ 883 546 296
+ 169 693 18
+ 992 743 316
+ 263 529 529
+ 705 570 4
+ 918 706 527
+ 609 285 971
+ 260 533 112
+ 711 486 904
+ 820 40 472
+ 997 301 129
+ 257 288 343
+ 635 439 375
+ 560 381 417
+ 773 105 145
+ 58 963 267
+ 976 742 424
+ 994 441 384
+ 389 770 514
+ 782 463 335
+ 919 727 276
+ 780 794 372
+ 326 180 590
+ 918 946 257
+ 889 842 181
+ 507 61 464
+ 762 835 443
+ 827 607 982
+ 174 875 544
+ 934 885 589
+ 32 343 757
+ 987 826 257
+ 981 782 844
+ 446 291 397
+ 443 800 421
+ 165 668 539
+ 410 373 487
+ 422 803 881
+ 546 998 953
+ 291 607 160
+ 919 894 62
+ 842 718 117
+ 110 816 582
+ 470 836 596
+ 575 687 35
+ 37 835 374
+ 90 954 354
+ 101 141 407
+ 174 398 499
+ 173 737 964
+ 4 365 950
+ 946 616 634
+ 906 904 619
+ 40 789 16
+ 788 769 76
+ 737 867 88
+ 565 812 31
+ 508 380 201
+ 34 935 339
+ 500 862 326
+ 431 181 475
+ 403 346 585
+ 88 530 708
+ 731 137 781
+ 715 563 272
+ 817 659 932
+ 396 368 360
+ 162 683 376
+ 278 620 39
+ 525 910 371
+ 688 524 149
+ 488 998 279
+ 286 392 523
+ 325 144 406
+ 79 532 419
+ 540 460 465
+ 222 832 416
+ 517 507 46
+ 87 744 183
+ 382 819 701
+ 306 763 647
+ 744 74 913
+ 62 813 849
+ 691 874 775
+ 291 422 314
+ 432 630 809
+ 611 510 566
+ 583 745 289
+ 397 19 727
+ 188 766 442
+ 96 108 329
+ 963 719 598
+ 963 764 469
+ 444 636 731
+ 792 636 422
+ 993 1 416
+ 518 300 532
+ 298 312 736
+ 316 111 463
+ 825 569 35
+ 858 591 584
+ 809 84 607
+ 681 610 740
+ 383 279 210
+ 851 733 615
+ 287 959 160
+ 856 851 171
+ 606 115 211
+ 310 541 845
+ 506 119 319
+ 665 471 562
+ 382 885 798
+ 440 29 595
+ 113 903 475
+ 257 773 846
+ 306 741 776
+ 97 804 76
+ 489 332 423
+ 466 632 613
+ 86 739 481
+ 199 846 712
+ 62 282 809
+ 155 681 142
+ 705 525 270
+ 159 800 117
+ 612 664 316
+ 505 616 837
+ 578 839 770
+ 942 535 122
+ 542 781 512
+ 552 22 475
+ 760 791 97
+ 432 626 837
+ 26 616 336
+ 412 316 702
+ 108 232 242
+ 158 311 449
+ 60 141 325
+ 58 1 714
+ 532 977 123
+ 531 978 598
+ 679 899 57
+ 645 523 54
+ 167 892 14
+ 164 574 492
+ 105 37 491
+ 132 555 485
+ 600 879 508
+ 608 843 222
+ 270 255 398
+ 232 960 281
+ 241 995 436
+ 113 674 411
+ 381 567 5
+ 697 450 966
+ 726 857 969
+ 722 686 965
+ 543 20 453
+ 955 689 554
+ 858 161 923
+ 140 979 953
+ 786 836 237
+ 200 322 875
+ 311 623 398
+ 510 814 945
+ 67 387 825
+ 621 620 740
+ 630 842 163
+ 545 75 373
+ 506 531 501
+ 301 571 357
+ 746 491 253
+ 37 29 748
+ 769 507 754
+ 69 886 861
+ 423 629 856
+ 380 723 83
+ 875 647 657
+ 144 696 580
+ 896 49 629
+ 275 598 374
+ 118 636 279
+ 277 80 529
+ 623 130 493
+ 368 712 621
+ 833 730 512
+ 59 767 829
+ 105 933 731
+ 54 240 108
+ 803 235 992
+ 837 726 881
+ 426 855 450
+ 636 730 731
+ 840 561 977
+ 996 229 670
+ 508 234 186
+ 529 108 917
+ 373 337 795
+ 681 35 565
+ 790 251 152
+ 301 235 599
+ 875 416 653
+ 277 338 990
+ 800 207 595
+ 954 650 896
+ 931 667 706
+ 84 851 822
+ 254 778 816
+ 316 141 732
+ 233 759 239
+ 546 473 315
+ 69 15 96
+ 513 470 320
+ 460 188 729
+ 429 950 288
+ 709 807 790
+ 456 161 570
+ 269 718 339
+ 213 628 602
+ 155 367 686
+ 176 418 568
+ 66 251 723
+ 959 696 536
+ 794 279 885
+ 315 527 993
+ 603 853 868
+ 727 747 994
+ 411 287 193
+ 528 763 559
+ 803 149 739
+ 542 883 696
+ 275 676 183
+ 411 317 161
+ 349 875 35
+ 39 729 221
+ 256 831 216
+ 247 238 176
+ 399 59 306
+ 409 445 550
+ 9 387 253
+ 613 204 474
+ 81 868 944
+ 589 912 735
+ 319 264 83
+ 984 704 614
+ 778 614 532
+ 699 762 556
+ 680 250 507
+ 504 581 647
+ 160 351 295
+ 513 739 413
+ 651 915 651
+ 878 218 499
+ 872 990 503
+ 38 886 12
+ 218 201 415
+ 240 250 504
+ 265 448 382
+ 402 876 126
+ 488 950 649
+ 189 210 597
+ 24 850 758
+ 30 451 347
+ 5 437 723
+ 634 310 546
+ 801 179 411
+ 679 338 852
+ 385 32 933
+ 406 531 554
+ 88 516 871
+ 860 486 834
+ 467 535 849
+ 419 820 785
+ 206 649 526
+ 244 499 714
+ 80 774 678
+ 336 149 612
+ 310 175 656
+ 150 221 791
+ 159 806 701
+ 336 465 530
+ 376 819 272
+ 533 472 421
+ 82 124 909
+ 523 561 539
+ 844 811 576
+ 439 612 587
+ 782 457 686
+ 152 51 837
+ 413 573 855
+ 403 608 26
+ 893 819 910
+ 361 499 657
+ 677 937 617
+ 428 6 343
+ 310 38 431
+ 474 35 420
+ 574 256 221
+ 700 907 515
+ 149 685 478
+ 206 325 720
+ 114 51 67
+ 320 338 686
+ 293 59 527
+ 147 756 986
+ 250 697 573
+ 968 194 545
+ 542 480 72
+ 454 574 619
+ 473 55 592
+ 475 339 889
+ 884 313 993
+ 125 127 742
+ 591 514 585
+ 543 583 282
+ 264 580 390
+ 839 487 781
+ 902 664 868
+ 334 459 819
+ 107 20 211
+ 368 479 775
+ 683 691 273
+ 681 336 630
+ 22 978 536
+ 926 828 708
+ 210 319 723
+ 787 689 866
+ 854 633 856
+ 960 494 866
+ 122 687 596
+ 918 705 539
+ 84 564 791
+ 876 138 949
+ 836 1 500
+ 718 308 466
+ 228 311 271
+ 421 998 433
+ 622 772 174
+ 875 720 432
+ 680 687 509
+ 215 95 623
+ 674 732 166
+ 198 174 645
+ 721 839 390
+ 617 896 448
+ 73 331 155
+ 789 134 431
+ 853 376 400
+ 82 862 411
+ 779 362 70
+ 750 777 349
+ 674 604 224
+ 812 731 446
+ 280 546 336
+ 922 781 619
+ 196 892 876
+ 941 361 479
+ 344 988 873
+ 499 92 795
+ 287 913 546
+ 625 167 604
+ 617 1 399
+ 154 166 720
+ 328 323 111
+ 713 619 530
+ 606 756 580
+ 194 247 935
+ 149 65 64
+ 55 287 902
+ 870 866 127
+ 478 679 587
+ 900 459 565
+ 563 787 743
+ 962 798 769
+ 669 39 525
+ 745 691 317
+ 484 123 93
+ 500 598 348
+ 159 535 681
+ 618 176 877
+ 723 373 464
+ 304 184 131
+ 542 209 654
+ 716 47 647
+ 976 537 771
+ 914 606 568
+ 241 250 481
+ 616 640 660
+ 744 187 843
+ 303 617 927
+ 369 525 773
+ 754 697 360
+ 595 560 605
+ 562 589 610
+ 799 497 655
+ 823 553 532
+ 937 502 449
+ 976 941 158
+ 194 720 347
+ 474 694 822
+ 528 184 272
+ 922 698 568
+ 415 889 638
+ 169 822 65
+ 547 281 663
+ 582 167 110
+ 365 56 914
+ 431 162 923
+ 473 812 578
+ 572 890 386
+ 164 119 308
+ 604 946 496
+ 327 142 72
+ 641 916 472
+ 743 663 228
+ 107 446 345
+ 823 486 152
+ 997 47 968
+ 565 155 631
+ 438 205 416
+ 271 163 875
+ 123 393 111
+ 169 412 854
+ 615 683 659
+ 592 362 9
+ 99 895 668
+ 834 205 172
+ 359 355 550
+ 499 149 389
+ 755 298 916
+ 475 706 807
+ 829 425 118
+ 43 527 479
+ 159 473 874
+ 151 326 992
+ 970 660 509
+ 837 930 35
+ 164 345 506
+ 209 879 487
+ 97 157 503
+ 289 755 793
+ 624 897 293
+ 382 134 451
+ 257 917 339
+ 110 168 85
+ 470 583 139
+ 486 613 120
+ 584 747 795
+ 959 699 339
+ 866 384 672
+ 157 639 464
+ 939 485 409
+ 947 441 131
+ 179 953 581
+ 735 587 605
+ 834 582 36
+ 304 422 707
+ 195 348 347
+ 163 521 486
+ 948 471 675
+ 915 453 406
+ 40 345 635
+ 81 124 115
+ 127 105 127
+ 50 32 10
+ 221 399 397
+ 487 676 412
+ 574 607 450
+ 268 625 323
+ 843 858 145
+ 706 286 218
+ 822 168 254
+ 950 708 944
+ 572 640 775
+ 958 563 909
+ 996 154 918
+ 378 626 564
+ 335 823 339
+ 499 810 270
+ 294 22 98
+ 987 959 591
+ 101 899 442
+ 931 409 576
+ 542 102 655
+ 404 980 398
+ 759 990 381
+ 692 990 750
+ 752 93 149
+ 278 973 883
+ 621 459 232
+ 398 261 626
+ 221 212 744
+ 790 241 352
+ 802 218 317
+ 443 294 244
+ 393 131 941
+ 466 378 885
+ 516 419 240
+ 799 748 407
+ 468 502 386
+ 829 329 766
+ 432 376 408
+ 681 88 198
+ 553 351 489
+ 234 717 59
+ 332 525 675
+ 437 691 723
+ 441 834 433
+ 616 144 274
+ 966 911 650
+ 254 274 782
+ 346 714 856
+ 330 696 171
+ 394 407 298
+ 897 553 867
+ 755 503 956
+ 253 840 382
+ 923 195 262
+ 918 735 483
+ 55 703 227
+ 768 759 225
+ 825 238 14
+ 7 479 978
+ 211 603 957
+ 216 866 94
+ 112 698 60
+ 847 631 307
+ 940 164 253
+ 406 133 14
+ 380 816 425
+ 147 873 429
+ 698 987 98
+ 534 823 691
+ 197 690 754
+ 979 39 468
+ 928 73 531
+ 119 66 920
+ 982 810 569
+ 476 534 397
+ 931 366 182
+ 783 104 732
+ 131 32 619
+ 784 136 530
+ 16 933 484
+ 995 987 739
+ 985 88 977
+ 43 919 914
+ 540 399 915
+ 566 859 257
+ 639 419 73
+ 727 118 865
+ 477 370 834
+ 293 434 155
+ 422 557 603
+ 203 243 754
+ 373 15 748
+ 466 574 807
+ 282 576 70
+ 275 365 608
+ 987 644 648
+ 711 629 717
+ 420 410 696
+ 252 417 874
+ 642 26 202
+ 223 23 531
+ 545 580 675
+ 565 600 521
+ 130 745 142
+ 264 377 397
+ 300 618 253
+ 683 331 279
+ 440 826 275
+ 835 785 266
+ 592 264 590
+ 257 255 173
+ 532 23 620
+ 571 749 434
+ 988 552 492
+ 566 766 234
+ 617 818 776
+ 45 113 882
+ 579 793 114
+ 971 243 608
+ 979 241 241
+ 130 83 634
+ 91 361 5
+ 311 107 501
+ 377 388 496
+ 727 849 317
+ 323 702 256
+ 804 254 189
+ 70 11 246
+ 752 425 785
+ 799 413 882
+ 917 133 695
+ 959 49 902
+ 420 121 412
+ 177 170 158
+ 828 734 135
+ 880 875 75
+ 824 556 960
+ 857 689 960
+ 74 951 2
+ 246 687 756
+ 311 93 487
+ 209 626 886
+ 17 545 566
+ 963 252 283
+ 947 493 805
+ 185 493 462
+ 728 365 885
+ 808 214 528
+ 582 780 100
+ 30 254 654
+ 596 706 553
+ 713 968 803
+ 123 270 839
+ 792 778 475
+ 442 95 682
+ 931 212 678
+ 781 140 439
+ 651 645 978
+ 137 829 286
+ 593 503 895
+ 642 215 144
+ 687 122 934
+ 84 240 919
+ 656 515 774
+ 51 799 273
+ 636 324 924
+ 213 161 309
+ 509 157 458
+ 582 1 727
+ 716 269 819
+ 978 343 303
+ 828 264 708
+ 108 620 190
+ 12 12 634
+ 103 615 579
+ 364 286 660
+ 809 714 656
+ 729 504 10
+ 994 366 341
+ 433 796 77
+ 663 462 353
+ 776 687 758
+ 751 495 651
+ 33 751 753
+ 349 919 228
+ 204 799 584
+ 335 156 563
+ 725 191 535
+ 731 676 524
+ 455 571 10
+ 899 379 689
+ 773 641 812
+ 324 761 421
+ 354 557 897
+ 571 740 161
+ 407 271 856
+ 886 393 428
+ 286 870 218
+ 950 819 347
+ 331 847 858
+ 498 471 689
+ 357 378 775
+ 890 503 514
+ 201 863 428
+ 721 737 796
+ 636 178 974
+ 14 387 936
+ 622 424 144
+ 82 201 727
+ 127 164 779
+ 173 319 326
+ 195 748 641
+ 469 512 510
+ 626 949 405
+ 552 542 251
+ 192 204 382
+ 655 558 631
+ 970 519 3
+ 918 701 399
+ 56 543 403
+ 524 848 641
+ 620 431 539
+ 604 473 824
+ 369 105 464
+ 575 957 429
+ 859 978 199
+ 712 381 199
+ 941 305 738
+ 892 663 937
+ 653 963 365
+ 70 331 508
+ 620 923 682
+ 739 122 350
+ 288 418 768
+ 733 326 520
+ 694 472 793
+ 725 415 739
+ 895 398 201
+ 500 157 168
+ 727 814 354
+ 807 726 340
+ 431 329 212
+ 635 374 403
+ 677 78 347
+ 386 559 505
+ 385 361 161
+ 262 494 621
+ 481 237 767
+ 318 966 640
+ 723 732 546
+ 911 652 823
+ 958 502 677
+ 718 258 834
+ 98 666 506
+ 929 41 933
+ 869 637 605
+ 585 156 335
+ 490 316 149
+ 436 339 323
+ 596 948 224
+ 275 433 241
+ 545 890 155
+ 601 413 676
+ 893 401 673
+ 694 171 403
+ 211 110 482
+ 267 61 541
+ 206 124 256
+ 189 353 308
+ 351 880 70
+ 237 677 380
+ 759 754 388
+ 465 99 862
+ 852 787 925
+ 758 890 804
+ 252 817 784
+ 773 129 860
+ 954 102 872
+ 743 396 730
+ 500 304 173
+ 492 399 527
+ 413 465 813
+ 670 837 933
+ 897 424 430
+ 782 404 14
+ 151 24 418
+ 897 260 306
+ 811 287 386
+ 440 93 449
+ 229 185 582
+ 136 63 678
+ 211 250 940
+ 184 400 209
+ 122 383 238
+ 143 386 111
+ 320 194 415
+ 925 790 501
+ 924 596 614
+ 606 733 277
+ 886 116 194
+ 278 627 189
+ 225 536 981
+ 487 538 584
+ 539 2 793
+ 219 456 57
+ 341 424 941
+ 199 482 921
+ 231 241 588
+ 711 740 334
+ 596 554 323
+ 917 164 629
+ 19 138 756
+ 939 70 225
+ 536 432 401
+ 137 614 14
+ 593 818 402
+ 871 280 515
+ 268 259 326
+ 900 97 376
+ 68 699 461
+ 546 810 400
+ 540 697 676
+ 591 125 751
+ 159 719 919
+ 605 763 898
+ 171 845 459
+ 115 289 376
+ 265 636 317
+ 646 225 84
+ 663 755 89
+ 192 828 12
+ 316 523 822
+ 310 933 784
+ 44 721 873
+ 893 873 461
+ 898 15 548
+ 96 861 726
+ 9 837 398
+ 238 404 29
+ 227 845 428
+ 770 764 472
+ 960 747 784
+ 990 281 811
+ 59 597 111
+ 930 799 729
+ 930 882 758
+ 459 961 116
+ 484 83 914
+ 83 969 994
+ 828 423 132
+ 346 541 246
+ 783 484 303
+ 983 7 921
+ 216 208 905
+ 802 216 54
+ 6 121 306
+ 609 36 749
+ 608 84 626
+ 97 705 89
+ 200 688 878
+ 242 314 802
+ 294 66 338
+ 768 417 272
+ 785 351 266
+ 58 505 668
+ 791 291 679
+ 783 694 43
+ 794 468 355
+ 777 796 171
+ 378 784 426
+ 224 510 840
+ 557 606 708
+ 513 127 189
+ 231 976 517
+ 772 37 433
+ 684 973 324
+ 70 661 83
+ 914 136 702
+ 917 630 710
+ 826 894 84
+ 373 416 248
+ 551 924 226
+ 357 646 374
+ 890 491 246
+ 938 293 519
+ 66 42 704
+ 537 60 374
+ 508 56 405
+ 437 751 653
+ 681 718 160
+ 683 293 800
+ 569 288 878
+ 692 206 611
+ 173 157 399
+ 201 492 645
+ 98 132 329
+ 234 612 711
+ 296 54 975
+ 651 219 923
+ 527 177 138
+ 585 598 302
+ 552 653 474
+ 54 288 358
+ 828 631 279
+ 854 642 746
+ 80 52 645
+ 386 346 181
+ 488 7 569
+ 168 351 533
+ 906 186 681
+ 833 404 191
+ 863 297 526
+ 451 555 808
+ 336 544 155
+ 253 211 838
+ 759 819 238
+ 921 343 761
+ 264 632 690
+ 165 424 159
+ 121 481 361
+ 181 409 439
+ 94 972 995
+ 696 904 722
+ 613 238 422
+ 190 281 334
+ 385 127 129
+ 300 364 234
+ 479 768 937
+ 883 654 35
+ 979 679 959
+ 244 51 788
+ 275 613 804
+ 143 575 210
+ 160 168 608
+ 330 471 651
+ 407 594 410
+ 723 576 943
+ 268 912 361
+ 692 442 760
+ 443 288 20
+ 382 610 556
+ 62 694 568
+ 322 257 214
+ 253 458 861
+ 260 213 829
+ 37 137 420
+ 668 220 104
+ 673 150 435
+ 551 466 897
+ 390 729 999
+ 423 963 763
+ 837 36 295
+ 854 726 495
+ 16 728 389
+ 735 246 510
+ 218 136 617
+ 604 197 140
+ 113 355 499
+ 631 902 488
+ 689 898 212
+ 780 826 901
+ 556 205 657
+ 855 661 288
+ 141 34 480
+ 27 23 194
+ 115 53 393
+ 333 287 700
+ 68 300 671
+ 394 589 28
+ 572 248 771
+ 454 118 797
+ 526 141 300
+ 785 377 504
+ 886 723 105
+ 541 712 470
+ 156 128 932
+ 479 85 989
+ 381 207 162
+ 813 839 544
+ 143 783 541
+ 916 361 24
+ 878 133 886
+ 986 750 335
+ 122 643 864
+ 395 460 591
+ 387 896 627
+ 117 455 109
+ 2 14 569
+ 873 364 215
+ 875 350 554
+ 70 878 940
+ 234 846 82
+ 256 279 901
+ 693 990 473
+ 951 866 824
+ 923 408 891
+ 36 5 531
+ 954 654 266
+ 921 652 434
+ 561 701 427
+ 232 764 365
+ 330 331 73
+ 46 813 6
+ 380 698 297
+ 396 221 289
+ 135 867 633
+ 814 649 286
+ 797 918 827
+ 705 58 338
+ 6 305 310
+ 701 352 28
+ 903 97 825
+ 693 126 794
+ 438 144 592
+ 367 932 400
+ 320 820 264
+ 687 210 652
+ 682 84 566
+ 671 604 816
+ 529 646 267
+ 795 654 114
+ 955 426 118
+ 249 759 102
+ 343 581 267
+ 341 619 107
+ 479 57 341
+ 683 32 870
+ 630 609 210
+ 361 643 803
+ 506 856 406
+ 580 562 359
+ 312 433 154
+ 750 379 920
+ 448 520 312
+ 733 259 899
+ 33 786 319
+ 579 669 90
+ 595 769 242
+ 160 985 236
+ 654 903 946
+ 635 99 802
+ 75 158 437
+ 467 382 289
+ 406 542 548
+ 684 417 794
+ 729 105 122
+ 44 485 689
+ 737 15 713
+ 970 391 17
+ 373 384 729
+ 336 1 118
+ 814 807 759
+ 965 808 828
+ 179 181 834
+ 242 94 838
+ 188 183 82
+ 691 402 618
+ 984 43 561
+ 330 447 872
+ 553 581 30
+ 884 393 836
+ 431 298 837
+ 278 389 690
+ 976 587 803
+ 722 220 538
+ 548 208 107
+ 629 414 729
+ 543 584 672
+ 512 431 954
+ 475 367 959
+ 226 306 9
+ 824 774 668
+ 188 22 870
+ 722 764 300
+ 647 803 256
+ 410 972 21
+ 436 536 278
+ 995 577 453
+ 670 439 224
+ 434 488 572
+ 82 317 498
+ 559 823 662
+ 499 614 196
+ 944 14 432
+ 618 866 652
+ 467 872 289
+ 471 722 189
+ 923 756 17
+ 790 409 195
+ 511 500 545
+ 667 283 758
+ 271 373 283
+ 573 686 490
+ 659 706 560
+ 770 247 633
+ 424 169 895
+ 47 349 411
+ 380 235 805
+ 384 546 148
+ 747 870 831
+ 754 421 910
+ 937 15 433
+ 188 760 806
+ 872 748 418
+ 718 556 510
+ 165 590 486
+ 798 40 177
+ 349 923 530
+ 795 690 746
+ 550 671 360
+ 824 442 775
+ 331 686 152
+ 570 270 926
+ 860 64 383
+ 408 464 170
+ 758 440 349
+ 773 434 699
+ 780 563 352
+ 18 644 621
+ 432 663 188
+ 420 887 956
+ 237 586 788
+ 319 526 586
+ 544 647 115
+ 628 235 511
+ 666 408 33
+ 670 459 697
+ 48 189 692
+ 837 708 428
+ 462 652 632
+ 426 106 457
+ 730 744 195
+ 700 816 769
+ 383 480 923
+ 601 612 910
+ 559 953 779
+ 533 937 240
+ 464 123 344
+ 579 82 76
+ 179 188 373
+ 1 641 56
+ 688 698 50
+ 688 160 4
+ 790 364 767
+ 202 70 137
+ 914 420 674
+ 961 657 851
+ 578 708 875
+ 503 94 776
+ 221 143 356
+ 34 126 403
+ 234 31 78
+ 721 949 330
+ 675 191 460
+ 80 957 651
+ 690 580 824
+ 461 73 802
+ 725 606 51
+ 183 857 521
+ 708 800 482
+ 644 111 37
+ 769 778 869
+ 883 693 909
+ 549 714 43
+ 273 246 599
+ 637 309 675
+ 451 195 552
+ 681 408 126
+ 422 465 52
+ 743 235 144
+ 248 586 312
+ 42 398 313
+ 222 335 21
+ 528 312 738
+ 856 312 132
+ 915 79 610
+ 550 605 186
+ 566 815 698
+ 127 250 717
+ 532 129 775
+ 604 132 549
+ 134 44 247
+ 521 815 470
+ 370 853 515
+ 795 187 851
+ 963 295 50
+ 757 228 169
+ 706 303 120
+ 416 133 309
+ 956 63 11
+ 751 162 301
+ 387 632 29
+ 257 383 994
+ 215 247 994
+ 529 606 963
+ 770 305 756
+ 721 791 971
+ 558 531 675
+ 253 477 918
+ 470 52 615
+ 256 335 24
+ 301 523 651
+ 316 702 637
+ 321 721 32
+ 591 730 179
+ 341 364 146
+ 673 120 501
+ 31 183 207
+ 641 116 463
+ 221 54 775
+ 262 458 669
+ 139 486 904
+ 736 260 139
+ 406 359 663
+ 434 563 753
+ 981 6 215
+ 423 320 358
+ 719 319 415
+ 315 375 320
+ 7 637 423
+ 314 365 175
+ 199 687 754
+ 174 546 1
+ 29 526 754
+ 153 402 251
+ 787 565 919
+ 820 239 876
+ 994 614 47
+ 958 816 288
+ 244 750 275
+ 248 890 694
+ 628 194 414
+ 774 958 466
+ 181 34 442
+ 569 371 939
+ 500 347 740
+ 745 123 467
+ 614 662 119
+ 201 690 352
+ 596 974 215
+ 508 921 240
+ 405 947 317
+ 402 372 733
+ 298 41 357
+ 135 339 759
+ 544 683 690
+ 584 1 893
+ 215 680 501
+ 191 453 649
+ 952 84 727
+ 815 494 293
+ 163 168 46
+ 136 119 441
+ 185 112 474
+ 877 830 354
+ 497 242 226
+ 484 714 178
+ 854 570 402
+ 873 120 432
+ 30 613 50
+ 365 529 624
+ 969 332 586
+ 636 617 153
+ 588 669 314
+ 12 52 628
+ 584 704 642
+ 95 199 69
+ 979 486 705
+ 953 391 698
+ 698 471 333
+ 302 466 64
+ 678 19 376
+ 353 860 905
+ 236 113 797
+ 400 879 962
+ 341 805 493
+ 661 506 196
+ 736 357 644
+ 943 352 365
+ 484 756 282
+ 491 943 262
+ 765 494 729
+ 321 208 986
+ 621 346 290
+ 258 706 386
+ 179 452 276
+ 433 583 153
+ 708 2 212
+ 193 151 320
+ 647 149 299
+ 335 951 831
+ 661 787 792
+ 818 742 477
+ 799 964 157
+ 726 780 172
+ 740 225 24
+ 428 39 263
+ 388 901 506
+ 97 940 413
+ 41 454 826
+ 324 453 443
+ 346 76 938
+ 463 595 751
+ 854 948 454
+ 451 902 507
+ 722 961 130
+ 695 529 425
+ 59 591 467
+ 559 623 222
+ 991 194 196
+ 749 793 245
+ 474 327 247
+ 346 2 277
+ 643 328 135
+ 785 264 751
+ 35 537 887
+ 811 584 685
+ 475 903 748
+ 471 115 698
+ 7 945 449
+ 464 880 227
+ 287 868 878
+ 564 11 850
+ 221 623 475
+ 314 325 553
+ 209 865 621
+ 39 655 236
+ 95 296 235
+ 124 920 21
+ 439 473 902
+ 334 375 792
+ 315 116 768
+ 267 736 95
+ 703 606 595
+ 505 886 514
+ 114 168 52
+ 301 584 495
+ 200 709 527
+ 164 422 554
+ 246 546 460
+ 377 141 223
+ 286 323 354
+ 810 240 90
+ 920 450 425
+ 277 8 570
+ 28 649 50
+ 295 650 534
+ 690 187 665
+ 674 184 483
+ 68 139 376
+ 570 430 500
+ 590 422 543
+ 304 68 43
+ 422 666 163
+ 501 375 696
+ 81 621 813
+ 19 981 945
+ 410 83 941
+ 427 945 25
+ 283 408 825
+ 281 648 635
+ 294 678 615
+ 113 936 500
+ 554 772 314
+ 502 642 624
+ 262 318 699
+ 88 526 817
+ 242 468 161
+ 820 179 253
+ 580 62 531
+ 343 183 422
+ 430 161 485
+ 26 127 435
+ 442 32 517
+ 491 243 544
+ 552 680 310
+ 131 489 457
+ 697 162 526
+ 897 838 305
+ 695 748 335
+ 753 936 24
+ 46 681 637
+ 745 808 617
+ 318 251 171
+ 49 39 855
+ 359 284 725
+ 221 837 145
+ 581 821 444
+ 573 267 318
+ 706 969 583
+ 722 912 586
+ 680 86 869
+ 833 546 97
+ 865 507 481
+ 938 104 386
+ 941 217 265
+ 360 53 607
+ 634 197 476
+ 787 659 444
+ 368 163 783
+ 493 738 345
+ 182 539 52
+ 764 827 612
+ 699 493 663
+ 914 384 17
+ 495 546 260
+ 739 461 275
+ 386 91 394
+ 804 506 198
+ 780 421 269
+ 109 669 193
+ 457 298 349
+ 560 800 331
+ 282 153 637
+ 160 254 807
+ 434 204 476
+ 717 759 737
+ 629 785 65
+ 347 614 790
+ 270 663 647
+ 188 271 528
+ 277 929 591
+ 853 744 589
+ 704 881 761
+ 573 714 627
+ 541 689 287
+ 540 301 187
+ 670 397 368
+ 867 8 698
+ 869 146 802
+ 10 137 104
+ 164 575 450
+ 507 233 466
+ 548 425 46
+ 435 824 78
+ 334 951 34
+ 646 551 99
+ 60 829 569
+ 501 866 382
+ 440 327 222
+ 744 132 333
+ 800 983 126
+ 887 866 451
+ 28 599 39
+ 833 129 307
+ 804 519 319
+ 510 746 821
+ 639 209 561
+ 197 649 333
+ 638 644 361
+ 754 474 366
+ 193 219 106
+ 843 536 331
+ 483 634 611
+ 367 195 592
+ 753 71 115
+ 934 42 83
+ 337 75 85
+ 475 304 169
+ 672 143 211
+ 360 406 74
+ 370 119 111
+ 351 955 696
+ 543 849 785
+ 375 576 836
+ 288 316 239
+ 512 273 786
+ 721 407 82
+ 998 634 292
+ 449 399 284
+ 540 316 693
+ 430 68 984
+ 146 376 482
+ 785 134 643
+ 157 509 441
+ 808 615 552
+ 920 564 452
+ 407 341 441
+ 990 778 211
+ 822 325 925
+ 368 206 876
+ 491 153 126
+ 11 373 546
+ 854 752 143
+ 843 773 660
+ 777 472 964
+ 359 708 889
+ 575 941 882
+ 945 22 152
+ 968 237 115
+ 30 238 110
+ 101 504 412
+ 119 646 719
+ 28 190 336
+ 890 301 712
+ 11 657 782
+ 885 465 361
+ 424 669 645
+ 528 654 194
+ 894 252 667
+ 516 299 998
+ 370 837 976
+ 305 651 194
+ 701 447 175
+ 470 234 929
+ 752 606 965
+ 568 370 322
+ 226 592 281
+ 553 801 330
+ 576 228 623
+ 639 477 637
+ 252 664 998
+ 781 215 994
+ 446 698 25
+ 562 500 980
+ 702 444 299
+ 971 550 387
+ 754 562 439
+ 347 896 716
+ 242 861 596
+ 588 829 323
+ 464 211 949
+ 481 192 47
+ 598 98 963
+ 932 960 32
+ 933 482 893
+ 15 989 888
+ 866 735 629
+ 636 513 470
+ 280 528 944
+ 531 66 867
+ 284 735 865
+ 778 743 3
+ 458 131 262
+ 772 273 255
+ 942 278 50
+ 269 151 917
+ 502 4 883
+ 538 155 68
+ 929 850 21
+ 126 759 729
+ 869 689 711
+ 180 359 855
+ 299 68 975
+ 210 371 205
+ 477 183 827
+ 922 50 841
+ 665 154 312
+ 379 848 486
+ 450 835 743
+ 69 161 515
+ 680 535 83
+ 692 779 352
+ 818 554 389
+ 781 89 538
+ 746 218 209
+ 292 201 652
+ 417 375 393
+ 916 962 644
+ 518 923 561
+ 915 469 386
+ 142 460 454
+ 947 392 89
+ 144 840 866
+ 205 465 967
+ 209 657 650
+ 891 322 207
+ 800 522 907
+ 516 498 994
+ 185 806 804
+ 179 393 137
+ 316 765 892
+ 850 756 123
+ 494 783 627
+ 832 53 659
+ 93 949 602
+ 666 954 516
+ 592 11 210
+ 223 4 389
+ 221 280 388
+ 100 279 50
+ 380 589 345
+ 385 238 382
+ 205 506 359
+ 98 280 652
+ 396 371 290
+ 314 477 454
+ 368 692 564
+ 48 263 586
+ 356 902 922
diff --git a/2016/aoc3/src/main.rs b/2016/aoc3/src/main.rs
new file mode 100644
index 0000000..678933f
--- /dev/null
+++ b/2016/aoc3/src/main.rs
@@ -0,0 +1,64 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+
+struct Triangle {
+ l1: i32,
+ l2: i32,
+ l3: i32
+}
+
+impl Triangle {
+ fn is_valid(&self) -> bool {
+ (self.l1 + self.l2) > self.l3 &&
+ (self.l2 + self.l3) > self.l1 &&
+ (self.l3 + self.l1) > self.l2
+
+ }
+}
+
+fn main() {
+ let len = read_file().iter().filter(|tri| tri.is_valid()).count();
+ println!("{} valid triangles", len);
+}
+
+fn read_file() -> Vec<Triangle> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ let mut lines = file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .peekable();
+
+ let mut results = Vec::new();
+ while lines.peek().is_some() {
+ let (t11, t21, t31) = parse_line(lines.next().unwrap());
+ let (t12, t22, t32) = parse_line(lines.next().unwrap());
+ let (t13, t23, t33) = parse_line(lines.next().unwrap());
+
+ results.push(Triangle {
+ l1: t11,
+ l2: t12,
+ l3: t13
+ });
+ results.push(Triangle {
+ l1: t21,
+ l2: t22,
+ l3: t23
+ });
+ results.push(Triangle {
+ l1: t31,
+ l2: t32,
+ l3: t33
+ });
+ }
+ results
+}
+
+fn parse_line(line: String) -> (i32, i32, i32) {
+ let mut separated = line.split_whitespace();
+ (separated.next().unwrap().trim().parse().unwrap(),
+ separated.next().unwrap().trim().parse().unwrap(),
+ separated.next().unwrap().trim().parse().unwrap())
+}
+
diff --git a/2016/aoc4/Cargo.lock b/2016/aoc4/Cargo.lock
new file mode 100644
index 0000000..df3af88
--- /dev/null
+++ b/2016/aoc4/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc4"
+version = "0.1.0"
+
diff --git a/2016/aoc4/Cargo.toml b/2016/aoc4/Cargo.toml
new file mode 100644
index 0000000..7d02c6d
--- /dev/null
+++ b/2016/aoc4/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc4"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc4/input.txt b/2016/aoc4/input.txt
new file mode 100644
index 0000000..c23ffc2
--- /dev/null
+++ b/2016/aoc4/input.txt
@@ -0,0 +1,1091 @@
+gbc-frperg-pubpbyngr-znantrzrag-377[rgbnp]
+nij-mywlyn-wlsiayhcw-jfumncw-alumm-mbcjjcha-422[mcjwa]
+pualyuhapvuhs-ibuuf-zhslz-227[uhalp]
+xlrypetn-prr-lylwjdtd-665[dzoya]
+zilqwikbqdm-rmttgjmiv-mvoqvmmzqvo-278[mqvio]
+rgllk-bxmefuo-sdmee-geqd-fqefuzs-274[efdgl]
+ugfkmewj-yjsvw-wyy-lwuzfgdgyq-814[wygfj]
+lnkfaypeha-xwogap-bejwjyejc-524[uqzms]
+laffe-sorozgxe-mxgjk-jek-xkykgxin-254[kxegf]
+ytu-xjhwjy-hfsid-htfynsl-qtlnxynhx-411[hyntx]
+vetllbybxw-xzz-mktbgbgz-709[kblty]
+ixeumktoi-kmm-giwaoyozout-176[oimkt]
+frqvxphu-judgh-udpsdjlqj-udeelw-uhvhdufk-647[ntbsq]
+ixccb-hjj-uhvhdufk-725[hcjub]
+sehheiylu-isqludwuh-xkdj-qsgkyiyjyed-634[ydehi]
+yhwooebeaz-acc-ajcejaanejc-316[acejo]
+qyujihctyx-vumeyn-zchuhwcha-318[hcuya]
+xtwtelcj-rclop-clmmte-nzyeltyxpye-171[eltcy]
+pinovwgz-mvwwdo-yzkgjthzio-941[owzgi]
+htwwtxnaj-xhfajsljw-mzsy-hzxytrjw-xjwanhj-229[jwhxa]
+amlqskcp-epybc-cee-pcyaosgqgrgml-652[cegpa]
+fab-eqodqf-omzpk-emxqe-560[eqfmo]
+bnmrtldq-fqzcd-idkkxadzm-qdrdzqbg-365[dqzbk]
+ovbunmneqbhf-wryylorna-qrirybczrag-559[rbnya]
+ynukcajey-xwogap-iwjwcaiajp-966[jydme]
+dkqjcbctfqwu-uecxgpigt-jwpv-fgrctvogpv-128[cgptv]
+ugfkmewj-yjsvw-tmffq-vwhdgqewfl-606[zfmlc]
+htqtwkzq-idj-ijxnls-723[rwmzt]
+kgjgrypw-epybc-aylbw-amyrgle-amlryglkclr-184[lygra]
+jxdkbqfz-yrkkv-bkdfkbbofkd-705[csxut]
+ujqgywfau-uzgugdslw-sfsdqkak-684[duboh]
+rwcnawjcrxwju-mhn-nwprwnnarwp-823[wnrac]
+eqttqukxg-rncuvke-itcuu-ujkrrkpi-102[ukrtc]
+jvuzbtly-nyhkl-ibuuf-dvyrzovw-201[uvybl]
+tvsnigxmpi-fewoix-wxsveki-750[ixesv]
+rtqlgevkng-ejqeqncvg-ncdqtcvqta-336[prlxq]
+wfummczcyx-luvvcn-nywbhifias-864[cfimn]
+irdgrxzex-vxx-nfibjyfg-763[xfgir]
+buzahisl-ipvohghykvbz-qlssfilhu-klclsvwtlua-591[moyzp]
+dpotvnfs-hsbef-sbnqbhjoh-fhh-nbobhfnfou-831[vbmns]
+owshgfarwv-lgh-kwujwl-usfvq-ghwjslagfk-164[wgfhl]
+yuxufmdk-sdmpq-bxmefuo-sdmee-dqeqmdot-222[dmequ]
+clotzlnetgp-clmmte-opawzjxpye-873[elptc]
+mfklstdw-usfvq-kwjnauwk-268[kwfsu]
+vhglnfxk-zktwx-unggr-xgzbgxxkbgz-839[gxkzb]
+yrwxefpi-tpewxmg-kveww-ywiv-xiwxmrk-932[pxhgu]
+shmml-cynfgvp-tenff-qrfvta-143[fmntv]
+zhdsrqlchg-sodvwlf-judvv-uhdftxlvlwlrq-855[ldvhf]
+kfg-jvtivk-sleep-uvjzxe-711[evjkf]
+molgbzqfib-yxphbq-obpbxoze-757[bopqx]
+qfmcusbwq-qobrm-qcohwbu-fsoqeiwgwhwcb-168[qwbco]
+sbejpbdujwf-gmpxfs-tupsbhf-623[bfpsj]
+jsehsyafy-hdsklau-yjskk-ksdwk-242[ksyad]
+rwcnawjcrxwju-ljwmh-bcxajpn-823[jwcan]
+excdklvo-oqq-oxqsxoobsxq-874[oqxsb]
+buzahisl-jhukf-jvhapun-klwsvftlua-565[uahlf]
+gpbepvxcv-snt-steadnbtci-453[tbcen]
+wyvqljapsl-ihzrla-zlycpjlz-149[lzajp]
+amlqskcp-epybc-cee-kylyeckclr-938[cekly]
+jchipqat-qphzti-advxhixrh-895[hiapq]
+tinnm-qvcqczohs-qighcasf-gsfjwqs-818[jfuek]
+qyujihctyx-mwupyhayl-bohn-wihnuchgyhn-890[hynuc]
+wlqqp-nvrgfezqvu-irsszk-ivjvrity-607[viqrs]
+molgbzqfib-avb-cfkxkzfkd-315[bfkza]
+luxciuwncpy-wuhxs-womnigyl-mylpcwy-266[ylhtr]
+ugdgjxmd-bwddqtwsf-ugflsafewfl-762[qdtes]
+fmsledevhsyw-nippcfier-eguymwmxmsr-438[vmsip]
+xekdwvwnzkqo-xwogap-ajcejaanejc-706[aejwc]
+wfummczcyx-yaa-fiacmncwm-136[bxsio]
+rdadguja-tvv-ldgzhwde-375[dagve]
+wsvsdkbi-qbkno-oqq-domrxyvyqi-718[qobdi]
+oaxadrgx-qss-oazfmuzyqzf-300[mfedb]
+hqfxxnknji-uqfxynh-lwfxx-xfqjx-125[zkwtx]
+gpbepvxcv-qphzti-rdcipxcbtci-947[cpibt]
+etyyx-bzmcx-bnzshmf-qdrdzqbg-443[btyez]
+htqtwkzq-gzssd-qfgtwfytwd-541[ogntm]
+uiovmbqk-kpwkwtibm-mvoqvmmzqvo-798[awevt]
+zotts-vumeyn-xypyfijgyhn-448[qasni]
+zovldbkfz-pzxsbkdbo-erkq-xznrfpfqflk-367[eunpo]
+htwwtxnaj-gntmfefwitzx-hfsid-htfynsl-zxjw-yjxynsl-255[tfnwx]
+vhglnfxk-zktwx-vahvhetmx-labiibgz-839[hvxab]
+htqtwkzq-idj-wjhjnansl-983[rmtzn]
+irgyyolokj-vrgyzoi-mxgyy-aykx-zkyzotm-358[yogkz]
+ktfitzbgz-lvtoxgzxk-angm-wxitkmfxgm-943[vxmua]
+uwtojhynqj-hmthtqfyj-jslnsjjwnsl-879[jhnst]
+mrxivrexmsrep-gerhc-gsexmrk-hiwmkr-100[yzpuo]
+hdgdovmt-bmvyz-ezggtwzvi-adivixdib-707[divgz]
+lqwhuqdwlrqdo-iorzhu-ghvljq-959[qhldo]
+vhkkhlbox-wrx-inkvatlbgz-397[kbhlv]
+tyepcyletzylw-awldetn-rcldd-dezclrp-795[ldect]
+sedikcuh-whqtu-uww-tufqhjcudj-946[uhwcd]
+lsyrkjkbnyec-zvkcdsm-qbkcc-myxdksxwoxd-848[kcdsx]
+fnjyxwrinm-lqxlxujcn-mnyjacvnwc-355[ncjxl]
+gpbepvxcv-tvv-rdcipxcbtci-141[cvpbi]
+xgsvgmotm-hgyqkz-ykxboiky-124[gkymo]
+udskkaxawv-usfvq-esjcwlafy-814[uidxk]
+fydelmwp-nlyoj-opalcexpye-899[elpyo]
+aczupnetwp-qwzhpc-afcnsldtyr-717[cpant]
+bknsykmdsfo-nio-yzobkdsyxc-926[kosyb]
+xjmmjndqz-xcjxjgvoz-mzvxlpdndodji-343[fqvmn]
+amjmpdsj-qaytclecp-fslr-bcqgel-782[claej]
+fnjyxwrinm-ouxfna-anjlzdrbrcrxw-719[nrxaf]
+qcbgiasf-ufors-pogysh-zcuwghwqg-168[gscfh]
+kmjezxodgz-wpiit-mzxzdqdib-109[aypcu]
+ckgvutofkj-xghhoz-uvkxgzouty-696[ajsic]
+lsyrkjkbnyec-mkxni-cdybkqo-510[kybcn]
+tipfxvezt-gcrjkzt-xirjj-jvimztvj-919[pofxi]
+pbybeshy-cynfgvp-tenff-svanapvat-403[afnpv]
+cjpibabsepvt-cvooz-usbjojoh-155[objcp]
+jvyyvzpcl-lnn-ayhpupun-929[npylu]
+wsvsdkbi-qbkno-zvkcdsm-qbkcc-oxqsxoobsxq-276[sbkoq]
+ugdgjxmd-usfvq-ugslafy-ugflsafewfl-918[xbmpo]
+nwlddtqtpo-ojp-xlcvpetyr-639[ptdlo]
+nzcczdtgp-prr-opdtry-587[wsiym]
+ynssr-yehpxk-wxlbzg-111[plhnx]
+xjmmjndqz-xcjxjgvoz-xjiovdihzio-967[jxioz]
+enqvbnpgvir-pubpbyngr-znexrgvat-585[qtsjn]
+gvcskirmg-qekrixmg-ikk-xvemrmrk-126[kmrgi]
+gpbepvxcv-uadltg-ejgrwphxcv-921[gpvce]
+kmjezxodgz-nxvqzibzm-cpio-adivixdib-941[izdxb]
+hcd-gsqfsh-xszzmpsob-sbuwbssfwbu-428[sbfhu]
+nwlddtqtpo-upwwjmply-dpcgtnpd-119[pdtwl]
+mbggf-msvdly-zlycpjlz-929[aonev]
+lhkhszqx-fqzcd-qzaahs-btrsnldq-rdquhbd-443[qdhsz]
+luxciuwncpy-xsy-uwkocmcncih-500[cuinw]
+qvbmzvibqwvit-kpwkwtibm-zmkmqdqvo-564[mqvbi]
+tvsnigxmpi-jpsaiv-irkmriivmrk-568[yileu]
+vxupkizork-kmm-lotgtiotm-748[xymrs]
+gpewwmjmih-gerhc-hiwmkr-152[lostk]
+ibghopzs-gqojsbusf-vibh-rsgwub-818[bsghi]
+guahyncw-luvvcn-wihnuchgyhn-552[hncug]
+iruzfrtkzmv-treup-tfrkzex-ivjvrity-373[rtivz]
+dsxxw-cee-ylyjwqgq-704[eqwxy]
+lhkhszqx-fqzcd-eknvdq-lzmzfdldms-911[dzlqf]
+oxmeeuruqp-omzpk-oamfuzs-emxqe-248[emoup]
+dyz-combod-mkxni-mykdsxq-vklybkdybi-848[dkybm]
+bpvctixr-qphzti-ldgzhwde-999[abmop]
+kwvacumz-ozilm-jiasmb-mvoqvmmzqvo-824[tnqvi]
+njmjubsz-hsbef-kfmmzcfbo-nbobhfnfou-389[luxhg]
+hwbba-fag-tgceswkukvkqp-622[kabgw]
+nchhg-jiasmb-lmxizbumvb-382[bmhia]
+ymszqfuo-dmnnuf-emxqe-170[syxpj]
+ymszqfuo-qss-abqdmfuaze-144[qsafm]
+tcfkqcevkxg-hwbba-hnqygt-vtckpkpi-440[kctbg]
+zloolpfsb-gbiivybxk-rpbo-qbpqfkd-705[bopfi]
+slqryzjc-pyzzgr-rpyglgle-288[uanmz]
+iutyaskx-mxgjk-inuiurgzk-rumoyzoiy-696[klmzy]
+dpssptjwf-cvooz-efqmpznfou-311[fopsz]
+dsxxw-cee-dglylagle-756[eldgx]
+nwlddtqtpo-upwwjmply-xlcvpetyr-223[pltwd]
+jvuzbtly-nyhkl-lnn-lunpullypun-201[tqlba]
+uiovmbqk-kivlg-bmkpvwtwog-720[kpvsu]
+nchhg-xtiabqk-oziaa-zmamizkp-850[aizhk]
+molgbzqfib-zixppfcfba-gbiivybxk-pqloxdb-237[igmjz]
+jyfvnlupj-jhukf-jvhapun-yljlpcpun-539[dmnws]
+hqtyeqsjylu-sqdto-tufqhjcudj-712[cnysz]
+gsvvswmzi-gerhc-gsrxemrqirx-100[dlypm]
+ktwbhtvmbox-xzz-vhgmtbgfxgm-709[bgmtx]
+hjgbwuladw-uzgugdslw-vwhsjlewfl-580[wlgud]
+njmjubsz-hsbef-kfmmzcfbo-efqmpznfou-181[subnv]
+bnknqetk-bzmcx-zbpthrhshnm-417[bhnkm]
+gspsvjyp-fyrrc-jmrergmrk-126[rgjmp]
+bjfutsneji-gntmfefwitzx-kqtbjw-fhvznxnynts-307[ntfjb]
+sedikcuh-whqtu-rqiauj-tuiywd-270[gipnv]
+hjgbwuladw-bwddqtwsf-jwsuimakalagf-294[wadbf]
+encuukhkgf-uecxgpigt-jwpv-rwtejcukpi-986[ucegk]
+nzydfxpc-rclop-nlyoj-nzletyr-zapcletzyd-847[lyzcn]
+eqpuwogt-itcfg-lgnnadgcp-tgceswkukvkqp-518[gckpt]
+nzwzcqfw-mldvpe-afcnsldtyr-171[cdfln]
+ide-htrgti-snt-advxhixrh-401[hitdr]
+fmsledevhsyw-gerhc-gsexmrk-erepcwmw-776[emrsw]
+jvyyvzpcl-yhiipa-aljouvsvnf-201[vyaij]
+chnylhuncihuf-zfiqyl-mniluay-656[hilnu]
+udskkaxawv-xdgowj-klgjsyw-346[eruiv]
+pbeebfvir-sybjre-qrcnegzrag-585[erbga]
+aoubshwq-qobrm-obozmgwg-948[obgmq]
+jvsvymbs-ibuuf-huhsfzpz-747[subfh]
+qvbmzvibqwvit-jiasmb-ikycqaqbqwv-928[qbiva]
+zuv-ykixkz-kmm-jkyomt-748[kmyzi]
+slqryzjc-zsllw-amlryglkclr-808[lrcsy]
+enzcntvat-enoovg-ybtvfgvpf-273[vntef]
+iqmbazulqp-dmnnuf-oazfmuzyqzf-664[zfmqu]
+yaxsnlcrun-ouxfna-uxprbcrlb-537[nruxa]
+ovbunmneqbhf-cynfgvp-tenff-ratvarrevat-351[uakpm]
+qzchnzbshud-idkkxadzm-rghoohmf-885[hdzkm]
+fodvvlilhg-sodvwlf-judvv-fxvwrphu-vhuylfh-101[vfhld]
+qvbmzvibqwvit-kpwkwtibm-apqxxqvo-798[qvbiw]
+aoubshwq-pwcvonofrcig-rms-aofyshwbu-688[oswab]
+hwbba-gii-fgrnqaogpv-882[gabif]
+pkl-oaynap-acc-pnwejejc-186[acpej]
+ltpedcxots-qphzti-ejgrwphxcv-323[ptceh]
+mybbycsfo-nio-nofovyzwoxd-250[stdkc]
+bgmxkgtmbhgte-ietlmbv-zktll-inkvatlbgz-397[ptrnf]
+dpotvnfs-hsbef-dipdpmbuf-qvsdibtjoh-545[dbfps]
+fmsledevhsyw-veqtekmrk-tpewxmg-kveww-hitevxqirx-568[evwkm]
+ykjoqian-cnwza-ywjzu-ykwpejc-wymqeoepekj-628[hmfzu]
+wihmogyl-aluxy-vumeyn-jolwbumcha-240[lmuya]
+yuxufmdk-sdmpq-eomhqzsqd-tgzf-emxqe-664[mqdef]
+wifilzof-vumeyn-guhuaygyhn-864[uyfgh]
+hplazytkpo-nlyoj-cpdplcns-457[plcno]
+vhglnfxk-zktwx-utldxm-hixktmbhgl-917[tursp]
+jxdkbqfz-zxkav-zlxqfkd-pxibp-133[xkzbd]
+mfklstdw-xdgowj-jwuwanafy-554[wadfj]
+eqttqukxg-tcddkv-vtckpkpi-596[ampxv]
+tpspahyf-nyhkl-jovjvshal-mpuhujpun-591[fkeyj]
+vqr-ugetgv-ecpfa-eqcvkpi-ujkrrkpi-414[ekprv]
+mvkccspson-bkllsd-nozvyiwoxd-952[oscdk]
+ugjjgkanw-ugfkmewj-yjsvw-bwddqtwsf-kwjnauwk-528[nkliy]
+wkqxodsm-lexxi-myxdksxwoxd-848[xdkmo]
+tfiifjzmv-tyftfcrkv-jyzggzex-841[unmyd]
+wdjcvuvmyjpn-rzvkjiduzy-mvwwdo-adivixdib-421[dvijw]
+xzwrmkbqtm-jcvvg-amzdqkma-226[uonyt]
+tvsnigxmpi-mrxivrexmsrep-veffmx-xvemrmrk-308[mrxev]
+iehepwnu-cnwza-nwxxep-owhao-420[wenah]
+fubrjhqlf-edvnhw-wudlqlqj-725[lqdfh]
+wfummczcyx-wuhxs-mniluay-370[cbijt]
+jchipqat-eaphixr-vgphh-sthxvc-895[hpaci]
+pelbtravp-ohaal-hfre-grfgvat-169[arefg]
+jshzzpmplk-jhukf-aljouvsvnf-279[jfhkl]
+hwbba-ejqeqncvg-ocpcigogpv-128[cgbeo]
+fnjyxwrinm-ajkkrc-cajrwrwp-745[rjwac]
+mhi-lxvkxm-utldxm-tgterlbl-267[lmtxb]
+jxdkbqfz-bdd-pqloxdb-237[dbqxf]
+qfkkj-nzydfxpc-rclop-clmmte-xlylrpxpye-197[vzyuc]
+bxaxipgn-vgpst-qxdwpopgsdjh-ytaanqtpc-hwxeexcv-687[csdop]
+rdggdhxkt-eaphixr-vgphh-itrwcdadvn-245[dhgra]
+qlm-pbzobq-zxkav-zlxqfkd-obzbfsfkd-471[bzfkq]
+ajyqqgdgcb-qaytclecp-fslr-sqcp-rcqrgle-106[cqglr]
+zgmfyxypbmsq-aylbw-amyrgle-qfgnngle-704[jmbna]
+pkl-oaynap-acc-zalhkuiajp-654[apckl]
+bqxnfdmhb-okzrshb-fqzrr-btrsnldq-rdquhbd-599[nszgr]
+mybbycsfo-mkxni-mykdsxq-cobfsmoc-302[mbcos]
+ujoon-eaphixr-vgphh-ldgzhwde-141[hdego]
+iuxxuyobk-hatte-lotgtiotm-852[toiux]
+muqfedyput-rkddo-huqsgkyiyjyed-608[dyuek]
+mrxivrexmsrep-ikk-irkmriivmrk-230[rikme]
+htqtwkzq-wfggny-ywfnsnsl-749[nwfgq]
+sno-rdbqds-idkkxadzm-trdq-sdrshmf-599[dsrkm]
+apuut-wpiit-gvwjmvojmt-369[tijmp]
+molgbzqfib-yxphbq-tlohpelm-133[blhmo]
+ugdgjxmd-wyy-hmjuzskafy-866[ydgjm]
+slqryzjc-hcjjwzcyl-dglylagle-860[lcjyg]
+ktwbhtvmbox-wrx-etuhktmhkr-241[psbxd]
+oaddaeuhq-otaoaxmfq-ruzmzouzs-950[aouzd]
+ugfkmewj-yjsvw-tmffq-klgjsyw-528[sqogh]
+vrurcjah-pajmn-ajvyjprwp-ljwmh-anlnrerwp-433[jkstx]
+fab-eqodqf-vqxxknqmz-ymdwqfuzs-586[qfdmx]
+tpspahyf-nyhkl-kfl-klwhyatlua-123[lahky]
+zntargvp-enoovg-znexrgvat-195[gnvae]
+dkqjcbctfqwu-uecxgpigt-jwpv-ugtxkegu-934[gucte]
+owshgfarwv-xdgowj-jwkwsjuz-320[wjgos]
+gifavtkzcv-treup-jyzggzex-659[gzetv]
+bjfutsneji-gfxpjy-tujwfyntsx-203[jftns]
+pxtihgbsxw-ietlmbv-zktll-ybgtgvbgz-371[bgtli]
+crwwv-zxkav-pefmmfkd-367[fkmvw]
+sbqiiyvyut-fbqijys-whqii-tulubefcudj-998[xytos]
+gvcskirmg-gsvvswmzi-fewoix-pskmwxmgw-230[gmswi]
+eqttqukxg-ejqeqncvg-octmgvkpi-232[qegtc]
+lqwhuqdwlrqdo-fdqgb-zrunvkrs-439[qdrlu]
+tinnm-gqojsbusf-vibh-gozsg-480[gsbin]
+lujbbrornm-ljwmh-orwjwlrwp-849[rwjlb]
+jef-iushuj-rkddo-efuhqjyedi-868[dejuf]
+szfyrqriuflj-treup-jrcvj-971[slkjz]
+ltpedcxots-rpcsn-itrwcdadvn-921[cdtnp]
+ohmnuvfy-xsy-jolwbumcha-968[hmouy]
+gntmfefwitzx-wfintfhynaj-uqfxynh-lwfxx-wjhjnansl-905[fnwxh]
+xcitgcpixdcpa-tvv-hwxeexcv-271[cxvei]
+jyfvnlupj-qlssfilhu-ayhpupun-227[zbydk]
+wdjcvuvmyjpn-zbb-vxlpdndodji-291[djvbn]
+wfummczcyx-dyffsvyuh-xymcah-630[ycfmh]
+cebwrpgvyr-wryylorna-phfgbzre-freivpr-897[opgba]
+cjpibabsepvt-tdbwfohfs-ivou-fohjoffsjoh-363[fobhj]
+zekvierkzferc-jtrmvexvi-ylek-wzeretzex-425[erzkv]
+sgmtkzoi-pkrrehkgt-ygrky-228[kgrty]
+iruzfrtkzmv-jtrmvexvi-ylek-jkfirxv-971[nvfye]
+dfcxsqhwzs-pogysh-obozmgwg-870[goshw]
+yuxufmdk-sdmpq-vqxxknqmz-bgdotmeuzs-326[tidcv]
+iuxxuyobk-igtje-ygrky-878[mflrz]
+laffe-igtje-vaxingyotm-800[aefgi]
+tpspahyf-nyhkl-wshzapj-nyhzz-zhslz-643[hzpsy]
+diozmivodjivg-xviyt-ozxcijgjbt-473[cmtlp]
+pyknyegle-njyqrga-epyqq-pcyaosgqgrgml-314[gyqep]
+bwx-amkzmb-zijjqb-tijwzibwzg-824[egorq]
+drxevkzt-vxx-uvjzxe-581[xvezd]
+ktfitzbgz-cxeeruxtg-wxitkmfxgm-761[txgef]
+htsxzrjw-lwfij-wfggny-ywfnsnsl-801[cjidb]
+oxmeeuruqp-nmewqf-pqeusz-742[eqump]
+hqfxxnknji-kzeed-ojqqdgjfs-jslnsjjwnsl-671[jnsqd]
+pbybeshy-rtt-phfgbzre-freivpr-221[rbepf]
+pdjqhwlf-edvnhw-xvhu-whvwlqj-231[hwvdj]
+gcfcnuls-aluxy-vumeyn-lywycpcha-188[cylua]
+plolwdub-judgh-edvnhw-pdqdjhphqw-699[dhpwj]
+udpsdjlqj-hjj-pdqdjhphqw-751[jdhpq]
+amjmpdsj-pyzzgr-qyjcq-886[jmpqy]
+lahxpnwrl-ljwmh-bqryyrwp-667[tifxe]
+drxevkzt-avccpsvre-uvgcfpdvek-191[vcedk]
+xzwrmkbqtm-rmttgjmiv-apqxxqvo-928[lmkgz]
+eqnqthwn-tcddkv-fgrctvogpv-648[tvcdg]
+bjfutsneji-ojqqdgjfs-ijajqturjsy-515[jqsfi]
+sebehvkb-hqrryj-ixyffydw-166[siyrz]
+zlkprjbo-doxab-mixpqfz-doxpp-jxohbqfkd-783[yjhzq]
+eza-dpncpe-nsznzwlep-opdtry-821[sdeti]
+tbxmlkfwba-yxphbq-xkxivpfp-523[slfmk]
+ucynmlgxcb-hcjjwzcyl-umpiqfmn-548[cmjln]
+lxwbdvna-pajmn-bljenwpna-qdwc-dbna-cnbcrwp-199[nabwc]
+eadalsjq-yjsvw-wyy-jwsuimakalagf-892[ajswy]
+fruurvlyh-mhoobehdq-zrunvkrs-907[rhuov]
+sbqiiyvyut-vbemuh-sedjqydcudj-686[ltadr]
+fkqbokxqflkxi-avb-lmboxqflkp-991[kbflq]
+lhkhszqx-fqzcd-atmmx-kzanqzsnqx-677[qzxah]
+cebwrpgvyr-hafgnoyr-cynfgvp-tenff-qrcnegzrag-793[rxmql]
+ajmrxjlcren-cxy-bnlanc-ouxfna-lxwcjrwvnwc-927[cnxaj]
+hqtyeqsjylu-isqludwuh-xkdj-tulubefcudj-244[udjlq]
+vdzonmhydc-azrjds-cdudknoldms-157[lzowh]
+uwtojhynqj-kqtbjw-zxjw-yjxynsl-333[grmkp]
+myxcewob-qbkno-oqq-ecob-docdsxq-614[oqbcd]
+rkpqxyib-gbiivybxk-abpfdk-419[bikpx]
+zlilocri-zelzlixqb-qbzeklildv-497[ucyzj]
+pinovwgz-xviyt-vivgtndn-499[vingt]
+gcfcnuls-aluxy-luvvcn-xymcah-318[cluan]
+sebehvkb-fbqijys-whqii-husuylydw-400[bhisy]
+rdchjbtg-vgpst-eaphixr-vgphh-rjhidbtg-htgkxrt-323[hgtrp]
+pualyuhapvuhs-jshzzpmplk-wshzapj-nyhzz-zlycpjlz-175[zphla]
+atyzghrk-sgmtkzoi-hgyqkz-yzuxgmk-228[gkzyh]
+ohmnuvfy-mwupyhayl-bohn-yhachyylcha-630[hyacl]
+oxjmxdfkd-avb-pqloxdb-211[dxboa]
+iqmbazulqp-bdavqofuxq-omzpk-ruzmzouzs-482[zqumo]
+zsxyfgqj-gzssd-wjxjfwhm-619[jsfgw]
+qvbmzvibqwvit-jcvvg-abwziom-512[tcrkb]
+xgjougizobk-lruckx-aykx-zkyzotm-826[koxzg]
+bkzrrhehdc-rbzudmfdq-gtms-zmzkxrhr-755[rzdhm]
+myxcewob-qbkno-cmkfoxqob-rexd-zebmrkcsxq-302[syrvm]
+zekvierkzferc-treup-tfrkzex-uvgrikdvek-867[ekrvz]
+cvabijtm-lgm-bziqvqvo-330[vbimq]
+vhglnfxk-zktwx-ktuubm-vhgmtbgfxgm-553[gkmtx]
+xst-wigvix-fyrrc-vieguymwmxmsr-490[yentm]
+ktfitzbgz-fbebmtkr-zktwx-xzz-lmhktzx-111[ztkbx]
+vdzonmhydc-eknvdq-sqzhmhmf-963[xacdu]
+dmpuamofuhq-otaoaxmfq-efadmsq-742[amfoq]
+htqtwkzq-gfxpjy-wjxjfwhm-827[fnred]
+sbnqbhjoh-xfbqpojafe-cbtlfu-dpoubjonfou-311[kezry]
+qyujihctyx-vumeyn-lywycpcha-604[ychua]
+ide-htrgti-tvv-uxcpcrxcv-973[ctvir]
+bxaxipgn-vgpst-snt-gtprfjxhxixdc-791[xgpti]
+nbhofujd-dipdpmbuf-dvtupnfs-tfswjdf-363[dfpub]
+apuut-nxvqzibzm-cpio-mznzvmxc-291[zmcin]
+uzfqdzmfuazmx-otaoaxmfq-pqhqxabyqzf-768[pzmry]
+tpspahyf-nyhkl-ibuuf-klwhyatlua-253[xkrsz]
+iqmbazulqp-vqxxknqmz-efadmsq-950[jrnox]
+bpvctixr-rpcsn-igpxcxcv-375[cpxir]
+ytu-xjhwjy-uqfxynh-lwfxx-yjhmstqtld-489[xyhjt]
+qvbmzvibqwvit-ntwemz-kwvbiqvumvb-720[vbimq]
+mhi-lxvkxm-ietlmbv-zktll-vnlmhfxk-lxkobvx-553[eusnm]
+tpspahyf-nyhkl-jhukf-wbyjohzpun-487[hpyfj]
+avw-zljyla-qlssfilhu-zlycpjlz-929[lzajs]
+sawlkjevaz-xwogap-skngodkl-290[akglo]
+xgjougizobk-laffe-lruckx-gtgreyoy-774[goefk]
+aoubshwq-qobrm-qcohwbu-qighcasf-gsfjwqs-948[qsbho]
+wifilzof-vumeyn-lyuwkocmcncih-968[avixc]
+uiovmbqk-xtiabqk-oziaa-mvoqvmmzqvo-382[moqva]
+sawlkjevaz-oywrajcan-dqjp-lqnydwoejc-342[ajwcd]
+kfg-jvtivk-jtrmvexvi-ylek-rercpjzj-529[jvekr]
+houngfgxjuay-igtje-giwaoyozout-228[gouai]
+gcfcnuls-aluxy-mwupyhayl-bohn-ijyluncihm-916[tacdb]
+cjpibabsepvt-cvooz-ufdiopmphz-155[pobci]
+iuxxuyobk-igtje-sgtgmksktz-878[uwcvx]
+thnulapj-ibuuf-ylzlhyjo-305[sfdnr]
+xzwrmkbqtm-rmttgjmiv-zmamizkp-434[ifpry]
+yhwooebeaz-zua-yqopkian-oanreya-680[aoeyn]
+tfcfiwlc-wcfnvi-wzeretzex-243[cefwi]
+guahyncw-xsy-uwkocmcncih-864[qsmtb]
+ovbunmneqbhf-rtt-qrfvta-689[zymsd]
+rgllk-eomhqzsqd-tgzf-ymdwqfuzs-638[qzdfg]
+ryexqpqhteki-sqdto-seqjydw-skijecuh-iuhlysu-946[eqshi]
+avw-zljyla-qlssfilhu-mpuhujpun-383[luahj]
+pynffvsvrq-onfxrg-znantrzrag-143[nrfag]
+ikhcxvmbex-xzz-phkdlahi-839[cstrx]
+mvhkvbdib-wvnfzo-zibdizzmdib-187[bizdv]
+ipvohghykvbz-wshzapj-nyhzz-huhsfzpz-747[hzpsv]
+htqtwkzq-hmthtqfyj-ijuqtdrjsy-151[tqhjy]
+xzz-ftgtzxfxgm-865[tupfq]
+jyfvnlupj-jhukf-klwhyatlua-747[jydsc]
+mbiyqoxsm-mkxni-kxkvicsc-510[ikmxc]
+bgmxkgtmbhgte-ietlmbv-zktll-labiibgz-163[bglti]
+vdzonmhydc-bqxnfdmhb-rbzudmfdq-gtms-lzmzfdldms-469[arkps]
+forwcoqhwjs-gqojsbusf-vibh-rsgwub-688[dgqsb]
+qcffcgwjs-pogysh-qcbhowbasbh-688[bchsf]
+apuut-xviyt-yzqzgjkhzio-317[zituy]
+ide-htrgti-qjccn-jhtg-ithixcv-479[itchg]
+kgjgrypw-epybc-hcjjwzcyl-cleglccpgle-262[qphrv]
+atyzghrk-lruckx-jkvruesktz-384[krtuz]
+hqtyeqsjylu-rqiauj-vydqdsydw-998[gqeba]
+uwtojhynqj-gfxpjy-qfgtwfytwd-177[fjtwy]
+nglmtuex-xzz-ftgtzxfxgm-839[xgtzf]
+ncjzrpytn-clmmte-epnsyzwzrj-951[yqksh]
+gntmfefwitzx-gzssd-htsyfnsrjsy-333[cngmk]
+qcbgiasf-ufors-qvcqczohs-hfowbwbu-168[bcfoq]
+wlqqp-gcrjkzt-xirjj-dribvkzex-529[ycrxs]
+drxevkzt-irdgrxzex-jtrmvexvi-ylek-glityrjzex-321[erxit]
+ovbunmneqbhf-qlr-znexrgvat-559[nbeqr]
+bwx-amkzmb-jiasmb-camz-bmabqvo-512[bmazc]
+vcibutulxiom-vohhs-womnigyl-mylpcwy-838[fczlm]
+fmsledevhsyw-ikk-hitpscqirx-230[owjnv]
+ykhknbqh-ywjzu-ykwpejc-odellejc-940[xguqm]
+nsyjwsfyntsfq-gzssd-uzwhmfxnsl-203[sfnwy]
+mtzslklcozfd-clmmte-nzyeltyxpye-301[tmlui]
+dsxxw-cee-kypicrgle-106[ecxdg]
+ujqgywfau-aflwjfslagfsd-tskcwl-ghwjslagfk-476[fagls]
+nchhg-jcvvg-mvoqvmmzqvo-642[vmcgh]
+cjpibabsepvt-tdbwfohfs-ivou-efqmpznfou-831[mvwiq]
+votubcmf-njmjubsz-hsbef-dboez-dpbujoh-fohjoffsjoh-129[izchs]
+njmjubsz-hsbef-fhh-nbobhfnfou-337[unims]
+iwcjapey-lhwopey-cnwoo-hkceopeyo-576[oecpw]
+ydjuhdqjyedqb-fbqijys-whqii-efuhqjyedi-322[qdijy]
+bknsykmdsfo-lkcuod-mecdywob-cobfsmo-250[obcdk]
+sbqiiyvyut-zubboruqd-cqdqwucudj-530[uqbdc]
+etaqigpke-dcumgv-vgejpqnqia-960[egqai]
+ykjoqian-cnwza-nwxxep-paydjkhkcu-134[pcdmt]
+iehepwnu-cnwza-lhwopey-cnwoo-nawymqeoepekj-108[ewnop]
+vagreangvbany-rtt-phfgbzre-freivpr-221[raegv]
+surmhfwloh-sodvwlf-judvv-xvhu-whvwlqj-595[vhwlu]
+qekrixmg-ikk-gywxsqiv-wivzmgi-256[jsykh]
+sno-rdbqds-bgnbnkzsd-otqbgzrhmf-495[rypqa]
+guahyncw-vohhs-nywbhifias-214[hains]
+sno-rdbqds-atmmx-bnmszhmldms-365[posvl]
+zovldbkfz-zxkav-zlxqfkd-zlkqxfkjbkq-575[zrqmk]
+ykhknbqh-zua-owhao-888[hakob]
+xmrrq-vqw-ugflsafewfl-372[isvjx]
+wdjcvuvmyjpn-wpiit-vxlpdndodji-395[cvdlm]
+wyvqljapsl-ihzrla-zopwwpun-123[lpwaz]
+kdijqrbu-tou-husuylydw-816[uvcwx]
+fhezusjybu-fbqijys-whqii-husuylydw-764[uyhis]
+jyfvnlupj-kfl-mpuhujpun-773[ujpfl]
+hafgnoyr-pubpbyngr-nanylfvf-715[nkyzs]
+jfifqxov-doxab-oxyyfq-absbilmjbkq-341[qmgrk]
+nij-mywlyn-wuhxs-wiuncha-uwkocmcncih-188[cnwhi]
+amjmpdsj-afmamjyrc-ylyjwqgq-470[jmayq]
+rdggdhxkt-eaphixr-vgphh-jhtg-ithixcv-921[yvuxl]
+ucynmlgxcb-qaytclecp-fslr-dglylagle-184[tudeg]
+dpmpsgvm-tdbwfohfs-ivou-sfdfjwjoh-363[qhgxy]
+bqvvu-ykhknbqh-fahhuxawj-wymqeoepekj-498[hekqa]
+qczcftiz-xszzmpsob-sbuwbssfwbu-818[sbzcf]
+aietsrmdih-hci-wlmttmrk-360[imthr]
+xst-wigvix-ikk-qevoixmrk-256[ikxve]
+nzydfxpc-rclop-nzwzcqfw-mfyyj-opalcexpye-405[cpyfz]
+frqvxphu-judgh-udeelw-uhdftxlvlwlrq-933[ludhe]
+jsehsyafy-jsttal-hmjuzskafy-892[sajyf]
+zbytomdsvo-mrymyvkdo-vyqscdsmc-276[mydos]
+tcorcikpi-ecpfa-eqcvkpi-fgxgnqrogpv-934[jziot]
+ytu-xjhwjy-hfsid-wjxjfwhm-905[jhwfx]
+hjgbwuladw-tmffq-suimakalagf-554[afglm]
+pyknyegle-zsllw-nspafyqgle-730[leygn]
+gifavtkzcv-avccpsvre-uvjzxe-607[zhayg]
+bpvctixr-snt-tcvxcttgxcv-973[vrteq]
+wyvqljapsl-jovjvshal-zlycpjlz-175[nrwfe]
+kwzzwaqdm-lgm-aitma-122[amwzd]
+iqmbazulqp-dmnnuf-qzsuzqqduzs-690[qhzsm]
+udskkaxawv-xdgowj-xafsfuafy-138[nailf]
+ipvohghykvbz-wshzapj-nyhzz-yljlpcpun-929[lwyvn]
+forwcoqhwjs-foppwh-hsqvbczcum-636[chowf]
+pualyuhapvuhs-msvdly-svnpzapjz-903[pasuv]
+xgjougizobk-vrgyzoi-mxgyy-xkykgxin-436[tjykb]
+sedikcuh-whqtu-rkddo-cqdqwucudj-348[brlqi]
+elrkdcdugrxv-fdqgb-uhfhlylqj-465[dlfgh]
+mhi-lxvkxm-lvtoxgzxk-angm-ltexl-917[xlmgk]
+bqvvu-fahhuxawj-yqopkian-oanreya-212[cpdwf]
+buzahisl-jhukf-thyrlapun-903[hualb]
+rgllk-oaxadrgx-nmewqf-pqbxakyqzf-690[aqxfg]
+iuruxlar-irgyyolokj-jek-ynovvotm-488[ohpdn]
+xmtjbzidx-nxvqzibzm-cpio-yzkgjthzio-811[zixbj]
+xmrrq-ugfkmewj-yjsvw-usfvq-ugslafy-ghwjslagfk-866[fgsju]
+yhtwhnpun-wshzapj-nyhzz-vwlyhapvuz-851[hznpw]
+zgmfyxypbmsq-zyqicr-kypicrgle-340[ycgim]
+uwtojhynqj-hfsid-htfynsl-wjfhvznxnynts-489[nhfjs]
+fab-eqodqf-dmnnuf-bgdotmeuzs-196[dfbem]
+wifilzof-wuhxs-wiuncha-lyuwkocmcncih-578[ciwhu]
+gspsvjyp-veffmx-pefsvexsvc-516[svefp]
+yknnkoera-xwogap-bejwjyejc-732[ejakn]
+nsyjwsfyntsfq-gfxpjy-knsfshnsl-333[sfnyj]
+fodvvlilhg-gbh-ghvljq-595[vgprj]
+nuatmlmdpage-bxmefuo-sdmee-emxqe-482[emadu]
+jvyyvzpcl-msvdly-vwlyhapvuz-903[vylpz]
+fruurvlyh-iorzhu-vdohv-517[hruvo]
+houngfgxjuay-hgyqkz-ykxboiky-618[ygkho]
+gsrwyqiv-kvehi-gerhc-gsexmrk-xiglrspskc-750[grsei]
+pualyuhapvuhs-qlssfilhu-zhslz-799[hlsua]
+nwlddtqtpo-nlyoj-nzletyr-opdtry-119[tdlno]
+fydelmwp-prr-nfdezxpc-dpcgtnp-535[pdcef]
+qmpmxevc-kvehi-jpsaiv-hizipstqirx-672[ipveh]
+nzwzcqfw-nlyoj-nzletyr-opawzjxpye-587[znwye]
+bpvctixr-rwdrdapit-hpath-973[prtad]
+gzefmnxq-omzpk-oazfmuzyqzf-430[zfmoq]
+wpuvcdng-hnqygt-vgejpqnqia-102[tmdxr]
+aoubshwq-foppwh-igsf-hsghwbu-610[tsrzk]
+wihmogyl-aluxy-mwupyhayl-bohn-mbcjjcha-422[vuypz]
+cqwdujys-uww-sedjqydcudj-478[djuwc]
+votubcmf-tdbwfohfs-ivou-sfbdrvjtjujpo-883[fobjt]
+gpbepvxcv-ytaanqtpc-apqdgpidgn-427[pagcd]
+bnknqetk-eknvdq-qdrdzqbg-885[qdknb]
+uwtojhynqj-wfruflnsl-hfsid-wjxjfwhm-541[fjwhl]
+zhdsrqlchg-fodvvlilhg-gbh-frqwdlqphqw-361[hlqdg]
+cvabijtm-jcvvg-lmxizbumvb-174[vbmci]
+fruurvlyh-fdqgb-ghsorbphqw-205[hrbfg]
+pualyuhapvuhs-msvdly-thyrlapun-279[uahlp]
+iehepwnu-cnwza-ydkykhwpa-ajcejaanejc-212[oqwrn]
+bqvvu-xwogap-yqopkian-oanreya-680[ckqtm]
+ktwbhtvmbox-vahvhetmx-mxvaghehzr-917[hvmtx]
+uzfqdzmfuazmx-omzpk-oamfuzs-fqotzaxask-274[mnilo]
+gntmfefwitzx-idj-rfsfljrjsy-931[fjirs]
+tcrjjzwzvu-tfiifjzmv-tyftfcrkv-vexzevvizex-399[vzfte]
+oaddaeuhq-vqxxknqmz-qzsuzqqduzs-404[qzdua]
+sorozgxe-mxgjk-yigbktmkx-natz-zxgototm-514[hejid]
+eadalsjq-yjsvw-ujqgywfau-tskcwl-kwjnauwk-554[wajks]
+lxuxaodu-rwcnawjcrxwju-ljwmh-fxatbqxy-693[xwaju]
+plolwdub-judgh-fdqgb-frdwlqj-vdohv-153[dlbfg]
+kdijqrbu-jef-iushuj-sqdto-seqjydw-kiuh-juijydw-218[iqtvx]
+tfejldvi-xiruv-tfcfiwlc-srjbvk-jyzggzex-243[fijvc]
+jchipqat-ltpedcxots-uadltg-tcvxcttgxcv-609[ezynj]
+ryexqpqhteki-sxesebqju-udwyduuhydw-816[eudqy]
+iuxxuyobk-xgjougizobk-hatte-sgtgmksktz-436[pwdlc]
+gcfcnuls-aluxy-wuhxs-wiuncha-guleyncha-136[ucahl]
+ugfkmewj-yjsvw-usfvq-ugslafy-mkwj-lwklafy-476[ohqre]
+laffe-vxupkizork-vrgyzoi-mxgyy-uvkxgzouty-488[awgqz]
+eqttqukxg-hnqygt-rwtejcukpi-570[tqegk]
+yuxufmdk-sdmpq-ngzzk-ruzmzouzs-534[zumdk]
+ktwbhtvmbox-ietlmbv-zktll-kxtvjnblbmbhg-553[btlkm]
+qxdwpopgsdjh-eaphixr-vgphh-prfjxhxixdc-999[hpxdg]
+bnmrtldq-fqzcd-oqnidbshkd-qzaahs-cdoknxldms-703[lxvwe]
+gokzyxsjon-nio-gybucryz-172[oygnz]
+cqwdujys-uww-cqhaujydw-660[wucdj]
+mbggf-pualyuhapvuhs-msvdly-aljouvsvnf-123[ngwhl]
+crwwv-oxaflxzqfsb-zelzlixqb-ixyloxqlov-913[lxoqz]
+qlm-pbzobq-ciltbo-abmxoqjbkq-861[bqolm]
+oqnidbshkd-dff-rghoohmf-313[dfhob]
+lzfmdshb-eknvdq-cdudknoldms-937[dklmn]
+wsvsdkbi-qbkno-nio-ecob-docdsxq-614[jsetb]
+zlilocri-zxkav-zlxqfkd-qoxfkfkd-835[kflxz]
+wlqqp-upv-vexzevvizex-165[vepqx]
+vcibutulxiom-vumeyn-womnigyl-mylpcwy-838[myilu]
+pelbtravp-cynfgvp-tenff-svanapvat-663[kzmfp]
+xgvnndadzy-wpiit-jkzmvodjin-421[dinjv]
+foadouwbu-pogysh-fsqswjwbu-480[osuwb]
+yrwxefpi-hci-wxsveki-308[iewxc]
+tmrszakd-azrjds-otqbgzrhmf-105[rzadm]
+sbnqbhjoh-dboez-dpbujoh-usbjojoh-155[bohjd]
+eqnqthwn-gii-fgrctvogpv-908[ginqt]
+uiovmbqk-jcvvg-amzdqkma-356[mvakq]
+sbejpbdujwf-gmpxfs-pqfsbujpot-857[pbfjs]
+ide-htrgti-ytaanqtpc-stepgibtci-531[mnyed]
+aietsrmdih-glsgspexi-gywxsqiv-wivzmgi-230[igsem]
+htqtwkzq-xhfajsljw-mzsy-zxjw-yjxynsl-931[cmkfr]
+ckgvutofkj-xgjougizobk-yigbktmkx-natz-lotgtiotm-436[tgkoi]
+nwlddtqtpo-upwwjmply-fdpc-epdetyr-509[pdtwe]
+irdgrxzex-sleep-jyzggzex-373[tvnma]
+crwwv-zxkav-qoxfkfkd-939[lyjmh]
+ejpanjwpekjwh-nwzekwypera-oywrajcan-dqjp-nawymqeoepekj-368[zmuyt]
+lzfmdshb-rbzudmfdq-gtms-knfhrshbr-495[bdfhm]
+nchhg-rmttgjmiv-uizsmbqvo-252[mghit]
+amjmpdsj-aylbw-rpyglgle-626[lagjm]
+dfcxsqhwzs-pogysh-qighcasf-gsfjwqs-220[sfghq]
+xjgjmapg-nxvqzibzm-cpio-nojmvbz-707[jmzbg]
+zntargvp-enoovg-qrirybczrag-663[scjtg]
+bkzrrhehdc-qzaahs-qdzbpthrhshnm-391[zjbto]
+hafgnoyr-wryylorna-erprvivat-429[rayno]
+apwmeclga-afmamjyrc-rpyglgle-262[aglmc]
+jsvagsulanw-jsttal-hmjuzskafy-606[asjlt]
+bnknqetk-lhkhszqx-fqzcd-cxd-zmzkxrhr-651[kzhqx]
+ykhknbqh-nwxxep-nayaerejc-966[enahk]
+vrurcjah-pajmn-kdwwh-cajrwrwp-667[rwajc]
+vhehkyne-utldxm-vhgmtbgfxgm-891[ghmet]
+zotts-dyffsvyuh-xymcah-812[yfhst]
+vhglnfxk-zktwx-vtgwr-vnlmhfxk-lxkobvx-319[gvnom]
+ajvyjprwp-mhn-nwprwnnarwp-563[npwra]
+guahyncw-chnylhuncihuf-jfumncw-alumm-guleyncha-110[zjirh]
+hwdtljsnh-jll-xfqjx-801[jlhxd]
+xjgjmapg-mvwwdo-xjiovdihzio-525[ijodg]
+pybgmyargtc-zgmfyxypbmsq-zsllw-asqrmkcp-qcptgac-262[cgmpy]
+aflwjfslagfsd-hdsklau-yjskk-esfsywewfl-528[sflak]
+lugjuacha-dyffsvyuh-xypyfijgyhn-708[yfhua]
+lxaaxbren-mhn-cnlqwxuxph-823[nzsvm]
+sehheiylu-tou-cqdqwucudj-738[xciqn]
+slqryzjc-djmucp-qrmpyec-808[sznhq]
+ykjoqian-cnwza-bhksan-opknwca-264[ankco]
+pualyuhapvuhs-lnn-bzly-alzapun-721[auzfj]
+tfiifjzmv-wcfnvi-jkfirxv-997[fivjc]
+lsyrkjkbnyec-mkxni-mykdsxq-vyqscdsmc-562[ksycm]
+fnjyxwrinm-lujbbrornm-ajkkrc-nwprwnnarwp-927[zmyco]
+pyknyegle-amlqskcp-epybc-hcjjwzcyl-qcptgacq-860[cpyel]
+rzvkjiduzy-ezggtwzvi-kpmxcvndib-811[zivdg]
+wyvqljapsl-yhiipa-bzly-alzapun-773[alpyi]
+joufsobujpobm-dipdpmbuf-bdrvjtjujpo-415[gvkud]
+zloolpfsb-zxkav-zlxqfkd-lmboxqflkp-393[lfkox]
+zilqwikbqdm-jcvvg-kwvbiqvumvb-174[vbiqk]
+kzeed-wfggny-xmnuunsl-853[negud]
+ftzgxmbv-xzz-phkdlahi-657[grbhi]
+bnqqnrhud-bzmcx-sqzhmhmf-131[hmqbn]
+zntargvp-pnaql-pbngvat-nanylfvf-169[napvf]
+jxdkbqfz-pzxsbkdbo-erkq-absbilmjbkq-315[uzmcf]
+jshzzpmplk-buzahisl-kfl-klzpnu-695[lzkph]
+pualyuhapvuhs-msvdly-jbzavtly-zlycpjl-825[lyapu]
+lujbbrornm-ouxfna-xynajcrxwb-667[bnrxa]
+dmpuamofuhq-nmewqf-pqhqxabyqzf-482[lndmj]
+cvabijtm-moo-zmikycqaqbqwv-148[mqabc]
+wyvqljapsl-msvdly-zlycpjlz-435[lyjps]
+fmsledevhsyw-ikk-gywxsqiv-wivzmgi-204[isvwe]
+ide-htrgti-snt-sthxvc-297[tyvnc]
+guahyncw-luvvcn-qilembij-292[tcrsd]
+udskkaxawv-wyy-kwjnauwk-710[kwauy]
+aczupnetwp-clmmte-dezclrp-379[ynpmz]
+ikhcxvmbex-ietlmbv-zktll-vnlmhfxk-lxkobvx-449[lxkvb]
+rzvkjiduzy-xcjxjgvoz-rjmfncjk-707[tmnki]
+enzcntvat-cynfgvp-tenff-ynobengbel-923[neftb]
+vkrhzxgbv-bgmxkgtmbhgte-lvtoxgzxk-angm-kxtvjnblbmbhg-111[iwvbg]
+esyfwlau-tskcwl-jwsuimakalagf-398[ywmzb]
+lhkhszqx-fqzcd-bzmcx-nodqzshnmr-287[zhqcd]
+nzwzcqfw-ojp-dstaatyr-977[dsznk]
+qfkkj-xlrypetn-nlyoj-xlcvpetyr-691[lczde]
+wifilzof-luvvcn-nywbhifias-552[sxghy]
+nchhg-kivlg-zmamizkp-928[ghikm]
+tipfxvezt-tcrjjzwzvu-upv-kirzezex-295[zetvi]
+gsvvswmzi-tpewxmg-kveww-gsrxemrqirx-698[wegmr]
+pynffvsvrq-sybjre-ernpdhvfvgvba-663[epsqt]
+sedikcuh-whqtu-vbemuh-udwyduuhydw-894[udhwe]
+tmrszakd-bzmcx-rsnqzfd-183[zdmrs]
+zilqwikbqdm-jcvvg-wxmzibqwva-798[iqvwb]
+lejkrscv-jtrmvexvi-ylek-nfibjyfg-815[ejvfi]
+zsxyfgqj-jll-qtlnxynhx-151[lxjnq]
+gbc-frperg-onfxrg-qrirybczrag-923[rgbcf]
+xjgjmapg-kgvnodx-bmvnn-nvgzn-343[ngvjm]
+dmybmsuzs-ngzzk-mocgueufuaz-534[uzmgs]
+dmpuamofuhq-omzpk-oamfuzs-pqbxakyqzf-482[mafop]
+fbebmtkr-zktwx-unggr-ehzblmbvl-787[begkl]
+zntargvp-enoovg-ybtvfgvpf-481[vgfno]
+fubrjhqlf-gbh-vhuylfhv-933[hfblu]
+fruurvlyh-fdqgb-frdwlqj-whfkqrorjb-569[tmdlw]
+ixccb-udeelw-ghvljq-335[nibrq]
+tcorcikpi-dwppa-fgukip-570[qnzgc]
+ibghopzs-pibbm-rsdzcmasbh-428[bshim]
+apuut-wpiit-nzmqdxzn-889[inptu]
+qzoggwtwsr-pibbm-igsf-hsghwbu-246[gbswh]
+atyzghrk-yigbktmkx-natz-uvkxgzouty-488[pxeoy]
+mbiyqoxsm-mkxni-bokmaescsdsyx-796[erynw]
+qxdwpopgsdjh-uadltg-itrwcdadvn-401[mzukc]
+tinnm-rms-kcfygvcd-688[cmndf]
+crwwv-mixpqfz-doxpp-xkxivpfp-107[tpawu]
+qxdwpopgsdjh-qphzti-itrwcdadvn-999[lenub]
+jqwpihizlwca-lgm-abwziom-538[iwalm]
+votubcmf-dboez-dpbujoh-gjobodjoh-909[szlxy]
+nwzekwypera-oywrajcan-dqjp-iwjwcaiajp-446[awjpc]
+lxuxaodu-vrurcjah-pajmn-ljwmh-cnlqwxuxph-329[uxahj]
+gvaaz-ezf-efwfmpqnfou-779[scdpt]
+jsvagsulanw-hdsklau-yjskk-vwhdgqewfl-190[saklw]
+yrwxefpi-fewoix-irkmriivmrk-828[irefk]
+jrncbavmrq-rtt-fgbentr-819[rtbna]
+tpspahyf-nyhkl-msvdly-klwsvftlua-409[lsyaf]
+veqtekmrk-tpewxmg-kveww-qerekiqirx-100[szdiy]
+ykhknbqh-ydkykhwpa-hkceopeyo-108[khyeo]
+gifavtkzcv-treup-tfrkzex-dribvkzex-503[ekrtv]
+hafgnoyr-pubpbyngr-bcrengvbaf-351[bgnra]
+ide-htrgti-gpqqxi-gtprfjxhxixdc-999[ixgtd]
+yhtwhnpun-ipvohghykvbz-wshzapj-nyhzz-zavyhnl-617[hznyp]
+enqvbnpgvir-pynffvsvrq-rtt-erprvivat-559[vrnpt]
+jxdkbqfz-yrkkv-pxibp-159[kbpxd]
+etyyx-rbzudmfdq-gtms-rdquhbdr-833[drbmq]
+owshgfarwv-udskkaxawv-hdsklau-yjskk-ogjckzgh-398[kasgh]
+xst-wigvix-gerhc-irkmriivmrk-828[ilntc]
+ugfkmewj-yjsvw-wyy-klgjsyw-684[wyjgk]
+zloolpfsb-mixpqfz-doxpp-pbosfzbp-211[topig]
+fruurvlyh-vfdyhqjhu-kxqw-orjlvwlfv-569[vfhlr]
+xst-wigvix-fyrrc-vigimzmrk-516[irgmv]
+rnqnyfwd-lwfij-wfggny-wjxjfwhm-281[wfjng]
+rdchjbtg-vgpst-ytaanqtpc-sthxvc-557[tcagh]
+fubrjhqlf-fdqgb-frdwlqj-dftxlvlwlrq-465[flqdr]
+qlm-pbzobq-pzxsbkdbo-erkq-xznrfpfqflk-679[bqfkp]
+ltpedcxots-rpcsn-bpcpvtbtci-921[dtejs]
+froruixo-edvnhw-ghsorbphqw-231[horwb]
+bjfutsneji-hmthtqfyj-fsfqdxnx-333[fjthn]
+yhtwhnpun-lnn-zavyhnl-669[wpsgy]
+dmpuamofuhq-ngzzk-xmnadmfadk-742[madfk]
+ejpanjwpekjwh-ywjzu-oanreyao-498[yzjwm]
+eza-dpncpe-qwzhpc-afcnsldtyr-353[ivxnu]
+qekrixmg-nippcfier-gywxsqiv-wivzmgi-464[yxkwm]
+avw-zljyla-ibuuf-ylzlhyjo-383[lyaju]
+lqwhuqdwlrqdo-mhoobehdq-rshudwlrqv-621[qdhlo]
+qvbmzvibqwvit-jcvvg-apqxxqvo-200[vqbix]
+ugjjgkanw-esyfwlau-jsttal-ugflsafewfl-164[fgcep]
+shoewudys-isqludwuh-xkdj-ijehqwu-504[stjyd]
+luxciuwncpy-vohhs-yhachyylcha-214[hcyal]
+gifavtkzcv-sleep-ivjvrity-685[vieta]
+rzvkjiduzy-xviyt-yzqzgjkhzio-161[ziyjk]
+iehepwnu-cnwza-ykjoqian-cnwza-ywjzu-ykwpejc-iwjwcaiajp-316[wajci]
+sorozgxe-mxgjk-jek-vaxingyotm-956[goxej]
+dmpuamofuhq-dmnnuf-dqmocgueufuaz-560[umdfa]
+hjgbwuladw-kusnwfywj-zmfl-ugflsafewfl-450[aezbn]
+esyfwlau-usfvq-ugslafy-ghwjslagfk-294[fsagl]
+shmml-sybjre-erfrnepu-195[ngkjp]
+jlidywncfy-ohmnuvfy-wuhxs-wiuncha-ijyluncihm-240[xtjsm]
+ixeumktoi-lruckx-aykx-zkyzotm-436[kximo]
+nzydfxpc-rclop-upwwjmply-xlylrpxpye-535[plyxc]
+fodvvlilhg-sodvwlf-judvv-pdunhwlqj-725[krngz]
+xjmmjndqz-ezggtwzvi-adivixdib-733[idzgj]
+pbybeshy-pnaql-pbngvat-znantrzrag-533[anbpg]
+fnjyxwrinm-ljwmh-lxjcrwp-bqryyrwp-329[rwjyl]
+lhkhszqx-fqzcd-okzrshb-fqzrr-cdoknxldms-391[zdhkq]
+pynffvsvrq-ohaal-znantrzrag-637[anrfv]
+hafgnoyr-sybjre-genvavat-767[ngacu]
+lhkhszqx-fqzcd-bgnbnkzsd-lzmzfdldms-443[ynael]
+lugjuacha-wbiwifuny-mufym-786[uafim]
+vkrhzxgbv-xzz-ftgtzxfxgm-995[xzgft]
+uzfqdzmfuazmx-rxaiqd-emxqe-170[mqxza]
+ajvyjprwp-snuuhknjw-anlnrerwp-771[njprw]
+zuv-ykixkz-igtje-iugzotm-zxgototm-930[lifhb]
+mfklstdw-wyy-ksdwk-294[kwdsy]
+kyelcrga-slqryzjc-hcjjwzcyl-qrmpyec-990[kypqm]
+vkppo-sxesebqju-tulubefcudj-400[uebjp]
+ynukcajey-xqjju-lqnydwoejc-394[jycen]
+qzlozfhmf-qzchnzbshud-qzaahs-qdzbpthrhshnm-287[hzqsa]
+kmjezxodgz-mvwwdo-ncdkkdib-109[dkmow]
+oazegyqd-sdmpq-ngzzk-bgdotmeuzs-482[zdgem]
+qfkkj-mldvpe-cpdplcns-561[pcdkl]
+hvbizodx-ezggtwzvi-xjiovdihzio-577[voqzy]
+iuxxuyobk-inuiurgzk-xkikobotm-722[ikuox]
+jyddc-gsvvswmzi-jpsaiv-jmrergmrk-958[cpedy]
+vhkkhlbox-unggr-hixktmbhgl-449[hgkbl]
+clotzlnetgp-nsznzwlep-dpcgtnpd-145[tehzy]
+plolwdub-judgh-hjj-dqdobvlv-543[zkryh]
+ajmrxjlcren-ouxfna-ydalqjbrwp-355[ajrln]
+uqtqbizg-ozilm-lgm-amzdqkma-304[mqzag]
+lnkfaypeha-zua-lqnydwoejc-914[aelny]
+ibghopzs-pwcvonofrcig-qobrm-aobousasbh-844[obsac]
+ocipgvke-eqpuwogt-itcfg-tcddkv-gpikpggtkpi-804[salbg]
+ajmrxjlcren-lqxlxujcn-uxprbcrlb-823[lrxcj]
+rgndvtcxr-ytaanqtpc-sthxvc-843[tcanr]
+hqcfqwydw-sxesebqju-qdqboiyi-894[qbdei]
+tbxmlkfwba-gbiivybxk-qbzeklildv-757[biklv]
+vetllbybxw-utldxm-vhgmtbgfxgm-735[bglmt]
+mfklstdw-hdsklau-yjskk-vwhsjlewfl-528[xyuts]
+pxtihgbsxw-vtgwr-nlxk-mxlmbgz-657[xgblm]
+bnmrtldq-fqzcd-dff-lzqjdshmf-677[szdpt]
+xekdwvwnzkqo-sawlkjevaz-fahhuxawj-nayaerejc-654[zdeyh]
+gzefmnxq-bxmefuo-sdmee-xmnadmfadk-170[medfx]
+gpsxdprixkt-eaphixr-vgphh-rjhidbtg-htgkxrt-115[hgprt]
+eza-dpncpe-hplazytkpo-awldetn-rcldd-xlcvpetyr-535[tnpmg]
+bnmrtldq-fqzcd-eknvdq-sdbgmnknfx-781[dnqbf]
+nzcczdtgp-dnlgpyrpc-sfye-opgpwzaxpye-899[pcgyz]
+nwzekwypera-ydkykhwpa-odellejc-992[pwqrh]
+oknkvcta-itcfg-gii-wugt-vguvkpi-154[giktv]
+tcrjjzwzvu-upv-kvtyefcfxp-373[vcfjp]
+xst-wigvix-ikk-stivexmsrw-230[isxkt]
+fkqbokxqflkxi-zelzlixqb-qoxfkfkd-705[mntlq]
+qlm-pbzobq-yxphbq-zrpqljbo-pbosfzb-237[bpqoz]
+drxevkzt-avccpsvre-wzeretzex-269[ervzc]
+ksodcbwnsr-pogysh-oqeiwgwhwcb-480[mxdsl]
+tyepcyletzylw-qwzhpc-xlylrpxpye-613[tvcgy]
+rnqnyfwd-lwfij-hmthtqfyj-qtlnxynhx-437[ukdrt]
+oxjmxdfkd-jfifqxov-doxab-yxphbq-ixyloxqlov-393[xodfq]
+tcorcikpi-ejqeqncvg-fgrnqaogpv-804[cgqei]
+hqtyeqsjylu-zubboruqd-qsgkyiyjyed-712[yqubd]
+hvbizodx-ezggtwzvi-gjbdnodxn-967[dgzbi]
+zntargvp-enoovg-fgbentr-923[gneor]
+mvydjvxodqz-wvnfzo-hvmfzodib-447[zfpes]
+emixwvqhml-zijjqb-lmdmtwxumvb-148[mbijl]
+frqvxphu-judgh-gbh-whfkqrorjb-179[jwmgn]
+kyelcrga-njyqrga-epyqq-dglylagle-782[glyae]
+npmhcargjc-pyzzgr-bctcjmnkclr-522[crgjm]
+pxtihgbsxw-xzz-tvjnblbmbhg-943[bxght]
+oknkvcta-itcfg-hnqygt-qrgtcvkqpu-206[tcgkq]
+amlqskcp-epybc-zyqicr-sqcp-rcqrgle-522[bnemi]
+enqvbnpgvir-pnaql-fuvccvat-299[vnacp]
+xlrypetn-mldvpe-cpnptgtyr-509[nugrq]
+mbggf-qlssfilhu-klclsvwtlua-383[lsfgu]
+wlsiayhcw-wuhxs-wiuncha-mniluay-656[wahiu]
+gvaaz-cbtlfu-efqmpznfou-415[byzhx]
+rzvkjiduzy-nxvqzibzm-cpio-hvivbzhzio-343[zivbh]
+bqxnfdmhb-dff-otqbgzrhmf-781[fbdhm]
+wihmogyl-aluxy-wuhxs-wiuncha-lyuwkocmcncih-838[chuwi]
+enzcntvat-onfxrg-hfre-grfgvat-689[nkvyi]
+xgjougizobk-igtje-iugzotm-ygrky-540[giojk]
+mbggf-kfl-aljouvsvnf-773[fglva]
+qzoggwtwsr-xszzmpsob-sbuwbssfwbu-662[sbwzg]
+wsvsdkbi-qbkno-mkxni-mykdsxq-nofovyzwoxd-744[kodns]
+tpspahyf-nyhkl-lnn-klzpnu-721[nlphk]
+pejji-nio-bomosfsxq-380[oijsb]
+amlqskcp-epybc-cee-nspafyqgle-132[dsayt]
+luxciuwncpy-xsy-lyuwkocmcncih-240[cuyil]
+irdgrxzex-gcrjkzt-xirjj-vexzevvizex-165[xerzi]
+lxaaxbren-snuuhknjw-ujkxajcxah-381[axjnu]
+ktfitzbgz-ynssr-xzz-wxiehrfxgm-839[sjagq]
+hafgnoyr-enzcntvat-pnaql-pbngvat-genvavat-975[antvg]
+dfcxsqhwzs-qobrm-fsqswjwbu-896[sqwbf]
+zsxyfgqj-xhfajsljw-mzsy-xytwflj-619[jfsxy]
+yhwooebeaz-ywjzu-ykwpejc-hkceopeyo-706[eoywc]
+mvydjvxodqz-wpiit-kpmxcvndib-863[yrjnz]
+otzkxtgzoutgr-igtje-iugzotm-iutzgotsktz-332[tgzoi]
+pdjqhwlf-sodvwlf-judvv-vdohv-855[vdfhj]
+gpewwmjmih-fyrrc-gywxsqiv-wivzmgi-724[iwgmr]
+oqnidbshkd-idkkxadzm-rsnqzfd-391[lpscd]
+rgndvtcxr-hrpktcvtg-wjci-uxcpcrxcv-765[crtvx]
+esyfwlau-tmffq-xafsfuafy-970[fasuy]
+gvaaz-dipdpmbuf-efqbsunfou-545[zmynh]
+zsxyfgqj-wfggny-uzwhmfxnsl-463[cvqjn]
+oazegyqd-sdmpq-ngzzk-emxqe-430[flhis]
+jvuzbtly-nyhkl-zjhclunly-obua-zlycpjlz-643[ueimk]
+surmhfwloh-vfdyhqjhu-kxqw-ghsorbphqw-205[hqwfo]
+pualyuhapvuhs-zjhclunly-obua-thuhnltlua-825[ficqs]
+wbhsfbohwcboz-rms-oqeiwgwhwcb-194[wbhoc]
+gpsxdprixkt-ytaanqtpc-bpcpvtbtci-635[qkzhc]
+rnqnyfwd-lwfij-xhfajsljw-mzsy-qfgtwfytwd-931[fwjyd]
+ubhatstkwhnl-ktuubm-vnlmhfxk-lxkobvx-787[gtsqv]
+lqwhuqdwlrqdo-udeelw-dftxlvlwlrq-413[ldqwe]
+kloqemlib-lygbzq-pqloxdb-991[lbqod]
+veqtekmrk-tpewxmg-kveww-hiwmkr-282[ekwmr]
+rflsjynh-ytu-xjhwjy-jll-knsfshnsl-333[jlshn]
+bknsykmdsfo-pvygob-domrxyvyqi-432[yobdk]
+mybbycsfo-bkllsd-kxkvicsc-822[yzxcq]
+zixppfcfba-yxphbq-absbilmjbkq-991[gbhts]
+udskkaxawv-uzgugdslw-klgjsyw-684[gksuw]
+clxalrtyr-mfyyj-qtylyntyr-665[ylrta]
+uiovmbqk-jiasmb-lmaqov-694[mabio]
+xmtjbzidx-mvwwdo-zibdizzmdib-161[dizbm]
+wyvqljapsl-jovjvshal-bzly-alzapun-643[lajvp]
+zlilocri-zxkav-mrozexpfkd-445[rifng]
+pinovwgz-zbb-hvmfzodib-811[bziov]
+rtqlgevkng-dwppa-vgejpqnqia-284[gpqae]
+vrurcjah-pajmn-ljwmh-jlzdrbrcrxw-667[lmdrk]
+jlidywncfy-dyffsvyuh-ijyluncihm-838[yficd]
+cebwrpgvyr-sybjre-qrirybczrag-741[tsrqd]
+pbafhzre-tenqr-onfxrg-grpuabybtl-949[rbaef]
+lahxpnwrl-ljwmh-lxjcrwp-nwprwnnarwp-433[seonp]
+iuxxuyobk-igtje-iugzotm-iutzgotsktz-644[tiugo]
+qfkkj-prr-fdpc-epdetyr-951[prdef]
+nchhg-akidmvomz-pcvb-nqvivkqvo-954[osgtz]
+htwwtxnaj-gzssd-ijufwyrjsy-385[jswty]
+myxcewob-qbkno-mrymyvkdo-bokmaescsdsyx-328[sezot]
+rzvkjiduzy-mvwwdo-ncdkkdib-499[mfyze]
+emixwvqhml-lgm-uizsmbqvo-798[milqv]
+xmtjbzidx-wvnfzo-vivgtndn-941[nvdit]
+bknsykmdsfo-zvkcdsm-qbkcc-cobfsmoc-198[cksbm]
+gsrwyqiv-kvehi-fyrrc-jmrergmrk-906[regik]
+bqvvu-oywrajcan-dqjp-nawymqeoepekj-524[aejqn]
+upq-tfdsfu-sbccju-bobmztjt-883[btucf]
+surmhfwloh-fruurvlyh-mhoobehdq-orjlvwlfv-933[zymnj]
+wkqxodsm-tovvilokx-gybucryz-588[okvxy]
+nchhg-ntwemz-twoqabqka-902[ahnqt]
+iqmbazulqp-rgllk-rxaiqd-fqotzaxask-950[dtanc]
+ejpanjwpekjwh-nwxxep-bejwjyejc-732[jewpn]
+ajmrxjlcren-fnjyxwrinm-lqxlxujcn-vjwjpnvnwc-329[yhgwz]
+qcbgiasf-ufors-qvcqczohs-aofyshwbu-532[scfoq]
+jsehsyafy-vqw-ugflsafewfl-970[mfzcn]
+fab-eqodqf-qss-geqd-fqefuzs-560[qfesd]
+jef-iushuj-uww-sedjqydcudj-322[qyadz]
+kfg-jvtivk-jtrmvexvi-ylek-ivtvzmzex-347[wmlfu]
+pxtihgbsxw-ietlmbv-zktll-wxiehrfxgm-371[xiltb]
+wfintfhynaj-hmthtqfyj-jslnsjjwnsl-463[jnfhs]
+forwcoqhwjs-foppwh-kcfygvcd-480[cfowh]
+kzgwomvqk-rmttgjmiv-camz-bmabqvo-616[mvabg]
+pybgmyargtc-aylbw-amyrgle-nspafyqgle-392[yaglb]
+jyfvnlupj-ihzrla-lunpullypun-149[lytps]
+dpmpsgvm-cbtlfu-xpsltipq-467[plmst]
+oxaflxzqfsb-avb-zrpqljbo-pbosfzb-965[bfoza]
+amlqskcp-epybc-afmamjyrc-bctcjmnkclr-392[cmabj]
+encuukhkgf-tcddkv-yqtmujqr-362[kucdq]
+lqwhuqdwlrqdo-edvnhw-hqjlqhhulqj-595[sywmh]
+njmjubsz-hsbef-qspkfdujmf-cbtlfu-vtfs-uftujoh-857[fujsb]
+dsxxw-djmucp-umpiqfmn-340[mdpux]
+aflwjfslagfsd-hdsklau-yjskk-dstgjslgjq-736[sjlad]
+ynukcajey-ywjzu-iwjwcaiajp-758[sthmn]
+froruixo-lqwhuqdwlrqdo-fdqgb-uhdftxlvlwlrq-621[gtcry]
+chnylhuncihuf-jfumncw-alumm-mylpcwym-526[tyodr]
+ujoon-qphzti-uxcpcrxcv-817[copux]
+bkwzkqsxq-cmkfoxqob-rexd-ckvoc-666[kcoqx]
+pelbtravp-enqvbnpgvir-qlr-qrfvta-403[wqynx]
+yhtwhnpun-ibuuf-thuhnltlua-643[trfed]
+willimcpy-yaa-wihnuchgyhn-344[hiyac]
+thnulapj-jovjvshal-mpuhujpun-799[juhpa]
+nzcczdtgp-mldvpe-lnbftdtetzy-821[qvnmi]
+qzlozfhmf-idkkxadzm-btrsnldq-rdquhbd-209[dqzbf]
+ajvyjprwp-ouxfna-vjwjpnvnwc-407[jnpvw]
+hcd-gsqfsh-dzoghwq-ufogg-zcuwghwqg-688[nwgox]
+jrncbavmrq-qlr-genvavat-169[arvnq]
+crwwv-yrkkv-jxkxdbjbkq-653[ylpzs]
+pejji-tovvilokx-vyqscdsmc-146[vcijo]
+ikhcxvmbex-lvtoxgzxk-angm-inkvatlbgz-189[xgkva]
+jyddc-wgezirkiv-lyrx-xiglrspskc-620[ircdg]
+ajyqqgdgcb-aylbw-amyrgle-rpyglgle-210[glyab]
+mhi-lxvkxm-yehpxk-kxvxbobgz-319[lcest]
+rkpqxyib-gbiivybxk-lmboxqflkp-211[vustn]
+jchipqat-rdadguja-hrpktcvtg-wjci-tcvxcttgxcv-999[ctagj]
+ovbunmneqbhf-fpniratre-uhag-grpuabybtl-949[banru]
+nchhg-xtiabqk-oziaa-abwziom-174[aibho]
+dwbcjkun-ljwmh-ydalqjbrwp-303[jwbdl]
+lxuxaodu-krxqjijamxdb-bljenwpna-qdwc-bnaerlnb-563[ycjlt]
+yhkpvhjapcl-wshzapj-nyhzz-shivyhavyf-461[hyapv]
+udglrdfwlyh-mhoobehdq-wudlqlqj-959[dlhqo]
+myxcewob-qbkno-lsyrkjkbnyec-lexxi-cdybkqo-588[nfdem]
+fnjyxwrinm-ljwmh-lxwcjrwvnwc-459[wjncl]
+udpsdjlqj-udeelw-ghvljq-491[djleq]
+zloolpfsb-yrkkv-mrozexpfkd-783[koflp]
+drxevkzt-jtrmvexvi-ylek-ivrthlzjzkzfe-997[evzkr]
+ykjoqian-cnwza-ywjzu-ykwpejc-opknwca-264[wacjk]
+xekdwvwnzkqo-zua-zalwnpiajp-992[awzkn]
+fydelmwp-aczupnetwp-prr-cplnbftdtetzy-847[ptecd]
+lxwbdvna-pajmn-ouxfna-anjlzdrbrcrxw-563[anrxb]
+xfbqpojafe-gmpxfs-tbmft-545[rgdzm]
+kzeed-ojqqdgjfs-ijuqtdrjsy-411[jdqes]
+ktiaaqnqml-ntwemz-uizsmbqvo-642[azvew]
+udpsdjlqj-gbh-whfkqrorjb-725[rnqmt]
+lahxpnwrl-ouxfna-ydalqjbrwp-745[alnpr]
+dsxxw-bwc-mncpyrgmlq-548[cmwxb]
+joufsobujpobm-gvaaz-qmbtujd-hsbtt-fohjoffsjoh-727[ojbfh]
+laffe-jek-ynovvotm-670[efova]
+nzcczdtgp-ojp-xlcvpetyr-353[nvmak]
+kgjgrypw-epybc-djmucp-qyjcq-496[sqhmg]
+ykjoqian-cnwza-ywjzu-klanwpekjo-680[ajknw]
+nbhofujd-dipdpmbuf-efqbsunfou-415[fubdn]
+oaddaeuhq-ngzzk-fqotzaxask-144[hbxcm]
+lujbbrornm-vjpwncrl-snuuhknjw-ldbcxvna-bnaerln-459[nblrj]
+xgvnndadzy-wvnfzo-yzkvmohzio-135[znovd]
+jchipqat-tvv-jhtg-ithixcv-271[ymstr]
+xtwtelcj-rclop-nlyoj-dstaatyr-431[ntags]
+iutyaskx-mxgjk-jek-xkykgxin-618[kxgij]
+pxtihgbsxw-ktwbhtvmbox-cxeeruxtg-tgterlbl-943[txbeg]
+xfbqpojafe-dboez-dpbujoh-mbcpsbupsz-441[bpode]
+qfkkj-mfyyj-opalcexpye-613[yefjk]
+ejpanjwpekjwh-lhwopey-cnwoo-nawymqeoepekj-836[ewjop]
+qjopwxha-xqjju-odellejc-732[jeloq]
+bnknqetk-atmmx-lzmzfdldms-261[mdkln]
+xgsvgmotm-pkrrehkgt-sgtgmksktz-332[gktms]
+ryexqpqhteki-vbemuh-huqsgkyiyjyed-244[tjsqx]
+xjinphzm-bmvyz-ytz-yzkvmohzio-239[oznyv]
+eqttqukxg-rncuvke-itcuu-cpcnauku-180[jztvf]
+xgjougizobk-xghhoz-ygrky-696[gohkx]
+mtzslklcozfd-nsznzwlep-opgpwzaxpye-769[zplen]
+kgjgrypw-epybc-pyzzgr-jmegqrgaq-626[gprye]
+jlidywncfy-wbiwifuny-mniluay-396[iynwf]
+myvybpev-mkxni-mykdsxq-psxkxmsxq-536[rxnml]
+ibghopzs-qobrm-rsdzcmasbh-246[bshmo]
+jyfvnlupj-wshzapj-nyhzz-klwsvftlua-201[jlzaf]
+dzczkrip-xiruv-avccpsvre-cfxzjkztj-113[czrvi]
+dmbttjgjfe-dboez-dpbujoh-nbslfujoh-493[bjdoe]
+kfg-jvtivk-gifavtkzcv-srjbvk-jvimztvj-347[aymns]
+ktwbhtvmbox-vetllbybxw-ietlmbv-zktll-wxlbzg-241[bltvw]
+tmrszakd-cxd-qdrdzqbg-417[dqrza]
+nzydfxpc-rclop-nsznzwlep-nfdezxpc-dpcgtnp-899[ynbfk]
+fruurvlyh-mhoobehdq-rshudwlrqv-491[hrudl]
+odkasqzuo-pkq-emxqe-144[qekoa]
+hwbba-dcumgv-vtckpkpi-180[bckpv]
+lsyrkjkbnyec-cmkfoxqob-rexd-wkbuodsxq-718[yfzcq]
+xgvnndadzy-kgvnodx-bmvnn-xjiovdihzio-395[ndvio]
+willimcpy-vumeyn-omyl-nymncha-890[nmyux]
+mbggf-zjhclunly-obua-yljlpcpun-487[lubcg]
+ryexqpqhteki-sqdto-tuiywd-608[xhjzp]
+egdytrixat-gpqqxi-prfjxhxixdc-193[xidgp]
+nbhofujd-dszphfojd-cbtlfu-sftfbsdi-909[fdbsh]
+rflsjynh-gfxpjy-htsyfnsrjsy-489[istpm]
+vkrhzxgbv-vetllbybxw-ietlmbv-zktll-phkdlahi-189[lbvhk]
+lujbbrornm-ouxfna-uxprbcrlb-459[ozvca]
+pbafhzre-tenqr-fpniratre-uhag-erprvivat-117[raept]
+xgvnndadzy-xjmmjndqz-ytz-nvgzn-577[nzdgj]
+houngfgxjuay-pkrrehkgt-jkyomt-618[dltyf]
+bjfutsneji-hmthtqfyj-jslnsjjwnsl-411[jsntf]
+sgmtkzoi-lruckx-rghuxgzuxe-774[guxkr]
+nuatmlmdpage-nmewqf-abqdmfuaze-326[zbewa]
+dsxxw-zsllw-qyjcq-912[lqswx]
+cvabijtm-kivlg-kwibqvo-aitma-226[mvuhw]
+yuxufmdk-sdmpq-qss-bgdotmeuzs-768[sdmuq]
+qspkfdujmf-fhh-usbjojoh-597[elvgu]
+htqtwkzq-gfxpjy-hzxytrjw-xjwanhj-359[jpytc]
+gbc-frperg-pnaql-pbngvat-grpuabybtl-169[bgpar]
+yhkpvhjapcl-qlssfilhu-klclsvwtlua-123[lhsac]
+nglmtuex-vtgwr-vhtmbgz-ftkdxmbgz-813[emnca]
+atyzghrk-lruckx-ygrky-592[kryga]
+dkqjcbctfqwu-tcddkv-tgegkxkpi-362[kcdtg]
+sawlkjevaz-bhksan-lqnydwoejc-914[aejkl]
+kdijqrbu-uww-ijehqwu-712[uwijq]
+rwcnawjcrxwju-snuuhknjw-mnbrpw-121[wnjru]
+vrurcjah-pajmn-mhn-bcxajpn-225[ajnch]
+clotzlnetgp-mldvpe-cpdplcns-353[lpcde]
+wihmogyl-aluxy-dyffsvyuh-womnigyl-mylpcwy-682[khzto]
+qcbgiasf-ufors-dzoghwq-ufogg-kcfygvcd-428[mselb]
+kwtwznct-ktiaaqnqml-akidmvomz-pcvb-bmkpvwtwog-824[kmtwa]
+crwwv-oxyyfq-pqloxdb-289[oqwxy]
+iutyaskx-mxgjk-ckgvutofkj-lruckx-jkvgxzsktz-852[kxgjt]
+irgyyolokj-yigbktmkx-natz-giwaoyozout-930[oygik]
+yhtwhnpun-buzahisl-jhukf-jvhapun-mpuhujpun-565[uhnpj]
+fbebmtkr-zktwx-ktuubm-ybgtgvbgz-761[ifsyt]
+lejkrscv-avccpsvre-dribvkzex-165[vcerk]
+avw-zljyla-yhiipa-jvuahputlua-617[aluhi]
+xjmmjndqz-wpiit-xjiovdihzio-889[ijdmo]
+pbybeshy-fpniratre-uhag-jbexfubc-819[snuje]
+ktwbhtvmbox-vtgwr-phkdlahi-683[htbkv]
+avw-zljyla-wshzapj-nyhzz-ylzlhyjo-409[zlyah]
+tcrjjzwzvu-treup-tfrkzex-drerxvdvek-633[retvz]
+zlkprjbo-doxab-ciltbo-qoxfkfkd-627[nmwxj]
+vkrhzxgbv-lvtoxgzxk-angm-labiibgz-995[gbvxz]
+gpbepvxcv-hrpktcvtg-wjci-sthxvc-609[cvptg]
+hwbba-gii-fgrctvogpv-804[gbiva]
+nwlddtqtpo-nsznzwlep-dstaatyr-275[tdnal]
+ovbunmneqbhf-fpniratre-uhag-hfre-grfgvat-637[fraeg]
+pkl-oaynap-fahhuxawj-nayaerejc-888[mnchz]
+etaqigpke-hnqygt-qrgtcvkqpu-752[antmz]
+lugjuacha-wuhxs-ijyluncihm-214[hfsun]
+zloolpfsb-zxkav-abpfdk-341[abfkl]
+bknsykmdsfo-mkxni-mykdsxq-bokmaescsdsyx-822[skmdx]
+xjgjmapg-zbb-hvivbzhzio-499[bzghi]
+amjmpdsj-ajyqqgdgcb-qaytclecp-fslr-qrmpyec-652[smgnt]
+qczcftiz-dzoghwq-ufogg-rsgwub-714[gzcfo]
+gokzyxsjon-wsvsdkbi-qbkno-nio-myxdksxwoxd-900[oksxd]
+ktfitzbgz-vtgwr-vhtmbgz-lxkobvxl-969[tbgvz]
+hqtyeqsjylu-uww-efuhqjyedi-270[dytgj]
+ovbunmneqbhf-pnaql-pbngvat-freivprf-845[nbfpv]
+kzgwomvqk-akidmvomz-pcvb-aitma-902[makvi]
+sedikcuh-whqtu-zubboruqd-bqrehqjeho-790[hqube]
+kwvacumz-ozilm-jcvvg-lmaqov-382[vmacl]
+rgndvtcxr-qjccn-prfjxhxixdc-661[cxrdj]
+tbxmlkfwba-oxyyfq-tlohpelm-523[uhvaf]
+iuxxuyobk-inuiurgzk-vaxingyotm-514[iuxgk]
+odkasqzuo-omzpk-oamfuzs-ymzmsqyqzf-170[zmoqs]
+ktwbhtvmbox-unggr-lxkobvxl-527[bxgkl]
+ynssr-vtgwr-mxvaghehzr-423[rghsv]
+sgmtkzoi-kmm-lotgtiotm-670[mtogi]
+ugdgjxmd-vqw-kwjnauwk-944[wdgjk]
+rdggdhxkt-jchipqat-snt-gthtpgrw-713[tghdp]
+zvyvgnel-tenqr-wryylorna-npdhvfvgvba-663[vnrya]
+jsvagsulanw-usfvq-ugslafy-esjcwlafy-762[fygle]
+zsxyfgqj-wfggny-hzxytrjw-xjwanhj-931[jgwxy]
+wkqxodsm-tovvilokx-dbksxsxq-822[cpsgv]
+mbiyqoxsm-tovvilokx-yzobkdsyxc-458[oxybi]
+lzfmdshb-bzmcx-bnzshmf-vnqjrgno-261[ujfyc]
+oknkvcta-itcfg-dcumgv-hkpcpekpi-258[ckpgi]
+iuxxuyobk-inuiurgzk-sgtgmksktz-202[ztjvk]
+hjgbwuladw-hdsklau-yjskk-ljsafafy-372[mvkts]
+rdadguja-eaphixr-vgphh-tcvxcttgxcv-739[acght]
+nsyjwsfyntsfq-idj-xmnuunsl-983[nsfju]
+gifavtkzcv-wcfnvi-rthlzjzkzfe-971[zfvci]
+qvbmzvibqwvit-jiasmb-zmamizkp-278[imbvz]
+houngfgxjuay-ckgvutofkj-yigbktmkx-natz-ykxboiky-930[kgyot]
+guahyncw-wuhxs-lyuwkocmcncih-500[chuwn]
+gpbepvxcv-ytaanqtpc-bpgztixcv-479[pctva]
+ksodcbwnsr-pogysh-gsfjwqsg-584[sgowb]
+dmybmsuzs-pkq-mzmxkeue-612[meksu]
+xmtjbzidx-xviyt-vxlpdndodji-577[dxijt]
+dpmpsgvm-kfmmzcfbo-bobmztjt-701[mbfop]
+oxjmxdfkd-pzxsbkdbo-erkq-xznrfpfqflk-627[jhlvw]
+npmhcargjc-aylbw-amyrgle-pcacgtgle-652[acgle]
+votubcmf-fhh-tfswjdft-701[fthbc]
+gzefmnxq-dmnnuf-geqd-fqefuzs-482[fenqd]
+dmpuamofuhq-oazegyqd-sdmpq-eomhqzsqd-tgzf-emxqe-378[mctsn]
+gzefmnxq-dmnnuf-etubbuzs-508[nubef]
+bwx-amkzmb-ntwemz-ivitgaqa-902[noeig]
+rdchjbtg-vgpst-qphzti-pcpanhxh-635[hptcg]
+qzchnzbshud-atmmx-sqzhmhmf-131[hmzqs]
+tipfxvezt-treup-tfrkzex-cfxzjkztj-633[tzefx]
+mvhkvbdib-wpiit-vivgtndn-603[ivbdn]
+hqfxxnknji-ojqqdgjfs-htsyfnsrjsy-957[bdtai]
+clxalrtyr-clmmte-dezclrp-275[lcrem]
+fubrjhqlf-udpsdjlqj-udeelw-ghyhorsphqw-387[hdjlq]
+qzoggwtwsr-dzoghwq-ufogg-hsqvbczcum-792[goqwz]
+nvrgfezqvu-sleep-ivtvzmzex-113[evzfg]
+fruurvlyh-iorzhu-orjlvwlfv-881[jcdtf]
+myxcewob-qbkno-mkxni-mykdsxq-nozvyiwoxd-900[oxkmn]
+wyvqljapsl-jhukf-jvhapun-aljouvsvnf-955[jvalu]
+tpspahyf-nyhkl-jhukf-zhslz-643[pytob]
+kgjgrypw-epybc-rmn-qcapcr-qaytclecp-fslr-nspafyqgle-938[mxunk]
+yknnkoera-zua-klanwpekjo-446[dphwe]
+kzgwomvqk-xtiabqk-oziaa-bziqvqvo-278[qaiko]
+iruzfrtkzmv-wcfnvi-rercpjzj-555[rzcfi]
+diozmivodjivg-apuut-nxvqzibzm-cpio-yzkvmohzio-447[iozvm]
+fydelmwp-ojp-nzyeltyxpye-405[nyzmg]
+ktiaaqnqml-ziuxioqvo-kivlg-kwibqvo-zmikycqaqbqwv-564[qikva]
+xst-wigvix-ikk-vieguymwmxmsr-724[imxgk]
+jfifqxov-doxab-ciltbo-jxohbqfkd-965[obfxd]
+rdggdhxkt-hrpktcvtg-wjci-rdcipxcbtci-531[ctdgi]
+awzwhofm-ufors-qobrm-qcohwbu-oqeiwgwhwcb-896[mkvzu]
+vagreangvbany-fpniratre-uhag-qrcnegzrag-689[xfuaz]
+vjpwncrl-lqxlxujcn-jlzdrbrcrxw-693[lrcjx]
+ibghopzs-dzoghwq-ufogg-rsdzcmasbh-948[ghosz]
+ynssr-vhglnfxk-zktwx-ietlmbv-zktll-phkdlahi-917[lkhti]
+tfcfiwlc-treup-tfrkzex-dribvkzex-685[efrtc]
+frqvxphu-judgh-fkrfrodwh-hqjlqhhulqj-803[wjnmk]
+vhkkhlbox-xzz-kxtvjnblbmbhg-631[bhkxl]
+ltpedcxots-snt-stepgibtci-297[tscei]
+nzwzcqfw-nlyoj-xlylrpxpye-275[lynpw]
+ejpanjwpekjwh-nwilwcejc-zua-hkceopeyo-498[ypoze]
+sno-rdbqds-azrjds-rghoohmf-859[dorsh]
+qzoggwtwsr-suu-qcbhowbasbh-480[bswgh]
+gvcskirmg-ikk-gywxsqiv-wivzmgi-698[rmvil]
+ktwbhtvmbox-ftzgxmbv-vtgwr-ftkdxmbgz-163[tbgmv]
+oxmeeuruqp-omzpk-oamfuzs-efadmsq-716[meoua]
+xjinphzm-bmvyz-hvbizodx-xviyt-xjvodib-ozxcijgjbt-343[ixbjv]
+jyfvnlupj-ibuuf-svnpzapjz-851[gmsnf]
diff --git a/2016/aoc4/src/main.rs b/2016/aoc4/src/main.rs
new file mode 100644
index 0000000..ea1edd8
--- /dev/null
+++ b/2016/aoc4/src/main.rs
@@ -0,0 +1,83 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::collections::BTreeMap;
+
+#[derive(Debug)]
+struct Room {
+ encrypted_name: String,
+ sector_id: u32,
+ checksum: String
+}
+
+impl Room {
+ fn new(line: String) -> Room {
+ let name_length = line.find(char::is_numeric).unwrap();
+ let (name, sector_and_check) = line.split_at(name_length);
+ let (sector, check) = sector_and_check.split_at(sector_and_check.len()-7);
+
+ Room {
+ encrypted_name: name.trim_matches('-').to_string(),
+ sector_id: sector.parse().unwrap(),
+ checksum: check.trim_matches(|c| c=='[' || c==']').to_string()
+ }
+ }
+
+ fn is_valid(&self) -> bool {
+ let mut char_counts: BTreeMap<char, i32> = BTreeMap::new();
+ let chars = self.encrypted_name.chars()
+ .filter(|&c| c != '-');
+ for c in chars {
+ *char_counts.entry(c).or_insert(0) += 1;
+ }
+
+ let mut vec_char_counts = char_counts.iter().collect::<Vec<_>>();
+ vec_char_counts.sort_by_key(|&(_, &value)| -value);
+ let expected_checksum = vec_char_counts
+ .iter()
+ .take(5)
+ .map(|&(&key, _)| key)
+ .collect::<String>();
+
+ expected_checksum == self.checksum
+ }
+
+ fn decrypt_name(&self) -> String {
+ self.encrypted_name.chars().map(|c| {
+ if c == '-' {
+ ' '
+ } else {
+ let current_digit = c as u8 - 'a' as u8;
+ let new_digit = ((current_digit as u32 + self.sector_id) % 26) as u8;
+ (new_digit + 'a' as u8) as char
+ }
+ }).collect()
+ }
+}
+
+fn main() {
+ let rooms = read_file();
+ let valid_rooms = rooms.iter()
+ .filter(|r| r.is_valid())
+ .collect::<Vec<_>>();
+ let sector_sum: u32 = valid_rooms.iter()
+ .map(|r| r.sector_id)
+ .sum();
+
+ println!("Sector sum {}", sector_sum);
+
+ let north_poles = rooms.iter()
+ .filter(|r| r.decrypt_name().contains("north"))
+ .inspect(|r| println!("{} {}", r.decrypt_name(), r.sector_id))
+ .collect::<Vec<_>>();
+ println!("{:?}", north_poles);
+}
+
+fn read_file() -> Vec<Room> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .map(Room::new)
+ .collect()
+}
diff --git a/2016/aoc5/Cargo.lock b/2016/aoc5/Cargo.lock
new file mode 100644
index 0000000..6d0e69c
--- /dev/null
+++ b/2016/aoc5/Cargo.lock
@@ -0,0 +1,12 @@
+[root]
+name = "aoc5"
+version = "0.1.0"
+dependencies = [
+ "md5 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "md5"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
diff --git a/2016/aoc5/Cargo.toml b/2016/aoc5/Cargo.toml
new file mode 100644
index 0000000..cc09c3c
--- /dev/null
+++ b/2016/aoc5/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc5"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+md5 = "^0.2" \ No newline at end of file
diff --git a/2016/aoc5/src/main.rs b/2016/aoc5/src/main.rs
new file mode 100644
index 0000000..31bef5e
--- /dev/null
+++ b/2016/aoc5/src/main.rs
@@ -0,0 +1,49 @@
+extern crate md5;
+
+fn main() {
+ let room = "reyedfim";
+
+ let mut i = 0;
+ let mut found_bytes = 0;
+
+ let mut code: [Option<u8>; 8] = [None;8];
+
+ println!("Cracking the passwordz");
+ print_code(&code);
+
+ while found_bytes < 8 {
+ let room_string = format!("{}{}", room, i);
+ let room_bytes = room_string.into_bytes();
+ let hash = md5::compute(room_bytes.as_slice());
+ if match_hash(hash) {
+ let position = hash[2];
+ let value = hash[3] / 16;
+ if code[position as usize].is_none() {
+ code[position as usize] = Some(value);
+ print_code(&code);
+ found_bytes += 1;
+ }
+ }
+
+ i+=1;
+ }
+
+ println!("Password found!");
+}
+
+fn match_hash(hash: [u8; 16]) -> bool {
+ hash[0] == 0 &&
+ hash[1] == 0 &&
+ hash[2] < 8
+}
+
+fn print_code(code: &[Option<u8>; 8]) {
+ println!("");
+ for &byte in code.iter() {
+ match byte {
+ None => {print!("-");},
+ Some(x) => {print!("{:x}", x);}
+ }
+ }
+ println!("");
+}
diff --git a/2016/aoc6/Cargo.lock b/2016/aoc6/Cargo.lock
new file mode 100644
index 0000000..f61aebf
--- /dev/null
+++ b/2016/aoc6/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc6"
+version = "0.1.0"
+
diff --git a/2016/aoc6/Cargo.toml b/2016/aoc6/Cargo.toml
new file mode 100644
index 0000000..22fc24a
--- /dev/null
+++ b/2016/aoc6/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc6"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
diff --git a/2016/aoc6/input.txt b/2016/aoc6/input.txt
new file mode 100644
index 0000000..6caf81a
--- /dev/null
+++ b/2016/aoc6/input.txt
@@ -0,0 +1,624 @@
+iyeajeby
+qengiuoe
+wxzardgo
+jciguemn
+zcampkps
+kiqjpjqb
+knwhoxlw
+iaxxpjhe
+kgrgaixi
+lciydajs
+svugtdwe
+nwailbqu
+cbkwwxvt
+lqjyrawh
+jylmtlzk
+firecpyg
+xegtcvvx
+jllqqzeq
+hggmnxlc
+pdmfuqlx
+hnbksbkl
+pmjmiqti
+gpmuvcsh
+tspnxvnm
+hghwizhe
+sgokeybb
+jtphckcv
+usypmmzq
+irlfaboj
+prgiqvil
+nfqegpjd
+aivwwkix
+xeljyzjv
+mrdpqlzc
+metcvpvd
+ifizfkgl
+uznvqiqw
+uzylkeui
+obmqhlan
+vaoivkeq
+wvlbwfaf
+ntbgtbpz
+lbuieiea
+rljyfeop
+rynkdwiq
+hyqpjwzl
+supxlsql
+bntmjboc
+qntfhain
+xxtjctjz
+qppakrbj
+ptnnwmlg
+pucuqrpi
+ensluhxm
+wtnabsej
+hvnozkvx
+dhxgysdk
+qdizyrkg
+vtuyxjky
+lxwcyfxr
+xoyphxmb
+ltylucct
+oaawvjfa
+qbjmdcap
+raqhkkbe
+uqtxpvhj
+pddzoucq
+axfbgpvj
+eohksqcm
+jtmmkovb
+paronxgv
+gtxnqybz
+qfsobvxz
+ywrnogwz
+ytdvpmzv
+daeappko
+zgjdatzf
+psrfofvi
+uobknckb
+rvndwdgs
+oedojfqv
+shxmutcm
+nigdxgrz
+ngwvdair
+wexxkvwn
+oqmrjlcr
+vcbmxvyb
+ekdfdzch
+klphcryl
+bbtobqqo
+wupuvqio
+hwiufjpk
+rckjewzp
+vhgzdtil
+qrvqytfe
+opolrgwi
+nektqhbg
+ynubobwy
+cqnysvzf
+muqrlihy
+ncbeeuur
+hxsvpoug
+kacsofnk
+vztkoicu
+smxiuykn
+sgnmdqmw
+sfsxxnds
+iwquujxr
+fwssfvfw
+qyoswzsm
+kvfvizgu
+fmewmudq
+mvtekgjn
+kkffshrt
+jzbkyxzf
+beszoylz
+lnhmbwae
+tijfkcrt
+culovluh
+jrgtbxma
+yqtlarnm
+rdlxlplt
+vzgphnpi
+igpbfrrd
+yqdgvyke
+juhzerjo
+kfwlvhag
+ysznuuey
+turxgyik
+iqgcxxpa
+tjrmtkjk
+ywfcwvqp
+ozmguljj
+maxegnqi
+vavydxwd
+dhlckjra
+omvdoafe
+rvzejiol
+rsnpjser
+nejognkt
+agkavzki
+uzskztny
+knvzbkff
+iiuhrzsp
+amxryjhv
+yqxdgdaj
+tpvellfc
+dqutbibf
+fbbrpcbg
+shxlcvmc
+ociooedg
+nedlhmfo
+ohdxifnx
+mqhbpyed
+tauomzjy
+bkooiesi
+xtukgdec
+mygazipf
+wkvecylo
+tlejwzcj
+rcpygkbi
+uihidqdr
+lxwthely
+ywyoahob
+zwjrveex
+eqahofbx
+mvipdaql
+zccdioga
+gttnacns
+urajevul
+uhsdjkhm
+cjbpznua
+tyfvodhw
+feadmwyl
+cjmccfcy
+uawxsuyy
+xzzidfrj
+slhgapvb
+tbdwntwx
+bvspfozq
+pkkwgooy
+frnhifax
+sxfkbojn
+ffnzlqda
+pbtbewtm
+mivpqcyc
+gztezasy
+jlfdrmou
+xjmazeef
+lgcaevtl
+piidoxbi
+iczlosyt
+egszahwu
+cmbybzvi
+orczduhd
+hzorfhdv
+yptggtmu
+yfsmednv
+ajawzgpp
+niicgavl
+mmdpsogr
+wkufsuct
+yboinvnc
+lmwbrqmb
+rrsfhics
+xguvmcmi
+yldifule
+laycxgaf
+jtnizmxf
+qrbpqznc
+cpplgbsm
+xzkwttnj
+axjxusuh
+nthcjcqn
+zjkdjlcz
+uulqjmfq
+djqlzrcb
+ftxhzuoq
+bfrzrdtn
+fvovpzts
+tloyyqoa
+spupkgwb
+ishhbwok
+spyfzbsj
+bvvnfnxx
+iuectyxc
+xbbjridq
+drzfvsrw
+gokuvwjf
+hhkmgqxf
+epijynaj
+bfxdnibq
+pjoovmhf
+izbgldjr
+rvxrhjxa
+blhhorwy
+xwmobyph
+pfoimsbl
+gprwonid
+hfwmazfu
+dudhehvt
+nbekhgbg
+qbwklpvg
+yemjyobm
+vmocaztb
+xkwklord
+tjooucsf
+qowresxh
+cxeapuvv
+zmlzqivx
+fryanflf
+kxcrserx
+jtoqtooo
+axrtkjyo
+fwwzdsbx
+pyphszfp
+ekdcnrgx
+zyrhxcvc
+blcqplmo
+wnsiistm
+slavtfip
+sixawglm
+sxpjnpsa
+sfwmudzt
+kcpetkcw
+iqfufsws
+wdfbgvol
+muvtnxzg
+otgycshn
+gddbabma
+swksjxjx
+hnfcsnir
+tmcnycfi
+lpvuwehn
+htyogany
+rggezmhh
+guzhwmss
+zoqiscdy
+dqbtvyrb
+wfnymsai
+klfpdgvn
+ihqjdope
+dudllmty
+gpbkmwtd
+tjmtvjpk
+sjnkfrsk
+bgruelqs
+repdjhre
+flxjlvah
+lkpnbajp
+rmkqdjpx
+enimddcn
+nzowveei
+cohzzkee
+sxfvyqwi
+vlztaixp
+xgkrlsyh
+eaurshic
+kifvzhsv
+dxfsexup
+fyqqbzgm
+bnxsgjxg
+ndbbkscp
+xyjhzqel
+eyanetmo
+quakpmsr
+kqfeprrb
+hhsvwyse
+jjvjivng
+zkeiinwn
+adibxest
+zjzrkmxr
+kceozeud
+iknfusda
+gqmuepbo
+ccwltods
+smaurfwy
+yojrrudk
+akygvwyf
+dermnpvn
+bvfvjskb
+pcohqoyu
+odyqfyhy
+nqgepwqo
+zijtbqgd
+czfgqsmr
+fkgeoorf
+udvncboo
+dwxgrgck
+vqhthccp
+gvkfkpwr
+pquhsiha
+hlpqfrpz
+aeirprab
+bouoglph
+zwyimnhu
+zpculwdn
+mokpnpeq
+hfgfjamc
+osgncdnf
+ejfjqwql
+tovcchzu
+wwmburym
+mdonvwnw
+wxjysrlt
+cjrqrnqv
+okzeilge
+egunoujn
+dlbaqemd
+qrdyabya
+vaaxguwe
+hjqwytxz
+xtvmgdaq
+noijjgft
+xgysigmw
+urbsmwdk
+bjnerghw
+aspvghjp
+hgciumho
+ivjihqed
+wtvkobuw
+zhtyhllg
+jlxjwjui
+xkmxhoek
+rydzmqip
+ydonbzvk
+byeoptyo
+gpnnqxrb
+hyzplaie
+tbedyaph
+zgqhqnmg
+tdepvaex
+wytwmgkr
+qsmuyzys
+fijlauqj
+wyqylgam
+lbwxnluj
+nmecxavu
+ofktnhfb
+lhjgzkjr
+ucctfetk
+mggvgkmu
+yzmnbbhe
+kcnqhuam
+rxiwfblx
+vfufzjou
+cpynrovg
+qdwshnpi
+pcrxywto
+ozhzwpwa
+zroxmvfr
+fpipfjvu
+leyiafxs
+oacgxszs
+voebeyvn
+ixkqabkl
+lqabfhtd
+oewbtlgc
+vdlaniii
+tabtkolp
+xufkdmem
+niofeqxn
+innfbedm
+zahlnzhd
+whmqyffv
+fhjascxd
+wnsktsdi
+ucdgnvkf
+fmpxuyml
+pnvuhmup
+wohfuyto
+wthjmlzx
+tkcdmttv
+ubyrests
+mkrplnes
+mglepvyl
+shqafjly
+gbpaitlu
+cesjmugk
+qnqmvnks
+kbvvlltq
+luvgtdmv
+rrrhawdz
+dthrxkth
+bglwrdgk
+apqxickb
+vnzwzjba
+reiafjdt
+qfcunhks
+dwmhshtd
+rwtwnxxu
+gjgdhwtr
+dhrwidzp
+manohccv
+jvccmlat
+txhfklix
+nczocnew
+gxlpkgqr
+vsrtxogh
+ixhtcwaz
+qfapctcq
+glvtpiug
+jnuecngg
+bktbndyg
+ceboexzj
+lsjakjjw
+oemmiqvu
+zqscwlay
+hqedlpzb
+hsrztfxj
+fjpwidgw
+abrsenrv
+qseoiuyj
+jtjtqxgr
+esczykzc
+mazmziim
+szzwzfuq
+zbcfhaiz
+uqsnjwus
+vwzqohsu
+yylbjhnl
+chqdcblk
+vporypnv
+vfhdofdx
+eztmaogh
+wlzjsgbw
+dqutunrc
+gwtpdvpm
+ywxghnkc
+alacomlw
+jfuygdcy
+zkoeauig
+abufqquo
+ncilvdgq
+guinnabe
+pdwybure
+jocsrmfp
+acwncthl
+cdnaffnn
+zyqbszzz
+azhxybig
+hibjuhsw
+tvckjxuf
+vklsqbos
+efzukhlt
+kjaqqofz
+esxcyrxt
+yocrwucn
+iodafafm
+oiakmvtb
+dmbgtcpj
+qnzrryot
+ufcbptbz
+veprgqre
+umsltfes
+bvvqhcmz
+rucsowjt
+kkbgkrxe
+fksibbfh
+tyckeiqo
+gfqurpyl
+raljmvsf
+chednohc
+gowzqrfm
+ypktqcvb
+fgiusizq
+jvdsmnhu
+esfuxpra
+uraiwlfz
+vpkulaao
+erkvbjrj
+mrhjjist
+xmpayrdq
+biqwpkrm
+lrlhkljw
+rbaglxsu
+kryywepc
+mrydxkuv
+obksnkir
+jogxscwa
+pxkzdamo
+wcywigdv
+acqicmyz
+xiqhgpik
+izubxapc
+yrzfptzd
+qmyltgkw
+dwedcarp
+oouewlrv
+izelyufn
+ehdstcah
+nylqvqtd
+ywxjkxnx
+sstceepq
+bjihzptq
+nvawrewu
+plftxhsh
+eyuzdika
+gjdyaoek
+euqeablj
+zhgjzdki
+lyygbhly
+joscwikc
+cbqczxbu
+xnhptyqu
+txvltmyh
+kwtaueat
+btpbbibj
+ueytsouw
+kfmmcyqk
+fwflotzv
+ouwyewua
+hslsjpur
+jdgrtwme
+lgelctfc
+nlxyvkgh
+xpeslfje
+adcifgwz
+gquvwdeb
+rkmzqard
+lvzehstp
+cijqaygt
+dwfzsddm
+vmwqrrsy
+aotsaqoj
+irjumknp
+altzbfjo
+hubsrgdb
+nudnkfof
+bvhvcltf
+xupumtmg
+kjfxunyd
+pjwhyeuz
+zmnxkepw
+mpzvjjni
+cskxvphp
+dykbldmb
+ymmsshaj
+gdsvrycq
+ehdvpiqy
+engermzp
+tmexxgkw
+acjslpiv
+qprqqyqf
+fbictbjs
+llaeirez
+uxoofxnc
+ukgpjtlz
+tpxwxzpu
+cuzgcjgd
+jnzxfqww
+wemyhsbv
+aslnwaqg
+aibaikgt
+hglojgqv
+larqrtka
+ozlrwpna
+pzxsdrjh
+vsnuuusj
+jswkkvun
+darbbbhk
+woeihkoh
+xdsunolx
+ymvbtrxg
+mtodxqik
+fxkcdfwq
+koivubnr
+gitldbqs
+bsjymzpd
+whaluyys
+rvaftjox
+qhinxcid
+snpkwuko
+mdgvstoq
+zzytixxc
+qsgrlmdn
+ddjqxeaw
+uilqxznh
+chazpmyk
+iivrixot
+casfxwwa
+mvjdazsr
+dnmivmal
+eayyeyfh
diff --git a/2016/aoc6/src/main.rs b/2016/aoc6/src/main.rs
new file mode 100644
index 0000000..45ae3b1
--- /dev/null
+++ b/2016/aoc6/src/main.rs
@@ -0,0 +1,27 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::collections::HashMap;
+
+fn main() {
+ let lines = read_file();
+ let answer_width = lines[0].len();
+ for i in 0..answer_width {
+ let line = lines.iter().map(|line| line.chars().nth(i).unwrap()).collect::<Vec<_>>();
+
+ let mut char_counts = HashMap::new();
+ for character in line {
+ *char_counts.entry(character).or_insert(0) += 1;
+ }
+ let (character, _) = char_counts.iter().min_by_key(|&(_, &count)| count).unwrap();
+ println!("{}", character);
+ }
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("test_input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
diff --git a/2016/aoc6/test_input.txt b/2016/aoc6/test_input.txt
new file mode 100644
index 0000000..32ba518
--- /dev/null
+++ b/2016/aoc6/test_input.txt
@@ -0,0 +1,16 @@
+eedadn
+drvtee
+eandsr
+raavrd
+atevrs
+tsrnev
+sdttsa
+rasrtv
+nssdts
+ntnada
+svetve
+tesnvt
+vntsnd
+vrdear
+dvrsen
+enarar
diff --git a/2016/aoc7/Cargo.lock b/2016/aoc7/Cargo.lock
new file mode 100644
index 0000000..58e04ee
--- /dev/null
+++ b/2016/aoc7/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "aoc7"
+version = "0.1.0"
+
diff --git a/2016/aoc7/Cargo.toml b/2016/aoc7/Cargo.toml
new file mode 100644
index 0000000..1b18be9
--- /dev/null
+++ b/2016/aoc7/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc7"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@gmail.com>"]
+
+[dependencies]
diff --git a/2016/aoc7/input.txt b/2016/aoc7/input.txt
new file mode 100644
index 0000000..d50f36c
--- /dev/null
+++ b/2016/aoc7/input.txt
@@ -0,0 +1,2000 @@
+wysextplwqpvipxdv[srzvtwbfzqtspxnethm]syqbzgtboxxzpwr[kljvjjkjyojzrstfgrw]obdhcczonzvbfby[svotajtpttohxsh]cooktbyumlpxostt
+emzopymywhhxulxuctj[dwwvkzhoigmbmnf]nxgbgfwqvrypqxppyq[qozsihnhpztcrpbdc]rnhnakmrdcowatw[rhvchmzmyfxlolwe]uysecbspabtauvmixa
+bqooxxweoytjghrqn[hkwwukixothfyglw]kpasnmikmbzcbfi[vlnyszifsaaicagxtqf]ucdyxasusefuuxlx
+rxpusykufgqujfe[rypwoorxdemxffui]cvvcufcqmxoxcphp[witynplrfvquduiot]vcysdcsowcxhphp[gctucefriclxaonpwe]jdprpdvpeumrhokrcjt
+iungssgfnnjlgdferc[xfffplonmzjmxkinhl]dehxdielvncdawomqk[teizynepguvtgofr]fjazkxesmlwryphifh[ppjfvfefqhmuqtdp]luopramrehtriilwlou
+mqxqhcpalwycdxw[fkwhjscfmgywhtvdb]khadwvhkxygtxqx
+ihekzgbwpjxgbau[eqpvqxncntbtsqn]mbtbcujdkbrhxdu
+izikobnovmjzngo[ombcpcvshnedtndu]lnnmdkuapgnxpgyxcmg[bgnxdzmiolfvvaizu]tcvnrfufuvhgmlxcm
+yhrowrreplrrsbupeor[nchtznfzbzwnogh]rynudxihckzattbz[dshxeaqusdlhydtm]rvqzuffgqtysfzxp
+unfjgussbjxzlhopoqg[ppdnqkiuooukdmbqlo]flfiieiitmettblfln
+hgtbgxarmgbxqrhghxb[hflfvoetxfisqsj]syhkugztqkywetyhad[fmptjuaqittvvyooda]cjkxbnylglnlfleelzu
+npxhwtitqnddkwg[gmzggwnvygsroeaadtc]gudnfyefqbbgyspdxjw[ilthbdqubqnveowv]xitfldhfjyjsomygjg[knmrlvoiqyytigytlum]dlfpsnyzmhkmeevfwsf
+wjzwftiuixvwyzmgoe[jbfghrqhyywwhlu]wcijbojvlgjjdtowzpv[lgfvxfdusgxddsppbxb]pagicuiuerzeydww[wlpjklgzyilrifonz]gdicckmxibtwwoesaxf
+eilrieezaciolhnhrc[hcisnfomqiiaculxfv]bfyxxhgrakqogthzft
+xijomgpzpilomlpy[sfgwaovcybyhoogrxsv]ufncwrahejwlhyvz
+nojlhdpfkjbhahgqo[lqrkjabuijutlcbq]caszlkvkofxjyqzsttc[isqicyomykudneq]izuzehgtmwnnvfrlrja
+qwfvuzrogqzvnhyqdv[qhnjhafmrtghosbmskc]msmwswtgzlpmtmzne[kovzhefjqtqadhj]myqisirynftmtzvxvvz
+frfongnaecavmrhj[uuptwvcqozxnglsd]kwpovfwuhmqjkog[phtrgysxaltvbohmv]abhuahonmbhsmfglltm
+wdqcwcbtpexduecepe[zwrcpctlwglgfpappb]zdadimzdcpxhxwde[yquulvwgyyzwcfsvkdt]thgziwclyxxfyjpbpc[ypkjfrfkxlkavboh]hxylcecamgezuoljh
+yqxkafpkuuxfafe[zehlwtvpprtiqbl]qswqigaeaneovxm[bqoieihtxarwyrqegb]yzdopgmqklqaizxjm[jhrsftklywefyevvha]xuvydwcntczjvuduj
+judhawjtmpsxfocai[qghshlgvbitxevt]xehceioknrewezihnb[jvrzemakemtgmqiqmvj]wewpjflvqmottqx
+uhokpvanmvdobqitn[eosarcmqnukoczgz]rmoowtgbbyimkptlxdu[rqhewmnpypqpyosgehz]nqdwglwscsizxey
+sbnojmynueuyyutr[oonxqrbbjxwvwafad]krqlneuehyrghmkrq[khsckkfwowubtglegu]xweufrmlufamzbcedk
+nmgjmbwyrvcbthw[ogtvotifzugvvrsfe]jucqbvfqclkuxzumoed
+uaokpcytcrfpitfursj[lweyfahryjfprulw]dsdutsxdtugaced
+ahshwqihivxlgsj[ldnmuwbrmoxtypqluyz]intafryfavcnotgxu[xjggdyvoarfajgp]zhfgnytzjhuyheqdy[yeynlfshsyrhjxrzguu]onvyhjfwooikmmqzwgc
+djkgxfnfojgjpxec[ngwqajfbywoxlbm]oqdqigzeqadgqjt[tvojayieruftbjokeeq]gxwtruomnhorqqrpzt[bxppvnbiwhkhdka]rhpffqekyrcgwqmoi
+aasbwiocfkaahrjwerr[dvlemehlhfzxnzymqn]okxibfrlswfvmreuf
+rwcjoknjvyufkrp[hsqrwhdlwrtlthp]ijezyezjdrhzgltliq
+azawpddzkqbosmltyxt[zoaaqnowmmwkmfkq]lgusvzwnimvgagupkt[scbjhqdftzssbvnvff]coiaslgcrwvyioxx[jouvwdiwvbsembzf]popmlnhjkoaeahcny
+snucfdhspcbcsgjnmcc[qbicureolmbzhsy]cuabqhzbcbkezsumkq[cnggwqizurflommitua]ajtxxkqwqynnwroi
+bsxzwpiauwlqelesq[uqfdggoirtlucvedpl]asacxftfqfswiapmj[nqohanbbzodfgkxihtt]lhshhkgjvjkumja
+beewgulkwnmwxenstrz[vybrrqhcdpkhfnshccv]xdfvqzdslwosulzatc[kuknmynmjntvtyduwlh]trfvychdobyghnrxrfy
+oxrwmqpvxntdkohmxb[wugyubwxumwnxlk]jidpzvtbomuymyf
+pqzbwlnmvtytsfre[pmtmcnxkylmqaeb]alfdaofnqpohulpmfoj
+qopdwichdepaubxxeu[ifjozmlqttahyugyt]mfmlwxifscsnuom[kiyjlqqxunsxfmht]icofrxpdpsktwiifyb[hetijegmockkyjhhc]aarioqngqmdpkti
+klumchkwczxuuekdb[nlalmjunselydybqxdj]alagfcxocldfyzdnzd[abfnqrgrxbscagj]cohrecgrcaxljkz
+djydzyiyydcneoubp[gorqzujuwkjsqhelfrp]pvtvbhztirfzmwcopfv[wfjumxbfvvgvzltlcf]ergdkkakrtfzcxmqcc[vwnkrxhayzbvbauvn]yjoqveipzibbmjq
+qbdruhoywfjhaljfkoy[tznfejprrnzrrewdx]jziputgqfcqtbhvhlnw[ikahxtlheeunzrdq]tmoanjmpioumvpcu[tnmcvxkewovprxgzd]trnmnhdvtsisiujqjk
+llojixxpxtvcwxaxp[rurmhymwuztchngs]weaefxdkjmofeydvfy[hmbracjdcwxfeva]jkiybiomykfexjlyg[pgrlrqgoxqqtoio]rdynpcndtqarmkagbw
+kislmybuoblnpsc[dvsrnwlsvxxmzuu]jakczftcvijbavhjgb[osdyplcgliragfnpezx]kihkywmwgbkjtgxn[tdsgdadcvcaxfrbur]lzyjmrjqztybfdmm
+orfngwdzlrucbkbqd[ibvlkwlnnzwkhnoad]brstantuaxwkibofh
+vuumejklanuomqqdbva[mwjzrpargsphzkkhaaz]lkkewmbrvuczyyu[ebpoqgoifelelzzhd]biflvclnnimuojihdmn[llrnjdgzagktjrys]edtbmzmcbthpixhwwyz
+ftaciyszakisxhzjhbo[khfshezpopvjaki]pdnnsqmgpgatvubllrr[ovjrouomglbpgvtya]ifwcvhascqptbvbums[cfpimraygtnuimiup]zeykmilehidtlstjux
+nzgbxxiimmzsvhe[ixypsgextxvdckbjelq]jpklrvkhgzprfrsv
+mpdlsziccgzmvorvm[vhxbfkwfwbxqbvxp]zbsxgodzhgmrhrprpu[pvawdsvqybgdncgxido]zuhyfbmmhzegohu
+rdkteyoeleyhxdlfa[nrrzftpiqatsnnnsd]qwelhxwbpuwjmrjxmgq
+vpdhtcgjpkrqmrt[gozqldncggxpvou]zedtarenbxskusqk[mwpmzpwraryuqqmdhrd]eoculislafmbqzy[okpddsvrtyrkbjtihhb]dvuadhnaxkfewhnksl
+ivjfulhqfbdqiprzbbe[ezhkhqxcviwxbwmlnbb]ttekmmdrphuteslzwcj[iocuduwexawydww]qmrfnnedqtqezclpuq
+tksplumjkpsjjorux[dpffmbayilzuszc]rsiowigabmredkfv[aurieaasmsrxufpo]lbwvhcrjfgomkff
+uwuobjzxkgeugrivc[biktdwykzondbwiko]nnrtnqzhdhdwzkau
+cjjawanjvbxvmvdmtu[kubvvkuoynaawzowphv]ssijoohfemyhrde
+qlykdpnioshrexuw[tjwoswemjxylnqupgv]ymovhecbliuuzhjwu[ghxibaaourtzzogrynv]hmlndovkousrtbomlnz[nzkdpmqrqovnvskh]vdvntntzrqrhvcaxdov
+tdhrefyrccgkdquxz[jqeprpsvvkmmldlwyq]lwhnimtgegsziejeh[gyefzqbmfnhzgtq]fmbcvbjtsriuicde[sbkkbqwzlluccpa]nwxmuolcbhtwcllmz
+cakfzlwlaxgrzjpgck[toihlzbehdzesbt]azrsizelgzczqxwejb[ypecquckfavmixeyjgr]njiyddhuwlwogbnpt
+jadaohixgxzjcopk[wopcnehanaabtklxnez]jgvumwvmixxxwaolxb[lrhmslkbmylyvlkx]tatmsbtlbcutcydlrf
+gelrpwfiyiszejt[skpclwjhzgwvfbbd]ibwzelwwhvudmvoe[gpdveubkzkkxvtjn]khmkjslnkdlmefcx[fcwhuyiyvnjgfcva]qjcfuqxwmkyvvzuj
+pbejigkioxtdjjzbl[uihultqxejdyegacm]fitsnuitopdzrxskz[shbzwyodcotpvoixoz]qrhuyetkmnnljfqt
+yohbaryhrhuobkf[fmfsylvacrgvpnlqdb]iucbpagpbziaqae[lfcjrlbgxiytord]mhjlzecyrqcpbxsaq
+vguohtnahunrvrfv[lwbganvrrgnasnkqjz]yuoncrmethwiglfiy
+pljibizefgbrfauieem[yadmbpkftrtwjrize]fuzpxdpomsdxfocc[lvoahklovaxtucrpwhj]newpgoizivpqkpo[uloztzclhwixtcjhyon]qyzzqoyirejavchy
+plinqqpqghkeuipqppp[rndecheohrsftgvku]ogsyvyxuetmdomwdmx[lumcfskwppjacuddm]uptsydogwyqaupdft
+ewvtreckmjqvkvwgtz[leisttvtmrxnzjv]bfzzponjsjmepqjfs[knbonuuuhvtvteiov]vaejlijsnrpqppo[hvwwdxernqcxtxe]ssznbkhfmchmjjiahkk
+rrofpphpfkeeqlxcev[ierkxtuduxxxbilmg]vmipzdomogxwiazla
+uqmllifxqxwcskoj[lwrjkmxgwxwvkqrsajx]wpbkbsohlaeskzbv[boyvlwxpqpppcknocv]pgsvgtugmxmoexrvpkk
+zupunwchccxqggie[sdcdhzciymhppyaaaib]izbizcvzvbcnofmqt[lvvxmcmydxruvudsar]gnspfiadqokusllygyw[wbcpnuppeugrqobtnu]mcvfhylypayxquurcv
+ngscsmmvttxjxoaniu[wsfnnfnkwmjxjql]ijtqswaevexzcmgime
+hkmykmrremccqxvfdps[izfaeewfadfhuwwd]yffzgiqtmayebphb
+znzxjrdnxhfydrhr[kwafvmygvlylite]hmskvvpqyoblrygj
+gkxzweijinwxyajq[jzljdfxlossksqa]octzjmrvxkumtpn[jypbqguwpybykguwn]ngriygtjydfznsf[cpwtojpifkhwtfknjsg]zahxvqxjtoutvvsphh
+kmvndjahzayidho[fitbtgfncjvmbyrbvnf]fodwrbklqhxpsrqwh[ccwvgmocbtbqvwzu]uuidhylekzxzvmce[qbhkjfhnczasecv]ctsfirxwjfvrmayoeb
+oktwbkikybfwojcweal[pnhqkawxmfxggabhgpa]kdjghdalrpgsdhqj[bxjcqdytenfjirvb]odnhihekqyskaoedyor[pqsixozypkjdnnntbng]negjtmkqfykrjgewt
+hriyrcurqmacydyay[gfblxaovvngyesfa]tmftedgxujvmjze[knivpbneiuxdsowcxdt]zzncnfcouzoppog
+edabqgdgbyjqkzjvzhr[rdejmmymhnvfrqvf]zknrxaqjohlncvwc[lcpuoqnkvwgjycfm]ohuebodqzydltckrsb
+rxcyawcfxcjtdshxg[zvggbsrobekoxidyx]zdpvqowndwgdubbhst
+qngajrgvzuafovkr[kracjvrryquumqerjev]mqddkdpqmfgexahczm[psmbzonkrrtlqdpgqci]obiynfssuwhprevmzm
+dihkldbnjicztjfrvga[qtlevmacqkefjomc]opjaojctoraohocxaca[ojldoulpocpcpexnyx]qnouppkcuggjmod[oeiywfzmbjrhtxz]mvhoarchbrpndgwhxga
+qyncschbsnqwgvfu[cscsfdcfbfqiwgwqi]pqzbontuospgycwzqn
+lwvovybfksidtajq[vrtqmrxzouplnjogzk]gailtfjtszlxzwhbs[bgqzyhgudphwgufmg]levofhjnxjqhkcy[wbffnapyutukiavenm]olkwwlrbbobqudwvnur
+yeqiptxuczuxzeatp[upzutosphyfhuho]jehejxjvfpqeifogn[odhltqvdcwwmshl]coezfdamogigspon[syppfhysfwfkisltwr]ihkaelrbcelykby
+nmciqyaovpdwzldwt[zoaowvxkrpfuwnyepcb]yhqlmmrxxvguuajawb[rmilfmqzokaeabc]yhmswnsiyrepbudi
+pifzooabiqmuicfqi[tvaqijdwxsbamxzg]zncutzbfmraagej
+jpgkrbovswsjnbcj[bjybzimnzszdkqj]mvwmgdithrxecpselt[kghbhnctqnhhxxhdro]drttsuyvtuuygdtfaf[zohajxyfyjnqrigq]gadarjzfafqxsjxk
+wivyofwdmipecdxuqu[trccnlbsvfbagstm]xajuejldffxzxfygsg
+qsuxdmtfgpmlgkh[gisuuzaglpmbmydtt]qzyfvzryxepjmnr[mgsjrbmtxxzkadomelm]fqzjahepxspwkwpwd
+pncauthrouncvjkrik[cyiovjnoesdgpeyjpvd]ajhonypsbifeghxi[wmudcxwbewumjbegnh]qetzbstgmzfruzxqln
+qmkcddrhexvtylukq[nwrryzbnjnhvvgm]edxlyprwzzhgfmhz
+iuonniejtavofqdqsln[ynjrsfsqrdsgydhpdvh]xvqtjledtcgkjkealws
+fhbxdtddlvkjrmjyae[nwwjmjvxtabdwdezfdy]iwnsmstiulolahbxka[lqrxlwifzndbeid]jilfjomwrbjeniwybv
+iptzrdexpfzabqcqkm[kvaxgarrbrobtmu]fqaedifschjkoepn[widcirixuswhcvcqywp]kpkxphryiwwnkmb
+zbeoanntetxhvigve[fhwvhghpujcldib]ncrcyvevibooqesy[ougjirkquasabeqad]ydufeicmimcwgtbg
+jaocnzcwgxknexaf[cqykwbyvxtcwnurw]udxjnumyhelfogapi
+sduqgjoijyfrcnfencj[uxuiwklsiuqwjjrzcfn]epnvqcjspwopyffl[mwghrhtfclodjan]ghamugnhrrzjwmnc
+woygyvtrlmjzaeteuj[vvvfohavzuuzyzgu]xjjcxhosambmkixiie[lqholbwbktlvdljmapw]diufpkdnjmjnmyc[ehjexwagbmezmpj]czhwzecixzxfykaiafj
+nkijgkhyilzqvtgj[llydwhyhnhpcracxxd]zgtsspcwpyujndbxvp
+nawnrsgxqpctinyek[ieguugfkwujnymij]rfmqypeekkdsttdw[rfuanabgfjgctueaaqo]vranbomhrynvjyywmh[zjncmschlfmkvhd]gfeoftxsawcgrzvrlx
+jgazasxbickiiiz[duuskjowanfmieegl]cwgdwtrzpbfemqitbhb
+lahkgoaoeofjlocsei[bwxyguvgmenwnpwlp]jigdlgdjptkimoyipa[zlcyjbqohvmlxgxp]bmovqedgchicusqzq
+jhkxinkbwhpddvjzgod[fypyyhptvewejlbwdmx]teagznqhjydanxxi[wkppnjsyzhwshtpo]piaqxcwqolwklwzsfkg
+sjedigezzdkqlxlcnr[xanehtpradlngiob]uonmjrieoycpthh[wnsqwfubwxkqhlflzv]smrebfwpnhskzlknva[pylbyttmhyggonlk]dwqkzjmatybpmgeb
+ktfcuvnwueamlwvgwmq[czcgevditrtvddgfh]djmmelqewdnzrlqliz[fkpieaipgyxnkmjp]rdpkfzvqpfpvczv
+tixjemagwmynkihelk[bnwfmkugsnivgdmvskc]nlasqrjqrlorszi[kbatouwdhejxchpdhd]etmbkytyrpnrpgqvel[xahfkfjmsqjycaq]mispsimhcckrhqvek
+abudxncgozbrbnx[fllpjgocynbuyawgs]hiphrvpugpfnnppn[jhmlgjsufflkdgw]ldmdclrkorzjtbjqcrn
+aljahmvdrraiavzv[tevjntkppnjqwovvuuh]ozmgagxzixxyzuy[zgefziawisowuyqra]nrqmsbwgqbfrxqvzu[zvzglmnjmjpmditiodb]odzbozesvocemfyis
+zgdukwtswaosbrossf[ugdnezayjnbjuhpeh]knkvomcsgfptssifni[votpmaaohcyofgdz]skbvfugaaxutcmrmsc
+ywiphurgqcvybiakgok[cscyksufsduegggw]rtvvvokrvwmwsvmk[oqvdxhoqfsfdwwm]sbzajtnbxzkyiwrj
+nxrvrsbjsrysysvftoo[qowwnvlezexjyynm]nknzluizyzjpbzpevb[adkqviapkjbmknchtb]xsgtthuifmsqidyh
+ejrplkjjbnjjouesaph[bdtybzkfyictcjuagr]ivtcttyunertnzgmpqv[roikukeznmtkqomqbk]lsxzsjrnsrdlxevj
+qgcebktqtyjjwsav[naozjsnqufkkgkp]evimphuulhzflub[weanrdvlsmmypnh]rojhwlyxtszxsjiuai
+zludmyuqlfpefvxcm[hejpyhwaqdndtwslan]ldtxkxxtegoqpntsnwg[olhtlkpvkdgkkxkisp]hursraavetjgloks
+rosuljoqspxeovaqr[ocjdnpuzmwioylt]txylrlsndrifxiuxuyg[jnubpcjyfzhiwul]pdtcjcrkpmzlayzcty[gasynfnouxnvrplkym]naxwpqsxlsbvyuavty
+oxbyqbqmpckkdpfjtr[ggnmfcjtyfspqrqkg]tzapjijawrabozckadp[varichgjrivmseddxv]admqmnzxzqcbapdquwd
+jvhvqxvhqfxnjzmv[hwfwxvwhxorzqizc]rpjpwggqxqkaznkuqn
+yrsucbqcfaukancrr[nabtowgijsnzryuvbiv]sfpffzxrftnrkjx[qfyfsbkyhetcedf]xdykjbymrqgheanxx[oxchcwrkbqvvfeyi]bztjlknshikocxztjm
+iniqqqqprdeznwhr[arooglolfjgprfrbhbm]sczcmpftuhbaagwgedq[yutgzaqyxntjxoglmb]vswbhlspwfulowkif
+bjcjrdzwhmssgoinrcj[jobrpyapaxkasve]hzacshssrxkdtrlqhr[yygotqrmvhiqjrja]ljwfwudymzkpczysknf
+lrnqnaxtavkhwfebb[vwyqnqkveujnlzv]coizhrfmviizxgz[zklqinvtnwtajyjx]nxvpznyebozrosfgh
+ccjjszgrbozbpopagns[abiuzirqfzactus]eemrbqrkhhppvan
+xeaifcibybamzzzic[ymvsqllvremyfify]ftgmrkhzswdpbmukcdv[fbyevcnnwtnodgxy]slfjznnldyuvair
+ajmeryqwfhniqenmi[bdzlgljpkkgsvpjcy]hqzxecqxmneterlqizz[pzrbbprbhujzpcxhjmh]lvrckyomhvidbiapikk[cyyapugbrwlubpmn]toodggarcneobyz
+lehpdvqjccdfpzpo[ssunfejvfxwzlzqy]dvhwfrwiipveqpb
+ijmthhifxtkoubt[jcgoxkntpnxkmdp]rzsfekfmamzddgm[szvzrwthulqzcorhnk]lmgsxsjjcagkaysalnj
+qmfgzmmoylbruqxoh[uoyinkzbglorxud]frtffuhkchkrwbxfx[urlwigeirzobvhir]pqrqujuwxueommaj
+tzjhaiqumjufkzcvphi[lhfohqxxuoqybomckm]qjhpjkjljzekboyc[gvzfehzyrfaarfklybg]fhurcpaukztwesz[lhvnhfgpmunjukye]mdzcvgeehmchcqe
+cbyyjbdwzgdhveyw[ockkdpwglixvbom]ozezplbkvaulagw[vmzfmqxplwaqjrf]upytqbnzjrclzfvti[hztxfkqwcuypqyhsfa]sfwcfhrnccesyncbg
+zaclpaavkxbpjxse[dmuzswkobdcfmrejhaj]eqdwvpiphijpwrvg
+yvectfptgdasqxi[rmpaospaiqhwpjwdru]ollajqbxmfnqmqrdce[jqixwgznolbepskpm]pmyfsrnbdcqdrhplko[pzblovbmbnbwjzsxrk]hgwpjhgshxoozdu
+gpnplfnpnmdlhehgazx[gkgcsjdcfnxytzp]wamlpixcrqvbtseb[ijaxccauotewzkgu]usgmgqmezufmgqjslbu
+jgtqghpjnbjkmajymfw[isxpkhlvtuyqpscvm]czbrsyeqmjnksov
+fjsepwfaxbbsdxlcz[efiljmecvcsybpj]fsvcvvewoepnvqz
+nxzdtgomsakdhwefrn[cobjsrlxnkxvmhk]wkfnuypvsigzcnswufj[ttmtjfkbnhmmdebtr]ffumzvnvgitjccgz[offnegtizuxhpqmic]lbhljegbjmldqbzryis
+gnnsvlcqoatssjuijb[eaodophfeufuvdodj]jplhbuvzqfgvrqbuy[ezxxqanlgnxdkohew]vsukbzhjshwmmqdkzdh
+shfhzsmqdeibrwgyr[slyyksjeywcnuaocadr]kdwnsokrwkajgnwi[zsfujtkhknplyieg]kijuvumdqvjyjpbhl[qyrlzloooajylfrsfk]gwqdkfpitiitrednt
+zhmwbilhpywvxrza[tgnybotdqixzolvn]ptxzyjbayyevmcqua[hcmgjpycosutmqbtkf]tboiprpyhwgjceu
+ejuvrirctrlirihunm[nfjigabdmqnkfoauuyg]rfwcumqndfgotyx
+cxkwlruaswigkrtxxch[fjsovwltjonhegm]zkfawxnzxlkaqawq[rgfftbipxlmelfnpf]qhhslyyiluvowxz[bgxutaxmhxyxxdob]hzthuaqpiyeomlgqqcn
+qyzwezoszvwrwiilglw[opryawlpulfkpkmuave]taxeqyunnihulfp[vzxzosekvamoofva]bbtonpohbgdwfmt[xwzkmwrwruatcdqrj]enrapbeqoxrufgp
+lowqonzaekybouni[uehkpbaxwfixuwlj]ionorsihznoszwzyq[cnatlobscugfpvpbw]lnsmgieepzvmhvbz[lsjebmtctttclkxqok]jwevnfmcrtmgjyniiuf
+ltxumfyzdinfqrlf[jyiwmlpqkbnbgmu]bnicegkghtwivvyozea[qhgoiugrookfmdsln]fpokyqsoknuahpmutnm[smzqellevlxgdbbet]vsadiuyglyyuccgkrz
+fvhanaukvcjdkhsydnz[pbjsoundyybhvaqglj]esjjvkdvjmgmlox
+hcckhzdfmmvnsmuzjg[uuajvdzksgilxpjmnv]opbmjvfljnqzxkql[pgdelzddxqrfdoqnit]hqrrfnwrokufpybg
+ovtjlczqesucgox[kiqphngcbakoelqncyi]jhrwrpwdjxbhnqp[kqvqdyokyuxulxidc]qumskxudarjyagegy
+mxrxpfkynragapzrmdv[rdhsbrxgeywqbqh]rpoerdiwdisciarhl
+ejbdfeqrdsrijztlibc[beglofnxveiorftulay]jslqibpnunabgqmi
+uplsbqledimexhzwnkk[sfreaeitecravsu]exfxqlrumxaeasi
+gicahlhkuxbhppe[cypyeqpzkrggfqrielv]pkuwwtbezndgtqhbz[ojnnxanlkamvmpqfj]eozgnkxtbtyecuhs
+jtzwiyeueztuiwysyv[awibgssyyssrnuxrvuw]mmyvqfgaaraahzzen[rhscfvdrvagricw]qsqbnurcszgekmp
+dxkeveuauhblqnq[oksqvawybtejxmdw]jrbwmyxdggncxitwcms[fvhnmupxnynxmprs]odbifiqqxskxaqn[xwdwagplcltcepjmtf]zsfevibkmzwtzoq
+kflcnlkdujmtiug[rwydvjaazfgmfcn]qolbbuxzxhoizfqcwn[tprjkbylcrlvmbggae]pjwhgcmgxzhxbxdceme
+donbjfkqtygixfpaa[lhfcyuzcmsgixjbr]njvgmbwgzimrtpdmvf[eonodblqfpgtmex]rkakjzfmuyeajvhs[lmgtvenasnqbyby]jdbxoeqnwoednoncq
+laiyueskjnlltkwm[lzrgjwrjchpmnais]pqltpskalrwtmtagvm[luctnpiuqvulmtmw]awlqbuutunlbpusn[hdetxhrtzhkyfktmfn]qpmezabxzrtquidbjc
+hritvdzjxipitctgoex[jtbjcyaysbefjme]ebbcyqglydfhqjfa[uwuwqhwanfydpxqk]enevryjyzduawrfc
+axxprqpxpifqnwte[qwkkhbywyixngun]ufwcbmerbqiblbdmn[mguzyerbfhpqnybh]gscgmmckgfxvvwgxxm[gfjzckcxdowpwmhmg]hjblyfatzhxjyvlccb
+qzzkrqfnnzvgfmrpjr[sktcrqxcctcduir]vmhsrsedrxpnrugm
+mpxgzowtjabzwfcbeg[olgfqepvinejmstbrj]fnqxcfzuxojvkscyk[pxbyuusrrbjwrygkxm]wiojjquwvhineivnkys
+vqcisychxuswbqlzdkj[jetvpggxtqqguuh]tyllnzfyfphoudijzj[xlnznxybxscqjktjn]oysyrlqascsqbclsb[rzhxpwwrjwakoldm]mrwzibdjlhsdsbew
+rttdskfweqmkjolrgsd[gmdwcimmgetwiprem]wkyklvpjyhpzvmsh[zftyxsrvhnioomw]mrvoyvyyrlguwedz[xyrajtcatyabfqigup]srjmohoxwdybksfv
+xzeexlrzdznmhbph[vobtfjuyowqppxw]mjxwhgwveozusndvi[jthhtubbkbmdiepfh]gtedeqwesiwzlrfny[tppxuofhnwwkbkysg]aygwlnvczaarhfgkw
+zxirxtzlqkptwqd[vwdzostlmrbjclfj]aluxqfcdbjwbeerhr[nsjcafnammlxjafrzaa]kipaqywrtrpkbcdtnyi
+vovbpdgnfhmeuadh[bcgvleartfaspvvjjz]ajyzrbirtimuifvs[lykguucpvkxuupcbims]qplsipqneiycefb
+alqzdecagmvodcigcd[atmngaijkfehfbc]cprsiaclouvtbpaab[lfrxlrzuuooqdtfirbj]olcjwtrkndcvykp[lelvgglysdxycvk]uyakjndqzxtzmxs
+syngsortxjqcdwcz[qkiseyvolwhibxdg]ucuxqdozkfgaxqwovk[eqeessuwvcayhpc]wkhzcbkxgakgxnmho
+bhtxesznfkwqbodb[ptpuhbdsvbcjpmnsl]oohvgktjsjwxqgyxov
+udnbbnkojrdevgujkg[cramyjeuckywtuw]qtldussgogyblkm[yuwacyafnikvgbibmwn]xvsgxmywenrmhdctxg
+uzqtkzkmmeuttwyklv[rgnrxkbavqabukxvnp]whhgpmwocfmplba
+kvbjvjxyqiqitikvm[vkzunkivwcpvxng]totvodotoqiqokouz[luzygityrnpuiih]eadddxqveeuujmvnek[nyxhwlkatungkgm]bdhobvhktlnfpjelr
+inmnseeoqimzjwzhltk[ntwlsdvvybtdoqciu]jaurhomtnyudxxmslj[wqygsctddywlbxg]apsdlaftsghmhtj
+pxieimaprtbntgvm[xuvwwsinhwjjapu]taeomoijctvzyeijfr[gitzztxejfefzvepf]udobxonjlqagrkpaehc[fkqjhfjicleroxp]hxpzoklhbgtngtagcz
+lqmoxvnknpqzcgs[zktsmqcgzqjponj]wfhhzvqiqkxfwrrw[actbxtcdlogatfkprc]tvzphmtxfrptzlopv
+czdnqiwqhighizbmivy[tptpsvsahslbsovazkk]ycppvkqvuggebgxibe[qutumfpnpzjkgqyfkok]ixywxvmvliftixfie[qipgniycxomhgmwje]vnhxbcnofkcnzep
+igvdicnzsefxlgk[dzppkxdievabwyh]fvyywjzcyfcqahv
+bjzwblslduiolbezybz[flvsgshhznvzmrxo]lottitaizuksqfihn[kgsgzawzjlqjsep]ihadewtrfpsudggga[oecgswhnbhslysd]flpdpxndzacxeskzmn
+syxfjuakhrnntipfpb[xmntswflflstndkv]lityfpfignnxsyirja
+unggjaqgvzrckyqx[llllagrmuioghea]qafuiwqpxcljhvf[tevtmuvcyqqrzvrduc]kqnaadyfxfyyzjuco
+cpjvjnocqphsagdizq[rzfbvtnodwqrqprvqh]rnlzshtjhrevjgdu[lbozqegfwoaikxbnt]cqmzymvkummuzjfx[vtknqltevighwfdnjv]djhfeemiljlvkgqkpp
+adbbbgxmiqomckxesb[dmwxvrammletdiim]eiozjsockohijbiinia[zyjjubdniurametk]ajivyylxbhvkktrzdg[byxiykqfbvpfdzdv]zborzsvqimrhyoyhevj
+frshflyhzegyezg[xxaoqtzxuqbamukfxed]klyullmlailfvcz[boefzsdpblwpbna]dbnxivwobykcfwogv
+xxycwortiwhndrvlr[mspdwmhyqdwtctlyek]qnzfcwwvvlfsael
+fnekkofpuwhttni[mlwvhzrwfdtfnvof]gtlyjqokjymvtkiqdl[gdjobagxsuhudnoi]jgcgyusdyyocqwwtatk[rjujihcuqgdpcbdnkco]iewvagokrzdhhhskv
+dfadfbjefyinccgzt[gzoojtdlvqysetfihg]nlsriqansooflahzhoa[vlzwtzgipbaxudxg]htykxxpfmhigbdqsu[pzipnakgdfpajkbqowq]zrwedqiuobogirulfwm
+wevlduhhsouwlqxdcfc[bxcvjwespxdkulgun]hfuhwpzgdgqsujeex
+zweayhrezaoqibgvc[sosownrvumzvynfpvr]lzubqqqepwraqqdxxy[bniazltbdanpnjjjuox]tulybfbbzeiyidrv[zbebbcdzpcvegcms]jdfofmnlgwrnvann
+gkmbgzvludgmjgnrkck[ijywdgxetrginhtaa]yiokddkvhxebbuyrwoy[erhxxldeegvsebr]ujqickibpbjpizhbjw[mtzvltxionpxygo]mbcgbublhkajfdfvf
+ddjzsqkoizakmeifr[sigtlzmyyrflvjowj]dyqyfvpkhdulwuj
+jivforicorwbkmccpgj[oviyldmrjjzbojbs]wpztdiwcdrwttmfdw[jgylosmbgxlrogsa]htkvwsfczzoascpunqr[uemtqxhcvvphnvktio]xkghvnicljrlndjtsv
+zkzjccnvukaraob[asytykcstvxtkvermx]lqgjlittfqpyxcq[dwyrqfxmwryvxjzr]edufjnmxhzxokjgphk[ucthvgtgfpzxikmnjv]yqumujliwpjujnymcen
+bhbndmsnnbhspzjby[llodpdecwrlspsbhbhm]zqulqmxwcerescalp
+ozkoqhvatxmivox[qffeloluwcgsimvcrnu]pweywrdkmtqjiflvcm
+rznstgdzevfsthcc[jpgjzgeibmumtatu]asgwjccfkwzaigwp[soegoylmysqcequdsw]pennknxcwwasonjz
+afniplpdesiwqvdioov[xfkwuijxjgtqbhqow]idmgzrcmwzmrfbsubkz[mjwyiznfpjztbfervj]cythmqghdkjcfrt[ekhpwckuwduoexycc]htaeivvotvlstvsrpj
+gecbcvpiswzjjeiriav[ivbfdesbkamvngogjb]xphdszgbcburesbfi
+uldzgctwccgqdbxrmpo[guiftcqomdqlqua]dmxluytucnlndazic[mhmdapmemlrwmvdzwkn]oqyvwmhlabcwxpzioz
+mganrfqbsckpjsnvlh[vlwmfxhxlnnpsghrhmr]eqyrkxjcwpkahqpxeqr
+wpbzefalgkbnrke[qruzjqtrkbzsvfgwz]vahtniazgsicquatrg[zzslttuxbwolldy]cuejnzjsuwgkobp[yspyowiamjpzcaqwb]vhakhmjrncjoroe
+ycxznczxbzrprsiw[oggkqxyiyvsrmxck]asjjivqayantzzfysr
+ewbllymppqrdnaeni[qkytupytcgsftpprv]jfepwibznfbypfnf[lrparpwtkrzlxwep]vdsywhvslycyohef[lxhwibvmyypfrkdsley]kookbjfsapqphmywuu
+cfpbgrwdsnrgddzzh[vbqzujunswprxyxnk]efqzsevzxurynhnm[cyctdnsmqdssnmzyrg]vvswrmqzxnrbkhunu[homwjhndwctdbecwh]cdvggafdchgeuqy
+lihwrhvzkhbrgct[hmwzxlaycaimxchybqf]ruvcpltuinwybvv[xjbzxcihznlkorih]zxnxeqobqveujyrdnur[ijhueqaqprdlrdcjsh]blwxhcuajnskuntgo
+iroxkwgrjpzdodvmohd[wexdltrhssaqwqnh]ynvmdpomrekdsfrjccp
+gfusgnroizvfwwcsc[jgvlrznerrnjretc]dcbnruamgkyrowpglv[tbusonvwwycqtfk]oqngfriboradzof[yosalcuxlovxpjnoss]teunwgykswgulguic
+bsjpzlhhqvnghwnp[gakhkxegeohljlwz]hfhculyhgdwcflbdt
+ataqyejfhrpvpagptx[ufqdptheyevtxqjuqsm]tekvtwjvapcyamluzbn[xxktujajfnprffsvfkc]espinhantulzwpqug[pamkrynxvlrwccp]bgzabgrubbhhwwanvf
+qkyfobviahzasbi[dqhxzkbapqmrubogqg]aenfdyclijdpkeqzc[fbetcpbytjywomh]mqzvwjmgiexjfehor[ntwcsnflvlaxmfqh]uvubufoducqwacwio
+zvygygjncwkyceve[knrtgwmfgpjlqdzusvb]denyidxiinzvmhkeads[nuqpppqdsbypxncb]pzqujhpprhbxvnuzis[zxyppxjfqtzdplvbegi]imswdcvwdghzhmyyoci
+mpiwlfpsupluuwzyqte[mtyfeccxfpcorktwam]jtmnexxnxsdutfve[ktzdkimtvwbcjrr]crdupwumoriklqckirt
+clubjinwpyiguop[xummstkqfygcnsu]rektotfjzzguums[hcxlqatyhaqponifaa]vdzuiclpdtepfqmbdiw
+sswrlfxpvbjntaovr[cajokjrogvtnguj]jsyxzvoomnfbtcc[lgpureoznbgrfwv]rbrwjeeiqshuvkwub[gzvyjbprnocmpkyk]gzibarcxnwnvuymlxpn
+wpdzryxwfahiwguwvtz[epyjrrvvjpkuogtflte]shadblrllcaigwocsw
+osmgewmpcqugjqyddn[omtivijufzacwctoaf]rvlwqcfmfuazwlas[wbpvzrbsnzqnhygpexe]vxvfjrrcjutfivtxb
+unyfptkouxbhwwur[atheuhcficbccfur]djycwrtnlttopnjcm[pyocjfcogkyoogo]uoogeqkztdvsgdj
+gdmorpdnzddjtbzo[hxulwsrafnvyxokoe]flzcmbhukjwjfnxsq[bzqqvrmxihbugam]kwwzidcxteeodrcekl[vtjszsdbmsxqouutvkt]whnkvoierxzhehwcjh
+laswazcejcxyzcocca[utnlyecffzypkiocowm]nievutnusvrsixk
+xlcgrfodctfmyxvsms[bgnofwciyllnekkiqf]knqjmtgrurhsjrwahoz
+enrcvyphrazilaqswz[gdxchlzickidnqfeo]wmadrvyuoczftbdbbij[jxlyycfmgmbujmas]gsreebayzepseakylr
+zeenyzzskgvaysxe[drhsgkqipilrdmcl]xyhouejaqgfdhoshp
+sclmsgjqcijlilhtyn[tyxuebqjqjqdnzg]rfeqmnwynyzfwsfq[jnrjwlqvcnvziqjqnz]zjyeqebxncecsykm[jizuywrcdskgjpv]nkogvpblfiwwnynxf
+rkklgzusmfikiyxsk[zfcqvybbvwxwxlosyhk]pbcybycsiegagdr[jfrnxtonuvihkiueuhz]xlfvapkzcpysqoi
+nllzirippgseojljl[oahmzicssbyckdhyb]qqaeuleefpxlwfl[orimgxtsfwsplrbuppt]eyzeliykpnmmklg
+sypyjddvabqnknl[zfoknkriiqmevubru]rcxkbkzngjzzcchl
+uveautnfudowpkocevc[xqckexnnmsrzxwrgnwo]fbrkssqktfmvbebfs[jmkkvbmhembpojk]vrixaskbnwyzibmtux[evdzaxyibnensgkua]djjjewnszeukvelm
+xcidhycxopgdfgzxp[wcybbxckgqmwttrrvq]zjynrtlsoibooaiqg[zzsjshnyyytzmrcskh]lnvmmzokrgnyqfvsi[kjpgxjqiyimfzec]bpdjsrxzsbwigarmwi
+zytphsjaeavezjmtjf[ocfrxoepijrllfc]gsnkhdomwvsrvmctk
+hjrxkkrrutrkmsiax[zwsclcwdqaukxxwmbgk]jjvxzyshctodfeeonp[eklzpyupurxmcvgndo]neaovsspupkhdclbo
+agrgepnpjdjmmzxtoz[yptupgqukzyiwko]zegusqzhdpylmvhgh[ftclkimlyjeiqxymyc]qplgypcugeybdlznf
+clmaojwiieaxtkf[hybxxzkuvyvljxs]nqyvgwkyfgwgpvjix[ffrpmlqwqbfqfpyn]wewixukrkkavdgpr[zabgeqjcvdsvydus]crgezocdrhjcufljyf
+xwekgqqxadszfqxp[xgftweqykbpaqymyaev]aawdhgjkmwqayhfuja
+tynmzjhrddacgjexrr[kgxebvnmaazmffon]qercmbticxiauyauxmp
+ueswrzmngurxaqja[yzlfxoaxangzjbyqm]zrwxnhpmqiespczu
+caxoesrhrghfcyunxkf[lmalmkbhrhijrvmafw]sdbhqytqtaviurkzi[ozohqgqrkgcbhet]wgwgtjtcfcqzvymnp[zxuhhoxlpsgrfcrejmn]hkopyalfpjzbptgetj
+osmyszkhkpaedzdy[xfincacxeotivra]lksiavomozgiywoxrdu
+fzbuakjjvpyjimycrt[vvbkutdqqtyjgqz]rxzeygtijyrfiqm[qxcgvagpoqyoxhziej]tfoadqfiddsurhergel[sxqvskkcvlkpavpls]ivztxqjuntogjxx
+hphqkgxgqhazalmlqoe[ovhvftdmpwudzdicfkc]tdfnmaosfddlzbhv[obkkfppmoqirgmih]xrsrqaohawnwlxpvq[btfonxzgatdqmohserb]bukakcwcagvcuuwvhtw
+cknwenzzehwdrlje[sctyfugmaxgbetxzf]fcsbyyqvoowzutlge
+gpjdtjgclynikoh[vicphcxycqsiiiglrsw]bcjlerxdimzupbpnw[waevcaeooffjikclq]nhajkvqepdnzgiijfrm[lvmtxqhswljuvux]rnmiklyolpctfrfgxs
+weolymxfeyqemlpxulo[ifjuypsxwrwczhpsw]hziolxpchkfouvegj[svfsshaljdhmwcmu]zqbrupsvenlvvfiuhf
+mxvfnwvzsyldqyi[bvfuwmmrksbxbzcmzrz]wktcxsiresexdodbtl[hijoaneecbrhpmaa]xajfvvnvwcocpcbrhbc
+pboivziugjszfopvkwa[kdcvzroeislbcymt]plydaqvkrjbbtlutgvv
+dtzdswmudibubrthcxc[vgmrnyfsqtutxfq]xwbupswdznzazrecwr[ijppmhwabxmhfgcqu]rwvltmqsymbydmqfnzp
+agaxfzobcsjhyutfk[ftmcykjveqrlmvizdt]agbgsgsmhehzvoy
+fbgqlgcyjmcjajxgq[xrxyfyshmvxgquv]ubfzmnkgipmqeucbk[ebcveyedtkxwqcni]dvujsyfjdfowgxfh[oubuurnpwusoxrx]bzxtjgpylljsuruwlq
+nbctombtbcumuwmay[pryqddzmpxgkjlz]bwwebcrzdpkqlex
+pvwqgvrjhkhjycm[luquegjefcvhweovots]vddsjvlawwxvkcepqx[xkomwqdwvymcgtgxky]tmjyqmzqxuhzxjekwpw[jdszwjkhkxkkpjjwkvh]jnlsvhnyijndbcavtlh
+ccitzedsdvzmktzl[qjtmlhlgdmhomythbe]skkosmhqaqyxvrpwyvi[toqfnarddgzlwhipiqf]vlallikphqpggunc
+aapudqmdqsoadhf[bptieajhwtguxpprkdn]fiopmsokjtonmei[rdcwfyvsmtkqwtpzwcg]pmgiakezkvhfiqxw[bmglrvzatxatgooc]jdkxirlaztzghpcgiot
+csxohvjhmjbjmsw[zgvrfjdvjkjrrsc]wbnhtwfofrquxtzynmy[smcwkfovyaozfhhf]yfribcdfykfzsig
+mzvhznqsykmcdgkphhu[cmmcxolosuhnkmuwhf]gkzgbqwzbzzurzehdm
+yecvknvwvjguxlytj[pncdvmrcqcjmsyix]nvosjrornnfgznaby[tzuoscqaarhjnslab]whvfxspoocikxfkyj
+guaouikkjfrtolsug[tzdjiielpgytyhis]gwwwtmdeetytmerjk[sorwxqfcsuhbvecom]wmfmxfovbdjhajcaxyx
+ouvjolrkjyetsqlo[vnadgdxvtdkqlgi]pivwtbhwibflcoh
+puboxtiwmmabyqgn[zhxzdcswdaavgdaly]ksukgpnictzfxxsuqsk[feoibpurptzvrqy]tytogwcrtiofplr
+pyeiwajmvimttmi[pkvpbhnufrwpwdwy]dwdpuymdrskpgfwp
+uwctwjpjojxatnyjwm[utlxyebxsfrddigrjh]rwepcpjgrqeafmr
+mcibrhjsqyketegjx[wjiejdvcjjaijnmoy]lsjoughndzzedmblz[ovdcmldcmntnxwk]gtjntfaikfbfhuercc
+xkcadobnrwjczwpo[izovquqhogzhtajgcfu]feiizljlnxughttxhy
+zovyoejioovblepnri[wpjrezfxmhepyyhi]lissctcyvfbtuklymtd[vtakkwrsocdxmyqjkl]idfjftptuoiheqi
+fjylzurwqfvphvctbn[wtraagycimmpycsbtw]zdolnnawyfkozoduzht[wqccswxyzozewtayycz]zngifgtxacyrwiacyd
+mkdselqpwqchnwxgydj[orjtmojhzkuxfbpmxa]udrbphkhzchgiyq[ckkhkoltyjlfzrro]kdyudnkzdsjpvonrw
+bpjaenogjpzaxxkejpa[jqgajznyesxfcdhph]euziwygknckkkkunxux
+btjnlodtnbaubkvb[topsbnzgxbfanulah]uksjmxxfwfzxqfcij
+zkfnmdwdaviehibtjy[adnmoctsyzhtangoxtk]rjydanokxyuxajmnx[rbamopbudxevhpoezc]mzurnxtacbelmitu[oidbxqghkpqjzyqrrox]ezgwbeyokfmjwblqq
+nwefqukauecrgki[ofkmtkzupjriwlml]diautbiayphukxvmhlo[iggbxeudmmbkayonzyc]hkijrjxiffmncybco
+ytgimnonvbqexhbabc[jbkbctatpdataxjqtee]bxzwvqoqyazdgoy
+bjztbbhxzzuannkyvet[mngxjhitobvkzvls]abhmarswjsswftn[ihxeotxkwnknkbmkvjs]iovgdoevhkarwuraoef[wvsvcnptmpcktslrn]ldjniscnknkjaheayp
+avmlgtbubxrilqdbvd[eqaifmlaniocwybqh]juzknvgrahckcrhagh
+dyvzlyoefrbtxizlod[ussgexxviaibhrkb]tcgkgkyckgkyewp
+jvrsopjyjarbkenouax[gwyjvegfpwvjsdl]crgcqjzhywhasbuzdji[wqqiwpzcllmnopvbf]hpirheoriudpernd
+cpykkvqvowwhoiys[yjoethxfromctdkog]cvlcjvgbugyqvqxjbc[ipyvfwhqyocrksd]dsvipsvdgzruhsli
+gsyxcrknbxxyhvnss[zymlfgpcupgtzycu]sjucevsghhzpuqe[qldvqrwjankaiexmj]cacvncnvtlbnxfybngh
+ndbxeywazfrnghgdjog[vncdnjelecbwcnuecit]obhfqkcyucffwbhk[wiboksymurccujv]kxhiktclvdsgbxt
+ieqiuumamwhkexjene[tubauuniiqmzdntax]kxiqlujdvpjqqrtkiy[ubnpvsfjutgvfhpe]fnwawoyfoqqdgyr
+lromgmscqlmoqtqrr[wbndhgvivyrvevwpbd]fjvqzyqdkqfpica[isfiiygygruduhleff]lbfsdwsbvndxjord[zmgvcnxjevefjnqx]izvrxpsfekwsaxhzg
+vfqitwljrqvsyilpb[ugzycuwrexfoavmalm]dshatbrosrihtwpf
+hduooarqszvabcwukj[ajuwsrthbgchctbyuyj]tpzioxoqtyfuwtdccn[jisrxrmnmzhnhotwra]swseywswdlsbzzqqlv
+aarocdgubnvehgg[xvfugpdczaccgttycv]nhzocbyrdhlppydelyq[uloucbldnjeulomssv]ayxgxkrslthaspz
+dhyljzgyamlcdmmz[zdkwfrroodcyfnfie]zkwhzngaidridcagekh[emzeeodcnuvzddnbm]vtwokrqakoovvcdisvm[nzdlsyrpcsicoedyx]rrnfnhgpaeqtlxv
+nxybztwairyftfvig[syeyundkruexgbwyvz]pspeqstftxbbaevhql
+sbbhfvvgyscleyxzki[hgjoiilqwuiiogtt]sblfjsptehcxdilpgw
+fmynycbkkkiwjllu[iolpwypqrdrnkitax]fwfzssjntanttkkboq[afgwfwvsudpprmpne]fbzhbkoxpxavaskchfq
+jcyrspmtzwxqtomkqab[xqivjfrwadfvtfmp]fxkhdbiczckphwhil[ztemqpsvuwhwhfdfip]zxqetcaulofvxrsak
+ozgxtokkrotpphxsnt[txgvekxlxkhufcwi]hspcyxwyijgjaqsyfw[bcjgsvsfzmvjklh]bxjmkqkynrusvvq
+wofaptbytcugaluqc[qdgdqupqigweysdhq]saaeqyqazqqaunofl[iorcsdtwdhfmajh]owdrcjffsvszwflax
+icrmudvzysqefbfgpae[uypfoutavxnzfpcfafy]moghronhxpgorkpypoi[ayrgvytktzzwtfuvfxm]ktoiazynmsksawusbsv[vypyasahxszocsfrcx]wyodebbscuterfrji
+otrgqclsvnjpznt[dwzibvrmtngomacr]xtqtbpxdtejwbstddr
+csiarmhcmunsjogtwp[nborrnynefhrgwy]lvsacfkgakkbjyny
+ijejwezkizvuswn[zfkgmewadvwroqibng]kqhmbrdzuvhcwkwxfwe[mgopomvjdemllzygc]ivzzvgcwpmgjewb
+jznavprnlcygwvvj[eobpbcbuqceogtei]jilcppgbqnzzjrjjjx[xurpitsmdxtiihb]pkwkdkckicticboagma
+hrarppjudvbccxdepdg[ksabupqjypyrwctd]jzmkavpyparwxrivfq
+kjtgdhvqyzisomc[koywiyiymrrjpbqno]vbbusjzesxjpwkrh[zfalkzmohlxcdykl]hdctcfabyzteadzofca[vlbsevgalpsvreryxda]oocgdkoeoxgepsikokz
+nckfsyxjdgmgcdyqoaz[cegnbhaksrdfaokttjc]rmfzhgwbszywwzbzpe[nofsbyxiguiaxju]vjjitkzyrugozdspwjy[gwkdakutwllydivtnns]gswugowdiouemkrf
+evjgxyciglvcnkjdep[ixmlhpvkldxvcerjb]eqpkpmyqvctcepuljz[aylvsdrrbajlptvfeo]nqmtctitzqxeluw[pkylojlgnaunmolry]patyaqnazqoykcls
+yklraufwcbbewrzdnl[dfsdynavgwiwbkmmpo]atqaaprzieowbqafr[udtaocwgbvqqztkykeh]eyzakgtvzrmejksf
+gplhegstsxbqvxtnp[sheoxtsrbdxposgmtx]fazbemqbzmssyce
+ulhekckzsguaeuectg[msnwinlfedcaqdyb]przurxwotscdzgtcjv[sbqdcqeculwutvfecqm]mjosilvbpgaawll
+bjohxvdcujujaoxe[buibijjxplrerpiphn]eorjpmrcugznwsi
+yflomjbhtnsgkkx[hhpskaiqhzlmbnpv]lgsdbeankbosyptonh[vxodyzameaaajwc]nwpmycktztqrgmxgbg
+eajkclofrzpwbscfuwv[vgcyrfqnycmarafkjc]yfrtobkpkwlmgyckhmt
+czamuejkegyxhetxmou[edrrdhmhhtxvpoxvx]wbzihlibvexqyvclzml[dnzwkagaeyicaojzg]wkireqqnngbfxsygz
+kwbjoaorrluxekext[ffjrmxvgeqyaoartr]pwxypyiquumrhbz
+pyxpvbqfwlpnawrygi[dtqrrjolckhpczlk]mtknbyltlictunxq
+cgwtgnafiflwgoims[qdbdbgkqhmtkzmmyuke]cuhipgoscmxtoihh[ieqobhwtcxsehgils]pmtyremzeqhcuinxs
+lmcuchgkedjkgbvxjdw[jxqmqodwyieikurcwf]mkfmofgbnxsmluu[rymmyeyhyncfnzobk]jnwjbmejttstvhumye
+qsuhfviyinfcwufzu[pqmeenwhbstgguzs]ypqszcvmaxfqwqcvqro[xiofditiroisnpbx]vhftrwgnrxoxciva[esrtbbadduxicftf]vcslxziacmscxaxvnbs
+bbfcqaoedfdwphomkh[jnslunmdmvkiyup]gfnnjqweocbybtjdtn
+srjpaxfvehavomsjq[nqqcwddbzqvxdacdep]hhpbhajjqaazpqyo[fclqwfkctufgmkqm]pzkwekfirzlcgduifqu
+kfmoszcssmucztdn[tllxhkubjuqjmgfeqw]djyeyajqakxkoxpk
+peeaqxjifuloiujd[tgplullzdgeqjononx]lsmrbynngeveozz
+chytpljkoqzhxfu[izwdbatnmmzzttst]pkfsahxrlgxedvsev[rcxdfirqmtavigilk]lvrudkskrxxyulbjbe
+iatlnhdapqsyskgstls[nqzlofurrzibukxddw]yxdwqadthjynwvatmp[bdkndmhtngzerzwqgmx]iclavwyossjrhtoqf
+vvanifuojsytdel[dmqjrwfgjqrcyazxa]mivahklphnoapabp[tlwiiuvxlonsucr]fccfhxkvvqeqvclcnr[rankwbxciojgzdhuuu]eycbcqhnkawkwmkxb
+kyqnkbwfvcarqcrcfua[toxpqnxiuyvfjlekjk]hfponcmqqsfdzqtlgm
+ksrmipfvtrgwofiqxx[dxncthyfpoivapdpf]tzlnjrfggtbgdxec[tmlpzqicqjfhxwjcigo]uzmkhvbltpwdbpxzfpi[yfkkmkzokekiidxpugj]jbmagsjlfozkajt
+xhrfhwrsgduyobjodd[pazkwxnflbwbpwxych]yvasgopohztnfcsbc[dohwmwtdklyjkbaqe]cttccmlckzlioizfufc
+lygkfdlnlrukwjskxqp[tcskymqclunvdqywv]rhxfxbjftjxdepuwax[eoqchqlngjnnshc]gvjhyrvjgueweik
+cehpocjxzxkpnxglhzc[ltjmejyuouzkisdnlah]ytzdlqcewgwzxdz[hcupzenhdmtvigdodq]oivalfgkscgnaxih[opciwwcvzkrsehcznh]iveqylobdjvqqrbb
+ofluwuxajcsnkanvg[vwpsezopzkpvhlobfos]gmnrtcprhthefopis[yvcgpesbspnlbvdcdj]unooggcrpjinkxmqsg[stfmzxmnwkyujhwqilj]editpyjnpwaefawwq
+cdneyarppztbtwsaqy[euyswrwxaaolxkzgcx]cqqabzealhvuwzo[hvnmwoqlzyjguvyy]goqjeapcwghvfszwsc
+hohlnwotueozwhyfgg[bdiawrubvrnulfemv]yohmiujjdfjexybb[uyyzvnainybidqfmll]pyybgwdxcdqdgjp[qpowhiuynwospqdgui]lqdoiaufqbqljkvhgjj
+tirxyuvikznzsavp[omifkdfvljmhlrk]ouzmaxynnznyhfrud
+iyoipjyrywuhpipcx[zkrusibgupcteuls]rkwpwfppboaxzgkbwuh
+yebynyhsovfufkhwoel[rqgwgiuuztoboxqo]tbcahalhrqzpqxhud
+mxvixuvpntcsxjzvpy[jnjtyjwuivtsxlko]zugkjugtwymssxd
+ddxewdmzqrmjcdx[tehlbyapxxetbkp]lkfkrutmzvjsvynmt[aryjfitktobzfnhcxu]rrbqdbzhgjwwnfpkxbx[ggbsnbwuwlduhlfp]bdniebubtcxsubscaad
+osbvoidqyhsnydypy[virseojzmlplzxfwcdk]qyyespqaegmtzgckltr[kjowbsggjlyrbtcxj]poychjfbatvhkrs
+rlvvjqnaiasedvpjbr[fufrhampzwdniipjc]oqjmidcyiekvayqfl
+hvtczuskhiykvchxno[benlaiuubpaghzlwbf]tarjrksfzvilwquxj[wehwbwsxfuaptyty]gvvlkkyayfstbcut[hxnojqaxevtbvmaz]jnhvumhqfgkaqhumxt
+thxtkuentusmryim[hzgibspwboqacdlwc]clsunqcnrlgldjbsvz[scnclutgijjilirutnn]izdwhvipobyzirg[hliollkyedcuomrwyyq]dpibjmbezvzyspmkgwj
+apezafwfsqifmip[kuxynugvrndkdifwhd]pixpqmsbuqspsdpqnzw[qfiqdwcdzbtidgm]otzbkrciacwchdnqa[kiblvlkmtkqjzyyv]hnucmptrhrodosk
+nuiovzzixafjgvl[slswktlejrrsmxujjrk]cjassomselslooj
+vnlustrakmrdrkjwju[nnlzyowyjshralbkgo]jpwjwpehndfweegrnq
+hdiueeojljpcqrdkdfk[aseznfnjilqktdx]fubppvpqwksxeiwpm
+kjlbdmnhtzcagcpc[wybonbamfkugypt]gnjrawnjietdzhaf
+ufmoyzcmcxoqqpsg[hkdzmupftmazbrhul]mypsxfpshzcirslsq[rumehwhrobhrjstjd]tcdatsxbxwzxseileyd[iwyafcoefsrbynl]vedzteatonqliwgyj
+wtmyhvmsfoxphqrusjw[ozpswsyjxemnczhga]xeplvzvjzdgqspqjv
+wxyocgbulqhbzyekcln[dijevkhdfkfwmppnert]uuxxnhhkbmcegbtugap
+ijgtsfvyzgrzjonlq[bxxhmrfelsyxkyxrex]pimhbbzahddhwrhudyo
+ydjcoqvktwdjucx[riqvhezqqrwpizvn]pptmsnmubbjzwozxy[rbzbtfnnkeyuvjqhjhu]hnqyyqccouflfzmk
+dordtdxwtwahcjcb[gumvtsackxhwojebt]gdzjirhxegmrgishf[ueivwcnfptgagdj]kzqyptwgfykrxqsc
+yovgolzpfuxumuusnu[yzmsckgxuxbcfhpovdi]ydcgpjfgjgstljbkc[jnxpktvohnxeoett]wijsttknnkaxhyx
+xaajqzktqfslihurb[ssufsbsajcwrysbaweg]odddpcsenmcxilrkp
+lhkzyewhnntocluc[witlpxxovbpaeue]zokmfkrsuzblnubzq[qbubewghnsjcnbku]xicstwzulnzadvwgv
+pzuhirxrvaghkajqsg[edyrpkukyvidoqbabcu]vfqcnorzlzxypla
+xythdypgcqkccfv[zrbuwbhkohddkmbj]dbkreagpyprchmoktz[mehstplzokdjkasge]bypysrypwfqaupkwmad[ywkktyjruqqoexms]xdvcvnaeuiwdtcjcwg
+ebmymncvgrkqlusommh[wtkwqtpboedpdwaxoxv]iezxkyrvialjrev
+njvacohjeagiztos[afpmzgmxbvpzrkpikb]cxbsozlksnpvdxh
+wnpqmnhzhaclqkn[neseqjerkxmpddehzpv]buwoodytrhkaffpb[zpqzycmuzkevvyl]iqdqjuqnmddqdmktojn[ocbknhhzdyzcpzi]srfnmfblqrqzwtusu
+paxcryjinpwgadnzgdn[pedljgwehinbuvueies]wykembvekyliivgd[mjonnndjrswlfvlo]vuanwryeqmmovavhf[pouuyesundysqaxzciv]itixbjpcioinvfkh
+vmlgtgupmvpnwkh[cpuwomxbeionmrkx]zwjdjcytxjxbzltbp
+gxbttoltnwfholw[srbxnbzsdlwegml]ufeghhwivplxych[kesniuppshrvbic]ongllrrsyzxurhxc[ucssycrhethdlhyzd]jvhniomjxluggwtcv
+kpwrbbrusxmusejnwz[wbgriazubzccotlcdbh]dxnvqwslhdxbbufe[pobrzwumffnjxfghv]qplrnuqjguonrpmpv[xxwugdzbckpvhhr]vbrmirtrwprtqli
+mlonozngubrbmumjxb[vzvxodkubovdionkb]uidfhtqhxxsetsnvy[spdgbqevotzyzhtyy]mjvctpqrtpxrbqeckq
+wftjnmpwffdunhwr[nzepzikompkwgje]rahnwuphbxpmwmtwboe[wcwxzwqppyaeihnxrvi]wozbvaemreqcvsoafr
+lmfgslqcwpzvgxgmgty[ihjhsbvhdnsbkroszc]scwicucudbqrvtygt[iomkilvjwsofqnjqtd]amzyfxiaogrsdikrgye
+fcjsdhrxjiuugivwyk[kazerfwbmgeiituwksg]nalxpcedxoajytfpg[lldrwcgzwhmukpmsvot]yzsnbooxncfhjdqi
+ljjwrowxmpvvwvsit[lhezgrfdcwohtllany]huqtnutwnuamaahpwa[ezoifbtagkrzzjybsf]fehkkskjziztlravf
+qggqdwibskgshrkyc[bcqhsghufawaskgezjl]tikipezkvitcxtefpg[rwvlyjcgevwbikop]ygxubvtkciptbhi
+gmlqugapdwdohic[fbxygwjlnwqygmnxma]sgnfeprkyxrzspd
+gtokbujgojpkdtrvt[hxtbjjffjwxnpco]vaxogwcclwrodfdxlfp[hihtvdymxjotbfuyfr]muubeuzwzbdsydkkss
+rpqdqfjuutdfbaarkgb[nihwtvhhcmxwbgr]evovoyejllhtmpv[qvkudqduftuvccmeby]caeupguvwobwkccojl
+gxqxcqpcbqmscefvj[jodkjejtlvhhyrw]ciduukfamepbpemyol[uchoefnuqlolilidyp]rsjsqlxmjccoipqueq[qlxonqxtccxuwcnrizs]plzdntlmgcnrwawrxdm
+jvbbytsctqrwjrdr[xtqorzwdmhunrtevfb]qqxbyumulbmrsbhtx
+yoenmlwliczccpkolc[xsolpcnqbbkrani]tzczkjomtarfeqiq
+ogxowfxoqczptla[ayzmunzjrhsyyit]ckixtyzdkicgemx[hhubqmeqeenjuwuclx]zjhusfgvemklroia
+wtnnwdcuqnxduod[nugtcdeviqkajsqxgvh]ujsnisiydziqndzgtn
+eylerocwshewgerk[szefiobgoejulsas]jxmoefzlxhchgmspo
+nnwqedoiuhqmmbqewzx[ocxrbmgeqxsjeorfrde]agqexvigcnntkdck[vopzcxqdokfydsh]aajrpilxdhftxbprqn
+gieaqwfwcaktnyrak[ckstsfspnaxvkkecu]nywzcpsrpeypytm
+nlsmbjepecyztmhys[yseyspewhduijglnxs]nmttyybnzhxcbuvcm
+gzimfexrobypudb[fmrtikpcalnxzjco]qbxokzuhvtgzerkwgig[otsumbzbiecnrsfvgox]pnbeigikjxbnesh[ifovbpoycogawpmbtuj]qjoaetsrenrirpvb
+ybjllzyznkniidrl[txlisrbknkopgbgutv]rspeuydexyushei
+nnigaodunsopocfqf[fdkbcjzyxamtnwn]obloxevzqyrmswtc[jkuniykbwsytpivsh]ceuzwuogyqxferdic
+gyuypjyncazpjtbni[aietrzglhhgxscvnwvu]ccqmabbzdawwoctwywe[fassebimijhpenb]bwqtcbfdilruikksetv
+ldxvntffkplnjgt[lhwtwwfoyuoumxngqbp]eyoreivfgqwyfet[ylipomgffukvmjynvu]npvyofzmqlyboidqya
+tpnxkxbhphxzetonae[sugfadsgjpdwxup]jainzhhwfvgcljydo
+uzllwzqtwsmvdpoivdm[geidfnypnnnszjjgc]vtwpieaxgzxbslxld
+lzeizipamzynfflhuhz[qzwbfnjeulpgjjn]aapdqkjbpljvnvt[qhauhykubojxcoyuglc]tkflnjrdtjgwilk[aorfkrzlpuhgozwyhj]kmbwxqqwfjxawbj
+ivqhauvcbmbzijrl[lbsmgujvpbayaoy]kteathfvlzvbfzdgw[xkpwoqzbkbdgrsjzn]hnihhzpetldtahy[ocottuvddcefplijb]vfolexdinkkgmcdwfyc
+vqblvnbutgxixnfcwc[kphevjpgctxpkavh]riyfeqvpyvgckaselrb[ryoltaxliqsnlqdagr]shrflexwtlaivfow
+lreoiyjedxzdyhdnlde[levshlupfrkvdfdeav]ehfmfwbetbsduiudzr[uoxbgzrwlqkbkcwo]wjlwlixknhzeuyw
+abnhwwybagtjfrh[jaoeeifkdmlksncnjp]rulgazssxsmrrwe[hisspgixyvssxiumqtj]ohkxzqzkfnkvvgvrhgf
+drtqdxxqsrkujjyyb[jxitdcumljupwcmxx]kmzgykavruhbplvjjp[tjxjcibazngasivc]iuhgnmtzaozykgtedes[pproeupegraihkv]vuptfrfnrwopiczzkos
+kbkxcesohyjlgyynpwe[bkintqjcoqshvve]torkeaaagbkbxosriuc
+qklkbdielutwmtwkgz[dtruujvmzvmannceu]xmrwrcevkgapcagtuof[ebouhjnkpgmqairnh]trgbvkjhgjvqmceu
+xcoycanpxtathanw[xdfzqcekyrgixxcc]zpbmkgrykuvlldgzh[zltkqabodeywxhtyfkc]jzetstuqnplogpkjyx
+pirttznzezsktas[ogefjszaezeqipdhy]tfzgyjkulhtyuhnvf
+kxyvrtcpdqieyro[wnvmnmiobotxsispv]qyvdfrfhxkjuqwdtw[qolhrtzasgthtplihxg]gfjpittpnbsymvnotyj[znwgxnufnotguzwgwxd]rdmgzgfprxmavttnoz
+mubjhrjxqggcrus[ammffdekmguajiq]wvtsxaabnjzbekpx[thnwbdcskocytas]yimpbasvxqiylaqn[mrrzwqztanrkdqwvw]uvtlhtffzkcautuvm
+xbnvzradisweizc[ogurjxmpvzglqbgjlpc]hhujtmvfmcqqcukjvjp[wgkwvyjkwkufvventj]ehdkswmxyekfimbk[ovbdceenqmnrjeqvf]oqvujeqvjlplnzgi
+ggbrbreeteveahudoxy[wuvddvvvugkdows]ftzrwbghewsdfqaigt
+shelsgoglooyenhx[lylymuuhrtnflwww]muaexmsuihzdiyly
+slmxqaktxwfpfgrqv[ekjhbymdpfpiqvm]zybjhwobkrylohor[xflqcdxcgvqpzzdd]txshvtkbijbkbnsh
+bpocmihqoplucwnvyb[scxgrmfmuycybgura]yupkvewviiggoszst[suowhbqfktiboyik]hqqmqjvjczoxgeoqof
+elmexemdeoaajpjhu[kilercdwmwidrkpx]pvyefsmytxvaxuzsq[xyyhrtmwtglmcqik]spnsavadaexrodemqbq[wzzqmadwqbqbuvdxpmv]tuvloljoyhrqccyd
+rzngofliosgytzkunp[cyjzxhswcqeeqhmkjn]ymhsqcfuowylqtjrb[pwocjlxtfqsmelq]ezhrwjlzjtsdqorfsn[iekekpprqmwpdyl]aduyoxkvlkxejyjnqdz
+yhwdblscdqhpdbthaac[xadcyjrkldvjlntkxl]tcohssfmczzbomezqdr[wspvzvkctwmmhfujxm]fgxpvtsninxayplzlas[poflalkhzwwqwotgldo]mihbeaapilajefhlxs
+xgwckmpjphdwvzujv[svfqqafftzlgoifup]pezixwriwatkcez
+mfgtxxoygegwmitbzkt[qxivglwljmpsfzn]mfvhkhhddithgxaokf
+npkhgeapbthebsqk[bwoqhnxqzhkkwcm]alwpwqgoitrupvsz[yqvcrithxqfdgzux]adoiatxqsplvllzivzb[fcfyicpoiqaagrb]lummgoxyspqibxaq
+vikqemveklzlaqdxvev[tsqfmvvhysvdmlspknc]ejryfsjgnpmxcvks[ecwobztvirmokwcf]siwzbkgxlniwnmhzyhd
+ltlhegkfxhbndmfcpo[pmcjzvzmerxvsdo]dijdhpewjuwnatewmg[ylninmvyjhiqvicagy]cqrtolyldnbzfufnju
+mxsbpkqgsuhpvsrwzdl[dlrlhbdjvmrjwwthq]rqowmkoukgclzrfh[djjugwzxaaqtqavlo]gdzvdzibnckhkqb[xvfheuckvskmouv]uwrmeqlloqbtbfc
+emfplgnlzranlwxnk[ubuhxoejgoxfciarjtr]uzcfagjxdfnewbxxcb
+tlkmvlcqcbaqozlwn[lbupwjeefgtoovnrkkh]sdzgkexzxzcpdjgaid[qisspueisheejzkfxdi]inhxlauecmmkpenqqf
+fdtrgsgechhugwnidpi[dtwwiqlxgtadmnrtej]hdgoyjhlzdrcjzvl
+mtglmkersierfaishps[gilijizfqdzqihkbsd]ieqqthavsiqbkxvrmll[oxznuqiocyxjzymxm]epuxtetrnfrzrlqd[gooprerdkioisowygrb]zzowrurkwngpvvh
+tznoyelqlffpalatbs[cmtlsjviihyavtxz]lphzihbzjykeuhuzpg[xqfwolpahmfquhuh]rpqawvkxodxmvfhswz
+ybityzvtpsfbovx[yrggwxpkqjtzdvkr]gphdlfythiokoitpcjx[wmfvcehazqfxesy]utjcvxaybxcikaqgrx
+olqndwuwjvfqhxt[qfgqmmyeowawqckfh]ngkiagyxtqpdwbrwlm
+ukuozdurxxrvljkoi[eysjyckwyiyuopa]fconkkukvvmgnvyn[nwkqsifcwlzjurruho]ryslsdfmhgesmdf
+tlchnjfxtkubrlta[rsqsxplnikmqxsyhyoq]xcytyjjduledlzhuh[qudvljyfmodytzaw]hspqkfbkjtsvcwpl[ptfjakjrpvqcqcuhmf]inxwobxnnzfirnvgmmr
+gaviilzxljsozua[vmqvdrqoqnztbdmzstt]ufxaggbphqyxgnpcgzm[zglcpiqjhahiqcb]tsiqxcvrwvqistphkj[ebajnjrqotekcerg]kciocwshxzksmunx
+cgpgikxsukwvmwi[janhpuvmccsdahfk]rrmkjehchkefwnz[plbujeqhgjvljzkwg]ttwfjicxkkofysgob
+girkwjuugyxtovkjr[htizrvsispydidi]wqdtgvsfnuisigmalai
+ajbikjzwulcmizeoasw[pkkgiucjnrubiwqoll]gscdqocmpsuvfznqhah[rztusgyvsxaeqfmesh]rarydwrmadghrjtx
+hxpxckfcwipinrxk[morfsambyhipqzwl]wzgttlcuikfpvywm[cyebxypkgvxhope]dqazfmcgyppybetn
+nrisbenoupwrstlxy[uewucgmzkoyulfbt]bbvorytlrgqknqz[zwseofceynlohaooxzm]hfzyxxxfpjmubbjysld[tetgwcwvhctlndovx]jxflzwtuhkltaqmnuh
+nmyrirhwawjtgcgma[ilkcycomeqvcsuwmmq]iridicawanwkaeumbvz
+sunhpdrgrjztzvkxnl[mtztitboyfmtysqeqzl]unugkiwrweincocilom
+jhoqhwlkzccmtrlrs[tazackiqztlndogrmgz]zsfezvlpuzwmfwee[vcfxoionmgpezbalm]ujdbonopokhkgynmhp[pcdhdmwegmihhkh]dgjjkcyuetspltxpl
+siocivjbvwhltkyk[imgupkeeknlltlk]qxfcqnjbjtenubcjasr
+hswgnfwswhyngohhyvo[vamsrkcpvakzvbsvls]ehqrevmxiccgfsq[pffckymkoredwdpcmx]vjdjsrqxttbfjqf
+qemtumhnmgkgfzfzqho[wfluvctfqhrwznyzfsa]zriirahfdpleznfto[dugecvltxsfumxvjaah]lvudvknmsbudzxoadg
+mvrjzvsrconakgifqj[ehgbxxxhfqcigyhuyya]eqofdufzntqtsjukffc[hbzrfurkracnfeig]zmahsqiqbinnlhnvrz[qdajsuhymeavrqpdoy]nspfggpgnwnalzuk
+sejkhhjswpiqukaddwc[vwdsuuxtfaxqbrcne]njkrzolxoqpmmua
+fumcwsiexfoqklovype[bzxfxytncrmwtfrojv]bfvsmplxarmselz[nrnsymdrakyaqzwivoe]fpvboftrzvkemjgqt[akiqkjrmnvhucjcxk]ynityzhxqopnjpslhg
+msoqujlsilpcgchprz[gqdevmuryxipqcgfdwz]wxjkmuhjootmigfietn[flfcoqhksuopnwk]cewizdzpgetongprkb[pqizytyliwhnetg]uknrvmoahsbicmeg
+evyofxtcsyfbjtbml[wjqpsedellhzgmvk]emdpcwxuuaccubksbqb[krehpfhgyibfxepo]imvfvflnagwulpcp[cldtyjrcehkgtfyxnws]gaicllkdzufdmja
+plinmvdjkaswskiw[zejltttlwtcetjb]uqkwaifdtedvcmiqcs[smlzeqfmbhssmvvmvh]lgypwtxchfxksqgmeb[fqygohnnxmmvazctrl]rwbjopgpdkeejeb
+hgxczafqluesrmrtuc[jkowxyxlufhgbmk]zbiycjiafsngeoz[mltnmcbnsrmdjini]wtokbcbelvzibjncpat[dmjqentqrspifbnind]drpbucndawosqjk
+hqaysnyyigyfvzsm[vrqjwqmhiywsbblfrq]wseacbmleqwlaci[eisrrgcmewmlsqkremg]hfqkdkghomzddiaeq
+qrcyyzpfuupvipsuor[ujvnwghyvsujblbiwy]uofftaesrxvghupknr[divaemcywwpnkeejjo]dmgdiifbkggxpzmfy
+qjttccgwnqwdehsoz[dfbrkdapobhqvzom]hqtnzkmtiunvomn
+irxyxnmdlzgxmpg[ityfjgihvzrylygz]qollizryghyxjglce
+bnibapdblbaoehfbvin[kmummoqopswsmvtgiz]isaumuoiybqckfvkhx
+waimkuqinxbmazab[foxenwzsxkkupwo]yjelgjycvabztzb
+exxvbdzpyswekjnfmef[tjmrddaazxyynamc]nambmdtnmfhtkiyqqct[patbobzwiwlidazpoc]nzbneeilwcjqnxqwh
+obtckokgcgcwbtyww[gxpfdpaggfbadjvdo]trethfifqwrfexv[uiucztyublzgcky]msapdqrbpbwxkoeuidi
+yfhewfkbdwvgwvmhqbd[fqginmtqmkcubfvci]aidxbpzcktshamejexi
+jjjryxfwjklxrkhhcxu[gwwrmyzrpjmjtmfl]fvjaxkdviibxaodo[csagiwfbhogtnpixzc]miorozrdmimmefh
+tzpxkatetacnqzombnn[bwzhrlkgwcolxczvcbg]rplchqjvjthsortjqb[oyqjdlyeyqhqtrfbfh]munhcovgrhuwhvkjzja
+slrtmwlceytivwzb[xapqxilotekdngaekz]rzohiqiljdhennylmk[whtwrgrfpxkgqrs]rtlehyggcuplhrfwsvs
+vjregfcqrdxbfntljq[xpfnzsjsmphfbppf]kwfjfcrvygtqwtdgh
+mnrnbytuhhsxrzgz[nzdxekogduhxbpipobg]ydgjseiypncodnm[oylueeldnmgcwmqhq]svqllgtwmhshzqaxf
+xhcxtoxuqumfxatsl[qlkqdcziwtbclcph]ysfpbfueqmlluib[jjvxhqopyhgxgvb]flovcgpyjyubpbdmp
+nvpcfbzmykatqdpgpv[eywcemzcjnlhwhfbjv]gcnnnrxczlzbtufuie
+rhikymyqgbqbwgw[eeitheuwdamcndqibp]aiikebogsqexfbob[tcsuzyilztxrrqa]wutfkolihzuhbvptoqn
+kokyhjebbwniohsgrbr[ggsocxmupmielega]esekvzvbajssesin[ipwqyvkwospydzpmk]byhqabwpjuihcpgipx
+pizgcsuyqldtehjc[utwlsnwndcjqnndpppe]qxzxhkayzcicvstxiws[tjqhoiifvxdzdkigtb]zjquhrplvjxruwjpyl
+oadivwkprasfyitu[yygivqpjckczybxrq]bezhtnyscekflpszt[eqvoapqpfnmwddehqbe]mnkqjstlvogsipe[vmcrcaytblgxyarcrx]nwvjubzclcaxtdmgl
+gimpphsdpyklrcsbk[qphbkjzijutqysed]fpokchopspibqiyyb[owxliqxhpvjjqjzvs]ttjeutzqspjqklxsx[nvxybvsgtxxwagkvg]pximctvjdqxbodwbid
+xmgqacsovxksrfnypy[jjybvmwissplkcttnp]ksakyoqvswnbrezeze
+xoxquvrpgiiopvepjd[xakbfdhgtdrxixz]uuidqssmeiardumqppv[ewdkbrnwbodzzyb]kuyvmhqxititvvmf
+ujuuypsguepvtqiurq[psgjujogkcbqrtrr]ckjvvhzookepzzwyuye
+lwnhrcbjrjqarzdx[jezkqlffqqbioajjbnl]zssjjsdouwbegdbnxx
+jghqoqlqghfqdfh[jswcksaiwouxhnssqin]kqcasjkrnihqmenbqbh[mgpmbwkzuduzsmnjb]dxsvhizedmabyjo[rbupdqkkgeihkywitk]pcgvmkrlpkbqfhune
+eopvqwwlvntomltpv[bwkbunwyjojuxoteyua]arbceqrmsflnytkl
+rcgjbumerakfnebou[qimexcxydncncunkhv]frixowswdjgqndoos[zkjdmnsofgvagtnlyph]efpdksfvricswsrn[vxscblhqnzquxmxw]dxnstwznvmwyawith
+zjddycxtbubaliviw[cwmjgucnnrbsybtpxu]zhmadkawbwtdlnjwb[qovxqaebehomoacpxyw]qctfbtyvbabebup[bwqjuutjmbgfdznqfa]jzitebxzsshsmoge
+hogrxyrrvjayayny[kdweaxnjncgvxhpud]orhfjkslldcjiokooob
+jdduztuhjzvbooejd[mcudzrhxonujxksbibe]ybhfelrayyxuuhuwmyx[lgshxdlzxbzcwhuru]zdkvnjkyhausdby
+xsuzxmrqkqtxmchz[dmgddhaltnlpfzkf]dexcfjfqdnajuzccluj
+ezpxycrcxzxycllpyc[stdgybwrxfzewkqqvzx]sxivpekfrrrqlfhg[nolxlfvwwqvkhou]psuyhkfiyohkogwfmt[zxwiqmslanvyrquhqa]fereljocexswrvs
+aeogravcbprgitmqedh[yjqbxvjwrcrbyneghi]lugbamrjgzqaixjxpa[zpvvfxavievwanxkedz]zksdwfkwtrmtaoy
+mvchajtfbplmslzxhk[pmkjinpckdvwjliz]lwigecrikkyoijkeow
+fnwfspmlakldfdhc[ujbeoudcbtqjmjy]tgitkdutjdhlrkwbts[upqsuxqtzrmwgmbjqyx]ayaivsgiqcuzizeau[fiqnymhyqjapvri]eioouxtbfwduighy
+dcuvsezsqwjnsvlqzah[jjzbyxctqhdxfuqer]wztjqxgjynojjur[zkiosthyfrroydaykyc]ocihuyyzvwdoixygzk[psaghlhtqoptvsldbdi]zxqwrhusqligxnoa
+tjzqnocojjzktgk[omlfecncaondrqrvwyw]dxwuwvsdiehvzqmafo[ihbhwnmxkbkypmum]enkexramnrjguwuxq
+ftdnelzrwzvxobrhjtb[kwnjqdhwztogpvvt]frxznutubezaczhwucd
+wtvnfoqoqvuioaotdqv[qwzmcsqjvpkrudkdu]vdcgzytjsihjytaunui[vxnbnlwvtribvbzv]lclrytcczbraubnr[fptsjqwofyngtnurf]izhrnmwjxwvsdcfai
+nqmhpgsurlnnjikyotm[nxxdysiylpgivpuc]uofofpqgcbojfofja[gmborbfjvlfokmkjlx]yptrgkpiarzgsgl
+polwihnjvtlojae[iyjbafwjoxqcjbwn]ecidvqragdcuotbw[ununcsfdoxstecbass]knnitckftuczdpblih[wylrqjxehihxfvzjn]lpjuibfkwrcmcijkho
+gsvfujdbedschya[owwscbzhfkkymsfy]bbxedxnzigfiogb[sebiwzxbshqohku]wqmnnhmldplmhwnngu
+cvgevjryjbmodqfw[jskismdjblbsjgmhilp]xhjlblnepxqayxpw[pmifrcxnxmadetumwm]lvjmmbceghwqdmk
+jgssirdflqhglgopgx[epcwzeqqkidejdrw]mjnozbbmubmqooiqr[wacqyepsgljjipi]vowguayfwcghbghhoyp
+tfkqxobejvvmglhqrgw[ddleaoforgpypavf]flnaiggwuxdbldb[rqqrjlzosctaouurtsr]bduvfxlomgfdwhxj
+iwhaxbggngkgdfi[xklwprhyorwyfcyo]lbrfcbprxedylzpfjk
+ixorpegqzuxidsasn[pwuwcywpavudpbkmdrk]stfjklbehmjdobcr[ziugachuezezjsw]dzwuijfiexsbbxjcga
+lcstmefgsfxelap[iaroxcldkoxjprhpni]erzoueqtwtyftuvz
+gsnvneyjuacyhipd[aglvnvpawajzbbgk]ptnrpilavksgzjyyo
+frxawoaynynrnxzk[agbtdjypjtpqskh]ljshzsnnynqotgog[ckariglbjzvbcedrap]sqdkygpetxuwfnk
+nuxleplcklptuce[fxsyqwfblquzwqjw]ndnvzriqecbqphdoc[pmvfypuinsxgglg]vcgzvoddzudwrapmyh[laengialdtihgzitt]ktbypjipfpnczyqw
+snghsdifwlabsbpzw[xgnrqjnhwdqkbhowzaz]cygljjwohwpzvxuaw
+hhxorrjxjnhcavt[lkeigkktbiaquqqh]ernbnsmtunqyccft[jiespyeonlsjliwt]vbhzvdhvvgsdgijg[lkxvfabwpujiaeaidj]dkilxjpizbzeqxkzt
+ukgapmfifvftpexnr[jydugqlbqyhvbsmoxd]kwvttiyqdmyaxidts[lqfofueuycoihkxig]vqbdiqazwnqetguq[fxhgbqqsilfcaflj]oissblxkisbkmolspwp
+hanudfleaqpnnykwfu[kllfsqanmahiwkqz]mkyztkpwilxirukacz[vnwdxbzbjrcvmmbx]lsjlgrnzdilnkxp[hhepketmdumjgjjsu]zrgaagprkrmgggpk
+qcaodhkekjwrjeu[bvbkikapkhneodeaqox]xxshbrfdxgvyabbuj[nnyshhdaogsermyisk]ieutdajlitenkmoh
+ryfcblckaejcahgy[kymhoizkyffsxybzdta]olmhiudvbcfbkjb
+jryuwyprwczmcczi[vtijzvfbpssohcdgv]qizkalsooznmasljh[sdvwxkvydoikgjtomxh]ixzqpazdakfwczn[tyjorxvairghzrqi]aunhzwxnkjqryibre
+mlcynvuzmmcgoqkft[fkeqzbjanvjoieooecy]muvosxtjytdkhuh[gsdxscdehocmajsnhn]kvqitwpizpjwzmeb[kpnyyoozocsxurfl]obfvxcgoavxoiyy
+tunaljqogcgofeh[ivxhcnvflsbnmktk]akwwtuwpdpbnesmrklw
+hicudrdjoglrnongron[mxaxjxojmjgutxg]tbetamqqcheyjbpa[itozzzbcpnyerpth]brqcvektqfaxazdfivl
+pdyuonakwvugssuduom[swhnhhzcbkrrpovuomy]ecfconssgftuhtwswfd[mjdgnwmncbjoxlinm]oklhmwptexymbgyfdaa
+hcxljuahgmiolty[kulhszpqyvsurma]xwknankkjfsieauadw[anajqqpwdkodeaagy]iupvtabiqsykmohiisl
+qruhviuomiixcoarv[idffbgdhamsshlinl]ygsinapdnmzvgit[xinvdhbqhbvqrjx]zdamlvlunjkkhof
+zyeynxvzdmmiybab[vhgjepcwqjbolwnft]aopzcryhnpswgmds[yynbcrcgegnrpsk]munxtddzxyvzwwcosq[igdwjifdopnhwzv]oyebiutkmraayzr
+onkgxvprjaynfipxeum[jjwmjcepwxbleahq]ofvhiwoyxmfnjbn
+jdwjapulavrgiviora[vnwjfwpsfcdkhamtg]jqcgsuleganytwsm[qajmdsarjnocjpq]lxpalpkeehxjdslu
+mzyzoemluwoovah[bydwxptnmzqxdqfgdgk]hekhqzpgilidwvpey[ouhnrujqyhnlilh]qjarvqynycolakyiu[wzeffbptmwixrmr]bowqsnjgurjpkuc
+jawvxlepzelbjymcke[atwksupwtnjjnkwe]xqqcmguandaqptp[yqsfhnssllituzzwa]xbgaqeuqtnclehgr
+xumjolgnaowjdoq[obqxrncwytcvrsa]tivvsxdntkrivblx[nfiworqsxjvwyki]nxnpoipcjqeeukx
+svkoyidvkhkvock[htgrjltotuunrwka]uqyezwkltzsjtaysa[tqaaskeswcllblpnozj]yizblbkqgvblvqghvk
+lfqasqaubbgirmw[xxpjcwlwjsklklgyrk]fwckfwwekdgcesswh[xkcxlxtanadezjpva]naodeooepetabkh
+mtbhzeufmgeskqsp[deibjhufkntahso]oxebgcgzvpudozi
+epuzizxnxpmgjkabqfb[fmteazugbgjgozgsmhl]conlsruhnwdekaxf[zimnpzazgotaghhaq]gmkwnkivobskmeafcck
+epbvuluuhaazalp[dtsthsijbzgbvwzwgpo]blfatalfityajcpmyc[bbypikyeizyfntdt]tcnzahhiwutntyt
+vailqzvutssuxjy[llxrpxlpcojwmab]kqpqrpogogkpefajeuj[afzpfhjmpnestctyqz]mdggrbuuglbmweujgxl[qhheeepqrcbdfhlxoo]lxvrdwpugjperwt
+roreocnumcerxnrhr[ricaoyebqjpgzazssc]xzuqnzfgbrcvfnmpcgs
+uludakjsmsamkpmy[ropmbbvjvupftps]swngrcigiqzdkie[hjhbsazzxdxrseczxyi]pjymgjgdksaalxbav
+ftvggoxgdteaxbrq[tifvvmwnraoiprgs]xopjvpddfjnbmcuxpu
+buzursiffpqcwnlsl[plvkitdlxiyiotdk]anlvhgektgbpslsiai[gdgwwvjcdnywwguf]bydbjfxclhxyfgruke
+indbphvhghzxsuy[izgrijghgwhcooc]gkaqbcpwwiyfwmv[xxlzhbqmxquoawq]gbazvlthqbviupchz
+qofufmkbljfygwxym[egvtczslvioufuzsyk]uscakosnjpjbcrggach[gnyghyvmgirmwolh]rotkdpwevcsipnxjokp
+jwaktcuuojllglwmr[dfntqdtznawzmzgwbj]gjykvnqmtzelkaus[eghpxrcnnhijhev]osfvouazhsijprtbtnm
+rqrtzzgqsnzzfntl[mrleyuyknyxyjhoibf]mwxfdxpeiyuhjcbdyi
+xgqwglrrdtupbjlmy[ayygnszmebgddghqg]hslqxsvijohmvklknkz
+sfqhncgimlzgjqs[vsudwekhrjuwjgig]fwkpceyrznigiwq
+bellebgmjpcruwv[njhctgeptjieourukf]sgybshminsxktqlfxr
+mpwnzwvblaseycnljze[qhrfygccokretvo]ydomrtoamoecceekrr[lgslvkhwnmsovxvhqhs]cbyuvbrusqqpvkmlhm[wrvxwjyyzsvxvxwpdq]amynjoncmemftlnqa
+iniemtnmqwdmxvpicqn[drdrbflsylzhzltq]orjcjdsbzijkfwhdhz[mrfovzdsugacpyvlaj]azjikxjuaszxpapss
+ynnxsnsrjdaqbbaa[lyifxbzcyzenzpzzulj]xejnjfbuykeojbeatvf[uhpeylmwgllqxtj]hirppxrtcuybulsuek[tzbdcyvsbmqtrzbakxj]kzpsdszfyuvgbtlksus
+ujrrrtdxpyhlpcyxs[molsrkbbxoexpbqhnhx]aesumqacmujuchpxv[jlwaktyumxuiyvt]mmwjujsvuvxsxxmsfr
+uehksybnnztmczl[suqgywouppzavyoi]zbndcbjuexdgscb[cliuxzpullifofbhgy]kupndcjvxqiavpk[hqgafivwddbbepkvjj]lrqalseezuhjjbkese
+djidmbcuqbjpfolm[cbbrttiwmetodejw]ghgnojuvsogrchwfp[qpikwfkqkfphshxbmxm]gsinzrkbzacyutlxso
+nvvjtnsnglopvcmna[opnjujeqmpgipfm]rudoacagklnjajjye[fqrtapichjqkhhf]zpkowfxfuoecvzq[juwjiqcolafbxzsw]fogkbzmrovqvbxbxeb
+ixciqkqggdxskbso[wkjptmoonusnkzyadmx]tvbhebhhaqhopjbjqht
+gepgaafxcogfkyecgs[jdqmpkhjkqefzkwxglq]zfpkqukaelflilmzwph[fndatrnmtrwgbwpj]bndevgsiouveums[fqxvkjthzmyryobt]ywgqodizmhsymako
+gjlyyrwgrugaulnj[zwsmlmyahggpvugef]ppqrrbxasqowhwz[ngwudjmonpelxhubwnj]ucfcaicagnbvlboiwky
+lfckmicaonarlbnu[qnigowwaziwjlmf]ihypnqqozcilwpm
+xmtcgkcyfjppjwaa[jlzhrxmfyfjfmadttpo]vucnncbadihuewzn
+sviknjiphswrawyskzz[vlsdhjduekvalqgwy]qlvefwhnwmxrzgxq[dwnapnjsuiowoqjts]pnepuekbrlbsswijr
+fknvwkusyvzledp[qzplkidoxmvxrxcfs]jxdhirqylkerndfd[vlqmngoqxsbmljcle]rtwemwvqkpfwfri
+cujhxofpcjpskrgn[jxxgrxhgnutgsusruvy]dewdqleqewbqftd[nfjzhgvvqummwzhyd]yrccepfnpbehqei
+dmfygizbsbrtgnzam[xdnnacheufcqahvx]rxtljkenkwxgkhrwos[xnxicyqemngzgjp]slcfzksterjpmiz[okdqdoipoqwcoyfyamu]cmoedniphnfddoywbne
+oafdrqypmxjzxbxutj[yzlsdipaswmgyay]xwllqynhfregxpwc[tjgxnibylfayarir]phswgvlkkfjjetrhdl[pkcutagssxligtwbd]xrvonaibaytcqnhgc
+ivalpefzoxwoqycavx[wnrysytaesivblx]dblopqsupplgoom[vxtobrfntcvixltcb]kzktacrarmtwuhkcoin[eviwodeyddmsfkvhzue]drtrnlgrndrxgcp
+aygkprnkwdzydlmww[firwrjxyrnqlvycccg]lcqurfdlcrvbzctz[cxzfxjybrqysasrppqr]domoafryutthljppcg
+uowwwiqusrqkpamdm[cppbcnmcxpecyoey]ndmdrcadjoukusxjfl
+mueapqgbxuyuttzaw[eojhbogjbfdbhyqjp]sxsjeclolvcjexxvxij[zugkiortijshaocu]mfayspauxoxdwkbj
+swusnwjcduzzhsjhykq[jhweoafdbntsmxcg]fwqrvlhlltfeygpcnyi[wzibgavydimypgdao]ocomuevbncyimhlbppq
+vzatvkicsxcmgcx[lembxneuonlldqupk]svfxiuungebjjgfre[ijwzrpepzkmvdwrjck]bhjiggmcfirhzyjljkd
+nlauzkixeqoldqwd[dwvmcwkqnwjlzqscj]hnnwnarbtuijzys[umpmhpnsrbypmpulhf]nijrnkqfvbyjfvgseaw
+gefcvkqyyecmnorr[unfzknqltdwwrejeix]quyfoemcjnbrarjuowo[znhhaogjluucobyvq]nozfnuqwkqrcbtwujxt
+keerveohuokinft[vtganysszjzosaco]ufsxvtiyupbeddibmt[wrlgimiwaspamrdp]wdjcaxuqikgauum[jpwldupwbuuufjnx]tumqrmftbkrmohls
+rtgtdqksqxgvgxadbjy[uclopjtrzpccvdpjq]hiqaonacbzvgvigg[dirbsktzndttpzmtznz]laimumxqrcnhoitaokp
+iqthbpkfocdhsvzje[jbxkmkvmrbnqjwlp]kycbbizaasoayspojv[iojspytksdfugqsqhvf]dlkjrsotrfugfft[zuzflpijcwgbioujw]tgyhlfclaxcsjnavdkh
+lmekqqiuknygtdo[ramnjnqzfihksfpoqsv]jhhvgphkjifxgap[dmpwxrhmhkwfsfgtn]mfzdjfhxmkrascd
+fywgfyehgheiqhbayw[ntuqlvjvldeyzokdepc]jrqpaluvezoujks[ijkurhccihukzuis]cljvkxweuvldevt
+udnphzgdlussuatatj[phfqqkmuhvlehlo]cyvspnwlrcmatbwoua
+lozehtimrottjudo[krocuifdrqwhsmm]uhauuuzfssimtfl[lyshrfrnvlueierymi]xogtepsflxfwcpau[nurlztguypvwjvoldsn]yxwnuqtvewgmlbfj
+qkioxzfrxxwbcddg[iecvjowpxnrevqrhl]qxpciafqndxasahsvoo[adfpiuoapzqsasajd]lduzndmefgsvzzdpmcg
+klfxwvnampkmmqjmfc[pcaeswcdleyweirmxpv]jnwkgamdjeoakjcnuep[hjwzdndjlvqfzkarwk]ewwgtcnyjuczgmyif[eaaehzgwbkdfbcgbz]eeioocxrjsulyuj
+eptlgbashiewmonaaal[ohtsrundioavfrouii]aydjhcanascnanbfzvd
+ikhfkzncdqyitenbg[ldqqsrhumdmiraztslw]aydpjfypxqllkevec[aponlfgxnzgcaddwt]yxlzqyhbilnsgjen[dwdrsgergyrzumtlpvd]srlqivkdhbdbevnq
+xpjwxwgiyzqfwajto[msisxrvzebbtxiv]zkuujbuznilsymuuxq
+vkmqsygowhcqzdxlslt[fnaztaplxaputnm]ykkslsosxwczlrwbpmc[orlhcrbdjuujhaj]odtfvozkxuwqdpsm
+qqxdpjpmujaveczctbz[gulkmdfhbgvyxuyd]jtxafmzqwqxauaxjt[jgfnrwhgdtkwdfgt]unidfciwdvpazpgfa
+lfcczmpjpqgqonvcvb[iflurylkaiuflxp]dbepqquyeagxsmrhbwr[vjjohmujkozstni]suvejhnfwknjusxgxwr[wkjnfmxxzwulujmw]qyawlzkyazbwftlw
+uwmrxdaxrlsvujdjrm[dmdnqcmdmnmnhhwicwk]uowycyvqvjwrjgtpfqu
+zbxlifyzwnwujvs[pyyyjxylpmpwgbh]iutvnonqqqtbxisfopf[qevehnvgqgkyfuqr]mqrcuibiihlwdrzd
+rxlnsbgsuofdjgifrnu[eougczwqhpbyqjpo]rokdsivylwcqepdyhfp
+yhzwpokjwnqbwtsxuh[ekjrlmzyakgkzlemnxp]gbktdprzdyhcifmigxt
+ewjfrgfxriqmbvczdtw[wlbdrngfgnwdvkt]vxgbaaggmwndxlms[vupgwxfgfpxtnen]kfeekrdualqqnril
+awkkejmtiopfrqfasgn[alciuobkmtbxngulv]qlowmadlrlapsquuhw[hhtlyfkusvlwunbbjod]seacetmksrrodjqdffk[aunntgaemlyoabfgpf]yrlrzbdjfejbmskdtrz
+uegpnmuaxvvpcsuzi[pxcbpsgaecuqyhvov]oiyjoyraxkymelqg
+ffpelsnrffyfzzfdb[ymtulkndbgguyivf]uauzvyseztbkdvxow
+omolchhfvuuzzbodx[zhvhxrqwbdhfwlnn]wyyrsjfjsfyafjfpoe
+puihcjkezjyjjfl[cornhtqjyqlebvqyl]dbemzlxolqxpzoi[qeihkchqoewcabbwog]rlfloutfwlcjywygd[glqjydslofkcstjxd]oxcycaaadlnxfkl
+hbxhlyelfyszkzyc[cdxcsyocdiifefpytl]wxefesokgwwvcrp
+vdqcqggyjstyefs[yiskvcmdlbyuwzdom]cwmntthjhfyzlus[dpoubuwkbwrkpfvlgf]zryvvtowakcyclcg
+kcpbllbamycbuynia[duyxsbzyzibjwejygq]mszplxmgtkqorlklg[kkbpzdcqtwkteqfpm]nvgoipyzmaxtizqkxk[dkjpvseaxvosmsh]ourguqaabxzzovsn
+ovojqexhiiwdqunfvpy[ijzonrwpmtbftrqgs]zkmuxgcckijagmj[oygvczrrilsowmxrcwq]jpwamodaidqrzmal[yglvklzzljuqykuxte]cifhyowckekufubnmu
+hqsemgdtjpiikngtrd[bqryvzqcejlkziqbeg]gycysifcawyjyeu
+tgdpvbxtvxlyqvouu[xqefdugumgqctwvihz]yxymyatxjpknmpb
+mghmbjssqzjlzlg[kilmyfmenoqjnmwg]hzuujufmwyperhvdl
+ieqarqlveeycgazb[azjmtbkbixtazbcv]xroiknhtlbefpgh[xnhgnpluemfqqkxg]okbkpxswfoikufwzazc
+phtjaokeiocojxb[snjwozbjnpwckhr]cjwsbiopkgqjjaz[rxkobmvupvjvobifvx]edubeedqalxklpb[nyfuqcxwtynmofmfg]zwdaaonmcoczxvfr
+fddrwtloipcoigpruvm[nmnolrurottdlkhfwzy]dzztqofiytbyhhzwsy[ovdmmhigvmzuuji]jirdnbaefkkdpgi[orlijsvzupzadsvi]mnmwussnnikjigkkr
+gspafobrohvirgeaxdq[igehxnlnjtwfcuc]aeibhshuiyekgcymyty[xhoayxpksnfvdzjwh]ktkoteqwnsouvwcftyu[eqfnhshsnakdnxwonzz]wwfzvzaupuirropirue
+bpyvotpfgrefzidpn[pyvnycicdpcutcayrv]twcjgpggepbtnute[fdumsgxervdixwv]ydccutccndbxxfjrxh
+okzxxrtdrfviychsj[ymguzlptohblvsj]ofquaojgbjuxhkrm[ingfugdcfpjtyoj]xwplthdujgksrosmv
+jbwwuuqkuwrrzxmuwh[hxqptnyqwndsntckqex]mgmaotcyybmuihu
+rojskmdnydeouqz[cdmuavkcabowcozhe]znwaohorcanpbyhjii[gkpcxjhxnhligil]qbzwurxyzdakgsnwvh[ettfivzqkrrenpxmsj]dfbcrgpjbivcpcpcoqr
+iztjhisgpskdgwxwfdq[avnaibsrkfmlavnyuce]innbnunmtkplvdhq[lxexsvmjqjzpswjyrju]adcnelughetzceb[cmafkyaouzplrel]iqhabfxgwxdrqojp
+mcxijhkidamijcggv[buvpvujncpcwxvvt]xortwrcnebozerevim[ylisqiexudovelmczm]sophxrbvffupehspu
+tdbjhtyvoiflmgdt[lbwyayxikccooiw]rbhpfinzxpaayibe[twvandevzmehmiiot]npuymvedotdclzovsq
+jtfyyycvwwukxvfbpq[acoshjowooeituuy]xicaiqqcrtpkwtu[lnnokqhsagantfsyl]kchtjwkppjyxtwjh
+vfzsxxvmxhdpjrlm[wpzhdncopnapfijmlcr]lqhsravxxgptgjs[wwyuluteptkhznh]tthklcbbtbvhauug[nfplnscrhldnwtdyzqe]ockiyqmpnksijbf
+dlnpcnognelscok[ibbeqsbqltfskgcgqb]htrpytqxmucqlnane[vtltdgsfjrwohtc]sbykausqnffmqkv
+kxnaikbdqxcponrlivi[pxltpufeegjrawwanax]apuwyiawecyuqhgjc[vtenugjmwgebqzdt]jpstgvxeivppyaqwdbh
+bjnvrqvazthxmzqe[vhhndcvzvvtdjpu]xvyoyqrjtbnonsstb
+rglwwateiuipzihomf[rvlceqfsjsdeajp]umwquiuviykogvs[nyxtxtkhyplexemcvjk]kgqhfvraxxybvapgs
+jfhopiiqntjmgdsj[lrijxadhlagitvp]uiwltkpdmqcvklmj[celhtexfpelokeyl]jucghcilfpxmuhsxlj[lnzbuosgycapkcujcsq]uipyywsuzrkxcxma
+zbczjtvnmirbqohanm[bssrqrthbgrtjlfdeyh]sajloorydqhdlpfx[twqasimfthlutzbvc]xdyjyaewqxknvdz[exppwmacezbuavlhe]cldjcsqujgldchzigys
+xvhlvnfixnvekmxfzr[mnmpxowwvahbtuiltn]facqroxwyyelgbeupk[liawlvgwyfizmas]yxgndlsxircarikrb
+yjisbltbmhloiojwzy[uiqmflerfnevkzvnfmy]kecwgynuudxejjvth[joscliommzmbkqcqa]pwypdesmkawikue
+hsiwncahwnipmmjwspf[icngtprynzjdnsgmh]htclvcobutyrczggpic[saypixczichbjeve]jmpwkwrnvhjcpglrul
+aagdbakqyfriiolq[cjlhszgovtyhykgikl]excahvgfswdnpezh[typkmvlnkgjkmherbx]zuhrtvvwvcvhuzalde
+qdunnnxbbpkljlj[opuhjxcwbtvnyzd]gqsaxqcmgmnagnim[sbbkqokcljlriqvwlj]vvgscumyxkrpmyrwz
+drtuyztubzingcdvpy[ichljckfcgomhcfah]wpkgosokfjvzabii[gufmzunfeecjsbgg]pbtuedlavgbxdqq[vbbhreveuzdzbjygt]kglhdfghynsujkvnug
+iccedgowicdllievwww[jrxauxixbmexkgfvvz]fysjaucelduzrxp[kubsdwfsoejcskemvl]wszejdloyalatpjq
+oujirnbrjgnlqaksps[lphfkzalpspyhuxf]kuscphbgysuwhwyhot
+vwpxodocwmfhzkhyf[srbxugrfpcalangfdj]bopxssvinpngkthdqyw[vkkyaqsjhizvounptrb]iiwhyeuatcqnojoidrn[xiuphhwusooiewosd]gggtfejwtpburzqyr
+ysoiymdfphxmwlmlbm[nudcbwwqdfabqxc]adsnqcsxmpxwrhdwp[kullnmgtapmantsqr]ykmzsizznrmofzmy[cxnrxafdhfprlarkd]pffnyurmoaxrpvd
+pouuuowcgcsgvuznt[wvbnsxurcwwxhkpdg]oncpjgpynhzxyvi
+vlyfxbogdlwgzbuy[bkgdkemihxctcppam]ckevcpesenqjadifwz[smxfhxaidkueomhxyc]qwokiceophbpdyjovvy[tmzeqvagzhvviakrh]hionrvofdutctqdb
+upsxlrmcnqiikdzhlcy[hehttqfmtzwgrmxfo]irippmddtqadjgytw[zkxutgforgpenbx]coziqjvbhjetosrtek
+oewwtzgqsoedpidbn[rjmmegjghjfposhp]tgddsmuqxnvfpopcg[iwwvjgzvbmkhcmlhm]teygdquxhyhkrtiyjse[sknqnxtiutqtavvf]bcqiwxuliuhpeto
+pdejprrltzgdddqhod[jgwgzdgvdopqgknwbqt]jaxeauvefzuvvgxlid[fpahofmhzzirjuw]enbiyknxsjhuxzx[bicvtjwkkhelcgebywj]ldvpqmpgzvihjkejl
+oazlgrzhvtekbje[rcnbajbbtikrfapsnuh]gtddpwaqibjnpmfhp[zxarpxagmnzespusnm]svtfacsjwezouqnyfa[ujbucyylrrvuijybde]bgumlrbysgompdeo
+eyescsulrvrxyngf[wpzojptmtmqywwvdz]oicscctycvplkhsb
+ecwhdlfufxxytti[tjpmriwkymqufurtux]kvcdcihmfxydmxb
+tmlzauuiszcwimcvli[vnvyjnebqbpoaotvcre]eupqvhojcmoweveps[cmjkegzrkspdwmdyuo]rjcxvzssaopikbi
+wmgjjrccewrspnkcdg[kqagiunuhskruqpsmql]histajgekuklfzmu[caldsteatfkgwqogjb]hwweftyntccwfmw
+lvwovmvymkxwcvuvuov[sxedhxpfwkndxgtwn]jnpctsvjkqsybbfy[coophwmyxhbhjjzvf]applfppvbrejnvz[ipytgyblyicrnet]ogktxhleyrrhjwqqt
+xuiednrxcdyejmgcsg[mlmhqtzingaekkj]xmvjiydsuffmteb
+zyweldtmlathqbd[zsskrkndiopdfqocigx]mpflfwtncuwjcnnvhf
+chmlgfccuyimavif[kpgcuavqzwvekmahgxu]zrrkiipozbierayt[ooxqyjdkmmuaonht]qhifgfwmnavhlgnz[cnbosuyqrbqiuye]ksvsrroennhnxup
+agxsrnpuwtpthaijwgi[fhyxwctpsxqkkypdfie]craulpcmyeifxluxu[yypagmcumxjcraxnvpz]zdgmbgteapcjwwzaive[rowspqgmcvqudjxm]qydbkwdeuraznvzzno
+rhlhblmxdccpvudu[jhbawwnkolhlfssiw]rahopqrzbhdivhkrl[sdyjjbmlxlpcfabw]olocfasvuwqfxbbynn
+xzbhnrzyvfvbrodi[kikpaqjccdhwfmjps]tqeliktvbjjnbpxwtq[jqjvumyqcjodqippp]ufaxyqyvdhjxccwbsfe[pxiqyqpvccnocmbinr]fqjralzkdemnowygd
+lvbihonzfclpqyijtk[tzokuoeriylwwjahfud]vqbyrpbchllhsmeodxl[ktbdicmiebbpuxnyi]guxcypoxyjhshqgshs
+nnmyoxtukxhrsgt[ecovrntpmkcaekonw]ncfzdxdlawbwtxqpkik[fkkkkxidubuatpihcnc]wqxmtvyakouvijt[tjvyhgempiufanh]bcibhdmbmbmmbyyi
+jjyiltmpfvlkclthbz[icijdepekvlffegr]xnmbqmdiaskvieeudt[clfecicrgtuxodur]kqcqrnvwfdhpibndt[xsieatgypudmiedmfo]eqaouqptjuohpzbxml
+waqqyhmfacfjbfasug[mbghdrtwrqihjje]jczikhpsasvutpmb[obwkagptmpwgjbhev]ozwfarybcfhihoku
+tocybmyipesjprx[jdsdjyflopvltwsccxe]esswfgrsjawbduxuu
+qwdwzgezyklxtmnd[uikylllxmtfhnwh]dmozabuomdvhcoz
+tffooggeeufibvgyy[walfmmmfaegxaua]woxfjealuwsjajkk
+aipayrjoievpqkqcb[pcnirwsnebqijke]ocpwinpdigoxudcksgx[vvuxytomiqmmacndtk]lkwmarnwqvzulsxofid
+jwrefdombiesxvvap[fwhhajyhfaqzgym]gersxvbwsbqezoxcg[iaetgujgempehiaxx]llbgjukufbvdfxvjs
+hexdafengwxaarjkqhe[brxnqkfcyltwlxc]tfqwhqspdfcgajfzlak[shtfaywffbchkkk]txpanajvkwazozn[jzfxmgozivlbctstlz]paxycypplmjazycksx
+rwttdrhdouzvmhalwc[ozryzmmhwztywhuif]favxmwzmgawjdmcho
+sndufqsbyhdkyathrxm[spluzodshkuiqhrm]gwctupgaumdalep[urynlbtsukjumpcrgar]mvgkstgtaxmtiufho
+miypgghnpfhpcndife[uogotzsxnulstsucja]wrdogybnlkagqdtv[uerlwvvqvxrvtsaycg]bxpngxvmakjdvvdqfed
+hgcyvldphesdmdma[inomdckqkhupvxmc]avlnivtukipmdmts
+vgjaofvwaodncajhg[wmqzkrqiwbxdfsgdc]uzsywyzfptypsbto[lwfowjvhczggllfrw]nwchgcixmkxheceuq[eanuozoreimfpjooin]btyiwwfizhdbpfazpjx
+ldsqkerydfisskoimys[ltqspskmalvyujfyrqt]dtyknopltmnvdtc
+ekrdpdzvkoxfkjfpx[dpskecmtgjtwkhi]nidanbsojuexjgife[pgpitenqczwzafdad]mfcmnjodtkvhbknfto[uutgojscjiffmofegr]rwirhlyejxezndbs
+mhsngxyweukngbybc[uiapxfrpfptauhiw]ruywrhlzekcudjgkw
+urxtzdmrfedalnuuha[ioeyevidklsxpqkaahw]jhcrcdzwljhnudk[dfvcwbualikbxihqg]rhhwlhcfpbkexewpgn[gkgaygbsxboxypxbq]trsaulacafchpndootk
+jmlhqgixgtfbcxyt[vhwpsfjufpbampqyqa]wwzszedhhdmztex
+exilqpohtavxypsco[wtjdsrkpmulcraoaooz]ozlzxumlxhyyvcg[btpzjjbgjlydtfq]suniwwnwobellpbwd
+glgwpqmljnfxjwsgae[hdnpgizkkafrkqfalpg]pskoghwqhabbrazqtgu[howksatecaqyemgxpye]bvrcfhawviubspmkeon[qciouynjddffdlp]kruofqzvhiaqbtm
+ekyqqslkiuaxpucbsj[nsltoiyaeyfkygmtaul]eryfelvxmeekndddu[waprjreciavpzzsj]cppczdrntzrrqpk
+draegnpszalplun[jwpjzjfpanpyqcxnu]lddilnitonnehft
+afwslsdmylslwvekv[ngnsirjimcteduhmbia]utirtwchbjinjtkp[xtdywavaenpcexfi]fsxuipobvivhpowgioh
+zpjzyqnadncjcbgulq[wtwvealiuqmxtmgbsu]wyjqglyafposcrwxue[xqmgfmbrcdcjfmazd]hjcjhoqisrvxdtiefm
+nlchdiedtvmvrwq[aeqiwviurvdlsaxzdy]vrjrsalrqznvzhwxpjv[ghsoysknlxlzbqjv]cwklpwafgddnupknr
+zxqjiqwrswpnotkjm[vdlwfpqexfvgzxjbsdl]avnrytuqubaojek
+oklkhatqbeccsctaq[jfvcdwlampkhgkjw]hwnefdbhaixemttbk[xbnquvzqozdzbntm]rpyliiqlbmravsu
+dazldpxyqjgbihafnl[udnqydjynzfllmxayne]oasevmgbxuvgxtmurus[alpxiujmrobllilgb]rrgekfumvabcjzmh
+zoojpgbyojsophrflji[bobvppelwuyynrwinzj]kfsldwgeqtbvtsfy[icdvpxikjxhdaipte]kxyxztmtqiksvidn
+ensxpontjxipkckasr[bdikuxubzmiuhsb]rffefjgowtxzjltz
+suqgbqjkbymetile[jmgtojqeprpffkogv]pnffnorgbyrwddlm[pozvbivhruebmmjwogs]fuleotnbbnpuqre
+yjwcijeeaqhjdmu[emqntgsefvphvpc]hddshsiudkvrzghal[aieudiuufjmtihwli]bbytteummcluoygddky[fbkfhkdwubnigzvl]phfapgcqrshmwis
+fbqpgkdmhvtjmkepui[harjpumdzotcylumk]fglgadntxizpjsy
+iforzbbzeepoddbalyb[cutsqxklmoljnexuaxo]ajmokylzrakmmlxcub[rximbemhrndnogfzf]pokqtdgeipqlswvrim
+umtkjkgoyutnxym[nizqgpcfftiydbqutr]rzgvklegcqnetqkg
+zdykayyaybkihcyc[qgmrngcbixqqdbvx]hcicjeavoycywax[bkjnxvfknauougpe]xjfsxnxlgixldzb[thjemtygmoazibfsar]qzdtbduakjdqteckq
+dwwceyrsaqrhiadehmw[bushvhvxdeznysxjr]hnrekmeoxifqrsq[ynfaykimagehxbcxhka]ucdpjqxgcyyhvhobmdj[ywcjwcveqtzgqkzx]poruhxqfxuyhgqog
+mcxpgupgbiznbdjjfzn[nxackwalqammtynl]qnrwciginnlyfxiyiv[hvovgilkgigolcolf]fyqfptzmgmzbgkh
+kwzvwimdnfngglsqk[tvhytletnpwmogdq]zjndivdpftqyecxhnyi[iiqioqsyphxjxdy]diyppzzxximnlgyhzh[ylyboefbsjwjkkxbar]fuvxtvpoyomnkwjwsg
+vlcyiigmifwxnvcdw[enlnmvlfghlbwib]lwsaxkcpgluzkmx[kglnyaprvaagswvfg]vvdeqkfdrjeqhfp[fcqxurkfmmorcenve]copdpqayaaolcox
+rxjfsazvypysbra[pwnsoibariykvjgubu]nyuqsygdavnxfakwlm
+kkgyhdbiwyexyhxgd[aigctwltgdrvyxbs]xypkkzuhuzpxygupvcz[lwjjxozwzniiywpv]koyfescfdlnyzhcgxin
+cmgqspcojjombguppb[atincfnafdmbhtgzk]bidgxkkmgvgbeilvk
+fphcdhkhetqucchmtm[ieoeogxnvdaxsayhc]xeigwycormzmwgf[cllkxjnlkjdinvouy]ammsmdyoyvlpldkgy
+pjewtnwxajalxzrw[sreuxtjgiwxqmsfkj]nghqriebzmyhgcgoks
+trtaefztlkjjzbxpip[fgpnmiewbmzvqfxoikc]wpemgpznkrerwlgr[ptjdchwakbcdmrjwxnf]unaxvqinaglgfeoi[ekfifzrybpfkjiehpsi]bxkuqrbzgfctzult
+oyuobptvcbpmiiw[fhefjfnvmrpohae]uykwxrtssawavbuk[cyabwfmaxwqgmudcmpx]vahdtwpzvebiypwjvq[twtyrryywtwsckmff]vkmzcehpgydnorxo
+dbgblaadftjartioq[avryclynyjmceujmy]nsqtusikmlamzfht[qmvmgeprwbsokvbzmmc]ddeuxmektypsukme[gqzmpenqiqlihjqoceh]fmsjcayltvsxycmzv
+ixacedvqlzvneoqus[zmgeugtrxuidpdtzzn]besixpupznfgvqelwxq
+ausrpqkpblrplbq[pzqlirofwbtvjvoua]yljvwgnjvjehsyjd
+dmreexcoqmzxelfjeib[zaghgfbihozktuebhb]vdwkqxzetddhhbhhyd[smjdjtmnswvdeuyt]noyncdtfrtokngqld
+akpixaofgmscjdmr[oiothmxmcgwvxmx]yjiwdlhqlrqerce
+deyrfnzcctnmwjagql[qgcmtvfvpvvdminuwa]tynjoikfebqrxgvyehu[qhyenmsqmxshkvcmohh]llpblusdcqfywcdq[ikngnvowhnvaiwno]ixndafincaxkyqwimq
+rjcoodvjnnbhxnlo[spesoflcmfcoifzosgs]qauqixapgyfzvtjbpee[zzxomezynqnoeue]xpiblpyghkxfueapcm[qotnfesblvvyrnsu]keguppozqkwfxlf
+jgrowursqweqfwxbg[rfyvmzbkacqjzooslnr]znoeuzryfguydetugz[ssotfccqiuilzfuexd]zqatqqmmdnuiicv[mkijjomihqrtuiuobl]erhrjzotwvvpqek
+unyrjnckltxyfxyj[vdlbfpobsnokudzqab]dhhsatcnsuifpwsqe
+iscfknfmwdnipkvxcma[shkdzhzbrpdpacel]nrbkhvxfyoslwfhkldm
+poxfvymkfzuhovx[wyjhfwnozjdghzuenkx]tpldycstgwuagjrz
+taqbysrkuxvxncweld[vquzvmysufavywl]irixymrfapfwvnorzx[wznvlqeltnvzjhd]wgpdkhhoypflubfznpa
+veeytotjubsezxvh[mlbakwdftkyfbpid]qehdyxzxctrdvvmpil[cfnhvbvjkuqwyzgie]wxbvbxibaqoefhzkimu[vcdhqkaxllbdmbuxowp]ifrawmsqulaizxxqytk
+pbwglxgdiijskqrksnc[xryasmfvaqakaovslr]wslyywaninmrddik[uhieoolqnqxdmmltpyp]sgjoghttawugzcwzstd[zwhohshbhultyyoti]anvjcthgqapmftxhe
+wmqxexytqfmdfgzkw[gbjexhyoufthdghiibi]ejhfohkfsaixzvtx
+msrjuadzrxxolmxfxq[slurgkvzzfgqpnwdhxg]mhvtwtqplrxzvrmwtw
+vzrfylnagvwqrbukxkt[wofldsbvtgzqsfxbl]scrfvyjrwyqmrsbot[bngltozaybaghfij]msdphikahbxebdar
+cqpwfhfmgioybwsq[judebliwtcirgrtjcs]zrprctntnwcrszilkws[qwoaitshrtavmpse]zubuyfygpgdycnytnt[ctkvsrkjluwdqeeyku]ksncsilzwvkwtmn
+lwtwlwmtqtjqiym[nxfgdevoxcdimcnb]koarjfajilpityyhmbc[emidtlwzhvfmrpqbhik]gsefmkukbjyhgdclj
+fesirdkrgznhplitqo[erpgpujpndzzaho]wqzethjbporhxokift[rwelvzaswcwwstny]xgqpqjlcukivddrlv
+zozyeoozrjrbdccroq[pffesupjavtnanbmhae]gatiaxphiwsrnnwloj[viampjpkjyrhypjmto]vsqwksazgcaggsv
+fycnqvxfihmjnkjogf[jjxnxjolrlkbcqp]pdqtmmxyrfzpbbdm[fdaejpjrasjphazkc]hntqbpjeliiqmtne
+yeounyqfhbnbmjc[mzbietsligfkult]bywnnvpavyhinsm[xuwaqmeiaffetkpkvoq]ufmjhazqnhdmqyecja[ztqflfgjsoqybaf]pjnbnrsnmfrgqamxb
+ycyxnmxnttqiqnsnmi[wkrtuoeddszbizysqv]yzbksxesoscmlzquqfp[unqyazgxjzdgvhjylfd]kunijisskcelgtxzp[ciyxcpyyefoyhqm]eoqszchkgdhttjn
+evecetgcdniectsnadi[skxzpvvuabkudplm]zqykqoduyjvgssjin[uyojccqmnfbztpdnwvs]uzysyjyjvowlsvpqa
+cqkietrmjexdkqb[rhubbesuoeclwmtakqe]ivdnvnndssfznwmhbrk[zmjmfprnnowiedabycu]rmgmbgvihdcuzarhbum
+zdhjklxbktkqeglhts[iqagcckadjftptawh]ezdtjbiebkjvivekdzt[gwehifbjyqnazsgzziv]fhdnwvcwnamqdaeb[rgxvlygqlocpfgqfpd]kkssrbltmsamrpiedjw
+jlttcsywphepmcike[kufzshdcbvfvkwsahfu]ioqzvlzvjqnavymv
+cfyvaasepjmgtofy[hhoqwyrkhuweoetwtir]fvpxylsiwyinialjsg[hqahlwsskotrjlid]azfumcjerwanpukap[iqjcxdwtvmvjkoukcvq]koeodiiywozmrtktxur
+llaevsbyxpkahrii[dxfpfzvxwpzedtvhtlx]corhjnbybhlahvogj[aeukoetmokgjlswve]iwamrxgeszbcnzsxy
+abxkqpiyavrfgxjbmx[uqzsbujxbmrjyxf]dsiktkwxjovhabuir[baqaipezkcvfjyqc]svvyuknankhxlttwng[kwsoccnvjnctnxa]zgnsnelphgyhfolihu
+oquaqiwlkhwwfxnox[rifozvbwcclekccqk]mmmgicxioqwhlvjpsu[tndpmsoarmdojex]spywovxndxncbpshb[rgceaghxxvddklc]osijkijuctxjhtbv
+ewucowyzjaqacfu[hruhcyudsttblexjwy]mjxsgzalkyasstkuzi[drnyfhqgaemafei]uuimofkacnittaoorr
+nyzetoiyaqbsxum[jowknmpjwqdutjlfwo]oalwqxqoyovfjriwb[lvwabzjorjiiemeaacg]znsbvpusrratzywwwyk
+lsjzqfxbbuihsdx[akccvjqdtzmxywakf]fkxrqzurzmqusrx[wmkamfvugczykevpq]avcvjbiwezkocfvo
+ohoszcqvqivamuaisf[lyyacjpyelrsgafmyl]icwpankirjvekeg
+kruylpszzrkzbfxbmk[thxwtofeyjsijenmom]gjblnnkhejpqdomos[xjfzkxpgfltzzfdby]fnbkcvyhwtwmvpykj
+dtqrdvxfjedeydhdsz[depsrsktdbsiwudc]unbdedwnchjgetnwf[bhojevqkvcgacid]jmyzzhyslvuhnaizc
+dwlyvffagjfzbevant[baalozybgljljwj]jomnxqrlanqrkcjds
+kjdsccouzjkqxgicub[ghhfptkxbsgatseoxgz]jiqgnfilkycyuvlwbid
+sxbgpazgvlipytzq[fixpxpdcuetwlqprcs]qcvdieujpvhwveur
+gerfcffcrfrwvsjw[ypgmjuvhhzvvavtyulf]cjhqxizulglhcvy[mpjpctaxpnlrfhalp]wmhafecpyzjuagisv[aumyqoujcjkxusu]skhuivrgveucfrfzb
+rqkibcopsltsjwq[gmnenbrlgqtvqflnt]xuczjcgsxmtbmeaysdk[rkjjglznqblxednxx]npiikosjigixuvlnzes[vqdtacxnqagckmz]bnrzgyqhejnbmtqa
+ekzqugvzksupljx[hsjwrqxwwgcdhqhhzo]cqnomxxbemqmhqnnw[udcfrvgkcibabyssusn]zfuxkqiwlbbhssd[pfvscossyfdhjyed]zlwsqyhygkdgfah
+uhfxysjbqxaerhsanh[zyuotxgmbwkahzyevkq]dricwyfpfffhxncjn
+cmccqegbarzixhqucrl[ztgvmqmqpjtfgfuqjjj]ubawaltzbmhdhqioav[sszfycahkeptflx]otogjwoazgidspib
+fgfdvktoaiucefhets[qwjumhonvmtimauqsy]zkzorsvmedrlycqel[caaejbjnvlaqlqonk]ndndrqbsaaweqoyi[ovnpneqkmsbqsav]cepurdlgjkedaaeo
+nfhaistnlhzethu[gyozecvbgbkutaiuiiy]vbmcwkesewbbcdvw[zxgnhhbnldllaacb]kbtgbqxtmqtatjc
+nuxiknpvosedexey[gfixiukjvovooybkr]nkprytbsajposdjcv[ahjzndfqmisqonz]kzybggzczcwhlnrerfd
+puxghpwmypdrhykyd[xioiypketoaohdxa]lybkoxvoraessmzzztd
+qwlzyfwnqvxylbttyy[idtjcszoblpujfkf]nbwtcwowujbgzsz[mqckgqkhmbzpwtuekcf]xyquvnuptbiwlqdn[gwgdvbsouphvvovkg]buqxksahwsgvruovojo
+nvjqtzkgoenxnismrq[mxybkgtvioipfjecdma]wtgqwbkpqfepskvvay[qqxflmtbhprambdu]iqtqqujmqrlzpdwbljh[cmdesejkyvjzwhevg]qkclggetgpamrach
+ntxnwuudhhghcgd[rlyqxrlsbpsdrdlls]qfzxlyrfjeshhmsyz
+rxgpjhpklloihtpptpy[pcbbsflfkrknahkeq]uljnjuavjkhklwwcm
+byxqwjjdyqqsdnt[nkxqnfrxqqjtwsnpj]xstdzfnmxpkyszg[yswyxmgmqsrvaxdkx]sjfpeyrrswxgeflbncz[likexnumjhlodzimm]crnvrjyaumqgmjmy
+skwhvjyhmosrbbziiaw[dbztswjofjvkcbjtapg]yrzwevkwnjjefwzl[ifwifdeiaqpvuyiidrz]kqnqtbvgpxkejxvf[ubyvhimnnmhkbbnbu]zsqpbztopdvjzbpj
+jttcdvuuyawsjnode[ahfzcsoxjswcdysclk]ubdipqyzzhafcdusjuf[wtsiychncfnaztdn]teqnxwryvsfwqbbw
+gsoacpemvpypmizazb[rzluiccnkviutvg]bxmhsnyomypyueyhqbo[mzxxtfjifzluckdypta]qlirsetsxpkgewemam
+cdqotetervrpkaiz[tohfcmgrtozdfduhk]mlgpfaviqgvzicff[snphhquukvzrgqynfqi]eredworrsugqqqowk[fvcdlekaqtuqhhchh]hhrerrbpzzarqnxiwwk
+eitniklfnvnilfttm[qduauheufxnjowyar]oxizltxvldookdlomn[igmwlbhxgszcvhshy]knibbdqqnftzglqjodl
+ibypwndwhrbzbowoa[wyrgxqcbqoqayqkf]rlnhzutwptjhfwrsme[cfpmzztsrhtdcgy]tdvricsznenkyphwzt
+orvqewlxihoswvwlx[ifiaqweqqmaeasrkvxt]icmqkogypgrbjoij[qnkooyxicmbjhormbu]wkpucublpyqfkpjewzd
+lzshelyjacfkrkykwe[jehbtylsskmnxigkrh]wgnozoomyzpbyrytrme[uwcvshtsdstibykyrnm]nykxibwjjcaacgg
+fgdrabfqaogxyvpqfgs[bandjgjgkuuuxfuh]wwxxsusuuiezkvojziu[jsprwhpeictwield]tbpmjxfilclfrqx[zdmxvurgzzrompujt]ausuaokslerjqiveplk
+jyhxxfrgrdjjsorsgu[uxzaififwgjnklvj]uehxdiantcneqrxeqi[nigrgktauzcpyazs]fjyinlukaspltshmhlh[mfvrnccglqfrdbk]qrmbqjtcccjrsrdmgs
+nltgngsggdruwrahzhq[gvjujsgoyasfqql]btwmnkkccdcvuyniu[tsqzwyypufxxjhd]dvqickfwnoqtrhokrud[qjhdfcdcsfvdgkotq]hndylujuuecvakzmrp
+xyvhcwkqkedbjzarfht[njkseezhzjrbujcdjs]obghjeljjsjksswil[mhfukqardbaypasf]wjcerxswmwvghjortxs[ghqmhxisgehdsyb]ysvgpyswsdfkomanrtp
+wdwmhahsrdjogceb[jdwdpxaeemsjficjz]qqysutatflhmanx
+cpctsiwpwyifqkk[eebyeqlgxyvaskcoda]sjayfoyavfkaydph[aztkadhyekpqtys]jwzqgyewxxkbisw[gvlxjstngthhsjeybv]ponztgpuhfsndjb
+fawvrgcdqdidogtfu[yidikecuyabulhiia]fxfmgcpdbdzdsfkm
+yjateqpywpcjcbo[xddnertejcjeedjulw]humaqnneeeynnpp
+jutrwhvpaknrwoxp[ajhencapzncoyszy]qyhbpivdpqjeebsirf[lbsqceuykthorgpk]olrdkqyikfzrdzi[bmqrmgcmvqcgaxosaho]dkejbjzuzvyypxz
+rhsdxnktvyiully[nciwcjzdccerinfkgi]czljhsizretcfuea[gudarsiefwzfdvfqsip]tedaanrqtnfjdvgm
+grkgawgbvajxlbmbgwm[dpfpvpbrcwxethiu]rpfkykrvmatjwkd
+daemahshxyowxgjuio[dwhknewdrwoxbgk]vggqgdzpypjshps[arwnnbysrmyfijttrh]mwuwdtpqmiqgfkntqm
+ljpbbzgdgfqmvis[zqmfyouebpfvuscncay]omiockdgdxibtmyfwsk
+pirgefjkoicryrcgu[qxkwrjfuhqmjzzmbc]jrofqkmdftjbupytg[mywqavlapyesbfea]trqscgjokafiarh
+qsycbrrefosycpzj[guklennkilcmomyngzq]numvvwtbyvtfarlt[frfzzodqottlwzj]qumundqekohrpin[rsxaymghybsvzymhac]wkmbavpbqtoewxruut
+erpqoualxstxkzkwgf[spsetkclioxmkpobkij]mocioemqrazrpexy
+ryeoamcyfewnjlbdfsu[mmelohdonphatmxblhd]wgkjtelxmbwunvaxfne[xgohvvrmkweaabsd]dkukcrasqoceqjyehjs
+zkmkqzphahjdzwot[objfpvwrjdcdxinuvi]goabmmhuvavbjgebdow[jbqupsngpnuoubvn]xofdcclnjyfofxnzyvk[mkmshdjabucvgpkteh]kqxuwhyogoxhgwqyyvf
+yqlzjzpztzgtpomj[qcmfrvyamtxxtcv]hupfwqhpdvdwfvu[edoxxlncqxfxpsls]iyflxxkaztzxodxfd[xavxxfdkzquifiwuu]bkjzjuxybfdjcqw
+gspnkpswktczjhi[pkpwicpaszrfnsa]reqjlqsucfsixykwmg[matrmmvriujnldbcuaf]lckpqdyikkaprdje
+pbkxtroofyztckqg[arrmawhzlhytfodqb]pirguzqkvbgxznqnn
+mmybfuxiqgljxdih[dzgfakmxryeoylimdqp]vizjwwrhnihcakb[njplrxabbturflf]qclfldtmazmigmd
+exhynsvqvhtzexfjt[rdzxptfigworypkcz]disdlwcxksxjghkkbqe[ktpysvjomszwxdmqdv]cmwenbksdvfihvxvz[vrxbmhxkfjwgktuy]xpyefktsqohxwkaowk
+iiuuszfrkqjprgoumy[svdcdtozwwtofuizxg]gkenicdslqaemvwlov
+mldgparlhmdhgvz[bexmggptmuvhkjj]hfnccpxdkireolxpe
+tzyrycryhzonuxekwt[cvskbxzwbuotnsu]pvybsdovxceqjfmo[oxjqmhruryormwvgkc]kiygcylmgxdjubtefiw
+egklopkulrxyltcpbnu[nmbkrgnsjyfjugcx]bufmkakubfrwnwai[pprytunilpvguaen]bceequilwywvtvmshg[aszamqynotadciwdwzk]uivoeunohsbulzpxko
+ubhofoouxcmdsqqkjbv[fdvdmyjaukqeuaassk]tjajanohfobuhgih[dfscfkxpzwoqobajau]aspwsctdasjdjnqbmt
+urlkduvyyyatpkb[zrolecowduswyfn]bgkveercmmeecop
+aitmhwttzyrqwwk[lxntglszzkyjrqogob]exmxyvhwwcopudfekgu[fzxdevariaovvyuof]almvqtftjsdqkevnw
+ftftrmapzrqqyql[fmxcumhriyippgxmy]igyxwlfgcjfwwwgpy
+ftkqjwepfbngstefaji[ekaiaqtwacopwxfcf]deswaixrljslcqc[nqwlvvuuziefvrd]pgfvwqsqxeqamxsjjw[zispeamntwboenxygcp]cwdhurmclfnjjjwjygh
+fixhqdsaxorgfndumt[ccglwvkrpbwideuhvx]fgsxflvifyrzlznwvp[lmebhuhqemgwxpuvb]psfuyywbujlpwcekwz
+otmnqzcbakdxosl[skiwodrlvhfjsuqfsma]wtyrxmotiqdinxmrbe[lhgprkzlguroolg]kjgvxaekydqxdepu[mvffwznlsunzhxknier]irzzbykjkzjdoybqg
+aauhucqygvsgwdaqfa[leenmhlorfgbyorrd]soryphiyiqsoydfkwzw
+aggwrqdafwtwwqjr[eafpfpxygvnfblxikwm]mlgoiwxfigmduubsr
+rglpanreckskdaojotf[yuywsgztcjzyrfqawj]wzwtndwugnelcmxpyme[uwcqyuebxpprisdls]kjisjtwisxawsufrd
+uqeuvhdoyujlazejbix[wtdxrqucvkbkavrvor]fclqcjvpxqgnkkhi
+mgpszcffmfxeacayj[eorkhzrwqvxkrnessk]wykadaapxxqmohwriin[iwfmoieivcljpem]bxhutydaznvlbuu
+vkvvkjckohpxkolpff[pepxkcsneexhhlsjs]mffyiopxkqdnwlg[qmkttuxyhvemywmu]puqepezxejnldtlf
+fkyblzyluhloblrlj[uuznhpsjgbnzghjczsq]ekddnoeylbefgmpwjp[gbfxttshaolcvhfsl]iygnwnznafbluanu[mnylijsqhwlhhbq]ultecropzmivwizl
+rwpypdkhndrotod[rganbztsadndbxr]dorwmwqoeppdpoyz[sefhqmaxuxqwjpgaofp]kerdiohsaddctmnj
+hlzqtzrmmgkudvsaxn[wnujyposfazclkutfq]yugpiuxxydkbjtqd[bxeuhvpdnzqzvrtynq]nqcwrvbzjijfjkmq[gviaheipjpncyxq]thgypvingfouyrdexu
+abnhtjtbkrvmukjsbi[yivolobglxbtivbmlxe]gpoearvtfhhjjxedpq
+uiubiwrlfkwrsnewvwz[xymjmptyaoiartx]lkyzzzynibifaahjewx[ijvyqumtxyumrnpyfz]hddwfrbrgifyegaji[tguxrbbrdvhmssvbopf]ykkkdwtdtlajkmbgnww
+omqzieitwyasnbuae[citxwhjdkqyzmfotup]enzrramzittuhgjcv[fierpodjceckpxwoiav]edtoxignggotlwka[sbjkaiypsozrukh]hdwihijpdemzcdvlsz
+rummzhhnmypaltcxrja[nbcaecgbuslkyfar]hhfbjgrmbmjexlllok[swzivorldyknmqbnmtp]yjimyhqwgrgdphl
+mvpjigwjeejzhnr[zmxoaofpatkxkbecaq]szixqtsjizfgvfioq
+umnruavumjfrbywaswu[aeypnvqccjmqfflsyyn]anbehjastasljxkg[kwsjaebdtuslcbae]corzitvsrhthwmjsny[gzojgomcsqjubqrwor]tcektreziofkfzlyp
+atrjsjmfiyyhjjpcq[aygsawvwkgmvjly]nvxcabdkjbowvfiuqim[nxwlnfgnkfmmrdqwva]bjqsncyahbgqgcck[kudkiazyfbbvwvae]egtutxkpkpibqcxd
+yyxasjrusephnhgz[tbgueaajlxklmqfzfxx]rbirjquhusiueda[wwyfqgowviapcam]iwwwfcjtyuokivtkaet[ojcechttmtwizhjzb]ilybbjncssrsdpyvun
+ouzhmpmtsxtbpgxd[xkpvjnalwhbhiwl]dohtpyllehgsmfqwio[pswfztwnlizwbhbopug]znhnnlkxrlsswkgrb
+wdfqtfgtawjujjnipv[ffiedysbmudjwegxa]uixjrzxqsqknbro[uijbgaxqvjeiaddellx]golimewbjgojubbk[cmkrjtwjwjndagjoidq]kuaetseghitsonmjxez
+hinvjpjfkrcfikcsnk[neznqyunxrviafftsv]xxzaxudvxzpzayzu[igikyqxlllewgxp]bbrmixylwkvzstannjk
+jnfqvpcsjlhmsgttoo[keugkkuywiztndixql]fwcomunksourfiufwgf[vwalfwhhknnkmlelb]lxwrjniskrxyxxfgbj
+hmxhwwoaovcmrsjng[caxzefbacuvtevwsn]lgybmbmfeizwrbfrzuc[usgudhgiwtuirjfkpz]dmohwrrvvujowdchnh
+suctmalsyteahln[iwbpvohjintrccllib]zdppjeyrkkjlwgfp
+hmnzkxvelkvxzminaj[llmbrsvokhyfowaimt]otgsfjkhormfnubhirp[cbycbwoqvdgyvbnmkz]gnnjznpxfxwfvaoc
+jniltxvpjudmaao[ukqflhglxrfpfjg]djvtunwwabljjdirgrj[zkfyhzxkarvjfrbzbhx]zrrzbzubefvchvrpftc
+lyqyzdgisrvolizgkvq[fcdlhezvozbrglr]lcuqsfwchyucocowuz[acdcsqmgffussoy]jlnuxatzdobackkwgwp
+gwcvsoqytskjaqo[rfzimztlooyjbodjcud]ewbpnbzdilxvjmwy[ugoqefqofiwkgnv]pugnbbxqbmpephsby
+bbzqqwyepafkukwqjbb[sprroemdjetnbhdu]donxkujxpajsakirfap[ybomycmhvmvslykfxuo]auqvkrofncqftmjshtz
+qbxmiueonhzkluju[yocqzkbdskeisgvm]kaasgmyupwosdzbumq[lkqmadnwplwlawznb]zxldpcgbouydtatpo[dqdshurolnithdof]sscgvlgvpgthgkhtszr
+uzcvcnjawdeonomhoh[lnckzlsxtxekacx]ogcbcsdksosgbdlrexd
+kiiixiatixklryllfyd[bdtcggfxvupbohvclg]rxwnmgvwphunygx[jisbxeqdcnocecrtabk]cpbsvzurbvmtwucvhk[hlrjqjldshzvbrn]wlmkcxbepdkwafeovn
+xavkcpvzdiowrpduy[lujfjaxzrmxxcnxfrlb]szegppqkdzrwkokbi
+ojlbyagshifmlrv[qexvdlykxlebrlrjkg]lvdobhyszjfkocbmt[uorpnorysdsqycpdoje]tknlzfganuxeulzv[amollnzxactinrv]unmkoyxobuuzfwduxa
+pjhpwsfoiufywtd[pzudakbhkrvzepfl]cnmjmtmacyjulpcu[yvevxufpkzfrksn]qqdusuumfgtaemuscj
+ffnxshbygoxcatgz[byegatenneixbjbrri]xrxazipjarxrrjj[ilvdkjlixdbdieycbvz]lvngjqnhjjhlvki
+maocxpwqvhfgoaoy[jthtqiiuukttxhh]qpvgjokizpojnsvgg
+vstmpuwjzkvzxakgreh[vwxiygqjyyvmgvjdhz]yanevbmxttonaonlgeq[rskehprefzmdfujh]kddqkrshtgymbyf[tdciwdrqgnrwygvlqwy]mwyxsmscrhxowaezs
+lpetegprilvnporglm[efutqcurzhuymzl]vpuzirgjkjkqmpglqoc[ynrhizbevmuobpyduap]joqowueodytoothjk
+uovjoxozjbjgjoedh[hdufcoupnwyqzqsdz]bfkcibjpdceeawfsxnb[pmfdhpjltsthickltq]wnvrznraeqgmhfh[zqsykjfanpwhdbm]oltzbvppyqrhmom
+cuptpflteqvnaexzwj[sokwgqieratedygx]tlgoqkfvmifmdguz[kfiwutninqxzwie]dulfdtlbltfjevgp[oftsoxfpwolpbvflmvk]xfbcennewbsxcgin
+xoajbdvgnaxyewthsyy[gbvxbmhptnkenvoef]iyxfsrwruprnhml[pwrbjucvopfozdjlg]ntsdilgkqjkwifjcmqq[gqtizyvtmqydqdemxx]llggegbgpbiebcsg
+osoqemdejeowlmtbr[gvnuwetgdhuzlfoyp]ynbzmlvpoydjaix
+xmtosmglxiswygqd[djjpcftewakmxhe]cxrcujdbpfpmpqaqp
+kmffzaniobvxkqobrz[xemvsxzxpikkgnz]coopvxaqcwwvcpzzbwc[frbwadxyrqsjmeb]solyurryfbhunkug
+syuvjlrlrotbcxtmqlh[plnbhkottpkhbgrmmc]tpkceggxjkkshgovp
+xypvptyubhdywjddc[dkdpirtrddhczvbi]gppnmtijmtndwsd[jctdyzyrapkwpsudre]ofnnmlflpjenwqme[wjlbkjvlxuwubdkskq]zmhodofehapyshkw
+zyfesoxeyyvugukolxq[sduqoqepedvxiaojef]ujbihfjhwwrxjbmjzwo[fjbbqkruyeexkrk]fyjhwioedesstjkw[nyhqlxexvrlglwcqbi]zgxdbhdcqgccgodx
+kbgeflyhriyaitjdw[gkmsfhbeeftzvlkkxd]leroadltgqyqepa[apzlemfdxyxhyqy]bifkxoyxysldsif[bypdkygwlqgxlhmay]odffxnaayhgxkyjsyg
+etnylemzuybethsak[rbqwbwcpspvwcnrtiaa]cxdlfpvaizzsiqy[cofixscwpmoaptvu]tuvmcbkoqlfljpc
+nafgslpawkgystrbu[lholsrbjchktftlct]cwxorzjqzuibydw[wolwkkqcflunakpsf]ftfjgybmpgmpzjpxok[omccjdarvniomtniw]vmtkovkvuahhcgj
+arfxtgjhwjbqqpn[ozbglzichfmhnsrmc]sxwomutyoliqdfrziy
+yrfbyqpslcykicx[uoxnsxbpkzuarrmhesg]ohscdwcojgysjov[epkotielizvhfbauf]kdichwakhcwuitdohe
+lxdfxhtcxpaqfgud[kietvvqhjbhmbdjh]rnnxrywwubyivxj
+wwqhnufhgdpwnidwe[trkijfvlemsenfvm]hwhzclbeilbbpmbdgvy[kcqrejunfyofjviz]ymhbanffstqwvlkczn
+bemjirozvmspfrojywv[gnkvjdexdgqeqvom]akfgpxfgjwsymkegz[yrbmhgnacpufxmilwbe]taxwtqhrfqehzvndlix[ndjuozknfyplqafyu]bwogrlytfyopgayph
+tzrwkqaembipwoyysy[zmjpcdqtbucakwta]eelwgobyifozmawhaeu
+pxpftlpvkjcwicy[ordfpujlgwgxccjcvc]ghrlgcktvifkicv[kteuygrgxnqbaagldhw]elebyndnyuknsxwsz
+eoayeeinavevnkocsh[wlhcijujotnsmyfwrg]nsghlrcpvhazacbriwy
+myqilamxvrkimzrypsq[dritxccifmrgnynl]ahpnxwgmmlcrmtujqv
+prjupstfryhiyxjr[nznibizpdpgsxozff]omzpiwgyqqytncz[ixhfkzmhfpctiaflrsg]fkxetrnjkjhwmbcs[mgfwcdxioxwsbpbxg]pnmcyowtigkikfbqem
+obihtythngvjelm[flrqufrqlvaamtlt]gbuppvlrpotvhgoivu
+wdovdejwygfyguc[acoacyczfmzugdiwfy]hbboqkjmpktiqigkaxi[eirojscvpewshvdslgs]oloathxikscihfpy[vbwlxhdnmpcvhrdwm]zxwsxrhoksbgnyva
+vuaiucuvucxmowfvdc[pkwwdrystnkynnfonv]bkguisxgqtsizbdpon
+nhegyhsxwcesxgagl[jsdkwvzzfvxuxsmkans]cwhuierxyqjmueehii
+nmtqqwclrkwlikw[drthkxkyfxqugph]bbneldbvtittaydbgag[vviulwoviezlxte]oqzoapkqstfdxbxm[bmhsjxwoxtflbqeo]hnsldpfruxcdnvz
+xrkijlvluezxevaye[erofwbtsylzfvyrersj]bkvnbppereymraau
+jamtmykfjuhzndgnzrj[ezhkpcujzmcdkkjjfbm]yojgtkoobnwvgendjt[jkeeulmfzdbfwnohfaf]cudgyvipscncfbvmlh[kxikmcqmpounqkwjhg]emsdqszhrpxpwcwb
+yywwadanokysrfh[btwstuwbsdiotcudf]qrsrtonegzitpgnzsvd
+hrhfutggyymxzgyj[agqctqvhyfytwsdmzf]ozyonngtqdoaagdl[uuykvsdfqdknray]shhtieifkqfewhopney[ydgftitgfmfdqwh]dfxovuekyvtaddh
+dbsuuitjdsiymhek[jgxxnjjzwgwirdlgwg]xwlvqyufgiwbwyfhqn[yywjhwiwijsuhlarpxv]zmpooqvlrrnwdfhsheg[piwaxxvwgzbbruij]izqwldwwjvrxmzuj
+nuxzejoidicdupcgdum[nelehvehbccqmwnla]bhazpsnmekeqkvr
+evnsveqnndjyarol[tgeuojqlculphzfva]rilaooxfpwyreyh
+hhwvcwpwgzktzotcrx[khmiivstojdaciyzb]xwaeqbqyqwqltdx[rgwirleearklteybyx]ckiyopbgfygyvui
+zpfozblbuwkdkkfsuft[lccwcopfworwnry]srwrcwdkalvsnsu[jmgukelsagifrhkxqma]wtrtztsztpnryaqw
+iszcbgumuoarzlkblr[xphrddxkyclfvnapk]rzryxqdnmxplfiu[plghrphjxgqlxtp]cxpvhwxkzkeczxcenm
+aezqpvhdbflknptrc[zykqxuzbatudehe]lugjrgmxtqlxrvt
+jsejnywikaohtarsxmp[whmztgiaadmiarwlbj]yjrgwesrymvzhlades
+cxmorkzlibiuyjgs[nyierakbbzkhvyizl]hmtqhrxddgdwmoayyse[ldupkxzsfkmnsfdnzsl]sfpntvoniewgfnyfw
+rtlhvogqfabwioi[mloxkofbaemaxcfzdo]ofeukqafbxivgvygl
+rjnyhsocogdwhswqonr[jrwafksjhfamqvfjk]seiscoezqmbopqryc
+txdcwwtcedbymvxy[dbhxqovjeifzsuvm]alhqphxcmfmodeb[zdzxpgxeezjaeichq]ggadublqxpfyoyc
+rvoblfajodmlbftahtv[dgglfidheitvcqob]uzvojeukksuthhlpyoc[ovnskmuaaxulloi]wqhxsjbtaqbgjpbw[ohmzmzpqzevicbzmtk]yjrbmkldmwmmcndia
+rnsgsacbysmwnhlqjps[hmjfyywxcpxwsicxit]rnikgavmgagtsoqjnfp[qvcofkevjqjqhiqhzek]vlhfbggnwqwohspyig[ibsdkevufgsnowonkj]ufazmdkexffmxxfwf
+qkcfiavyhcmknbqcjtq[lknppgsvbdvpftnzcgo]qswbyhtruabsyhvz[ilrimrzzjctbbwhc]knpudsvkdphxsuevep
+wmeryhgvkftqiyctbt[terkorqjaagtbsp]hilrpcfcjsyguukcehn[scmgvajuiuybvzt]enjhgqtdjabbkgh
+kvczijzgmasricwj[xhgvyfhnaxeugzje]xwcxqjegagsjbvnuskc[iiokktbsnmwxknkqch]vtuobocpydqweamu[jgmazxfjiryndgtcqjx]pykbsnsoxbfgacvgpz
+guthejosohmrswzgk[uqthzxkpgxlcmqyop]fxedavqwkrmzbfr[itsvdugwjezrjtgqmua]yotsdzczslbvzatsom
+lyltslrourlevnxw[dtiihjdbejwusjmfap]hdmttxgttdqytvdfpp[qhdrjcwprncegzdfl]iinunfljrfhgifws[fvjgcqtqgxqtgca]bzlvdtdsxgrtzuvh
+ndwwncgabwoynmn[zbxvlpndrsbczbklwrb]bkcrlonwivcipxe[eoliublkzenpeyxfk]voydcapbmbsiuvqfywt[mmiirgxvnbpnkyjh]pgkocrralcozybthp
+lvrcxgzomstmslr[vczvuydqcmhfmlt]gmogxiffrfsazqbh[yvnoqlavmbnattcrgd]tsbkxinrrbbxypwnafo[pgtfpwnnlxibpjchgd]hznabthirzxjipjd
+jtczttrstcpmsko[mabkmpwpcytkqdmhjc]jntwxslpyrkrehj[cqbvlkhugmarodmoqeo]weaiacdfakrkuizqw[uiwkgtbzmmffxrhtn]lhygapgcdaszgoyy
+ahnbwmiwwwivkykv[pcsiuyrowqrqfxcvw]mgksjiinoudrumr[ocwtmprzvamougd]lvqqlgaftlflllvqo[akvkgazplkkvqshgbk]zvyvtmxkttxnxxdy
+tsbifacnljabpczi[cmmjarpfeeyoeplv]zsjcjdfidfjvcgdd
+vaviqqmsbqellpw[xjjzxupmjbkyuzq]putpqaavecqypslf[nkyslewbmmsxvdy]maszkbnmujztqfbzq[hjwtywxdrybhcvplncc]bvgsnjtjidiuvggo
+jhejwzckrrrzcjgs[vjkxxdonhncwkykwi]kyuvbdlmkffyzept[jloktbqtmtczmjbdord]uzggzgltjzngpsboyxy
+rkrntmebnqrkoboby[gujdrcqoqatyewm]qhrzxubcwkrkqibjwl[hvnezryivakciaoukrd]teefauinxaijxil
+zkuajphbyhsxocacplf[tqkosililhbxgsgp]xttqprajeocotwoixkw[hdmduoyjxcizwpa]cihkdwlaxhjzpjw
+xzcmplyeabfrcpfr[qhfkyjzmivvhbqeblph]bkwydbvhtutbtytnrx[oslchcvrlcxmsnbqoq]zkggbeglckihzjuq[lxywqhpuarhpasbul]vqmgizoanebmehzfwyt
+bjrvsfwownhpxsowafm[dtmxsbtquavgypbizrj]boqoiajglkefiwaj[ycjpupieshgdmbwp]riufwociykhnwdsci
+urcrpmkeszzuctovhqu[vsutbxseevalnah]rwrptzraxwhuskb[inpentirbmcxdvof]nvtxiwtlkeknxfl[rddddhtpudrgpjafk]cojkmbekefbmuwev
+djavlwoikblvsufxrb[suujlpxslswxgfmrjj]drrpikhibuvwdlhvt[iopyjysnsjpyyxngdfq]sijwvhrwtourowgv
+kitztjpylzlaposkaun[szjrduixywmdpxbl]kaltysqcxzjrengtkwv[jhsqhlzxzayxdbebu]apyxjlaydhhokxacq
+kvzdgclklqsndxdo[kudsmgggtnwtxdnrev]quljmegosayhdwum[kklkxlmmmtjcretlyx]dtsexdvvjndpxtggjlw[mpcaczddrmktrpgngw]usxsptmzgzqhjaycg
+oxvlhxlmhhyqgwlao[wiqlkdwjluvqwgqp]sbjmqvssbwefsvq[ocwwdefylfgvgsygfbr]fbtqyawdbswjpux[loeconwsbvgbccoz]cdotdnnkzyaupynuk
+ykozujsmdopwobif[xaupavllckswbcyszd]jqdeagvmvsxpumvmu
+naxhmkdggymqhjcycw[xkhrapbevbaiwzdn]etnivyebbwvqarn[dnskxishknmcidwv]uctdvqkipycyzhgcp
+uktvpthtrtlgmwofun[rmevlwmmvzucsuxqx]zokkayofazorjdec[ickalywptsyxrttbynx]olddxeqctucllsvrvhn[pxfftvrdqdglkvll]xymmmimcqskfozlkyos
+rlqkqjeaqkqkdsfb[igleoesoxntrdwsyoz]ujmbnjtysangjwpsod[nniriilejnvzrrnn]mbqjytlwauzscjj
+egnnnubdxhgpiypsha[byoisscizhhpsjy]hmtbmbgshscaxadry
+qjafhagbtdpvszwlpz[ipehjbasniypubhfb]hreoxsqzigscxhnaf[rntqxzmxfxdldnpxqb]jriknndggvtkifa[kavxsbypdwmsildd]uisivvrtykssbvmsm
+rwxhzignxkrqeuy[memzudqlzcfrgudefyh]pyoldsepksbcbthfdcw
+jhgyboztenuwlqu[zjsmipieimgaypipjm]jbjlglomhxosmwypq[lvpsqwjvzepgvzbfs]ergqdyrvicbsgxg[ugcuougnecjcrpav]pzgpppoonvamxhkbg
+mdmifuoicysmavfkvtr[rdcuzujskhncvsy]ypspsiiizkvopyb
+tlwbtllklxrkyivnnuw[zqphdjfrntryqssd]uuefrmazhsiqdbodatx[zdptibmcvohmnwrv]jofpqdvwggfsdkz
+rkgfksxcpqkspdsx[zubzkcjhpvtdvow]bkbmwwrfqtmaosodlhx[shxfozufozglsgfj]tbtwcavcbvhjourcvu
+ayayqmsdvbzfnut[nzwcajbcbcduifari]eazisrtfqhzophb[zkgweftquububoothq]lrpktclkzizrutnybq[guuneltajlsxbbx]rrakswukxamcewdy
+dtuezfpubkdvxojau[ipzyfbjcwxazbqeslhs]nelubzldtozljzyj[uqkgjszhpokhonrpg]pgaebrtqevqblaxqa
+bbduqlqjpilanyikfb[iwngaxahwxongrgf]krgrarolzgmzdtj[mbsttcbkbedkcmbl]whecpxbvhuemjloxkcq[lrtaeothcehqsmbes]chuesxuwklohzrvgjkh
+sextateheibnehs[ccvuuyctlffatnmhie]xdrwtaeangizfxkt
+nayfogrvrhhvdfqf[upaiyvrvkcygazw]wtsawgmklbrjjhc
+qumnikpzpmsjvfiwapn[fdqlumgxklzlxcm]dczsgahneieodmhgvgt[babaxdoljtacfza]teoddbtcemfketpp[vazvzbcnqacbwcx]fulxjfohtywgtagn
+crcyymrdfaawflxfmfg[ovbkvuhdrxdbhmyphao]myqpzivnpjyjkogknqz
+xfkrzuoeclfphdae[wfuevmepzjjuzlbc]icytgjlzxvnjgugxyv[ppqszfvkmppjvktn]cifddqrtlcodiincw
+gobxpjjturfsgzell[rfhdgfzwpfoztzgcn]eworfqsmysqolgq
+laagoxczwfikjawci[sljddbmwqdnwxlkhdi]hwmoerlalfpjshedio
+wyomncmyxejknhswjv[awtbfqiarnoabkab]nitvsmoxyfdhpcdiee[sipoxhfskauxfskix]nktheznrekmrrxl[gwpmodgajfihlnad]pereyxjrernitwktv
+xxkbizhzxvqxbecadt[omafffruievwfqocujp]zpuotjhjwsdbsxteza[otcdtybhkqhjhvjjz]zjrkvtevohcfvlvq[yjdkpxspyojxstjkv]fbccdkbjrebcrxyrg
+zrctbusxagvjendfdf[szvxchrhjussntb]mzhzysbvlwwflpx[heijmktbzrbgqsklhcu]ygpkfilealopaixduvm[rakktnzhooijvydazhb]msnpudxdeaujqysbje
+xoemgrrmqqtfwtnwnyt[jextspoeediexugdgc]foyqnwnwstrguzk
+siuojescxsrrhvgpeoh[dnizqgnuprmevtqws]jtrkiydptijrwewcqz[zkvjwozfadmizvhfdk]kamauddrolxbdrn[yzfffqfeadlyfje]qanqnshkelszldi
+wdiojuevpybfvdp[zxyrygvkvufixzdwds]tgjzjufuuwenexe[outgdpnnysadoyeon]hvelposyxhlvfmdi[gazrxuhxrfxofsrxq]wpkujtixgvfrdgg
+pufjsqcfddyeghd[iylozggwqlqevyb]cbkdjgvbrpmrwrsgn[nuinkqeqchwluhwye]baetibebzmndgrulqdo
+rwwiamjdgdfsttq[xnsuyncklmryvumrii]qtcphhihqqqqtntvoev
+bwhfulscfcqggdswt[ostyvvcpdoyzvuhodeg]ekpjrxajoziohdvkfco[tbbppuyifwtcgvci]lwjfhfqfmclrhdhplbs[pplppkgrmykhtfnq]sfvskkgimpacxfam
+jripvodavtgdgkv[isotocixmxjmcldpx]oaptjpebswetmacnf[zdlipacteuduvqdhcfg]chciftufaejhxkmpozz[cmnwvdkbsczhekzwi]ovnjvgsuxmszncr
+ylpnqmqhlnmuxei[cyqofexibcjwunyl]ettxreudzmlhgtha
+dhmperfgtcbqlipcjbr[gkmgkletrzhoyhfcwb]psllsosgwjmtrvfanv[fimdtpgcoolukvvpu]ccqgkaqltrreqchxpbf
+huvrdvtjmncbokh[mxnsccgwblyahbdao]mpscnoohrsqideuhf
+pfvpbqmyapypiubxmt[kjfhekecjzzqftpj]sybxxlmvzhloooom
+iicuihjkntpnytg[xpzlplwvgwmzazj]dfiftbbvxbztjpx[patfyqrujpvwbsl]mxgsntaernztshbi[nfwhtuuwhgsljivcrws]iwzqwnbjapcfujz
+fdiifotbpdpfvedsfn[ptkzrnhuybmhzkh]rmxekkyxbqxmxccc[icwqbjmjtakfsqbd]euycnuevdyommhq[dqfyackkxmvbehucn]aabiiukaxiowhbtbwpj
+ofaeegcqivqrmtz[nyotqurllbitpijzdz]pdlsomnmdsbfhdzdh
+yxihvlkrcvzxhlmzm[asvxysmyxovvxdvv]rrwmvextlthjopu[nuaoossiaxivwwxwpa]xgaovndeadfyofish[dpdhiwlsvntqxypdpy]ddmbndbjtnpazhj
+kfqeicvkuvmsljtsez[vplnucnqgngsbfv]ycjwthuykmlfejqepad[ngklfmgvredrinryy]snsxjeqdinbbapwuno
+yznxssrnyacwtxlfbab[mpjvrwoguxgvcbtbmdv]uflsilwcemofepjghvh[cpprubjartjbnrdo]pocdfdephebcdavrxpo
+xkiccyvosgzxwtuck[oqqbviclakixdgc]kteovpyjbcejxui[mzuzcghrxtkssnrsqy]hcdpzjidycnlowgvaxo[iawhkiyhbswqsibqp]ltyzmuplqyoivgmzfa
+qllumnywkyqjpfv[lgkmvmbdwnkhlhqfse]lroouhapmomchyeghsp
+egmftdtwkpmhdpda[jlxrjvldyikwjlcwx]inqnhjexcxubtzbx[nxiniqbbzoedxkyc]siepprpdulpnkrussom[srrupzubqhkmccxcnas]qylljcyzwypwzumem
+ikjwnxkhkzqmppk[tzaysscnyqriqxcg]miabsouchfluijdwa[cmxeoduyguwjxqcj]ilprgkdcvvopotdzzon
+cauxikrtpgqgwydmagf[nrnvqarumgmthrf]xyyopmoyoampemafwe[jwjgmglxphjkvfg]oxltiecspkarhualt
+pjzcgmqitucfyph[cxxlbsznvwpxvzghv]woqulnjvvfjvjzy[wgxczusgzxnpkakki]fvtepvwjkaozguggqk
+fgwvbbyiyljwmkgcmic[gnohlyijeqfjldrpqey]qbdzxnxuiprcwjsn[ogtlzpxxzbtgfbjx]wxgaduaiyihyumprhe
+mgemsvccgqreluv[qrlpjfkdoinuyou]ovkiqoqefrjmrzgb[fzmqpuzoufcybpucq]aaftwlldjkholezzpk
+vxfsphugegtougthxk[lkvniyzlltosedmpgr]tomgbtfosxegecoqtn[mvptnxvxddkaqnjvnue]kclnhnpveadosfktw
+ltlrncoqeeupwtoxv[yoosiulyjjmwacymwfk]vdgfdfcjubkcbhiixv
+ediaeekjpbzidrfpu[rowhynyrchamhzrp]wetzubsftjwuksnd[yqbtzngplxcqkyxf]blzuvnektffqbkf[egmvyplsbysvfjjkr]ikrllifuchlkthknpqb
+ohspsyvzulzfsgghvbu[tvtbzqptcpguecpgb]zyadwosbwchbgrkypj[cphkhvagaasozym]tvgkhkooyejddnhv
+uxtuhgkkulhrvowswt[etzltbttiofnkeyh]gsgnleidfbomktjtbrq
+owccdxohulgarvvxx[pbbuwbbkrgqlhxa]lqbqozlyegslpxvr[arduobjtbducuoiwykm]tfziqcucaqjcfrc
+foxbwdzngattycaunku[lnkqgrufdcqreruqp]otrfaarzydubngucw[hhaqnaieublicggcep]jjvurleoxyatgtlexjd
+bxercunxdkmyxoo[zuvlzxstpwfmbnv]laszhsamraptopjmfx[syvqwydkiawwwpb]dyrhipcnwwbhmcotha
+mrcbhykyikojmqmxr[gijdvcjehxyzlpxms]bkzqdkykgcvrlbdcpck
+dqdrhkhanojahvaof[msammceatlnnwypjnk]yxkhkmiroydwvls[bgxvfxasrtzmiqpueoy]esjxrbelpjsvdcdx
+tuxcluskqsebpcm[xplkqkfmkdsjlgnome]qkweswhvzqmpkujows
+nbpwnioczrkicxddphr[zmtlntcztddnmcl]gjultcfncpmekcsosbn[pzwvjmfvfkanhxbhcy]kafsqjaraeicizjy
+drcviwihoplftyb[xykuycwejtdqehmuf]kfmgemdaoetwhczw
+iuqdiepdheskvvgvix[ayfqccpnsyzawotpt]xjmljfmrhvqedfsrdg[rvdqhetiopoykpopol]lnqyxioswrssucownvu
+umqpsyqwafisrktta[eqncbzzavysoixd]wdtnkvsvsfcvfks[opjoivoqobrzeepln]ziqmbmxwsppwzfro[mkhssttidvdgsvstov]akkdvcsjflhxllpblu
+qjlmfjwtglolrdxvqk[yufnmwyfhjrqzrxrddv]pzcaaeoitighunvg[eamjujwzolooemhj]mxbnbjvuikcycvnfuh
+zykdcejnrxpiimmbf[ofuzkgknvcexqzxpu]ketlytmhcmzvwtssaq[pgruobcnyaqmyjvospf]jkkvdoervshvgeqwj[fiexihxudpdrzdwp]pzmgprenvskgbgupy
+edesihewpfcjzkjhhk[ydoqcgosoyuebpoib]oaxftiagsynwawlukdo[pobikbzlxzzatth]tzvwglytrgbmlsdikum
+rvdcduthikkjrfx[oxwihjkewocfvjpq]wtpoobflhevxjuwnqr[ltfcdcjnkkfetnor]obpzfslqfunurzhpr
+ihikssgoutovoropq[nitrordhoxvqfbjfc]lxnjmoufkqnxizdcthn
+nsnkrlllkoyukbkwikp[anhzfrtqwndvwcndm]xyvidixcvjwqwxbsctb[awnmlqopvrjxyvjlbn]ldmgegtwfkvwjurzk
+dvjmhdavqxdhnbglm[qopsknwswyqoqccp]jycpmzubidfbwsskm
+dstxfmmohcyoivxmci[prdroxyvxqzdrdsu]qzczowwyxtufoewluu[ywzeufezgbazekly]tiifyttcldlhravctc
+anocufhbdffrnyhxt[sopxugpfxbbjlsgtdc]nvnnbdsjqfevwbgbaif[ljuuwzmlrnpjvxgbp]hoeejpqdkbrafcmv
+mvoaumknaokkjrduxj[anhqilrxkkqawmtdwhd]zuugnxwinmpwchymrx[ftylpriufvgtanapyy]xnizqpmgcbbotfpru[ilovypboxtuyozqag]aldfcdeyubuntmvyv
+xlvezhyhuvbnhgezw[yvaxeeokyjwjgzr]hqtybqtojttsyhycsy
+bjcbsmjssbubqixiqmu[uzycqzxxixenmtvz]ykvtnssyurdixcswneu
+gwcwwzlhdufsjwaxal[howbmljowljdsvbm]jggvldehjwoafvshlw[bfevufuakhrccqcc]dfufvaxzavehxgwb
+xuigvxgnmagtmdke[nxkzzxieoqxbaei]nqnpncmtrsiytxhy[bqpabinchcjqcjy]ysktjdirrevjyqyc[rwtodjwpnppdvig]cxedadgimutpobykf
+daqanavryjmzxflo[vcpyomgckepdftz]tizgysgskfuntqedhp[bkasgyhpytrbqvgf]dtjwyykxvutfihl[dgidcqrglxeuqmjvryo]baclxsovuumhgjffx
+lpyeghloevhgthedzjl[schxctqynpinoswgvwv]jpuvctsvrdpdhwsh[xdjqrqfwodmrxta]cmeizobaqtszfini[ttbvcouiaworjdp]uwfkbkxwhrkeugsccp
+ctvifkpejmwnuapjpjh[glykzeqimofbvirvv]kbzjjjxmiasijhyak[ucyzsvtasjfewtbm]zbhktdmufikfwsiqyfz[kolsqantshbocapum]jvjtmsmzjvdyawlrrv
+zbxgniymzkidlugns[xsyjfooxpsbhtjvjp]lydpcozhcmkdiactgsu
+rzsziayhprsxlwr[szdcnmcdpqkwlmhqlp]uctizqyfzorwogahopa
+njpfvxluupsvtbenq[cgenluehtxacymtm]onnngstsltmtobh[jkjpmbsumgmtkbyg]uvsefrirmvsuiff
+qukyshliwhitgmyeb[eikuuslkfgergykosp]fthsbtteuspbrqpssb
+xpgwgflgtkmtzhw[prdmpsbkrcbmjfitdyn]kqiyknqfoudyfvdmlhz[zswwgwvjkyvrjlg]zzmkyxkalhbbgcouvog
+dgxbmggkttasrcjotn[hsfrmfxeeuvovzuij]lnbdybfhkdsrymhu
+ryjamwprtdolosp[nkucayakarxezyxpgkp]qnezibzbjadqvqzz[kehgcplpjdlitdsg]nagotxuswnxikkicoi[fbpbayqjockutfqu]gnylxqhcacwdrdhlp
+quayrjbyxiviwukq[mwkxplqhlociiriaaao]lswnrperjoqewphn[nmwqzenrjmgikodk]sagkvoqqoayykkzri[uyenuakxyohedlz]ffzfpyguqryzodjwqxj
+fkymdwjnylzqnxhl[lsrorhrzdxpfkmai]vfytomporosnlpzc[pwpodimqjyfmczra]nibuxkjazxghetmxe
+vlrxyrxugxmmxnr[gioetjknstpngomi]jgzsfyvgbteacpupi[aeyhvaqkilxenfy]ezhnkbgkqgbymgzolq[dkzztikgwfghpltsd]nrslpkmvahlvwfhavn
+xpjvbcihegkoyjg[ddyxkmnhpnucgbeu]xnvxewhefxmfesoqkfo
+qgavdsmekecmyuuxln[toczsvzymwfzzrxprb]igonrcvkpxvekefo[abktdknxsdmpionl]uhhlekwqmalhfauva
+uveiuvjjvxlrlyxpc[ucbsqehsihiilfmxz]nvhvrtaxdpiqpbuyj[rhtfedxbiqutzvaucj]dxtgbmuwqxxqpfbohfb
+qerjjnnafocowost[axrfofdityutyzgv]acicnljrpsxzlcg[dhslugmdfaxclhrdecs]ekxnsbqhlxcfuron
+jknvvunefcyqagtj[zhgsvdlsfrlcfyoqt]srtokcehvdjwwkcwczm
+wwwyfmlxivfqcmnwtw[kaeymickhvsdlqkfuqc]dyzktnegiqbohljysa[qmnzkoqxsgtpattmt]oxxczwgodhiecoyp[swszkqetvvgdctkhyxo]qrjhaothcmyajmpy
+oldhdgmnxrbjncj[kkrntxgkrpbrsyi]qjronlhwmcpdnpp[ksqudrshtdnenqxt]wzbkmgdhgylcfpberv[nyddphsypgzienevnmx]memczjhmgzeyjchv
+jxojiumgecewqlc[nmiruhzcybahusxwt]pqlrbrwjitwylvzx[rjwehkmounctpcecz]jbhagxjlhngeibhh
+lbpildbxlosyqfun[razlyptphvjizuyonoy]atrqbzjakphxrguvmbt[ybdqfljkspdlgisypun]xttstfdytowwtxytsn
+txrzvdxevhqzpkb[xbsfvyjkimceqeog]ilzhcjiezytvmdd[kuhqkwaweasjoae]fuyyczwcpbdblxtxjgt[ujdwvuypmibgdbdtkij]vhrvswtmxfqkwmtjjld
+zipaigqfaywgroxzyh[nfaubfwofvgmjrlxw]srjdkzejhrpctlhbevh
+mtshlkbkfdacuvtjkbk[qemjvtgzaxmgvojtfl]emvduvrdlxnwgqrquk
+nekajppmdnadytnn[ynkibteahksyzvpenmp]jqxybiytpkgzgws[whyeilzvjokewweunf]ndkfvbdnbdoszwfugue
+fwfviekoibnqhpis[esurgsppgqchztm]vaxsbcgtqipiemvreaw[ytkxlxyzfifrxgmbggv]tygxkuusmptxqyl[lpuxifizetrlbsefado]rbykxursrelvgiilrai
+xyniecftatconlmstl[rpmxaolsbezfwzof]zvcmwpmmcszbaimwhfj[hggnwfkyexqkdancmc]cakzrmvvnmyiyzbwx[eizlhdetlkmzlrob]elvcwtpqtdpqxwdgjd
+yfxqriltoucrnfnj[zlvarepakboasju]bhpvqvllpphryccbjz[gilhjdjlsinanvhhe]rkypfwnsrmshanawlb
+cffxddoarujtkpwt[vgtsjcyuqgpoklcem]enplegjrghgfkvaqhtc
+kybnjsgrfnckxytl[obtlaqusuhkyeswu]vhaghsusagftgzxz[ganwwupndegfgxbckde]ncgnimjtllrpmajya[dmzimljmhjkbyozpmk]ygyhjeeexzqadcdyhf
+icjonhtmvgnwowp[xdtgaeotcyiyzozqwd]wudhamantwimysgpu[wjeyfkqluqgmbspxi]piyixwwkfdbogwcmtac
+qextqvcvlshqhbunkg[ouypttbdsycmscqe]qpxtjvipjkrbasofu[lzonfnanpflaekzhl]xwwxnjgtmzxnhmq
+zbtonkedeacrlltqnl[qlssupkhjptzbbru]nroemsymerldlshy[anmlmugxtrgypsvkgs]wfagpjfzgqcdhslmlnf
+dpjpmruktkfkpurvcks[mcdigtlyilcdvykpng]wrbydnqwmaatgjpjnew
+nhcyufcfcqqsxef[msqbqdsheiodqzpkcv]qlownycyhpteerrdfid[geiuncokzuwybrefno]mgugljgzgtdvyhpflbk[kwgpiyryqpdmphcwk]rghcxpkbbmimkui
+yyutoljmokemaksyh[ofyxkifbjqhrdklh]ltfjtukyeekhbjd
+uolodqcxatkpbywxs[qdpmghhjdsvuolwk]qfvcnuajofrynqndg[cpojwkswcxdorxvknrg]hluvdzuqsjsvhnqd[coemqesbuoorqrcht]oymvojeakuzzydb
+qrghrzhmccfpfymd[ejpldprfcjwhfthnli]wayofelvbtvjfesq[crskpxtazgepeguyywt]hedblyskngtnxnchdz
+gvebyckhjgfmqrxmmd[eklljmmtwggtlqdq]hmxazjnitvfcjmlactd[qhlsytdoiaksvney]jsdeegafywarxlsnkl[ycoyqpbbwsanlnoes]mnfxjeakujicrhn
+ttowopleauigqfzpuws[rwaipjqlxeajbszmt]ewurrgikabumnsg[hqhoudrdngplyncdoq]jvazavwibnayzbkmei[yfeaerzswqrhjiiqbb]khsqzfojtdimvcgsxuv
+zysbeejbuanxhomwne[wzcjovlgygbogvj]wqqbmqmudmkidhnm
+hzetqrjsokpzsfe[sfvglwbyaoczjozubjo]fisxeqpvyscesgy
+txsslfbzdakhenov[pdzbirgfxvyufuz]mwbclrbkpszfpgbrhu[ozmwusngkhbkluzvgo]wuwvzagakqcmcrcq
+vxmeolvgvkzdbldvid[ebhmwbfcvzykllewj]ngsvjbjjbyyoybnai[vvhfsezmrbmdkoxbdmj]pxxmcprffpzqadbu
+kagnhnyzbognzsmifby[rujzhkfynwygbcpuoq]wfgodhqkdextspa
+meyjysyguijkyen[vjyhsmvoyoppjknvivn]yuyroikrroyknlkgfn
+yrbljqrlekktwvq[ubrwbmlwxxtxnwa]ekompfyzprhialu[rdglmpamldxxxsgpmwk]atazfgcgkzbjydvf[sjdezkpgsienutudx]zuxyrrwpglvstutp
+yqhreymyqostwga[wngmbpfomuxgcyqdl]jdkppprtdctuyaonlqz[dfpqdidzlofdishhmot]gnifxcpfecsxdincqib
+xdfslzwasuifmmi[lbvuxnulhamtgfyhwz]sarfovphjgpdckkrbgy
+bzkfxruybgbjsmeflp[ubqugccjulkryeh]yaldnucjnxhktrgf[jamlgglyzdlaidp]dsvhuxerhecwhjslfk[yibicfmmkiugttqi]byyytkpsforwainomd
+asxywcdszmdtdndivdg[qkyfhaxaietrign]sjpliketcpjxkwxaoo[vmjxfuqxqgscfpd]mnpdsyqpnhlksmrcpa
+gpgcqhpkdzpmjoxbjvk[stpachxjlsdooglph]jaaoaxtyaogvmuhl[yochbczehvuvauxj]zatcmyzbmktdoohzgx[cbwozqlvqfssqaagyf]dkeooopvydlsoakyc
+blfmanmskfsbhnj[qurkejaextecwkh]iekzoszfdtcjcvqf[cllmensfekeoduop]kpldtlzhhnyaweelg[duturhserahslsvavl]tlscacpaddzunyhknql
+fgtfcerscppphulhdpc[cjasnicuepcfcpwwq]ubfqrgkjexhpcpdh[fcuypvlkciryarmpsb]lkazlfdxilmfoccr
+jaytjcjzwzzrwrosfig[bjwjolqvmwjwehvkyqm]qdrcohrlcqldwsj
+darwjaqwucpzrgob[utcloaeoixtgcssljwg]daazkyzlexvrwrvcoho[hesdrjjliusilwgn]kflojebucroplzdkid[mxvmzdobkvksvvzg]mllhibzchrvzahrj
+umabodjruykdkzuebe[pdyqfuwbwbnhvbgh]mvwcfyrzvyzbwbhen
+uuvjgoiafuuacqj[ccihiuugtipqyyve]xmtwktbgcgwvwchsseg
+oldckvjhhtvodiljhx[nqcvjxjohtdbukds]qsspbsmfdcamiwwr
+dzilyknpfbgtdnvntf[fzelzighvnvvqypxz]ntthcasrqrblqsk
+hphpardvfoqnqncq[ppvkmutvbzybiwmmcuz]kgfwazxcanccijxdxr[kvvrehncwizamjfbv]ptzvpznypbvmrshiq
+iteoprxpltaartmz[mnybqocmkusetlywx]mxfikdltxvgvklaxzqt
+qxldpbwuuyarzvlokm[peamzjnqawztknvnssx]pjacikdaebekzndkqbs
+kswrzqhftfhqqgetg[bplpppimgpytieviwci]gfeqifrktgdqxzw[ylzjvdvhoocfxoijb]jhullyfbzrzbtiujxo
+jbyalllemspbiba[fihpzyuwtiisvalzl]egftfecpkrowpxz[fwyjugfywhzgpbgxam]iuwakremprjkdfqep[cwjewifgwauyxaqa]gfnznfakypqatvp
+gtdsifvoatfwztxsgmn[lrdwcnvmfiuzxuyad]alnsyodvmgpdxqk
+ffyhycigkhlyiopmdx[yuuvtuoepntnqhkof]atumrmkzfhinoqq
+wrkcbbifeyemfppiaga[msgxssztbxvmdii]ydxtnokgvpouvcuk
+xivexjhdjysgmklbjp[scteqtgrnyuxsonvbx]kzbopsageoqsymtcfo
+jtsjoerkjzurnysfnwe[jqglomdcjmtvcwvhir]rozwrmwjuehpapebmgz
+qnscyvubszfeloscaez[povhdeeifvqfpyd]hdpspdtgtqpklhwqjec[xtqeoudrdzirwfxrowf]dllykbtfgrdwdlchn[fsjzptvngbbulfkpkh]nvyonktuxkjzpsciihm
+jzrrmwegexitufpbx[orlvlpnnuklsapk]kpwkwfggbcxwdxvp
+hfvhjwieruryoqk[qrtlruplpqjtwpuhhoa]ddbsdfqczwrmnrpm[hjjqrsppkjnvxmjq]juvwgpsglqllqhrc
+wogxentwvncxpjbntf[lunrnlkbjpkqcxprp]yanygvijbyhhpohijj
+kjwqxolclqanoyfes[oeasucvzznhjxkzlqb]bbxecjmmedvyfzapfif
+hfdiajyktrmlfzfbv[vdnyppvsruscsgvji]opwnmoadgirnedufn
+mrkqlpkzkhbfncol[huvazflnaswuhnv]pznbrubmgazkzfvkltx
+lfqfiunlwragtrknwpx[quvtbwmfgutkzaeng]kcdzgwyybqugyfgf[mjngrfgzmtbehzxzsbg]zjvpmzakgijjfyz[ghpyxsxuycqgdipdua]bjqtbqlzwyinovhnmmu
+ayagxnelxjvkqkwhax[zlimrxwrtlqtkvdny]nosfkooohodpzjp[hsrgztcucnuagedqoz]aujduldshdugxgbszom
+wkeqhrtgnhyektefk[afuwzaqdvmzzzgnuvw]aaisrnfyhuifpglpgp
+kpqqecovarltptjfdf[fwpprvpqfsntlobpdm]dtnujgpbbrqwqdyzs
+alnyvjvicoigistbmh[ueworbfuagjnech]dpzdovbhhbguxpginqy
+eiumooyxoukvaqoiv[qrygigmnybosyay]byhcqoggajjtotnuw[wpgsucwktfgcuhhi]hwoelhsxarzriqxtwao[nvemgikmzntrcfr]uguazrjfisipwrhcbn
+ghierhnuwvmisxxa[cmfxbenynymgvcrr]oknavjpheqtlsvwabd[izrzgzwvdgymivghdpv]fbqrtbvhcjgvbkwjs[ivdprbnygkhgzgaym]ziwhfgnbawgtpmkswvu
+pqcsccgpceupnvtr[bzfagcvmbelgxyns]uxkvxgveigehxsugzj[oojovkdwhojqcbilwvh]xeamwxhelypwwefsabq
+iltmsmcvjnhczdxoti[umsmolikbpmqnsyah]tdtojhhqszysiqkfqr
+eubknijqrihrbulq[hfmdunzrzrgseunf]qgdasqmtmgoacfid[duazrfhejbzxepx]apwgpewymhnhxsrx[judrexlgitldqqlnrpb]ynfdtcugmjvpdajapon
+lqwdkmmktuhdbawow[lsrovmkjyktyduf]utmrjitsbijombwo[abvvufjkwoxsthzbao]wteqdxfhbqrakiqenh
+phudxliosbjdplwzx[wmreutzkdlbxfksjt]onwnwzbffksdsrrvxuy[fuklieqfenqwinbmf]ckltdwaxzrpebmksn
+mldqsgldkmerpwqlg[thmshstolghijyjy]xzhkcpjyjuydgxjm
+wpsseyevqcibokcb[hnqscfwtkqckqmao]jsnvfanwiodlasx
+pomqeoawmwhijaq[ejtmvzlmidqwcft]hkeetgkruqgmnpoi
+twkcrdetwuxaxucnjv[xffwyrqfcqouyxmkrro]ezewjlxapphabveea[jfyjgbpkflijwvreer]nesuewscsclvwiwkn[xxjkzrpeonyctow]yclvbgnwgcarcxos
+ugndgtdqyxtplkdz[worxgglrocgtypfvmb]lcziijmkjfdpghkjqfp[qomfivwilarizmq]dnglkuyyinegywu[batxtrembnirlwr]ovrphoeyxqnhcvmts
+zgtxjxnktlvldrxpul[rviiugbdqcysxijrc]kyktcnhhtompktirdjz[bkusovlvbbigibd]airrtdvywvomcfrhi[xgapjazusatwmnl]usdiffjsbadtdonojs
+mimjtxkzfsnijawjrey[appuokfywghecatbzwo]aovbqviminrwaszvo
+kcmrpjoggjmfzwezv[onaeglpwhoxczbw]totswqmklmzrwmxdf[befvnijunppmomoduhr]wydkdiejzzdppny
+fgpjujczabbtkxwvfd[cicmceziihzlkcwdwhr]sicifccwrljuhteondz[qwtxzkpzaspfynin]scyjunafukgggpc
+buyslulsiiwxkge[ypiuwaxgxsqpbqqx]dwsyrzemulupybvx
+telsdbhziecdqvmyprn[hqpxpfnttkmchynab]wvopujdicijhmttrn[orfuzixnlfdimtsc]jzvuxsquolwwtzr[dmiytgapehniwib]zylakfeifdzatmqpb
+klvmlkigwhcckkyx[qxriuexxfsmfcpgvlzb]ygklxunjumjcmoph[ychtcmyhbyipspnnsr]pjqqgfbcsqmmrxbtj
+ugulusabrxqyxbvv[atgfhjdhplritht]glsimouvohndboxh
+fatrlhuimyqjjobdq[xvvmkavirljwcgmkvx]kbesaoxeeabtywsxcwr[pmvliimbudlzabbz]vseagltcmulcdib
+vowrlwyrxwivzacnop[fegbzczrceczdasjr]orroaksljdcydlk[clwvvrdfhommqcn]yqigbtlwvklqxxiors[uliodgyotgxdymyi]lqverjsyuxifpjoru
+wevsnwwlgslgxsof[eyjhzwdmvusnuerbqmh]mjzmgpkhaatmwptbo
+hljbwkfykqbnpqhkfuv[uirnlrjpryuhtqztz]ackmzmullgwefgug
+lmumdzgnhyjajoazd[yksltxstrsvugowym]xcmwqzbluyzdlbpkfkj[sbnktloqdabygsmyp]pyavvgzsxokeecxh[xcoublhmghnexnts]sdbkqumfdezjvqp
+stnccrfzofqwbcafssa[toskkshmnjeywtuq]kbkyxwghqfgrtxs[myvqujeowntxqiekgxh]dplyqviwehtzoxrrix[covstbqzxjrditsf]qxyocadbpdqqqpadl
+evgjdjnbnzmbzjpbfm[cxhsxvxtdtdowbd]wceyuozkwdjdsrsarl
+rbnbqreygxxaufhws[alsptejilzoslxfj]xirgkoxgpdsolbhqiqb
+kpzbxjsrsdgzstpc[jnpsoqmjqnfzkfsgq]tunpisxseqxjtyfwij
+kegehkcwqdyujtyv[qfprszwdyjylowrl]yqhpsvfmcofhrfn
+usfdjspdmrsmwotku[phpquxkrbrefnesvoig]vbrbyhzjjueflzur
+ahcrumgrsucgvcvs[zgiwqzqxdocenumve]wwmkejymlaysmpr
+egorqvqrhdxdcwglb[pewidggmjfdwchmpuxq]vfpginbbwnzhzutt
+rbwgxniblxrzdux[ctmqwdtjnnoizpfxkb]cjalwfgvfvehdshc
+grpqqrkmvatjnpe[fpuzplowwtztimw]zsebojrxdfyouujqu[jieuliemrlsrrhaaral]vapfxmifbvtdzjpqfn
+kxqzgqwklgxylpccai[scugesodkfdyduxfgpq]qeoajrdmbkawsrcde[yhplavixoxekedvoq]oefgpvukotfhzxvdpt[vfffrlkuirbixakjbg]shhslgefljkjhdu
+xltaldprsvinvsgfg[korqzbyuimhrmxg]pamxettjpfchnwvxfb[secngupffbmiekzfewg]jzqfwquugmanazihei[ldhzfrgdbneaxjjndgg]toefzbwrdaiqssxrbqh
+qgiiylhrxzzvniaegfw[vfxiqmehxnnjheiszxb]txrwpqbqkdbnsvt[voiphlhjwxrkcyrarwt]lhlhcobxijaoosyx[dyqmagxqryuyfbat]oovkonlsaeiqnil
+cwxhidoqdhxragzpib[hjmpsaxbqpiwqhy]csdontizglsbbeh
+cvqlicsscacfmuugq[eejkmtnhdfogzpbhygc]hsqpgofmanfemhido
+tsbgyswofaablrj[kxsfwmoymlmvxujvqc]oiatufqeigamjtqj[lbnetvjnhlmvyjs]aeeetvtqgykzstpt
+zikurkodzkxzvjucknr[eeldigjdnjetqzwtl]itaxybvtwbhjdci[hbkvepoewuzexeg]ohfbodukqdlanpa[rlxoscpwxfbemxvye]ydahcjuodtvinta
+dkdquuhvndpmvudwjx[hofzlmhpteoarpre]sdvnkykpcblbaardmf[hdtnalxmijwrorx]ixsdqmnoqrieeqn[tvyurwrpjzolmoqn]odvpdodyhdjvcaqi
+leufyoljrgauyshjmdn[omwkxoqtffghqvn]iqpnagprpvmlsvo[glbhtzdectgrymdzxf]dwgpfoqsivjdvpiidzo[glnavlopicrpfkc]nnstfkiqjxccqrvmg
+jdpqymeesiieeeb[iwrygkpzdjttxuz]qqrbobabyedbigesuh[tmfkwpopdgcfuydhukb]mzldoxgjdeckpdvu[obojbnmmlhdwsman]nssaclvkjwmoozuissi
+upgpcxmqbimkrcvcmp[ivnacnyueiepraljdh]vfagabifynlpbjdc[dobimimkhmytben]pgasxhypmszdnvjwnwh[nvcvwfgrqenthqcqlw]cdvvgepmrqskpffhw
+fifgarfuqaoifkymgx[mvgawkhnxvgaqdmzat]fuemwmfadtlaxwyslr
+bcbtmtmkhecpaemtmec[apsgtrjqwqreuntmdyq]qecxvrivzvlkwwnzcfv
+vslhwcbtvnnkfge[zbotbapnldktkexac]ieekqwkifqtpzwsb[wjjwgvhvnqaqmrmath]aeauqxrfhwdlbsqx[ijqqcgxjzepgnbru]uycbebwrapkiobz
+fgfxlcgdrvbwkhf[gcdnlfdqppnocayj]kgluimmxtrnrkxxy[ebmozaizcvfxamjfgfl]zxjsthsrjazocerdybe[uiodgjwmepojoaswdqb]gsywzobidosuauosihp
+jocqkcfjxtprwzxcol[jomzitpuxjjstqj]jyaupzbknhzvwkwejgg[frkljzosjvpzzffe]najjqpukuhkyseux[obvojkkfdiawyysye]awwxmmkvzedenpagx
+wnjitpqtpbywfdfzqb[zsmozjfwpksophbzrp]ryxeuskjtgqxlkqinbl[jbenmfsdrvwdjfxhibx]vdwygykkkqqzoueisnu[xgnqjjcnbpugkeuaon]wvyttauvhjmdqcbmfqz
+cjikxgbzdupqnoq[khvayknbckfnohcbc]gjsqdwbzsjnwjblbe
+sknizlycschmfbcbo[glptboptcwtmwmyj]hmgkwtwaifrmzxhee[dxxxiulybtkhkstynq]mjntafrkgppmgisnz
+vbijkdmufqxhuinw[nqkbpwcxoozkrllibiu]maiisvopemncukdedg[flspngjuzwaveawgk]lqinchaieoizrwr[tuyuxyvxkesiktilna]rhyincnkvnnqejsoxp
+eehvafmuwihwbizcao[vnktgdjhjeatxeshjh]taoisnoyefbphntft[pfzlfnftyvfkkmau]gxmhcurnvyqxgffll
+ytdqzmfcxjezgvr[yttnwhebnitzkmpvg]gnxpxseopkiwdwq
+tiygnypqepfcbcqasq[qoiylamohtllezrd]hieijornlrltkvvf
+gcolxjnzzqtozkqlo[gwiytfqkewszkddc]mervsuxdbxtqkclwli[zamcpapgayrobsrnros]skfbjychckenvdnk[msqqgpdtgzpbdsflgo]hswedrxeichgpbkt
+aoyzbbkhsyzouhf[yuheesbhrurspvkoeoa]icwrvttxwvrjodooy[lclcdnulwihttoo]aheoekyzcrdbtnkdn
+epqxzqeqfqquuvaxut[rvniqevejzxwbgdj]mdozdllbtyxiessvou[ftmdtfmxjktmdjrp]rbdfhuqvdzpiyaw
+fvfozofyprhtptnvfvv[cvjusvxzqhknsrfuw]wwjlogceospgxpoq
+lboiooritgdlzti[dcvmycwryuiwrxuf]rgsvwmbouwqweusdsrb[ncalmljnmldxtgjyn]digztuhetumfrmzwg[jxhgzioinwtdfvsczf]ormtzakkenigohbn
+jjgkkenzhjxreujjury[oqbhgbvyvybhznj]lzzpsybrpvmfxftasjv[fajchcbbxzyjzdmzju]jbyovxsryhenhqd
+kimqpwhmrecjichuf[biclfkhxsptyasun]cykzrmdsfvyszfldtxb[foamaxeacbbfukrav]kpdkasbbrjuqndsjf
+ixiemjwdwfauydlzrf[ehczcannzlhrpuu]zgmsdfleegepchlbml[pxixfrfqusymnyad]wynixqpqilkigha[ujtjksmgswjsqlt]uabmyxgfqtqxbtggvoh
+vvxrjenkffmjasf[zxizrnxsywrjpbsy]danlwskfpxmwozazt
+hdbwqsphlabkzxxhrgo[erldraphnhaevid]ynkxoezwjpygvftw
+eynyhfzlfnvsrguftv[olhsgnhicqlhqcopiai]azubeqximmxxruopbcv
+ixkfvfumxiagjybsn[frwibevmaiibyzd]qzqfzepjziatdpyqmr[onsezbgebekxybzzqzw]yqotbtwhsuxraexdfes[sqyxxukeslhogqaftl]kpqsxbeawasfnbwm
+fbotlkdfsscgahhtbvr[qzlujuyglqbktek]fitzbfribrvygprgssx[ytfthkzieycghddhs]twelmrjujaidadamq
+nuxgihsikrkmrydy[awvlrjbdobngseyw]owlsggrmwypppcnkmws[ipqmpwdvbohtnbs]nutezdkbigrjnveau
+ftxpxuuvsdipzjvmy[zfrkyfvducmhwzfdxj]ycyrhdiyszpbldrqyqp[pdhfnaicafoldftflv]rskyllsuaaxidlokgxz
+gqnlikldqbizpsceti[skfmnlrtbwyqrwpi]ubwivkayvgbhnixj[kmlxwcfmudgamallj]tfwinixbevrrgzozw[iufudfqiwsyjcyqrs]ujixfobkouvxhmvcql
+iddngjedxnwlbcxhkw[yqwiebcdacegykn]saybhmmqxdoxrrzced[bqjiuuqpbxczshymt]qagtwkbyyslughgsxrd[wjjqtpphygirijzcnun]lvwqqctdkjvaatovttj
+qzarsgfojoaqkzb[jiuvvyihogymomqddqs]ekacrjmxsudjuvjd[dkfjwxmpbviqeuiotlu]tpmzbyfqhelgtpic[xcankncgcyaixxcuaj]jsieyimscyfvaeduf
+epqisdvjvcpyxcwxuu[hhdspwfhkosxunncv]iibgrkioklsoktfp[kjvjytinytggjurws]oekjstnakyoohller
+yidewjsqwykhvakby[ewhvuvpzmeexvwtd]mygypbsbaabkccvslri[dgaksoqgxghazflkn]kpdssbszxhpltdxht
+ijhcdyyvjscrvhh[fpobanqwzccnyev]vtvztxptbegfabvm
+fcicsnaoileyhlta[ivnthhpicibzhtyfaf]agaffazyjidivabel[zprfefitivfahmsx]jxfvpjrbftgokdclnw[vfmlrayxecyduau]dkuaarmbkuqqjuva
+wjhhegqxpegrypjlpvr[orhbboezmjncmclamy]pckznmicczddarise
+ccxnbhlsqrtqcbrczci[zwbnllwffvdsmmd]wdcyuartrmykqbvmlc
+shpzokvkrrpypaohp[cdbxbviwegleqizw]dcilynllhnasdzaku[brkdsnedgdlzlhxzlzg]ygvficcbzjonmzh
+vzdkvwtqbqsgxenb[dfrsswrrxxxlpxpgp]lheiqkpbahpgjtvax[lbfhfdztehvveioipoj]xkpbfwdxvkcndrbfgya[qvewltgemzljlokhjxi]bufpvhmvhrndnkmjsjr
+mynfnfbjlwljwoqbenl[wnuganfnmpqrgcdxvn]kpcfvfegyibrhoeouiv[tmquruuijoivdluhc]lnspgmbphvhxlcw[slrraibkhqkaupb]vxwczoqsrepmgzz
+eaeovlebqlahuiztd[dngzrklmortvzksk]atunvakfxeqeymw[huaccbfdtygotzubrj]poeblqeqsdqpcbqd
+gzbgdqlebuwepvx[qpajreszsyyluwi]hymkhgxqpabniqzells[zediljwkqfpvblioz]zguladbcmloyugl
+cvkyjumasouhugvvz[dtidgtxbbufhwyvob]pdmhzqubmdreglyy
+tcxjcacxysuimczi[uhflafmjntxmsaf]uexrhinqroupcbksrsj[nocrykejeuzzigkyqxx]crwdvpjofxynwft[fmxkcqrsrpdfxscabs]crbnlnzoihruuilu
+notkmxwmhfptgfpvntf[ucdfxyikwxtsumebhj]kjhhkgtruhuqzsl[nyiklbrbfvreipanby]flesvbofrdsclfvm[zghcpgxoauylwmlzfl]vwotzewzjzpyccl
+pjrbmasdillqwdkjfni[lalstrvjalnttmwr]xbezkjpklkrnlpzjjn[wbpwhbukoixcfsqnu]xknhkqjktuybkfnz
+ykvyxzavfcirelraq[itraxkxjwslzkxkigcm]ndbwcybrgayecrpjao
+jqwujyllrskoetkbz[akunxyvvaxrysiygb]ynqqotupdoqbfwncn[yyszfaxjmgqmwxrvdx]zeacfwrreohtnzvobhj
+fsfgewroujqwaek[mryrrkeqgtpibzn]vlmavzfvsadxbdiph[tdlovgncglhaoqafic]ziupjyryletstrull
+fosmjgkqrqvjjigrtf[ejrefcyognxkuvlwl]bzhpufedodqwsztzng[rgxidklqahcldewgfrl]eodokojqopkrrhfpmmf[yqwaeuztmjkelpwlj]zijgacsyrbtwkxh
+cehnutkhbzhfouyk[pdiacmcgcdpmsvgvkmp]uaslakppkycqbzn[ldbaomdftjcnpasl]fgdrrrzumavxzlojm[iyknsyaoypsbqicx]ggtbqnjftvmqkmiu
+nmezigjskmagkzcsyhb[rfrggycsxoxxnxrhyb]zjlrnpgxzgljzfw[ztdnrdocidkgbqmmqa]hnuqryossbzlfaivij[dkaufcpwgzsxztpqsk]tzkdznvnizjtbrnqosj
+zcdfhyoyrbwonet[otdhxcbmwxzgoyoo]kbkvqasgmhmuynqth
+wajbfmurouvueehl[dvyueqwzbqcpdvbjfr]vkujmhhlqbdaqcsvomz[wlekuxdiumhnwms]yzgtuwxfirpmllcek[tzipbxbzpxcvzxzmtr]tynktoelqfhedvavge
+hueffzriwkhilam[zheswsymmryugjawlxy]rptwswnecdpsdjujnt[rjyipvpqzbnvtugvi]xkicvyasotmrxvqj
+rqbhugeaozfjbqm[blpvbvcvrytbekhjfo]twsrzdeuojhqpaa
+fymuqqbklufqakg[wfsqzzrvdqcubxbdr]yzvdgnwitopzvtha[vhrdzzbmubhgovut]tfkcybfbdsxbxaxnmm[ruvfmuciecbfoxbummm]ysaeetmynjhyegk
+koqhuxoxhzmsycbr[vbpklymhqueodieomz]jmstuovitaskfbay[mpccjuzuqwkhvnzlbl]jvdqgfkbyzaaeaxjfcl
+sbryyigqipvwczxty[ypjxmlzyfjkfqxyxibv]ktqvnmbdtykqyiu
+vivvjcfrqdbkyopqjdd[wkpuxloudonlcsutb]wpcbavtlbxcojarsj[wxihbnghmpfppwqlykz]dpyadzmpvgwtjoiz[jgagjiqugqvjnehajcv]tvrrkzjwwxaswbaz
+tkpkdqijrxmpddkkau[yljmixrzauogowt]yngihfgazktusprrt[ggqtnksekzzypkpud]rxvvuhfakfcxjieaa[spuvyobjexcgobltmk]radfcjxnsgsntezrerl
+hywcvnclwvvcmkdk[teiryduhljxirhrjbt]brkfilaybgtdkdh[zjqmovlmzogwvfmmi]czmtshoirukgjgeug
+sdbxirgqauygushqq[itvwniqwuzmpzqbuug]dnrxseaisdgklwodsgq[euqpdyvpyncxocy]ggchswamymfpxaiap
+nzteyxnakzfebtcszx[uctynyhtavkzfcudvke]uasdfpeleelxacxq[kyqsinbcwbvlrmr]zelddmnaqlkhmbsw
+ttzhosgzkuxfwsy[carsvskefzrusoihqw]qiuobbcgndqqukuvbmp
+wihzjoazedelgsojb[ftgarhsuahimrocy]umttbzcrvgzroprh
+itojzylgycblvbao[xgmeltpmzvzvyfnso]kuohqnawebyjdrerwty[oslthgekjbgpsnkyk]jifnogopgpnkfdrwi
+nvyowfknauliiht[tskhxdgvaggvgsbk]blgylrovweecglu
+hvzpbfqqlwjennnj[vnmqrqlfiqeqdmg]hfofuvqicttlcxka[ievkgdwazpamrdzz]aoofvzixtqamcvhbh
+yuxckarjmwgyvqjl[nvlegkojdyybpty]hvkrieawbpkcjit[tewpyncidhvdtomjq]dtgggmzwogtyoxrepi
+jobfkxxyhcfvetxwuc[nreuagzglpniuwkvui]seztmibtqvrdepqyt[skrxasyhbotymilzgzr]jnhqwvcpirmpnltnyn
+hoqhdburqwecnzksmd[gnegphjoyuvflxlujbs]zhuvrcztcfgorbwuc[pjxxfqyqmnhyopaeh]ewbvxrexhvdawazw[kbngpgqwtgkzuwupwj]kmatbuqigzqrzmbq
+ltjrhusfbjbciixg[swlhqxnykjxumuifqdd]romkzpszqgaflgbjpsp[lbaqcvazaucueltnp]wovkfmiuwjdqxovf[vuundonjprqrxakp]wxeulnkckdufqjy
+xkdmgtutsfumpzteeh[yvkilakqbawvedm]dwwaexrzzsyjpzsn[pxitznlnnvnjyrs]kcnhpbkzicorrgncowu[ogyvmiykolbwdtv]vjaksxdrtpuuyykihe
+eyzjheolvkemumxpo[ipwxnrhyldvgewl]zbrzwobnthndxxvthe[gkfleabqwkpjxbtdlt]wywjazwwxwmuqkpwj[omgsyntzcnhjvsu]asknyjsgbofzyfte
+kxxpalmmgdqwahfxs[zwafxcjjypzibafhrag]qfnbakvxozjqgbnnizp[bqhtnoqzctknrmmh]zvmyctoitshakgx[dzatbhonulhknbio]eufzjykwmqoignzm
+beenkdmzqibirws[majntndkzawkbfpi]biygjiawnioazizbt[yonbljzgueyiuirtv]umjmhspfocrpobmrfu[dwegjekvrmgoaqc]dorpbifeqhmtglavx
+sstlfeielfmztngzpbl[alzfrbyqiqangbkwi]qcomrirvulgipuk[mdvsghpkpisxplgit]aykwuhadobubmrdtvvj[pqdycsmawculwsz]oemcgayshwppgbwanxk
+qwhfnqzudzysqxwebj[nhsrdvugubbtuuseux]etcjsefcsjblcjgshh
+cgagbjtoxvwwqonb[crbqhpfajsdwtudybm]dquyiuqtarcupaeujhk
+qjsqqlgdczcqarhftri[rchwsuodsdofjpd]mrpwnlqgetejijnwnr[lwusdojqkioapaxwc]ioumfyxtwspuyztz[dgncyjfldlapoasebgz]raelsaeajwuhnabrgw
+tihnitxxkxjvudnrj[neqbqspcfnldrna]qkkcggwjgejtbmggemx[ffhkzdeopnhrdfpbrfn]rucxwfyfiavskfahg
+zralvoiqdvpvjkkf[ttvdslqoxnlvnyyskq]joucwcxixdqsagu[tulodbmorpbjnzz]qkknyrgruwgrgupgb
+fgfaohmvjameqyl[riumppkgphbaziwbfcn]gspevtjsfjazlolblh[sueqarjummrmwdgzsr]szmltztnwpqshlr
+lgcudszwvsooaxhuz[wpnexmkikdsfquxleu]icefstmmxwsrzqoiki
+elrybwwbktbemldjqeu[moigtqyrbfwcdtjkm]cfquoomooaqrsuomty
+rihnsvwngkabincos[hrafbjoluwrkoaqb]genyvelnsrwqpljgdf[ytnarqybnwaeawssx]bdhppadoofmwwbcbl[acnqxbqukongbge]tptnvsrcborwgumweyb
+sesxnxaikeytqds[groytsrabjvakklwp]jzexhtzpseseauk[sdndnglavrmhzyjdh]mpsxlaxqnazayppc
+ozkfwwrdoftbpnqwa[mvzpilxwrdeszungggo]fbjxevczxrypzzegxmv[zvzaovlhirczrlwnvk]yulsjotokxaurjibuk[hygvqlsqfygujup]ijtuoskhnrvxmmnety
+ssoavardlqlejqfndz[emljlpogavcsyvavr]izdkqsihedwjaxva
+wixidnoyhmsiuzwbm[jgqpnkzbobknrufgif]yaarbsalkqgscyv
+hgcggfqnkhbjlhhipc[cgcrrzyspqlllhee]czfvtkjhfgnrwwua
+ggnsczivqxwhungxmb[foslhzlzqyhcwepvhga]qgqnwrpvfjilhnttbv[uhuhvuqwbxsjxqbmqfs]pvwkiufdudmyabq[ffqrrfjgkmegfls]pvuflwvnbnllckrmdas
+llelndaczjibswzoaen[dzvunuujhpmgqdyond]slkfwoyxpgohhelexsl[hvtucjohyvbuihbonup]mwatlwbwxntozpiymy
+epjldiafxyinaljee[zfgytlqlzoaauszrn]gvyukiahumemeqnsy
+vldhkwyfpfssriaiwe[yuluhcsjdkyumyhnd]wggzcfalpkmnsudzr[qisyeltbpzmkvqr]kmbnsrdjgspckgmwfj
+qkxpyonwbsteomlyhxz[wdkzqjywdsbiccr]ojkvswlubvbbskvnbdw[ejvtytntukhcuuad]hspfdjitkfetytyb[hlgziyjqrulvyaoco]rfhwusvjmkzkpmjvrm
+lnmjprwzvaboyyobux[lncninvpqfpuaswssjs]vodhkkndlvixtbsdfph[gdufsyhihlynxuluvx]oyczgnpmusuvligf[jqtdbytmuyavcyfaia]mcdloputyodiezffqpd
+awulgpuvbkountidkgx[rzatlqccygoyamniyaw]zmkfnkaiuzjgdsxd[dornnqierejrlxbitfn]qyhlxykziurpdxpz[fjaesxiowwxjvoxzq]oujzxyreqtbosriwkl
+hcycycsytqzpijy[pptcwgiggnlhewdwfa]aqrsokplrsmbzzovz
+szlezpesytqglub[hlmouktdjtcglvvb]wgcrjqyvabgnnirxs[cafdqrjgmugvsjarx]uomjcavfgggsyknjge[syhraisenfpvlekk]voyezwktjlqoirx
+ltjosfxwsqmgdrnpyav[revxajvfbpuqqscgxb]pnjpsoikmxwrpbk[frqghuqvbomoddukohb]egfbhndnpnlxjhyv
+ydyzmmgkrvbycjgeheq[xmrcsrshrtogjfez]vberqebkqhindvsj
+usczwnycqbxdrcfr[papmzhuxspnfexyr]pwsybmexcdgfztkc[jmiatnbqkxmarkaeer]whejsdpzzxkdxgwm
+vfiswfowhnwcuusmd[dhhjzfujepawktlh]quzyrwoerrtncnnxup[ekhrriqhoudhiwiju]exzcmnyrtbnxlchf
+fmobpaevmkephhfuu[pjbpnzxkqpvoafxj]ickqqwfifesukyx[uzfultsftvuzbipz]jgvjewotmlkzqhvvc[fhfgcekzgmgxosyuac]gwbmgqtvkhyqidnehhy
+zbwadipvxkyqwsaassl[wcojcviexybrfhdfc]euliyskdckqzozfnlpn[fsvqspcvigzxlzya]vzabwryzpqlmvns
+wavahkemgrtwnvbocse[hnzvxqcxzisfehcy]mqvssniqlwekgowu[cusnrkcbwuichekh]cfvncmjjykeaufknu
+wvtptjerlrfvtbywes[ciopqzpfjdoclfyxxqy]sleyhkequxorssls[weyxuuiigtkjsmnugij]onxiowvkwaaycpv
+csanwgypabdqhiinan[gujzhrxowlgejtk]mkczaemurigewvqw[lsqtuuxcsuphogl]acfqrkiewfykgnx
+ennvxqkaqdppzmj[litdmoukvydtepvji]hfuqcwyuufmxcxy[bilbdvnquchtcjquymu]yjndoqqpyzrjudd
+vhkrlicuffddtktngy[opctcwvtlypwglpaoi]iscxtzlmlkjdgty[xadnwdasnszzmwwid]uijlqxpfgkkcmwga[ykqorpoxpbjkepibk]dmuojdumobwfmkvqg
+wgcihfnjvadtczgqbj[psdtqjwifivgbhp]ocykhmjfvbppiltqpvv[ermpbuyieexqujuiji]vjioxemsjslsdxso[bmsocpaehaeadsaqzbm]hqlzlnedzwgbxbcacf
+reesvrozyerxeid[ymtiurpepvrvnkf]thobixnwiqrdkih[uipdwllkuudcydjinew]lzpxeltetaixzfjxvf[ewlhchkdiewigxy]wfeiqnngnifjzbpikb
+rxgukabwlgxzaxjxch[ljrblzdmvcwcxdoomq]ksidvuwcwvwlvrpe[yrnyjokakcbwdxh]nertnqwigrzbtdmj[gxbsdsdmishqjeswt]dsgnhlagonywspbr
+jjdfvvurvfljscocvr[ueywpzuumfihiocoe]lmcrxdlkqsouhpimc
+qgelmqtmcfsdugg[jpbrzcblivebxazpamj]jpkxrusyqkjnndao[nqcxhhmkpfgrcwhsoyr]wvigixehqklwvrscmz[xutrclaofzczcvfnxll]xsyxrvfnovmohxfbt
+aqhrsqbyxtxhsvmnz[pfpclhprjghikyngp]krgiznxuehpzeiy
+trqnrkulbvipvmj[mgsdnaqnayymjyp]otecdnzhhcufrly
+illmnsgqusbqybiso[fxddafnnoholnqjotb]uplvjosscbyhwmw[jsedsarqbralzbjmyq]sdwkyeychcdpqvfup
+zehmutjhkodiqpi[usuretqrbmggvlvr]dewkdjmtingkzuyq[pmmbbozcvplhejh]jzasjfqvsusgnkfegad
+ljpcpqtpcpcdttjo[qbmnhadshlheoavsbxi]wnwuahdcagpellgs
+ayqxaqtrqzbxyhu[wkplzaetynfxqzhtkco]jpgbztbvmojlflc[ojmgjvfxdvlyzih]levvkelkzftbzwzkow[fmszxqchzjhxtwfm]vihmoqcosarkzsad
+nigshquyfjlleujdtw[qmiqiabzqiqafambcv]ywbltgpjxcwlkyahg
+vmgyovkavazsxwed[anpflkjsqieufhscn]uizulvgasvsstuhfn[ygxgsfldybdnsleqy]tztuatotreocsrfevpy[yxqmsidajmknyrae]whoydkufyieuqhmqv
+jyhhfbftixtntuozgfl[ffrzhxpaezbspndbo]sbwvaoziercfpmeo[tzeluvflupgartnyjes]gqfmzvmpieczbjdsr[zeenwxfhhxbdgjkr]ojqxbcxciclzwthvqyv
+olhruodhjmaicslbgw[upvujuuazyolckot]gcwfjukdneuxqreeg[tnnnlficumlgwkdsxus]pxrxdntakudobpo
+vdowqzktnmpimsvok[gggjvxecgicglrkuvfb]xtsuhbzqpovnoqhnbs
+hxvziijhffbzjnjvgoc[sealjvjgnjnkzac]neuhdwcgtjcvpku
+qryaqhtnjvickffebwj[hcgzffksmwbqqdm]zrwihiolnfuqzqpkxn
+egbqexgeqnqsaxdi[xghkrttlbmkxgfj]rpulxldvweijplm[dldqxbqxenksncnwhxo]steqcncxfskqcfwfnbm
+dhusxmzjdacdrqor[tzblogyadgggzbi]vssexeogwduosdoeo[xexqnjrctzlbkfri]dqppelyoecnnacs
+tkrkjtgdhxdcyapamp[gvyyiztulksqxosp]voudpakpaphmrlebpj[vghkfcrqexfgoguvbxv]yronkwfpvrwilnuegkb
+yiuhvglusvqtzvngzuc[mfvcrgjuywuthtprxe]vjrrmtbyppmesvorp[ucqdvtwolrvpjyhiolf]eazedskopeknjcqx
+segabhonjryukdicj[zvjqilxyvwjnjgjvrnf]gxibvkxslgkpfdhsn[tlbwwiypungvwcvwngx]hhgglxqosunhdvgr[mrjgltlfxwsznpnmdox]bqsgftffsibfruyz
+hrtiuksavtjzekgf[vaagjkvweeznlshs]ntotbakgpxpcmqanhab[pqvkabybndisouur]cnjoxldhauoppnqqk
+yizxcouxlbjqbijqmj[kkqvlcusdkmkbmuia]pidiunjwlkapojzzmf
+dfzinzasgtnjdbdh[wyguangjweruyqm]jfpqpyqydvbdtgqpqt[eryvzkaxiahxekwbp]sywpjhgufixvhljk
+jkmabkiiltlvopaxec[utofhywhxjucodwke]dwxatuzwebnyulyt[iajptbioysozunsws]nmfnmtguoqipjmigsyn
+yxletutyrgisbrm[ljtuifjmgxupgerhuhb]wpqnfedngiollocqbfh
+zszqqoahkvdvpezddea[defewzqptytvhnpzcdu]cxuavzeyqysdynnr[gvmfnqnjwrjrjzphei]pelrqmmykeiamnh[jrjqavultdjecnghoc]ekxawogufyfdmltveqf
+morsvbgrpgqiqeplgg[giswwkjoxkgkbonav]lyhrrcwskwjjflawgs[ogjazoccoomohhalb]gjnkzumbxtojtud
+gtgotbovcctgtwwc[owthnyvlmcwnctlkilj]eytxalpmzywmwqc
+ikznlwbayqdbhusm[iqstwodfolztyldh]amvvpwqwlswcnut
+kumjpojktwxazwtg[idtisckrbetbaye]mgqtwjxlbdpadrnxg[eourfrbwgoeoqrlvhv]gegegzbxfyzpbij
+mxcepmkacvzxddcpnsf[jviddcgbglreegewbj]qmqdhescnuuswkhpvxn
+ltsouowwsvovkbie[huwwuaptbopxsixrb]skscogxrektbbmuwqu[niaczcnnxkymnnuu]sfczdkldegoynqw[mrjssleiutncang]jkfgyuzcaisvrjekiwe
+mfqowsxqmywlvauv[fziifhafjuiwdizvm]gmaxzryznwavsaxsv
+okmehkbnqsegqinj[dxddmmglnqftiunfuea]todmrlalqdfqfkbq[vrktligspzyclnfz]jwdvkpuvhpwffrnyxw
+mybozskxkccdsuuptc[mrlkqwbdhhktuxpzjxi]xrujoxxkxwqcthydsw
+jupphmpmynzxsfkr[xhvcemrobysjizesgs]ijjlrwbpchbbiblvr
+vpabzrcqfzsejjgln[segfzwfyprsfqskhop]gksthicdjyagobs
+tuhzaznrumhuwud[szqusyzaykegklbcdoo]prwjxzrwyrgcouehrg
+dfvbjgrshvnvfumqxh[tgnhpzveumwngrnoc]qpntyvcxxoofgsk[jibdpycgwklugip]mgkzhcifwyzxsbuwj
+mbdpghflpcondfk[ftzfdsbexmnznqqmfaa]xznzgqjdfkmjzvwni
+ojjaanxihagtezp[pxqpdgygyklexhrpc]lapqmhronwsmwbbf[rzuhtemugsniacn]apixdvsnjpsplmjwvn[iwdpiqgoztjamenyyw]zjyidlwjbvevovgf
+pijmbdkeyhcjzuwclu[onazufaoibbwzepmbr]jhjaqudvrdoqcvobs[lrwjikvojmgdtkwb]gfxgoeihxughdfbetm[yjhxesdcdudwszwv]hgfdxuejwfuedpdu
+hvdutkvozvxwpvx[beubpipzuwaclrev]lqeylkxqdqmcdqd[oivjrkpjzrjywzrxely]dcupjtbrltnguho
+esrepqjymnodspvjib[kwdoleplnoxmntjuip]lvrhqceegktadibgh[yfbqpomfldnbpxsaoan]cheitjzmqwdbilm
+oakpwuuoizfcsfo[csxawuixxvzzooah]dafrurtufjpuetnui
+jmmekugaastsvdn[qoasgnykbkodsgt]lmfvbqomdghvicry
+hqznrdvlwnamiushnou[iufqiqjtaiejfqwns]xsgjmqqsvbctpwqcgz[mvpdchozogazbfywqd]iqimztlwajwbxhr
+gkeetoqftvsdjhhghre[nspwxohslbgkpyyhdh]glknqkzyfmvjczau[zrzurqfppidpckhmxu]rtawnnjhyjnbvnt[deisyafkjnxtcjas]cshchafpoiqptus
+jpkjyjiucudsgjz[mppiltmurhwxvmv]sdhrapccelecuctxq[cnwlmuvyistotoykn]hjzxzneifkwmvumg
+uvzuxzcnipyfyuesvna[ckplomuathpfkndodxk]vrqhbliixmzbefuh
+ionmypunjczxhry[bvgmqzohimrjmijzkwz]qfzsokgukugmeso[uarvxrewouktpgnghtq]rsnccdtstsegeoudngq[hkvkymbbgdyncilyf]zteoiyacrtwykwzbxy
+jnyydhrsrkeujfvj[qmxzqkbwizhvcztzdqr]yllidgevuektldszzjy
+nuylrchiwpfvhdumyet[hfgfzmeldvotgtxqh]frzcopyhigfewcnb
+sdcvojpgatiidjvfy[zhvymqejqxllelyux]ektbysjcypxfjrsor[kgfvqbereoskymyfp]izmdymjhwwtelesjr
+xnelfgdpnrfhdombqq[oiidietkplqnygwsgo]jiltmfqqavrjrvyui
+zyuubhwaovcbnaxrmtv[yefoksxqkrkbmbm]ainfhyuonvdvcyegy[nntnxqkqdqattwt]tcrtyqjhokntxcb
+hxkbhdfwcraxhdcff[umxxccphsddzavdqn]zsmmtgneghqsrwfauw
+kbdughqnourxomuiab[xcjayouykostteh]enwbjtpxpyzaeuhuwb
+cpmzhwxdntahvhl[diddnwirsnqchwr]etsizyoarkawzrpfidi
+xrruvcmbmigmutacwc[owhorlqlgqujvhos]iddgaukpxlielcko[gawcwcvuviuohmda]bfdceclnseehdeyxv
+vlxaputciirctva[qgmwpinixdixaiut]kkoousbfcxganzcffg[cikwetvrztjgefpzsks]jrsyfxydznmupwapco[ooydsykpjwakdep]krlytknowykzzqaafou
+dnnvcszortmitfv[sbnurvnwxwmvbdpawa]ewayhapxdfxplpqudro
+fsiehjchtnyenvmjfw[obnlguwjqsgylwveak]hupypbuggmbkeqxt[ljxbmifxgorvriaj]tkttmzairwztsmn
+pnhgjwzyqnjrkkw[ofyifgmztnzelptkwho]cgnlnrfdgfgjvztpz[wemrlhyskboycpdbzr]azikmfaudvrdhvfvt[chxmcbgineaycjiwy]kjbfttnqgqhkefoolo
+khdlanelfapgxqpspe[alrgipfwfdyguqtk]coxffjtxpbqmxig
+sxobbewirkvducqxd[ubfbqjccnbtkwpbxqpg]hgsswdjiudnvmvijt
+jzbqaqfubdsfinobsdu[rojkizavtvueepedxw]lcsyjeoyieqjcim[nszibgczunpslecxo]louacmgeotayemh[zvpjwwpeyjjdhjc]jidkptxmhccryujojap
+rrofkfoljuossrced[ymvijcmdvrzhcyh]zegkwrmeneexpcnrh
+eniwjwjnmgyzescoz[semlscmtbagknxpbvte]ysqfgrshborwtgnwtr[bossxfqcyadppdflbr]pyiuttfsuegwjwcxzr[yaymomeitxwdfvsr]elhifdegwfstqyniqta
+xauanaojjnhdgcpuwwj[ccitjseyrwjqvaljv]ebbwxnquaqlhgqjsgwc[jybietxintbtpzncpw]wfkwxwffzxwqucjhyvs
+ipmxdranyxbmwlo[ueimjvadwbdjithwn]ifmvlcsneopyffsums[ejornegszbqxtosc]iucimozjnkqkeysden[vvtdfnvjnzqbxujml]klrpisgrmdbrqbupc
+evolkocwyejqtcazj[dzleqjleocyexjivik]zmvqrxiqhsjtoezm[sskndhlmxrucdyqvop]murrraduofedtltbtg[kuzqpodvwnewwqdil]otvalnjnbexltsbitwi
+ppqnetrairzkzlt[hyydyimhgzayzgnxqn]lwubwuvowsyovjjfgp[xbzmifaqcmpyuev]wtgcnccsysrfvbtb
+jpecpgdrvunkjfrp[eevsiosfybfgdgalp]veprfliqlxmoctjx[bcfelthvqqxthqwpuoz]beufleuquitnnsti[aslupsydyktxgqsolq]gctlsoauflrjprdn
+yekfawwakhkqvpqf[cvenkdpepuyimstwmnz]fphlenyhtsxxeyst[yohciybbsiokzajcwlz]vtqcjngqpamsvrchix
+ougrpfmoohiymnx[gorlgyciageugmcbony]ozmvirifntorlvzz[klsgbagukrnbyzsez]rdzhlkpoucggkcdqm
+gfhrcutoyproiww[nzgfaaccfrgdbcg]fcrtnobfhhyzmadxjv[vlbueztcxkkbufljse]gqpnxtlrrhclwuaj[sstrllihglystknh]alxmlywxfjwnynbwfk
+opeacxklhjwcefmwrwg[mzqwxyfltfqyepcgnym]cpziqpjettzcnktrqi[mbnwwhyxebbececc]tdkduejetkrqwoxrsoq[ncenzwgjnekbobv]yxhgzizqxwaihedda
+svatyxdgfofrrkiksjf[mxmrficzxfyykqekorr]qojleucutcqxqryi
+prrhfrigzcmemou[zkhokevqzcspzoyt]tytqcpuucppiwio[mogedxwsflwocpkdh]kkqnructlslbaked[sslztcwiwkudgtji]djssvabrpmygljeh
+btundrdlcsgtilltpue[jiunnaqqzfgxauqjes]wtdxsfqroorcghqk[qvyzuidvkzmomfi]cgckuokezrtxrgdlo
+tjcpdjzfllhwugiy[vxypwowarlatqjlwq]wnpwefpgpfcqqwwrsq
+zfduowqkrccccgggmbl[iwwfgrhmjxgljwqf]cminvjjyetivkvhvkdy[ismlcjjywxxvaehvhhm]eojlvocbfkftjkapzs
+hzkrcmpwhfnbwlisg[wxwoegwncugpcfwywxe]voktthitecybcfpnz
+dcsrtgkbstmkwlzy[pcnwmgmcmpsiyizqx]pzjcivraubvgbkdahk[yydvhvyumdzfmjuso]bfljbkwodikjenu[toxagxhnvgkwcivpcuc]sanysdrigussqum
+lpcxkqrspacyzrqhbhr[vdcbkamwyjnxpgjpm]afxbzzxzrtaacbypq[ftbpiplrdrreqesthw]tidlvfojrlctjkfel[iibzklhicpqjvzrnza]bmekkyjigxxtegqbait
+duchvjohwoouxgmmxds[qscgkenygikbdrsqc]iovrgoggtgiebylbu[iqqrytrhujzcywwq]ybgfnnhqwfpfios[dryqypecmskrqux]klqhpvydovzggsqo
+gwgojmuthbgcalzvdxh[njicnwbqdckxtyxkj]rwyptcssdkdqthiydea
+yokzqvwcycvjgouoyw[starlvyjnijeacjseo]iehvlergdbswibmzci[ppmriizuqubzfehcz]jartjkmqzngigjvl[izpxafhxdmckrcuufu]pvkldotwdzdluoubpnm
+rogyxrgfqivkovtna[xtahrogngfeygkasq]kpcpvtirxettedux[cdlnciogkcsaras]bupwazalrmfnjufn
+eaeubxmpmymzrfleut[eharpivgddyokps]wimaximeayrixnts[paysmyvjuzpjjqr]fcqykmkzbcbyrpy
+exvlqvnfmpkxfjwbhol[utjaefsandulqaw]xjrjchxifscadbld[ifrckhdhmptybkhrj]ykcqgygngiwzzyfnxg[plfhikkzndknbpdeeu]siwtfnlbcxuqkrhwj
+ljihefaqagbmffbcr[ccmafzhpsvluglwsgh]jioaeefkgujinzlgn
+rgysyaquiuyvtojxnaj[gcygzkwqdebiqsr]icaeuutjodsizqzfvj[qapmsqsaoniuinsz]ppgtfxsblzgtqtaiiey[xlkzyyvcgyhlmvnzrpr]htorgwwkbhasrsbvemq
+coiurrjhxxkcplh[nkusmllwtsuddqasyc]vyxzujqohjyctyv
+briulribegnliapcimw[rgawfayyoopbosvc]owgryasogyewgxchxgr
+smseegsurmfktgmefhw[paopyayrwykwdvcjjhp]byayaatpurrllyzd
+mvgbtjdigbhhywarz[pfrhqtizabthnqrvvw]azdztfkkfizbxsy[jozzjtzkscklmdt]ucnptpblgcgmkeojpl[nqsybfqdphdncqgigis]yecpixjgagdgkbz
+zyuzikehgrfaztne[oaxgeczbaafnottqg]kuuggppqtgrncptm[tcfnyqvqcijfcfdljh]pwntuaixpqfvyoatk[mowgvynrpbvmqlpucq]vgopzmyigjbqlismti
+ostutlkruoevsjr[qnvqsxlasjyrdyyz]klwvhuhmvgrlcdy[tycmevukacjlveu]mvxcfqojmrijbubfm[rbodtpwkkidfrnhayj]jsbgdcwbfdfflvupn
+eaiframmiukbcixxi[bmqaglfamrqoswuhme]lxvkwmzgauwmabu[kxusdngtifhpmplxl]sfccogjqnblrahch
+hcjmrcnzrhznwvtjby[lxmehjbnudevzmhx]ukfmdplzriyztnioty[lqjesrsxjozxcgfaknm]qifmjftfaswtrjblzf
+xmhpeigrzvrgknc[drornrcakzujdrsbrvj]czapwkwkwwnkwks
+sfdyqdpsfcxebamsf[vehdpjffaqhytqhhbi]urolmsuobvbecvcnv[toagfgryhwfgfwxmvs]btjwiwdrxnpzxlxdsdi
+gnjmrczrqiryaodop[etlqbnstgjysesf]ggmbohbzrtfbapbjg
+wwkqbdcmlkfwxwdu[firsfuftyxwxpcicu]cntzxuydyjkgkkfvdl
+cvcsgxflnidiwtvy[hhzzbmygwugzsfnus]evzlovhsgqumejki[btikqitubnwzkhfyhh]xwxvlgyojlmkwljv
+bzuxzgeuobcctajvva[lpqpidtuzmrrnnlgkqu]lhyxsevugkrdimm[umbmngadfcujqpqr]nizwephuepdykbgj[hfheiymxxfgyxyl]zlurubnhkwxdrwllatg
+gkwahvrljkerohucrty[lgxqhorgrscmkjqcziq]otxkbzuzncbznvr
+hpoehzfotnjpnhl[yrkyqbolznetbgxmy]fblwkhzfebmzavscyyl[lxvxgdkjvtoxjpu]oetusxkoxlpceierbt[faylwjcdxicxbqr]ledknznfnaiaovejww
+xifdyajgrrrhakdqhg[qtzmwfjraqbrwstiibr]juciognmzyafmai[lgbmgoxqtjngqpqkwt]zzkhrunuborvoajlvul
+ekecthrkwdbjhsy[klxbdnucasemwhlpjj]jbvenwrnvynlfyjybm[zgfxxurrduhtlmsbelf]lxuxlahnrqvjssffj[wzcpjiesgsbwbtnlrs]sofzsskbviyfvlo
+jscqvqqdwvkvrqcb[vzfqbgopfnjcekjs]dmspregwlklxptp[lsxjobfksvzwshdre]yqfwrvjrykinzeon
+rbtqjtepvufhwpjugj[vkdhjmfkeocnauedxp]vpoqmfpnmjdpcxw
+ihhaztfuasflyghkndl[vseslcbeufhmrpyfqb]mtcgpfjhjeowjpqc[cabeopcrmhjhudob]fgeutfapismkdwqxmal[wldzeajldxlxpwfrb]rvyuojjnauuitoofgcm
+ixrzwptyltfshve[xwlsfazypzeuauxpozt]nwfgkbpuxeauadrgbbm
+vppgbcdybisarvokztx[yuykfmzxbgfwzdohup]vlkdreyqjihmdksxih[iysfrpczrirzbeirih]czkbhrqlrovfkmlu
+iaatwbohmiosyiqfq[imajfecefyujhwg]aanaybxebrfpdfxxpgw
+qgomsuglksqobwhaq[fzcrputgufyvnesoqwe]ipziztlrfmlaizts[pulgtrdydqegbymu]pxcyeozdofdghkmst
+tlxidzqdeqchemiqdsm[hacfdsanbiffzhilct]jtclxgjapfmwhlkn[ieafoftblueqcped]lauckblqborgtjnj
+upkkaykvxwvkgwgztzp[jmotfixnvoqrpwsci]wszntutpsjljzmwqpgp[dbnlosuwazvekoplb]bmobthbbmitprffl[qkjfwmsronqjmylzcre]yaulmyfoixmkgjs
+zxxsmidmqxjigkbos[iwsufumylphrhyx]uqmpbcxmvhzuppxqopf[ykipifsdwkpzgmt]zzcwzmwugdzckey
+ciakjtvtrkgrxvp[yhxuyhyxwytquzxujw]lrxibndatfiqyltehl[nnadhofokmcutiyc]vosxtisllkweiaapagg[vwniutthbrvmqrvik]aixaxvddxrdnmmt
+mbjsskcvljlehsxc[cknzgxghehlmats]eqknrogpyfcmtfhso
+lcbrfrsccsbhyhurc[mheohludmokwwjx]bezowkrdzwhssgbvydq[kiwqvuebvywyegmdyy]ioskcrvqcagocnnh[zgttakbraxpcsqsc]hmmqufyflbmjlcciqvn
+ezmqplezxylckxcqjxn[pdzarngoyfbjgyxqxgt]yokricbfoocmehi[cffrwwrwhmilnyf]uaybztxphgccfuu
+xnjslvbmmapiwwpq[qmuxemavopeoiwnebts]xmrajpgpgeojtabumm[tbjjrgipnfzjafi]hcuirvleolclticur
+eltfnqblogwvtjgni[bjfxnnmgalahvpdtvku]eingohwswwabsbtb[nxsqsvleqobfpxlaxj]gfsbsvcbbnwtuktuw[wrgcswhmdtssvxobcu]wgsniklaxmadgnjd
+kxpuygixzfwrwzpzsbw[uqxqvvupyvvajkcysh]scshpiffohigsgm
+ovchugxbmthhhijq[fznmygfcqewzomfgbc]qczlousnoccgyrgs
+imtfinjttxvhtcll[xiqmbmrcqdxlvuf]pybqlwqezwrkvikns[usjydesemedszquseso]fhcgyicfbdrmgcnk
+aqnavkllyitzewgs[cbbqmbtgufuvcun]iugpkakfufksfitigk[lyqiierbjucxbvaux]szbwsttayzipkcdb
+yetucqvgffnvnxqx[pvgczfwkehnfqxawz]vfxegwcevafevvzx[ukcwxvnvfnqvxhfa]bdciuylrvfkmxyi
+yvachrqguvjhkrbe[rtlpuvvfdvmtqswiln]jcyqjdmtzndhrif
+rphybwiwiszwkkxm[waiaqtuthjgfgag]ttlnqhzfagaregyo
+unsmoewlzxuguuwu[dyqsnohyqcommmmov]jipyewobyjdzkgkgo[yphyanakgkgvybsx]pjtzynsvtltzzajc[iweuafprefmbuekk]rwelzzbkbqjwjrw
+kluxazqhqmcrvldfv[dbxzgwsfmxettwmgj]rgvfmxibxzbajitnud[vtlbsgrkhnfpmvvkp]pdycyraaqooszqa[eyliotjigekmtov]eiopplzmedvdvmwt
+mlozzkwmfcrdlvns[wsdduzxzfvlvldpjvgg]ywqncwocnslofij[sakivxaniergaouc]nzmhdlkxeiehdpuok[zfwtadjlizjcauurkq]vlvtdicnyhseqbeo
+ssfmkfdeguuaqdbyqub[nbobgowoboytefejnz]fplpuipnficejfsuid
+lljnuuistrsmsjazzy[vccsskujvdwxypuk]jhqjqhfatmuedugl[hufmsmgjutabctabusw]zcoiiovxkxtualjx[zdxdbmbibryrqaubxy]tyayojdxepcpmwi
+zursgksbdkuzemouhl[sekbvoxwlmumyrdh]yxafewnovnxivyp[ajjditfeeocipuvdl]ygsuxuhtqervumd
+suxzfxizhyzbovsz[dtamgkleqiesxemqkgl]vjuviztkxzchergyx[tvazaqnrstjbdts]wccoiceucunjiuus
+gongygcedfxwncy[lxtpoagiqvgiryasha]elmaiygycycdtsclhpf
+pkyqsmcicydbmdagw[ayulcaspxpbtnegeoou]welxvngiualigfefv[veqtcxgkgzveegxckee]djmbhovzjfexqaedywl[okzphpgdqtpicit]mistlyyaoyphetsxqxi
+uwrxhstckbebnlw[yhflbfhsqhshieo]dvmzzqknrjcnwixhgk[upxuqrlwzvvsgpa]bmnfpjynunfbwunupiv[mbcmrpoxtbzcbijmmu]icdxewwtwcibjotjf
+pscqchwjixrhpzprdla[nzfglspgwpsaiph]xtypkrtleiujsfmcso
+llcxlfghzjvyhgill[vtqyiyrwujkovfctkk]arbtetvtixtnyavydg[ozxyyroceqktxhpv]maekylkkwdbgwgug
+bzagcsgcadoffot[demvhzpdjthrniiuvj]nwwrkguuemsdtvspi[sququtlqggtpszucm]pqaqqxpssdgniycn[lkdwrbxkrkiqdxjc]bqngsdxlxxvxdvqww
+wijjgkptnkbnzpqr[zylewxhygsxcrlyi]nanyoaosbxahyvdsett[kojrflwbltrombqxo]lfdpaptujhwfgrrnf[slsmmogpspgpuwnce]sihedfdnqnejevnw
+nutyeltkszkulqpt[cpgdmqleitivdtr]veieyzmfjafragrcht[nzudyhtmpopacznkq]dmywgwmnrieiohcuf[ctbktcgxznhoqoxczzf]bqzffvqraxpjdcvt
+akgmlcznqnhncjknbp[bwdbsrdxqqmaavngjc]cwyygvcrkagmmrciout[nkpzkdmflljxczogs]mqkafcpxslquyrudeui[clvbdgnkrjdpptqwq]cyygmkgtftxvsbbbfgc
+fxlpnkdskynkosqpp[efnouhxslwitteqrtx]xjxojaxrbampbcknga[ugewjlmzbspxhtejamk]nrtflumsbbtkejw
+vzrzmtwbxwfhyjvcmft[wrdvmieyzckycagwma]izyptswwlzgivtgyfd[jaujtzdzregakjk]cjdnelesxnhmgkqsgs[tjcsmxghgtmstejjhb]tzqsgoiospxadncn
+okgjhnzaxrtektb[sleqpxoqckdrsiwi]jzthxxszazdahvhq[mgxzdqnfscpqdoykr]doyvhvnmbshvkcib[jtrsntjktunoxxn]rmejgievrkrxaziux
+fodknkictemsxiicght[tdltamcatgnknki]hzdspvkbgipuvnb
+xhhmaiussrmwaxcpoq[agyegtzmrcgdrqiiv]akuxocgoidnfmkffroz[lkkfnmgryejzyvjh]ozdzcbsfmllaiyclho[vseayejwmotjhccg]qfqchpalcnaweyo
+imdrphyleudnvhc[lzqochrdcjotjojk]cwsqzuwoflalwatlsd[ctefovkyinrjchrwdav]cmnbuqveexpaxmhi
+vckjhzrdtpyynzbdsad[ehjwlyfbffzszrx]aizjcopfbdgrrtei
+vfkpxnrqufijmniu[wnwtwpmgtjonykmcsp]mhehavmuivmxhdelxa[spyybveheykroybw]bfzudojcjhzckbac
+egipucceijeltfoz[jpyjfgsqdywwjillf]kltttxmvrepsures[asbzcnwdqvfkfkiqqs]usnadxpcdxpjnifm
+svsbijigntdtxph[fabzbljmijzwvjlac]kieomhcpodzimrmqoc[xusohhfobyruazi]wxkjzzpskukqjirtjc[iwqdjijjucrslihqpo]faezwwmpfpxenvp
+sbjgcnwomllqwavkviw[pxekvxjtjbgjuouft]puzjbrwmyzsxclgmqsb[vtpnaljnxkgwlryjo]lhqzwvnpkzsdndp
+fyfyvifiocceoozl[dmjxamblfosaizav]smoyhjbuffpgqdl
+tlbdacsdiavtwucvf[npepgjenhdkgfavbn]hvbffufjyehpsoa[xghicdcxptmipfxlz]lvducqyymcqkket
+nuystaihvpelybkvch[rlqyflvholahkcxw]gicdfjzhwwocfejthx[jpeuakotyanntiw]sfsavxuyyulvuluyur[asngaxekprpfzsvxx]rliayxmjvsrnizh
+axquvvjwulrntbzzf[fddxxjwbdaecbsderd]vjtqwpjlhbdhxjoh
+cgeyfvgczhhwbdz[kgsqgnalsysssiyhqp]wqzhbjvykeuyjxgfzgg[mqkzclianfnifjdql]vbeyhsxsfmoeanpnipa[sxmzlhgrezqxsxzzcku]gwmgkijugjwtutmgj
+nnjlbnnasmuhskqu[shbjjccjlumeuigoim]ndwzzmbtazttjpawtzl[cnkpifihvkmsallifij]ccpzfojfxszmytbd[jtcogseximfojmjm]bgdltwjrqciyqfifkh
+pkdqnzhjzcttkackdba[mucwutymaybynvttts]nndhioamrjejmibag[fndcrctykpehoglop]rgxjwrpzlqapjsv
+nccuyvrhzyszqnw[ogdgzsefffyfoenfh]jnqnhnyoyrcnrowjmpv[wmlihztaoyedgkg]vneeegnosrxphish[uwrmezbsmqbxjpx]jgfoinwzlhyixzjzv
+kriqecrnaeujvuzw[lruowheuwnintaqqxcl]kcopdidcqinihhmk
+vxkblgxcmztnphdzf[ysjhxgovujrpagndi]ezgjwgowcdkfcstfhr[hpxrabjwpymyaolp]itcthqpgksvedadl[stfrippovsfrwglisp]eodicmiszqhwnuymlgn
+jznqrbdgjcokdqdlser[xemhfhnwbftgxgjukrf]mhcovplrxcsixrh[xyswalpqqvgsvmqvx]kjeuyxksnmydfkakhq[zcaydzhceioawvrlsm]wzezpqlhvwcgzjzigtn
+vedqtirgwrgutas[eegbxmhgykfrwrwy]pzslegjrbmdmeub
+lespviexybwomljka[dxvrexedlclnaurw]wzevexsobirvepgpmt[rseoofjlimvxwro]cyojbkugwdzjlxsqd
+fsdyxosfmlqfwoqpy[mwypxaxulrbjsfi]ghywyebrmgjsrshgc[lggfwxlpovrwthxtlln]zmtqqhkwabuhvtnabwh
+smsgvpvsfaxhocsyz[hgbjpapisxsillo]qsgxbvoijxlwhxpt
+fyfpxellnptlqfxvdn[hpopfkwhgcbjoze]sopowsrtqgbpysjfz
+qenbpbnrikfrnwpq[nmkndzwogcgtzhm]zhuslfffixielmjaqpb[dtmldnpqizrcbxixto]wpspaoprebgbksq
+vhjgpbgdoeoljigkqde[aqojnqwgpiredyffb]vmlvnnohhbwzouwi[rldlmezoquqcodxghov]bhwnyaxsnyyihhgv[gjjezirrmfvkpvfayb]uaxxuikjcwppslge
+fnwyhfrnoxxjpubwe[rflutoqwauqbztk]tmbmyhpncgpkzcqvv[dgksjzbgbuzlozns]psdmkqjzxdwvllstru
+vnrsujzctbuqnbu[glgsyfmfeuoloohqp]ybhziayoqxsbopf[vtwnbpqxhgsfguztg]xhgvtoqwouusyahedc[zcchxnllferklyt]avgtwloloznygrb
+rojtxmpwxsledhm[xibuxgovbxiejlegyc]xihwoxmzghhwlsthiou[ywkngtjxrhhozglwo]zfncywcurhmsfxxqjbt
+vxoojfqikhnbnrh[trdtiatykaontxlv]xenfwokorxaeweoz[itbylohijtfjgdtmkvc]butficisomglwjzaa
+wkofaduihyxhiyrvjs[deskgjgenvxxxupntfl]ralmugesymrxreommk
+ozsnpcdvkykxguzltcp[caargzwxildtwswp]capkmhbfpfmdegigg[sigilgehfnfxlza]trtpmbccrrkpggioz
+pfuhqwjjgyzbbea[yexwnbudioaikfsqlca]vaobiurftgeglgrzl[thjpurqfzaezqxfajme]seuekovcvvtdmlixf[mknpvkntvdftjhhhfgh]dlgqajapwlgdjnwybp
+jbtzwsypehgrmzeg[gwskjuqbwedzxfcehr]xpkfcuejevonsinxs[upnrxgjqhohlyeyp]dsyhrudzqsibolxnvw
+skjjsxxumbobzsckqk[sqlnqpubrayffzs]hseibigmtjtcgbav[khvlknemnqiekxy]fkzvtfscvoatsfqrd
+dozlslrkuemgbykifp[bzvnluuiqdffwtf]tignkmwpnqrnmefaqm
+ppxwcouehvqfwoenqo[rzmtyyvedmojatvvq]efcstfsjslpqdzvhb[tvmkwnuxestqxfockv]oqskydohbmayshfcihw[pfyulawxqbaiehqvmwi]wluhmctgrkjxqtlmp
+uvqfjimhzqboivo[buuulgcbqgfsbup]wqnbktwxwslvceegi
+muiuadioyfirjks[xviqxaavhdxjkkccmrx]weauetgyttscsfwv[rzgaefcngzklpjqzgeh]jtnbnuuvbnbjhdqn[idjpczmrbomwipkv]vbgcjfvyvnxhdsmycx
+hmdflkjbenjynzdmeqj[ybyntwgyyptizunn]ctijqxbybwarmfzpit
+khhocslzxicmlxk[xssahaneujvceofaiyh]swrjwipkknbnrrrig
+dvjvkhnqyifqzse[myleyunwsupcnfagq]tmtuvqikqxzdskqcgxp[lblzunblboznidegkla]eaqhztxpgjuijohkdru
+mqcasrzjqmhwbhbuyc[wkfahpqjhtwuiybqae]yzfcavhtmzofqww[goqblpzkmfxynuzm]bysjxjeocperndv[uwpxvnpxqhfnaalchm]lyfynynkovtmfsi
+wnczxavmjnfgogv[oyjxcsvrrgtpkponga]gzhjlzgxxjkoklgm[hsrwppehbugkcap]zayfyoqorpxefqenxc[apojyrhryhfnmksa]uwnuxprqfxnkzkhnbji
+iylrycmvbhpowmdvwy[oepptahrmhsoiskeoq]vtqctnyinxvrvlpl
+iauhsxbjgxiebvfhbw[mnjywcztqiajiqxx]iikcygxzeprjwkoniqj[tqycczkvsvlsjetec]mwrnosvszjhmuoiyzxw[klgtgkaxohfaogm]fsxjsgwondgzpdrbbcl
+bfqtwsviccqwndca[juqvrcznrlghmsiz]yttbexwewvvoehurkrv[mkugsxdrbaktcqf]yrqebvyxlcqjwcewg
+ytoteijopgxfmiokatn[oppmfhkktlewhlq]erycfxfafsiicbtx
+xlwbkbenrohodfnmuv[zarnezgnivnmged]vyumskttvpderhzbimc[hvbbjegwdeeqtam]fopblbizbmbhzfsdnzm
+rgmnnwzikyanthhp[nvnhsgdymtjeqzurz]mbqxtvwhpggnbcq[apeorjqexywhszrno]qaxdcaysefnpyviduz
+vjaljdyyoihduumfo[bpufjkyqjvxoprdwrr]ccjbldnkbzezeznmkpu
+yhbnzbxqrvzrguxcbss[unzjeicvhgqtwek]obuccrvnajbvkcmkzh[futhsovnghajatalva]humwbgtpqzjgordah[kvxmlpebzsitmnjfnz]olxhcyqkvfkqdxdc
+gsojkejbnpgptcgeubr[lgjcwaotpdouravq]neezbmtkclvcvkqncw
+qqdvpngddzjwase[rtgandojrzcpohlpknx]qdnxpiawdlklkscmpa[qtpzakubrncjzbpr]efpxwdvobcigtpu
+boxlzukkqchmqrrpgk[ggylyipkjdmbjfp]dkckhhgapbgpmygpa[yfetxkcehafknkmk]acqmjcsvxzptstswuj[atrjixpyeqordilgj]eccoowxhivjiljegqm
+exjgzzncnnehrto[qnhzvdfprbarmtdpp]rcdxdswituqgnsix
+tokldrsfwqqhetyw[muqzhystnflncxm]pjpmtwcamluvvvdsu[mpfvycofrzebemw]mcyzcqfngdrjaioxzda
+pqhnhcbjoqjvgqh[vqkgnojpmbawemi]lampvrpcpvxludprfuj
+vbdpihaehliobsbciw[cpaudttavwxkfpg]aidtxeypckfsagubro[fpaiuhpggzpxsctw]danwtjnlhrbfipgfbq
+beoecqatqkztrbevt[bdqoxnitxmdqunizj]lgquhovsnjuxqaml[vyfylkbhnsdjoezm]ediekdjfsnsodqep
+cnaisicaronpqbihlv[ajfhzrpysjdkxqpql]dfznlmsbuozjlqvf
+jbgsemiqgxmtwmdulu[ulbyoughrbpthdlvmvm]dyrxsdesjjwwfmvmkf[gogkkkefuecieipe]nimswajpymtzyleew
+haavjxuwhbfxlhfx[rssbpwlffrpnsse]chremerememjcbfuv
+losdtsrwrdvwzbjf[daaxdqsorbsgznm]miovihloamfmovzruxk[horqrumrdnjorfw]shihudanlgqfzjf[kqkwshgnrpwudohanr]yohqqtcywhqawfhi
+trrbdodxpewxgcyryk[limhtndawxliixkkq]ivxmixrjddqlmounj[cfhqatncyqijnvjv]djqfccmuvdnsylo
+yfdgkwopvrudzsww[gnyyumqxrftncsfuaaw]zfiekmyvpseaugfwss[etzbbabtbkdtgbwf]djmbswwpvfsowmqdlw[lpbkaarutdlovoptrke]ukztythdiepqgemm
+huwfnhilneqaecp[hdcrdcipgcaxtbfouo]poacbxvuqwkcilkb[dnpryjlynwgzbrnbc]hxillsnqqraloociaqc[uoyktvkfxkdkdopnbk]qvjeuapououufksmwse
+lfbrqypxgthlyxqzywe[pcxfduxttmzaxtr]gidsxacxodigyok[qyaamzuhjqqnpdsii]apgfypwqjpygzmdtpj
+prkahitlcoynnubnri[rqthrhhudrvryoea]urkuwyabxskqbsyfgm[dyagznreglcdincwie]okvqdhlixssurnd
+qrwefbcelgjgpzoe[aedkjvzurwcrhdimb]eaxqgpvkewmjynmek[nmfyhryoglbtdgq]dfnecedmtcrkfyq[omndbxvzczgnojpl]trcocwxxczcxrvjjce
+pphzgbbfbqmhbysodv[znbyvvkjlacgjrwlnkr]iyjpdjsjryyqsoblbyf
+lziqyyfhruzfpwy[upekwttdqzjxspfzcmw]ptdaapvzenixlab[wvsdrswafuftmysocc]ykzygszayfmgenk[mylrsdifhepnnsst]tqrbrvifghuesad
+jwfyweiiqvjfkvp[gsmzrlbjdpgqtbjakw]oofharmppecdotcw[dencjxxfrzxbuku]ygflsusvcrcdznc[fmcercvqncnxcbbwcrn]lkxshvdqjairdnnpz
+mfspfyoqeyalvzx[zwdzwlsmnktynntn]eeogyyanaydeykwd
+gvwvweokjzagobku[ixdetnocslayahccde]juncfldivihwfpee[mcpxioooaydtjmojwm]satqvbxfkxhfdrgoin
+yncjgygznetzrrh[uzkbwhtbtkrcxcveik]gehtfqltpixmsuami[nqhxycgquaihujx]ndtusluyzjwufzdh[ppvannvzrnncxpcfbyy]kgitvwtucjasvtk
+feushnbxghbeqsu[utnmthhouoazgbym]jmplltesvrbrllei
+ijwbtaksbikedfm[gjckpcivddahwkp]kubvhiqvktkkijchj[qocdkdejflyyzwukfrh]qlnixtictiubnfhvv[ygbwjbjxtvfevjug]dclcjonutlwyqaxx
+vqtafpvexofwcfssx[zmlfsfqivipeumubau]moqspxvivckaesffn
+hphwnfopanasosexay[ddmqqktxkrurcry]slvhqigvbwonriydzb[ynanjunpszocqrjqm]fkdtvygiiddygcrg[jgumgpiumyhktlhoeom]dkvwoureblktplcjmi
+skxhzizzzfrfausiz[nakguftuobnmkoz]buzexokukfscgmmfru[jhpsafmtolwlhvkhs]hznyqntiienjmspy
+ccxuwxzdxtfwbpie[shhongtetcwukjbre]nufocpasneteinfkk
+apfhilvripbjswmig[tzmvefmwonqiqdyt]szdbbwkkgaqmjkhpuu
+gmqjznmtepctxpcfnx[eezqztmqxceenmds]avqugeuarwprizij[uumhklvgcrkfozd]goypuraafiwdcvq[zueuogjqbnsqmjfmxbn]ahgjvoxojaumver
+payebfjnonvscnr[nzubpmedfuvkiwqkycu]cvsjgdyfvzippxu[gmiawxppknjjmvm]spdngdktoclylmo
+ruhhexcfvomrhibmoux[cjkryzqtfkckieyzuu]vkwptpezjrouirxq[sggqhkgstdzqikfnxk]zxfgbatfizeivfkjbl
+qqizwnfaajabeuskjdu[szujizggsbdhvihk]wxjmzdiqugjylejfu[dfygnnvhbvghhyuzo]yeaepigfgdcxbav[schlmqwlcifeqjhixs]ifaxsbjyirgfmwkaott
+erxreojjauvvlbsxomv[xaneipervgreexmp]itfaxjxrwueyrynk
+lgzbkiqfbgvdnyt[milmskrelgdjggvtmsv]clolytrsgczyppvrhkf
+ryvrtxkdydhujxapwjw[ohgtjdaeifxzuhoqc]yflsxucxibqkcpft
+srtfcyyruyxzxum[ygeoeyfnlufgsjxjm]ifwimooynxbrsxmyk
+rqbnowuwuernuxpim[zzumupyxvnbnngmc]uwurpinkjmkckxx
+ikzheexqxrfttoy[uwegndkenfvosfpm]acomhjgdgbuelap
+srookpxqmghokjoegi[lhpppxjenrjqiri]mjlixhnrirctrsupv
+onuiajxptpjwixyvp[otlnjwravarqmepwyd]hmnvzsflzeyrlxgpwwh
+jmpskqdlbuorcpwpqj[sxwomhbdyomudfaisda]nvzxtvytsrqqxbsug
+lohoirsglnfzmslubqc[pxhygduybnlqemp]eulzazwozzqytmn[joeiaeuczyygjtg]tnowqyhlrtmumjyrkp[lidmrorxkpcajufzib]ixxyjcoocfdgzjbhhl
+tmixfdhagahaqeers[ruioctblczdbnusokt]orpjrznwojfxnheoqbj[gbgyexwumyintxi]tznnvbemvedlpriyu[ibseuzmfqmroeeawur]tkggtpbcgdthcpo
+psnbkiuzotsmeklinng[qhigmmuxrpjmhuhxt]urvnxarbhbsouap[chfgrdkbxmgqzdccv]lbopbgjsbykugbzfp
+qcneczsyljovqwlnjz[mntyylfgsuvpjdp]osrpdqguiouevrdq
+xvfraxzgsypwfmswwwu[oyrmndtdginkvlzdid]xgtwrddwmukzxypxl[mcjxgiimlmsnizirzt]gliezwdntsgoxznesl[vwypsvpvcaeyzivjo]zigujupypwjqljxaie
+xayweakpavlylgjl[hxjyhvqwnyixcesj]yuhyulfybuhvqiinlso[eyopyetglenvqzqhnqr]mqcovyockdqdqvfer
+sovuasutixukkuuxn[jlvxhosfgqjcxnlmxql]bekpnvhdbyhmmvdhplp[xohnfpbaeqpbfnfi]eobpufxrrjaajjd[snnfnhoikinfhioa]syhkocukumqrwcgw
+vhgyxqcvafubikvakos[jfivvuhbnehuqbeyu]dwezavodqhdmujzc[naepoqzmbtiraxhskf]bwuozbexnzmpukgu[zyzfttszjkatnovj]sgkrklrsnjzduvvjans
+yplxqjomjxguqxjjix[mvtzncrxfvzjofx]wlhvxxzsdcfptbse
+ddqjeqgctjkvwge[cbgnejudebflhpm]ryzxhqqixwsoztz[hxszfpgrjuxxipt]zuvvwbmdvqbqihy[gjfkxykdstapfhu]bzprrjdyjlljxnxb
+xbnilldcerusgpejs[pvldiyrckxtgoesbti]ljqvtntbhxrryxcka[gdqkfyumjhgbzzwlvfi]uekphsrzawxriyei
+egwrxuedgpcppavzt[mbblqsizmrxdwdrio]dzozhiodhtlvmrjcygh[gdzijmqhitlbhfw]ewvkussgmsnietkiv
+oraksmkemjiapbdvqxc[vvgximcdecwxmpbjsr]breycrlgdwgnbjy[oqqtlhrvdyqesttwieg]dksvmqwavamfdma[fndgywlwmsmaivduv]mfweojoshjwolwla
+pqpeytynxunxdfyxrmr[krtrvrufaemrmit]kcgnivmpvqoagjmharc[pvkuwynulvvuqkif]mvbbgwnmngtralbe
+nsacyqfpikkoqqxp[jdcdddcdcylpjiled]jstcntnjxszhichrkw[vzfusiwojvrjzhevjm]lywsheganczawtqb
+rtcpdankaboogxhbqj[vfamnogaxasxdiiizk]whpyanngpggqutan
+qlxjojmpesvehkggt[flysjbaoiorosmpzcl]wgpxurstlnopucd[ewkgadgmllrewtwse]icnqidtfsqjurnkw
+oifarludgzqkwtdm[jvoeypeqpfivakqyj]dtcboyxnhejlitz
+npkttburtggvbsfuiwo[wvklzpiffhreyxkz]uhuynxjezspazaudse
+etaapuxqbavybsp[mndpkefjvjupccx]pdcnnncxtrzfvlnmq[ioehzamymeougocos]hcuxkuwhwvjvysbwdo
+fjrsuygcrtpzjsw[rhfrgfnkhajlqtqdp]hftckgnarcgoyfkmimd[hkldanmovhazpcpwhl]qomxfqqhkcuqhibrl[tpbrlhcndgbxuuzdng]knqmgdkpbljyufzazki
+zydstadkygzvjmxdhu[qtgaglwyzqncfbds]dqwbpmopxmdtkkcj[dcakbjdwzlglkpndtb]nijwetvoulkydqukzn
+hbxhybosbnopyxpnnz[juewibpcgkchnerk]pvdtzqclnvdbmwjk[wmtpskdcqiiythces]kbhxnzcnjxhnkuxwft[yetvomdrmxarjwsumqv]pgumogczlkgoiyn
+zaeaejxwpzbqtjiutt[eqjjobopoyuoxymtvb]glxzffwpiwoqcciyul
+rqrvuzjvcgaancl[pmxugkapydtxezz]lihcobqbdqenjmxyn[aemdyhmkusmchckzqnp]tgiijsdtqtqomptveju[mvaiexukertbkyinjc]pjuulfqsxhbpdiy
+jjygzflwfyeiecuztx[yrziwmbdidxrjsouxen]bqkyguqcejsvrkn[hzipqxzodrnsozfmta]xvtakmgzpstbsivyt[ieiucrjmzeupsprslje]iquppghgxqhosvjzc
+dwprarljcykiecn[wvdjaraappnffzsih]difkjyzhcyzgzjl
+shsrycjlblbrcpv[drktygzuxbooshwhute]fanflcwacerdevozor[feybgvfyookhlsoivd]ixzfmefkgvcdnxqvy
+rgogoobzbggsbeynx[nlnbqvcwdyzkbaa]prjegdbkocptzducz[tjanhuiieffrdspjf]bhhziiqbzdlkdmj
+yslioeknctqgcwk[szhjocwzxxkbdoykvjj]aowmmepratdcjkgwjhe
+yrfhkqrnxzzyvrocav[rqyqhvtneezcivu]hunxsvslxgfzevsvvw[pyyclulboseqorxoihs]akjsixprdzbyqlbupi
+tcapvmyxklqgewra[pwxrpoxdptxemahbrot]ncwuxwfzukwcatres[ftlzvkapguezyhnsgl]ermejyvoisweiqvi[wynjqudtjghztati]vhpdjconbhhejafgfu
+qkqbjylknnexhcziot[lwjbulvorpdzrhddlm]mvvmstxnwigtstskoo
+wncbdjbvzjvrrunb[riirhteyuokxshfmxed]sdcpacarelkhxkt
+xxcromhxgxqeokih[xxcnkwhvsylkpfbsj]xipnqesaslmeqsnu[rmzahgumualwizqnf]mutxgygzbvgkimvab[jypnhvoztklxkxyzsr]qhuxxsuvigbloux
+yenrilcccypxerlso[dttyspegodnpefcpg]mdhfzxgyoxozmgi
+jndnuwbhvaciqduyfg[xoeqacufaixieedbtnz]mpkkivmhxwxujcn
+majifpotxhylyshir[mhcapgzvvwadphfid]rjaoxsvqlqyvqgtxte
+imhzefgngckhvgqcjr[zysfanhwbnqzysui]zgogpzkcgjeigcwpv[jtxumxvjpotihpmb]zuuueogbabahhwa
+ijrqngygldyukndxhqw[xlcwaqfuzjigxddxjn]mcuyklxezeidilnl[atvcyujrcexfnknulm]txxgigzthrbbqna
+dvhqjqbgudpghndlvu[drhjjaxeomuoxxnagyp]dbeymfmzzevjydlzk[gklvfdcdfmnfvfslpfn]kssctqoyxognwiem[aojhwzwnegpnydzywor]eyrhiouwbqfpeoto
+xznkczuhsgldtilz[fhdcsnfixqbysff]ppbqiltpbrlhjliz
+zkfgueqzataygeavus[nymgcgakmtuwnkidr]ypuhovawsbnmlmpo
+lnjbdjnhhqeifmi[diompfqeocwmuqi]kdawxfqtkschlgnh[fsmxaerroipesmywqa]vqpxljxwpzudocn[sffzifosvfuytvdzb]fjqfwikuqzhzuthxzq
+ecyyeabjhjrfbdqy[xpqhxzehjkjhotrdlk]ztrkutdijjkmgzkuci[hwdxdsprkacxjrjjtxw]fbhbrjzwubhgjdwvpjy[vppgvmthaqkgzrzva]xuhyvaytyufxrkgeb
+tbeqtxhfqbbdrvwn[juqpksgrfsbsqdx]znceqzwqsfrhavmetys[khetxkkpwfmkmlvc]hazxybkgkzrmbtqshz[yavtnkwhxppnqwzwj]hgabdrxubvyvgniz
+rwvvgwyfgincgkurooy[wxcmmmkqpmtghmmltt]kgtqowxiyjbepqnkiyu[iofgybnjrqtngltajvq]mxsbhbkhddqnfowxw[ptqpbwojwfhhqyv]ymflkhgfnlagbxddzr
+lybbfxollocxnfxfeba[tvjolzzkenoxfxqrocd]vkgswdtqpilvbixss
+yurvqideiuqwekwop[gxsoytqhoasfouiasm]fyhiugkvhkbcfcshkzb
+rurapcltqwutrslalpe[wsqprvdmmtohamza]xmkzqeajamyurualky
+buprncslromlgznqper[xjefyfgkufdkspph]wjncmqpgmnjzmjbqc[miovfouyxitayfs]gtrmwhvmgcliwegeg[owvnsvmazybubxfrp]cdjevcehzrminnc
+uxhqucibxiemlbtg[dyshtfhtlbjreji]ilgubuujgmytfxeqzrh[zahfdfyzbhexldxg]yohfxkodjqfdzqe
+kqcxiuftivavvdv[rbijqqjbhpdcrtpcy]dijrgcyuoqfzronrfps[knxiljzdtvauitad]hohafhoofjhhhppkr
+vbanudfbhmhpqsdpdgw[ksrnxrccuenustesws]bgiuwlkckvdplqygpi[ivyzkermofckkcotkj]mhjspcpkcwsbisbve[mlmgilflysuxqmzwp]afixxyabstclpunrya
+mnniaptautqeenvmog[wfqrhlcbcwqhwzj]ccouhkyhrvdcbilshrw
+zankwrrkgkejsfiwcox[gcxocohqugmgpfoea]cfpphqzxdllapiaxu[ckfcklaedfbhgino]pwdqreudlymfoif[nkaiutnpwnsfrbzqyuc]mscstkuwovgypqtta
+dhhvqxovlmkpzsg[loljkdtjkdhgawrpi]ggnnhvbpshpwoloac
+wjepglephkicsoti[lvcfarizbzsudio]httbqobbfjoomntye[rrlwtyngtpvffaanlpw]moqdodrnstpwmhjrw[ujoowvjwddvlqqbbzbt]alyeqayozgbhtpsni
+okuneqgdkcjggazki[ebqvcuzvuqlvptuoqf]wvcvzlzipmoamnvjt[dncwvnvagpitnxtjo]oadxpnnqonbrrarqn[ruogikvmdiporivvzm]vicubwgqcblvvop
+iqwlvhjhfrfeayiclzb[mkafugqikswvpqehb]ezlojhjvdoyzwmggb[mncadipbeamkzbndk]kpewfgsurwlikle
+ewpiriwkjrgicwzfxck[iazlrpnsiynlmfi]srfoarhvphakmcyke
+faalgogxxzuylnk[zsgporpeqifzknzz]mjkbrrvswlbgdwhmlgd[mxfiiekevaaosozya]klhonreqfikygbmf[hhgfoolpnquxfxoazy]vcxscuxdbvevulug
+curbpzpilaczuowrsi[wmyxdecknwrspllfhpl]quuvzoiqziuotvfl
+kugdhavlhuperwafe[ecuvibachziwzefzn]oyhrdjgmqqauqhhg
+kcbawjisdirrwzv[fugffzgwmricsypdz]bouoevvlaykmgve[glivzpgoripmcnqv]bsmuvtuxrrzjaxko
+oyaxoumybizeabdg[quusffkxbmxajbni]lxxqjhqcajdkqszr[cpgzcteolyloguchf]zxowxsyvudncstwk
+xmlnrjsanwjmizgawvk[wlyncljroxswzsmd]waxcvfcwftjxbqxpmvr[spiqjeqpfxanegjxf]sxzszkcgibvfkgtozy[nmhjzcaophbfpil]nrwfxurekvqndbzw
+xunbkhekkwyvgcerevv[bgjzbkihvzlnnpptr]huqryhbrkspzxusu[dmrytcqghtbbhhzu]lasujmpjaobcnfj[ebofoyovhhzsprycn]belltiuhimwgwqek
+ocgmydyjloxpbsyj[wuhymkumnwwcdprxc]ncmkmnedztlutaw
+lyuydomeinqxrex[gukhcsjakylfwqodm]hdghwpfhnwjtmafqt[lqwtforyrybxbbh]fgyfkgvzyooifxa[kgxkzeuijywgdhuryra]dohlilkbkqzjsbx
+zgckhhqwhgctoun[ajftizwahkaxzich]wacumictegcbysyn[zzxxwgjdzicxreegal]pwquqtaijwqpkistf[vbombdxhjxwlboqdbqh]hfyfujedxzoceqewhgt
+rcpaadoewdfxoksbiuf[cmcgotvayrjllxgtm]pmkfrygwrzuobudsah[gonfdimjagiyayni]ctrukcwixqczltol
+jrehwmakkkobozzwrn[beoievlwkmkusjzangv]djpjbtpjpdcjsmopzpw
+zsgrycgmryfdzqyfj[yipsuqvzrujoaqga]khjrvsadupzwwoasmp[bdpwsunstwzgzawlu]wxaqnorkgypawanoso[iknpjxzhmqermgl]zcsakkbrkkaimtnya
+uyuzptbpmmukyrpd[vmbrbmpgvxdxryzcpbb]ltybhrruutchwbuuicv
+ddaeptwdykjibuffjh[ufzsfgmcffyxyyywdu]vrdexhgwtdlczpc
+csivzntivihwomh[nprwknojctjnkov]uzridiquzokufgzgjs
+gcpleovxfcyyeme[crpzfylaxfpuecz]zoomnthfoptieor[ycybuegqfkhlupplwb]qjmvwbggqxwgeuneph
+vwqdvgzzotnnsydivip[ohjqzjuzxyncdbenf]suwfgrjkasvyhzbtfo[qfalzqxllbjohnzvgj]mtkkcwoapdjaysfyono[yqdgnieatutxldqyosk]debyxvqoatdeibyy
+lhljheobdtmdowhx[lrxkzhxzdjmemintrq]jecllyatwkrhfxru
+howoydpdchixptjqapd[nuwrazvltwkshpvlg]havqlubvtfkhsmxwxew
+uwapzmqskzwiiqx[xtyqrsajsrljaajwedl]dgcalrxxdsfhqfdie[svghimwbcbmxqtqhjn]akqfoppjhaadsdbela
+slbymelmqscfinxle[ahjtgvzldgftnkehsr]vaqtlbhritaotaxvhpg[chcyoduevjsyehz]jncoccdngssgteldzq
+mmkzxzkatapuuwwv[odomzyzveadmmicfb]eiptpqypfvfroxu[bxfgwaezkjrbpim]hvfvtenhpyqiohxj
+jetnikaiyuylckwz[vonvdfgbgfxrvjzluaj]zpmcyjvkwghaiuxic[irxghevzlcccxfcrf]xicbllnxpzlcmqbgm
+chvpdcrevaqnstnw[sofvzfabefeacnniokj]qdasdxrscvlmwcchq[kcpxsnydjsoviwwy]bkdprrvzdinwsfxkien
+cwoamgnaytsfeccbqb[vyysuocjjhfoixrtmpr]junwfwadfbyukyvnw[lcwtmcbwdkrqngvqi]vevlawxbwoqcibmtk
+seboazoqdqpckthgk[psehbzatcusxwqa]tiwgrqjikjzwabuufp
+ouwlbqhczqgbljktjy[bubtiannyvmvkekhwbg]xvrlrmkjwkhzjjlia
+vatnmtxixznyvdvt[ftzepafpamiqpjulci]izhqwdhnqpyppuqiv[mjqocpfxdfcgpgmk]yirocnwnrzchhvrbfb
+eehvjfqvnwplppeg[mntocrytmuzmuvc]zsfcohpjfqdrtfbbbh[bqhzekffwgpwsbxd]zlhxmhjluxrjmpwkyc[imisxjdmeqavdvztbd]tjlwasbwbrddpqpgwq
+ygjdaucrxaqjcjj[zaunyucvccyhgomr]ifczoiwclbaryopmfa[ihkdhvovnvujtbasuip]mabqxvuzswimbitoy
+shzlhbrvjjzpyxfqgus[ykurcdmtryyccnysxi]sypivgjjgkngrxs[rkavyufibjkqetgld]foqdqcpatgctaehxi[jpnwjyafgkdytef]apehakogeatmfyalzr
+kithfcpkwdhgqjohr[vvpujusooxkdrmbcoo]tuzaiinsycjujjuw[fqdhhizbifrkpjxgyb]rddsmqvmitgdywh
+gngbozbqsfrigmuq[euutspovzyvfbgp]gobfhihxxwpndpaggx
+dctfsuzvpvttqpgppw[dnilcstcsxxkvwdsu]zqzgahpihqrhohqdtst[eoaatnenejvvuloknf]xwneniznbkjolnouj[gslnbvbmlwerbwvdti]jovdchklafrsncadr
+mdgpetsnkaddebh[gypkuqwwtjrzrhi]eyfbmxbyafuenmjdfvs
+nmkfscflwwiyxhzgzw[cixmvcvloqdyuikk]jprtrqwqtbrnksnxh[tngpiloomzgdmpryl]gwvmzbcftuthxvyqutu
+zkpdrykxtfvqneh[pxvjsvutuauoeducg]iduhzedqopyfgxjwpl[tmzqjdffcpzytkg]zvwkvgwmfhbqklyvai[scusvxtyjacnqtkany]xqsylxxrbgvudrdxd
+dbgodepvweaspcsam[vnqcsulaljbjrygsgv]gmfdwebiufbqkaofraq[unbumchixaeviclyqbn]ekpfqosiklnpdjrjq[nlcbhutxymbumqmwh]svtcirskdgbhfjr
+wpvcqnrvyjvfkfpclz[wogcckufvzviggf]oulptksetgaaholu[dwwcwhkktrhgkahbs]sobrvezzrrzvlihicw
+xlcqxbbegaulczmzw[xcllvvmlrdiamavgvh]fgipexbodvwutyt[pwhoyusimtkyswrc]mxtrsgpuxsjcqmb
+euzbhyalpjhxfawzyj[kqcqpulvktfqwccr]etzsqjqzeosiarij[kinbhoflquwkkobs]jvcmusgezydgutda
+lpxgexsvlfylfjva[wnzhqafvnbcbcoy]wevgfhsjrkdgvnbta[mvmabgghwicirugb]ctcyjxzknsnpxixkc
+hkkbtbsnyzrlsuyhwov[iurtqidtzfwtfhiltt]wokyylscmppxsdqtnns[swtohjqkqnmzxon]mthgkxltaceszxm
+jernxnsovguhkpljxce[twgyaawrcpjpnxp]rvjtstsecwlieaeblp[tihicijqmcrggggrjo]igcnuyrhtaooygb[ntscsypsxaeatyj]aslpawlvpctyjzwxhw
+xoooyfocrwvsumzzywf[rdovvrfjqhtuiro]eudcowqfnmcvpkdpv[hdyyadaesuxiykkiztt]ykgxpvfilimofxfj[ittajdlxgptkzqt]djtaivnjndcktuvd
+usxiyxinxwkgmdmjlq[quaspjeawvvlagjmla]sucqobcfnryoftyttwk[knzzgsqjkwlybeebxrg]juprtecqapdfbkk
+jsbpwwkgsmydnreqkd[abmspggfxrehkgk]nzhjbpwxrvuwrsnilmj[qqtarhezcecijunbk]fzskmnquqoivtsaxym
+mgekjguhkwyfdcse[ydcdycgmcbzvpkesg]yuzqagwvmncdcia
+wrqntmycrllbddv[fzewvpbxklyccfkqsed]czcxxkwfeberluvi[iupovtrukptjstnkex]sukvpgublggqzbecwz[rabiytcgypowllw]dfitoowyhfxjteip
+wlqzetmtxlrkydh[dbgzuittqekewyc]vsrigjcntogidwtft[hscoyacwvjejmwxxv]vpljhuinywgbjnynxhj
+ydpusekwzovghcojdp[dqycroxflpnyqpnai]znbszhqqfkdbrwzrxr
+uzfunassiuljodnjr[tzrbcvrfieeocdcn]bmsircirorbtgydp[wcxinsnngyykaaavhk]xxqbherleuhjskfyu[wfklhczmivpuooytgz]fzxxivrumhumdcdt
+mshsdecfbmkjmbrx[fdhjzahrcoydrvqg]stkkbwrlhhnjzts
+nmbyxmysrbuejutpzn[ruyrvzgagqgybiqsn]atkbnawkdkildlbg[trjlpfbjomgxvvmzowo]gbmfxqgecnzrwowcm
+rtiylcxgfuqngjkyny[mgidqfnevlylaukbwts]vcejabirnbonrowlea[cancfhwbwdlklwo]ifsehqpalixvinbsr
+ifyzslyhrydfxbsb[nigcfrqizdtzetpncxt]svvmxecfemwefpgduln
+rtzslwquokcygmdws[wvblnifrxmomsmdwtx]scpjyfputxvatko[mffinnpsxezowdl]bsmsjqeowsoobewko
+zllghkuucklrmwy[ylrocgxqrlkdkotl]gmmdzctugnusdsrwwhq[cllevhgqwlszrhlbv]prpeirpbwoapvocm[urvubddgwfmmkoyu]ygmtwdiwvuepkcw
+hnqlptboqzzpksz[axumkjmbmyxfokki]oyassusfzvnzhlobbme[vbnbcjaiiuqptfyct]oagongosnahrlok
+vgsfvfwepwufvvqbo[pmdxwkxldxhlqlqrgp]nmkpknxluiphfrfxm
+qypkqkfcicanneyvvr[hrsgqfwjegdzfmyt]hmsppdjbdxxtagyhfkg[ranuabbxvhlszpmlmv]ajsbmdayixczrhy
+oykuwlbsupkaaaioxnb[cemxnilkmxflpnwp]vuvzxrfcfhqvmzlzl[hnvnqhipzparrqm]rjzhvguxrwhwyzc
+mdjjwbprbzhftjae[clpvjvsxatcbzsyybw]thsopmeuzvhcfppbha[hwbfzhbptymaaoywwiv]ybsfudfmveobwaqkul[argjxabjvcalkomgp]nogtearwoznoinj
+ngsqrfixojvtgzmfx[dlttfdsvjeppwweu]ydwjjxycbpopceaj[anlhiebedcpahqihhd]gtsexwhwnpmpqvdxa[qflvviiybebmusv]epuouytlbtacnsnz
+ouccxvpsqnmxezei[vmifqcpthebiklhid]tszxpvkgldobdjl
+pauvqtezlhvjejl[sczynxdhjpivcogula]llemqpnanorgnkmjl[xxtooqiwqkcbvmp]anafyzhbzdtpcxcad
+gngdmikcpsuduzdrd[fchropeunoqkngns]rfdquwdpxtlfxscvhzj
+otnuxdwoeqotcogo[jxyhojuczdysbfvp]upffjmvriabbalmlqmx
+xfjrywdooyrkvifzub[ygubulhifdmoytb]hjuvaxnchbmrptw[txcsgcehrbszmnzl]xlvcnwmeztfiyhlwtrj[twopxgslxaqihinrefq]tnbdtvwxxbichal
+bepzmphvahjuibuvg[zuoplvyeupxvzoprs]qgkpflfygaoxuriy[lgugebpiqnkxxqhz]kqhkfkyiqigodfq[hvaktogguzjumlga]gglqsklyzznufpg
+cnzflcqxgiepnsmpxt[hqbdhovnvyecljhzx]vawynjdylprjdky
+pxhlvphiiyocalr[dfhohrjqchpblygac]oqdjtliamyneclgc[pzanjswflkxxwvnzm]qbbuqtxwodofarbbl[kiqrgquowfurmiqlqy]kppecttggvnsuzaarwo
+dkzdgkqnfjkadwk[bjzvvzwnbuhkinvc]xhiswkplvojtzwwvyph[qroekqfwzfqeqcfns]kyijvgidcjeeenhgea
+mqoqfigmgtagmxjt[qojoaaqyptscsfmd]zkpsvrsxzwvllxqpi
+cdlfgkthideaizn[klvwdqakbyaunqfxt]egotktupevsisej[olkmccwoqyqzsnuv]szxkfqjshuwyqewmgm
+caanbkvopjahzmqch[wylutkdesribnllzbac]fjpryexeaxbopdjhhu
+avulisxpjwlldll[tueldewuwemaihrw]vjzctwcvzpyiihnlrzo[cjdkrvxhmsglzllbpl]gcsruqwlokbdtgucp[nxubgtwzjtwhtdvbjuq]dpghqlnwugoywuiqefv
+rcfjxvabpkgxhlvzf[ftlsstmreroxhmuw]gcacbophluxzofii[vkkogukgydicpvdqbzv]dvalzsrgykitiqy
+sufacmzxrfdwlivdngo[kthzrniwspkdawxz]rudbmasvirscdpkpr[pcielclbxsbfedr]pneagajkflznxdrkejk
+qtvidydakxhrbrli[arccjldfmvtskqtot]uxldrdgmtilrhob[mfqcpjzuqeibckk]tjubrbrdjdakrdud
+cbwxzgidmrnjqukyl[uhenxvxtomizedkxwt]pcpeskttqdttvibym[egwkoivkdehfrlzz]pjueedjamrhpsnuulj[ccamvzizqyunxwbojum]qguxpdkjsvkuxiskx
+ecwvkjdmndzmmivxnsa[unghjtnrlreamcw]fhxvfvlthzqifvftbo
+tfzpfvojlegclkt[kdwzmhrpxckfknvmdqu]gnpywcujxlgishx[mhxacejyvmcleasixmm]ggmuguvhesyqaijlv[fcyzsosernhgawagft]rmdvdnkuaworthwsoi
+adztzinzrvazerolcl[vypxttybduwxgrd]mggcsuuzlwiilaav
+qnamzrfomzqqhozg[zaoqvddnqodpztm]pqhditszsmuiakyelb[sfknkiilewablfnt]mdzzoowquvhayznyl
+ovvwrhkbkeqeatbcke[wtzdbpzbnlkuhwqwfz]tupytpbukmuqytc[fpyravdsbihddaubymf]pjiotvegpewlpke
+lubqiczycurwvqozz[khnsmjxfeogtewtodhj]xhqksdbozycjszipd[zeptjnsjluccoiuxm]bhvktxgvqjkufxhprr
+zflhauqmcaiwnqn[jhyeagjfxbgnzkdr]hdwykmzypixrdykd[zkqqugefunjmuhf]ykufgfmmeaapnag
+eqhnlafwpxhjtrif[ixkfnqexzmbmqencp]npxnxbzhuvwqnxn
+kokxqtbaemcjzlrioa[ujvykzotvzlrnfg]couurswwzchjzbxq[ympswhhwlvpohjg]wxcufycbxuvmrqekgq[wyljlkzgavafrvjuesw]dmgjejauotkmwgw
+mgxyddqzqmprxrdizf[clocszvenjingorxku]zsuqrmnlgyucrgboe[vpenwatmulopddv]expnuzinwtlihej
+xqhirwwuirdapgmyk[snyixpqruifdiqekwiv]zogryeticrubznbumf[yisxpgzptlkrmeevgqj]qrebxwojumgwfnf
+djlypifibwpydcxrd[swxgzdsqfgksqwxjxfk]kbpzzqheozbjjcdpor
+uueutycrzzvuhvniu[nqhaoxpjrlvrtbahncz]tmxvdfxvmctcfzoqiux[gevrghyecnzmkrujmeg]rcyqojjmpxkpeulzl
+quyrwpchownternlfj[qijougzkibnhwzvjk]lmrfvudpzxhshukhpn[jvvvelpjnyxpwvo]ztuckjcxyxjvqop
+ueyerkamylcyhgszgme[kpqbsxegdljldwjdxgp]afoamkxjljqzpmyef
+ryrrppctsvwsxjslb[sbmyepjknxewewrqfsa]gevwiiwpwstdkruplv[ilkxpskdrntqvofj]srpukrzanrqhkprnu[jlujnhxksrytsdazgyt]fcxyuaotwykaosgnvp
+yhjojsuhfhujvfk[nhdemperlpgxpud]pdvcrmhvfeudrea
+merahlzkjieamdkyky[yeygykydcucbambmtz]tbujyhneuvzacymtgrd
+sgvvjpfdcsriacwuyy[rqhuwizydqorikmqqlo]ozsalwkmuodygrh
+jfzfzodtrqrrwvlr[ukxwobjdyhtqrqr]qzmrpkkjzqibwekne
+xbmixvpzovpzydwprwt[qnquthrvjmqtpzb]utnmpbzmurlbpfuaqu
+fkfzgaotoffusnte[ajzqatzkpajlsge]hamnzapphynrppmzwm[teysbhjrdgatijve]aigpcjplbknziprba
+jfprgbpaubcukcmp[kddnrlcjywdjcud]nwzsudlamqhzrwlkh[fuavvscfxpynlxexr]szgousvpbqawlkpcd
+idlhdjsytmzcwcu[lgwbpjcyvpnecsqfhr]sjkxaancdmlpobiwjr[gzxmhvvugpuywst]oodlrjlodknfxde
+bplasvzaijndpfkr[wkvndyztlfkelwckt]kjkbnawptptvful[fmlqcligysmrzes]ujvljnzkznjvkgmsvqq[ezpnsnwrujkrbcmggsj]eghksoebyyfnptgqjul
+bjwqelavjebvqjroszz[jlfwuhjucugbvczdbil]xxuinqhddmsrpukke
+tgbvekwixowohur[hctpawxelfhbtmwc]axirbbtolsqjclqo[xcxiycbryxmpimq]kutifmilczlxebzxwjn
+dvxlbiymdfdrnnfp[nxrzuioymgfxqwxo]qhydikbrlhqldbq[heutjkmrstetknylg]grzklzcisupegmbg[mlvaswdotnzowpqw]inmxskvrovknbngkp
+rpoicdzdnkcxqtqule[gcxezbuirojvwliv]bmnlgvtpiyfhkukpj[gtqavwzdzdmqufnce]nwnlyciquxxcwpte
+ubleorakkrqlakyr[kqwacjjutlifarh]dgijscrhnsrsxqhogb
+niodmrcgcjrihildfw[pmtshihgrssakbouvf]otoaadrggvnzmetmyds
+jczcvqxamrdcpnjl[pitcvywsuryykynqxax]zmojzqezwxdnwrcuif
+nbmlxeosjvvtihmwt[acformsggoqxslahuma]nmezephkdzghfvhiqq[epizeyqkmseenueefiu]alkiffsdvovxmejkunk[hiwyudbbuondtsqjm]wjioowmqljplehwe
+hlcllqbyvenlzcfgz[tkddqsjxydctcrcuhq]lnqsaupwdmxeptzog
+rrkevyquvdogauq[lxscinoclyrawtkvr]mbiscfistpoutkc
+lwkkwxlifgwimrupndu[kglwcbuugjkujltz]rrgozebmyxigvxefa[hxbstqxfjnzvkco]rqpxaurnjtzymxkvtiv[fgbvzthgqifdqehisw]kwvdvfijmbimizl
+yejkpafozbchconq[chghchxxcybtarwkel]ensiprnejdyegqiiu
+gsclugkgowknjfkewxn[pgzgezavhgcfjpi]wttjlezzjwqyyzgzc
+ndgluxoxlnekaomi[hrrjyflrxyetpub]kwpcbjgszdjimqfgat[ofdwoxrgxjrbxhgep]rdaebrkfchddavjeqap
+vzlsrismjdiyfqzcieb[fylncgldcdlrqnbpw]hyrajwsfckxlkhcboe[rxqyolmmgairjktnk]xhrusylermeiiolade[ifiekphfwfzsnrb]szyunhntoeymkuhyvru
+ekgeyjojapzhzaxfzhw[nmmzpmouaheahibz]skhvrmqbvgkbismmmw[lpohwytpsrtegazzkwg]cvyqhgsyodcdoyandpp[rntevuwuoyqnhkmrr]szsrcjzpstfyvlf
+ioykyddusobfdscqkmy[pmuczfvmkjokvnoxrz]osyjyicdpcwzxvwfn[gimnsriontvxypcxnja]rgedrrsbgienkkwy
+oktebiadpwprzrv[wgprjpksbgdyqidklkf]xhhjmhfbhpszdqu[rxjenkcvcswchak]fxqrycgufsqtbxx[pyxvqyqnctpzpggzrq]mmncxhloifiifjpnitw
+xbqdzlpfxcznmczfqq[tpfsrcmbflynynshgt]whfhtgfqobzaolpx
+hfbetzccpyqauunfsq[ihzoakqpjosfmeff]xvgsqfzcgxtranek[zbtxsvwatcplcseik]vaidkyuhjnsgptupyxq[vprljemlqmphnaau]vfgliasxcpdyayvfddk
+jetotpxiincpkjxqmz[sfwjrlxbmpafwtjuy]rasahmylsaswogm
+ipseqmdzbeeqjsnvo[qxgatjiqzhwulhgkjm]syofcufklnbeobppx[lbmkistwoiolecjh]qpznlrllrkhxrnyvf[zbhzvyjqzywdpvh]thlrfwmziexkhxgp
+uqyiqoznpgsjaaftzq[bfmkexvilwsavbrnwo]pwdssrfyvkefanxnlfr
+yijgsezauqoevphn[qboayuokxuaztxd]peepgblucrlstsln[rnifdfjhxdmtfse]qvymgyfdvcpezxdgmen[qyorafkexhajsha]knaylffgeufjxogyel
+qlydmvzjoavamnvot[napvavoknajlvmdd]wbjkbdpjhuhxybgywu[umxthkfbtbevasmekcr]adnybcirbnsyplp
+qshfqvkxfhgsysl[tzlddkjozqzcpcnx]xjkhcdozufunylwdzs[smgwthhegrzgufktc]myfufzjuvrafwalrnn[jhsmzagnqmhzscu]dbqonhtmhhdshdyatcn
+tcdybubnklvamrjlxqo[naocexrxejgekonegma]hlejmizxmhxahxboitw[jteivhxwxftlyhl]kvhbakqlmukgslgvgx[aueqotadcogcmhqeeec]igrfisukejhgfmdvx
+jowozfzspexprygzplp[acahqiqszrcdhsylwwa]ppdmkmcrzpzbflgeld[etwowmhcqhkjkkipk]gnilcosjuukihcwyne
+ynmgkfpaiocmkybwkz[ztxveuhtztuioruvqbr]grhetxxldtoepqtm[yrucewbvzbphefuf]idcnnpztztemlywblpm[ltaesuehnzfrsflac]bbarkjzutumhskhf
+mckdhqphoehsqgjzpzi[eiretkkiklgmfvohgvs]fsaipzocdnrwworpfj
+hmdbweapvrpdkhqhr[xwpfkaaejitfikqgy]atylpiafldvqsunu[dwvoqhxryfpiegidm]dyvhcjqkgspgnpw[nkabxwemccqznbpdq]ripivpqpjrebswqspd
+xdjfwlhvdtcxqvfzrlh[kcjkplfasydesgzkkh]ilfrxwwjtpmshhcy[gsobusiljqgosoih]dgtehabeomwepoaaahd[gikvtnebxclexmsc]nkcvdazorstiymosjv
+fjjpjjjikuarjinig[ytnbvaleddhkesaoaut]eorhszwghtnmzbjipie[fuwkcamkegyilppagl]pipdvxwvkvvvanblh[ipiaupaojxfjukjgk]purmzuzammwgfyle
+qclqkkcoimixsiou[psabxyezhvejtdodz]ejzppqfiokslbdzoyo
+hrrdaecpdytoxkwdynw[vhgsgzqlqemkdkewg]yeqaoolmodchmigyxt[whflgmjarkpzbitpkl]jqjtyhnxkklkzoa
+jxdsjmkuplrowpkta[uzwnxgrrcieqvoz]vtwwzqgvdeornoqxmuw
+igfbnfbrrkfiyngqux[aajdqilzidsasrthcnc]xmkzmvqsexhkttcd
+bmcwxzeodkxlxclq[zvmqvljaabeakiei]xzujkuxdmumimotsaps[xuhocncyjxiyavon]hslcfclmfhfxxwwrln[dfmghezypyqxtwo]wxaxiadxkpvuwdl
+xifaalrmhugjejbl[ioovxgzfgpaqlyt]uayfrtjeutfeprmb[fknrvsrbeucxlyzauy]geowvgcfjnbglmrxp[ocnpvwnagqhgbcvoupp]inzfrbwlliwgcsqgzb
+wccriqkjssvswvpgx[apoeqvsvtniwgbt]wfrmnudgajwhkcy
+mbyargqesqkprhbtaqq[tpxvefsyzwxvshmict]dxpxmxcluamxmfq
+jfxpcnpdgytwhkfb[kdrqmtogtlmxqmv]auuyjbertdteoho[tdendgogvoevpnevzdx]eicpvtgotdkcgwbd[ygcvethlzayahhialf]kytibwtgzhuvvsjw
+wfdfxjuqfxjbnjpt[mmaupydmuixzfwebpjt]kssauqawybxkfmcu[juevujxyjrwzewzua]eladywlrkxglizgc
+qtkmarqccnxwoqr[vzmovjwxsbhtnmjhqjh]zycttmgyujdefxxfs[tsmxkcuqircrdwtsz]uhqtftqwcxreyvlvff[kwsyvatwweenxdvqum]sjmbfsnprqixqzx
+rantzkbrnpwuuvqbqn[qaudnwijvntnxlj]tfdbqbdepavxiewo
+xwjmsobvbyejpyjkrz[ozkgsxhxiyuejjr]etkvofiicvcusmmlg[rmkhfcaxfbdltnpwk]swklpvfmxmlfhls[iexmcqatbamzyvxft]djvoysjwetzhocdd
+iixngfiuncqysuzf[ehzeqdsqwwjrubb]udkdvfkdtxbddruub[hktknkxemrlnbxwz]qfejqmapclbzhhe
+pmviizplesuakfc[woqzewypfpcaiotx]xatiburufdzajqrv[ydsakwhemrgnxgqyli]isubtdzpkcgsoas
+xxsqvodorzrnrbzsvyu[apejbcvdjuyujpxewu]kfrcogbvnrkuykpgx
+nkvsmhvlyyweggw[yhcjceblmlzpgig]smpwtbqsnklgxxbssz[aiivebyzjnbelkphux]wnaojsgmpoiaykznpj
+xcllttmboowsgodsf[dfskztizatqovmat]gpzyyqjotpdkdemcjon
+drhgljhvyonmqzkr[ohxhjhvlrpodxwy]mrrhedvtgdxjhjv[golpxgauowhwdoov]rdmuwnfurqwssgth[atspndhxuuhzadog]qgdswxcwwahqnpx
+uvdajunzymasgjc[onqeemcifirbxli]mrmpwnqojidvwexxrjg[vbpwisdwqtiteawvdw]rpjzhfsfhrzukstel
+owbdsotbsjvrwvdb[fclwyuadozjjeyvkz]uzfygewxtlgjhmfpyfy[qlnlpqspocvcpqsa]fannkpftifaoeszzu[pvwpbdancbljmucxql]tlzusxlphovfyfflj
+mmtmuzzulxmgxsmf[djwlpuwrkdpcbvv]jomhrdgighcolvayu[vdxrekbfbxgdluj]mwkcqhjhlrehesmwft[pigmugayjtdhtpweyo]lemzwycbgzzhvin
+eferdgkfaasmkyi[nopnmqjuuhhkaclf]twwodgunizovyvydh
+baddrprmgewtmypxsp[yahwshbkzattrry]tjjmawkirxcxcpkbdr[kcptwlmozcgjszalueb]msxrkbrbcfnflgnqe[amwmeanfnbrpznz]jkkxzruebylcrqkvyvk
+kjagsescwfjkqrykx[sefltugsdwkybwj]jmebeveaticpwddxbk[ktfnvedmpvqufsi]zxjysrfpzfhngjci[yifiorzwyumqotxoch]afedqtkmzpfwnacb
+lelwtilhzhzslvzo[ehvnqsjxemjrcvbqyf]ovygwyyazlsulyzhjja
+gluywzrxutecuauqi[vyllygndlfkbmgaoefq]cyucodjkxwauafwfxw
+dflaghirjcyhylbcenw[dndkrtbxackpdcphny]pnhqmjxdzkjycmdo[fryelfouoaesejoq]tdhcacxuqwfspqevq
+yjnumjjyewzjnakmnhv[ulycnyiyvszhifgscjr]xheytyiiyilswfhqywd[jxrndqsxmwcrpwrfu]jquhfnyxudasmomnpx
+rspuvdkdzbrbajkj[dcfpcvzpbodrxtl]xbskonezgtixwjfsuq[gubkcjizpgfwqktcc]ddjzlszkolvwqsrnnc
+moobncjrmmfonnmp[lpbevkcuzvqguwzbzb]pacppeefawsktrydyqd[wayxdzsvisprqutg]dfysmjhwsvnavpixfl[aphusnjjnvygqikzbz]qmvbpeopziujlsmgx
+wfujisugotfsymh[juvkyhewsnpzualwau]ljyuwiidwytmvinw[qicxeddblcxrsdrp]khdooklzguadokmdbd
+wdzzexnylrbsniulyv[nbehnwkwkrrkbwirh]ymyaqhrhmbuolmtbz
+hsxsderrtdvolsms[yqxhutbtoodvausgm]eufwcczbwgvzxsti[gqewnssdahkfambauv]hrnsadgqtzcegnplnce[fwzpwvfptgbgaahdn]hlvjzdqpvjezifpbh
+gtnyrilnfgmslzfju[qwahfyniqetvzpb]txlwtncptwapogp
+xblzbbrwjoudimv[grtjaoaytdyffbl]jojuhhvrrgbymoptzi[rgpexwvtgbswbzp]ysyfhclvndltbnnzg
+ggtkfikxhhzevnhpkoj[egndynfnwwogwdttwg]gmdytpspodusstki[zokrsgoycmxdzrni]jjtmaoztqkdpsnty[ishkqeyrmckkbcug]jkkfuvenjvphkmbtk
+aprzrupkmqzdgncwuq[ototomaxhriosvx]zftevshbmxrjingy[vkrildlncmbvbfi]wsqygjuriitkbszg[ncmxdegpxcdvtgau]iauwjlqoidqpkzkeazx
+klbfjwxkpqniguvq[wymwprcxjujljrexcg]mtjifypvknsiogypja[tfbqvlowzqxqefia]azvpxtyghflrgdo
+xfiwnyfpxzaizzzhp[jsfakgounppfocql]gcgjvygypcgzvnu[qmwugdkvhxjknumcr]ftgvxsqochhihwnsb[acnafcpwduptldm]zcstejwdgasnvehwyot
+repltebkzsojvhxy[chzhbjyllumckfluof]lhdibxgatvxzzhzflz
+ilqmrorgodzrbfesczh[udnwlveyxsalbxf]pptfzbjvkxksoarpy[wffmfpwwxmuxfmrvmg]zatihmtjlhvjbzdwr
+gjqtwvpdnhhqqqvop[hafmfvvzhqrnugo]xgrpicypdmzyjodfv[vtykgzaxumptsclyf]medyaqnemgrawbizrdz[ykkktuzmryicpimqgdk]wyxwdmdtrxcpdqhsrli
+hjnariohxtbsthvcwj[jqplvjyvfwbbphien]yyogxtzdtzodxceve
+tqajsqqmgynvntqf[wkovdsdotmgxjmmgmoz]kyffakcqgknonqj[hvuefibelljpsvaa]santzrmyhmmfgsac[xevdggsuztwdjllvmod]osdymicaxgknwafiyhf
+xgangxswvkcjsek[jrvhyhmomvqblucr]mhakwjcqomofhbdt
+vuuruhdlaefeyjtemtn[rkewcsrolbjkvgnjur]ajuzfefffkgdtzfmfwu[ysqkcwziamybbcghjb]vnyxgeftjtrxeokaqk
+ytfkhfnkxsuuddh[uorumsswhfhyjhnoqe]mlmhytefajriiwzln[ivgrtejpggcetxry]gtwlsddrscrxepv
+zhsugwnutzaxunnfbj[oenidjfrxbnbnevjwo]wnscklrurlxquzhuwf[fswcwqtoexgrdguawj]knactvqybzyjdjdkdkd[hwncacnowaliolgzmlh]xcqfyvhkoaxjyrxggg
+vfcdutbbpmmhmpty[glvdyxliujvbdqr]jyavmvfrqjztetyn[rqngwyfxdxofvqwo]xqcpmtqhrkoctux
+zfeyzggpwatzvvr[mwnxvrajqdtijeqm]kyprmauvxauaeuntay[ivwbqplblehbbhi]xfasnjwliydlrcyk[jmalyrxoozbrang]lksylhfvgbezkcf
+trqdnrlvoqyqyvjt[ekkkwqklawagqqprz]zaojypuwvzdghwkye
+bmnmbsogxhtpved[zffxeokudzgkusvk]qcuxjdhqclszjnxdhd[rsjdhjczxtrghlxwh]vpekhuzoamazdzgufb[bgtmhavdkyhtwlwcqmk]qucpatddwrtjztpxvi
+hwqfyynrncmhcsmrlp[vlaqdzxwrpawflemknd]kmvyzqfvlouluxelul
+gnzpgjfxtsaiknapn[rganasfzfnrvxir]ooatokkxjxhzxlpmb
+mpedacmqtzqmwqyfz[dcofwyebgsvctomzomk]vpqmhpoitpubjorx[thmfofpuparhszqe]clvrtngjajielkxre[mfcjhfugpyymytri]moqcfkrpazshwvh
+fxskejrgulaixah[cwshxkapatrgudllubb]vgykjzaukwxoyeucosg
+mgfyakavdeymyzxwa[dsvhoxfiuxixxva]jsxfqsnjgroxbmpiilm[kxkakjvwgwflxnnu]denqicbsmzvgtcxm
+zfqnynrdbdtqblxnww[nzbnvcjtsxrdmasqtn]yoganlahispbjdyxqx[tuqafqcjrxnybeksh]imhkfmqdjiyfoqp[oennqnvdpveoija]vljstbhqatpwvkbg
+lpzjqfcipceweps[indnzphetquilkxnds]oxyivnjttcuectlyfy
+tfhhmfeomcdyuql[ioclczzniueodbtpbrp]wuiujzhxjbgdlqbm[iciypydykxiyqies]ptvkrvkragnibssly
+ybllxqqxzjlhskqi[ytsvahdhxgwnwql]pzfzcnbxiypkpytv
+cchwtoevekjgyqqs[kizgrwqwbhebxlscmj]tjbuacerkadppftxdpn
+nofeoaawaeoepwekxty[mgapdpmakihrfzlfvpf]huhzkicazfkvjhgdvsp[eqtuybajdgdthtz]opgdgjzkrfejgawxn[umbakkosxdtfwcfh]dhukvukdwsevvcmt
+nhzmrmtfyhjpvbsi[jghcdhdrxermnhnrg]sasarolrztffxrvh[tafrflhiydopcqrx]hbrwebrzutugjnj[ejqrvlcpqxtiuqho]xjgvbnuvoxjdcpx
+dkizkqalwbetbepak[detgokxgkgyhrqzzbqq]rmwrqwolneotsyvq[fpffqdefoxfczyfb]dxwsppdngvyskdpfnbc
+ygwbidlvlgwncfy[ouryypomwfwmnka]axlhgqfgvrfsmbs[zavmkhmkjzvpzlxpkag]bfewyvdthrjzmmjs
+jwyxcjasntveqmblff[mudhpflnaxhhrphuwy]yyvtbzbohccozqj
+ckfocickdlijiur[fejgtsphnigervnza]owlznrkbwqhkskgebbx[alnbdcgnktmjlnhig]dpfomgwzkqrpmicih[vovjambzftywljbxrgj]ihljubxxgrxrqpn
+pygdmdnnbvnjlkacjfz[xwefajgruywjhysd]soepimqfbbhekifv[frdrobvsbwwkcytfv]aszgyodinewnrfdhh[wztqipflzlrwmpxefga]bxviyixobyldmkln
+qujnmepaefnkxgrrg[yxdnlyihixwasibuy]qtmnryswxwzkuqw[ozuwcixlzlbiacytv]oylpudpmjaqgwfqvsb[wljtqzfawkmrnkgkvla]kgdvfppcbpyazklfdk
+ijkbhnjcxgsslwtkuca[pxpiyixylcuudtwbt]ooerzoxehuqynhzmhwn[ynmgxzstfawvqihdhoa]bdrhyquybjddpuroto[fhnnpsgnxlnoiiqcml]oaibnvvqupilprgcyiw
+dfqizqapoxvqvqixvm[mgrrcrzvjkncxlmq]xqcxnymsyxbtfebdgy[hfdfaxiuiexfdhy]flyhvoppwzigjxlytu
+qlakotkuqswwtqx[xnpcrmswyqolvyp]limmsdyvzescvvt[rrpvvituflyuhyhz]amdxfzneiggintiyzuv[cykruetmmqucsbwjrh]ymobjslroztxtla
+aiufklgicgwxdlaefc[ofaqlmhnwrwhjlleyt]dixgrgkhhbyopqkzmt[zhqupdyazgumcagdids]mxijcialempjslotrgr[lmwxkdqqijndgoiv]upioecwmfnndajajbxw
+oiwkroaymbjtugfvip[hyqrpfdrfjppatm]azycyfsttguvudeq[czujqevgflhvskaguy]llsuolaevinsabqpy[sivsqswxfxlanvod]sswhiwoaxhqsjnynidh
+qipfjqqbxflvnxgv[cnxuwbvnxndkoxcxjl]atoznchumwauytpqmgk
+doncjsebymuefbxj[itsfdedfjxzxgvj]wpxzcoaybnzzzxz[hfxwmqbaiyiajiorh]einnvliwbxhjzxx[rkeenlrteubkvgrpmms]qbrpoghwjttgawgstt
+tyiexegppbtbxzovpb[yljnqybbavpwbwmvg]unbjhlrkpjrqbxrtpof[bvbfvhvgtawgpydlnn]phdnwsbwbljkqchww[galszmgwroduckhyyqa]wgfbqlipsvntmnspge
+gmnkhnuwwojgyybh[ivxthnkhjaevliiberd]crpicsxuksahuebnk[vogumtrrqupdjhtvmi]pcezvomttzmdgtelfq
+kwvkuklbkgbxoyqo[cckuhlseweoukudp]kuvdtzbjeoormufjn
+ewqcguiyodbjoxu[qgqtmjabzxbzjua]twmhfdmuudjrqjpge[xexjbzjvrungbvvmry]yuazblohcojrddhfzg
+irustuljdmhlqrettvb[dgsukspodhlhcqabx]auntsiybdcfgxjmsiqy[oqscrcekuibymdwfcy]dmxibunjfmqjoeajyi
+ppvngsfdficcpbmbze[gcazeiyfowcmezww]wmphalytgunmpjqatau[qnhrljcdkikordx]yqrsgeczwcwjbqfhfw
+iniqgrqelaihnllono[cydssebiyefnljxfdh]ljpqnievldmltrpp
+jzjmjfifakcsixsg[zmgaofcvdvtziindqe]mzodtodhvkiluhuzf[gqjguyslrtqvcesa]gwzpfqfyfxnncsemb
+gdnmdicwnjwgpjqdw[odoslhoqgocoumxf]vodkzgngmshtzwjpgbn[rrhzqlqeixvxjbaldp]xsvbscotkujitex
+nnewsdtgggcgiawo[kmuweskiapswdskgosj]avjieesxujtqfwpuis[tvulfkzyslzakco]sjhbzevzvglgfreyc[wzxjjpsqmctkyoutau]isajcfzslakogyuevtj
+brresmfifuolfyc[hkeljqzezcsvzrcue]zswubkhczxziqxlty
+xzohgybxqdxdwxfbx[dqcorjuppxguxgps]gltuxzxhdjujuro
+hmyrpjbmwmyzijkbljp[ipbngzbreqoqcisbi]ctdmsssqkgrjxozcx[egmuzsmsaiodyyt]ugjpwtglzvshohbj
+snumfuurpriffdvj[ojmagqzaktihjmwriyv]rgnyhbobphsfqgh[azucllkylyxgrlom]vhtysupgjwbwndwrgfq
+pxjdxiuhqmvwufld[ktpvbdokrtdpxrekaf]mamfsijuemlsyio
+olcpnpmilbzxxvqsz[ervozeicgvqskuenz]gcxvfthottngwww
+hphpdxpbsbmzshrwmwt[sapciwpwuradyvko]dnrhabfjqorseajgr[abhgtcdijsqfndmney]mmsvtcxmoobkkaeevz
+rtvrohugqesutzky[sjsvmjhonskkqwhis]pqjtzpfnvwsigtme[ckthdaxpibfximcq]peoffhphnstzruuhze
+cazrddymetaqdtlwn[tqrvhfevxilaptinubr]opnhppmmbfscporp
+ctclntnozqwmiqz[qniikhszzxbcatctip]wpoexzkaxyealqhcg
+suxvexjrakvhziolw[pxjlsfocisjmwzl]smoqdqjoczuyiac[ojpwtuddbldiaruiamd]upfrpxzwnthfytv[xvfejrchuditjal]bxzvjvhoigqunomnikp
+vjuryymolbathzinp[xrcvcqvbklvqtjnpzh]wugebbnbnzzvdmpg[kzdlfbpqgvbiyqwitga]wztqfradlqinyzfzf[abgygmhhsksnvso]kntwamrohagtdrsm
+ernvshbquyjfymdthx[jjshkcpnxftyopjayzm]yidkdkommeyieirf[zxxkwqqlsgxpcdwlgq]zpjrhkyjkdkxoufwlx
+pnevxgcsnqcdezwf[mnftbwqkrfmwcgp]rkmeslzoffovqheq[vxdcnglifignqqx]xiofsoyrslgyfrxl
+bjehvbcqagyczepreos[swecagoxtwhtmzsjxt]ihbrujlisjdftzpfll
+bdczzogwjpcdwyq[jptlwjoskogbhfcdu]sbfatvcosbvikmvm[njvcfwokqbtynugffu]qwhsgaqfunpacmimzhp[mulicnvulazcycscjye]oycycatwylztksmrfh
+idpyubomejrcwurt[idytppqynyqvdajevmk]mykbzkihnmfcnfg[ghfxtsrfkqppejwgen]rsalcongusjamgcltti
+gutkiuskjqzvbau[vqhivilwddgfrckjc]gpkuhglnqnlzndpl[tywjgkqskbdlsvf]bkwvgkdcxvdlvplmza[yeqeuyzuoqbypnwg]wsqmblkggadabss
+zgirdbsohsmusxbiqm[xnuiyfzmegcwzuvery]mzjixtxtbdruckher[ylfmvkslkcukfdp]vdwcmqmrsnedjnvsomy[cmmaoebsohfrnqu]bzgstdhoneuzfdxl
+wimnreygvgbpvafqrn[froxfavuvgvwirr]avnmgyvkwfnwfgudiks
+edgbqmwalgtiurhmmg[vjzrrmbtvyyhwliye]mpykphdsaunzjkpam[qdcecrxescwvlxmpi]gkfipuqdcpcqodcptya[pmdbisdhifodialab]wjucsoipfxzkkzwm
+xmurhwryxntmdwwv[bveccegjmwnppgio]rbnnbsqzutgyoign
+koftdywagyijtsi[amffypsbtekqlbvlli]avskrcxhiysqqgjja[ixrtkpjnrhljddqzt]ekluhurkjnhlzaudnrj
+vqbrbgtnvazwyixug[yrmuvykapxyyqxus]ehhkvomrgnlsofbd[mgwdwrvjwhhuynogqv]nyjsgnomdxwabameuss
+upixiwerfsjxjvecmo[lhlmklygfmbxljvptf]qnlxnzoekmyoggtsmtm[wqvqbaemhanfxldq]msobqxpmwqyauii[khuvobspvluvghjhcjm]ysvqvfsfyanmyrbuxnw
+xeawztjrtohpimzkw[umvqxdfhsyyxsimzj]kyhlrkyxcnyupqmp
+hqzlqinkcowqqzp[vhdaljgjjfqhlrjj]gmsyhpvpblkaxiox[vhbjqxseofvbvzbshv]ecirxnvxadesrbvn
+puqpygmwhwskicogo[lbkrenbngbzoljzuoo]tndvmvztkssolnom
+dbswyuxfrnypetkm[lyuajkvfqzwpuon]oorgrpkhwwgtpzxc[guszbthjnajqffsofme]vcqjstfdtrxcuscz
+clhtmgyxqbrzeipksw[mwuhcxpahefneke]bssxlwoelrrgsqcicz[yyrkfjczqdsglltdjz]xscwwnkcwstkpxto
+ajsijhedwsivzvngsr[eqorzqparxhrbesw]lyvxgqgqguifrpuj
+sqtxgdsfkbhljmt[ndqljydrgqwwqjayc]lttwcrsejwxgxkuawgm[nefpbdmgtizfijyt]dcxacpeeyuzkemb[otnbznolvwiervj]hdcjffxyhtqdjmaipj
+kvohguactjmqrluci[tefqrqmjpzpsazfoe]ptxqfezuvtxphvy
+wmawphvozqxqtmq[qqtumumswsrpsnjug]wejsdbswswrjitmq
+pdzwixvmkxpsxygxmp[zfxeglxxoxtkkmshin]hxjmzexyabkviollfnk[nfitohyddbdfqekaty]poexvcemyssklhllw
+wyyiqymjavixnwcnxu[xnhhsqavbnggdqn]gymwgjatpsojwfj
+iqdkuwpqylmwhfvm[bjgqryooacvjmxtrq]dqhwmcafwgedohws[ucnjhrhnvekrgjefzxq]opvzmoismjdmsezvle
+ommglribbfvicgmugx[msedauwycskyoios]qrhxlnihnwmktihzp
+laphdvdlixghsmjpsq[blbjmefxvnjnxmmc]hnzsqzhaenlzcvoq[ppyribixnyeucvjlv]fdogfvnymyznuuxa[pelyyutyolblxzp]fqgcltvxupdobson
+apnimgsoqfmqlgmjsvm[rdpnruzylevyuir]wwfenkdjpmqnvyf
+ltskflhfhupifhf[gwtcqaatnfjdgywo]kvguorbhzxfqrhxnij
+kqaeviepbnrokflimj[zqzevrvhforlozy]orzvxhevxtzorkch
+uhsjyhwppwarmrfed[nsfzcvrwjhfuwjta]nlthyhmaeghygqdaxdj[esqbskelpkfswkvwmr]stzggiejdzkhohumob[snlnvsgiktqewvpxhm]ahojfbcfgxqmmml
+idlikoogcxqffrufcqi[vcuenzmwggmbsknfj]peoviabqngzwiqtvri
+rigldzvrvmsmyakcjb[wwsutfoucqlgorxnu]bcuixkbifegcmltqibo[szoqsqlnduhgvhlza]pcvurfgchanmngh[glpfevaugptbhqqrd]vpndxitsihovocvong
+jwfhrlvcglbtbdlix[vmhtfcvzlshpfcii]gosuawoykketkzdhw
+bexfthnhhppzzutg[ewpudndaewfnwaht]wlnqstzsulregcwgmzw[atroqzyofendnnp]idtypgwyeatycgpde
+ldhjuqeykeelckq[qrrabgedfafkzize]tfjpjpzsafansvygor[jpuzbjptblhydidkek]bbkncsznubtpoiahot
+mqqxpkguxlmvyyk[vnxxtwxblmjdxjkhecj]shwgynlewfeegfwo[dgybavttexfiaod]ruobjihpitxxfwx[frpidegurggjllhq]kcfnatekrezeqoqnpqn
+pfelcxohsnhpzjnrp[bmnzwycytvwquengc]weaysvdqdkhrprcpmw
+llmwiwxeyezezpt[densmtrbqpiuwryg]pbgadfldspoahjimq[ugideashgoighvpiwid]pdvxaqoufmuvtrgs
+ynviititdvccfewheh[phaubuotpzjwqfcrm]spytehersqqwhac
+ktjvhepsakhdtvgoq[bnejcglklonqxmygyn]kbywvhkayojcufnwr[ipiujgjwknxzefdphq]zcmnmxqhuhjwqiue[dueiqqteiuvgyggtc]rbsyqjqegupwxbazttv
+pgnoazapsklgvmejjr[hjzazneywdxkaki]gfwcgiyhuaovsye
+qorimqvzoheryivfi[usbcrrdgseveupnqadf]bvedishdaepjjnrgftc
+thxrgxhchpeczth[eneefpesxkgwuxpnyb]efgidnpfdesgcmkqllx[jglvknahzvxyegxxedi]cupoduyjkdpyajhirg
+ltabaysmmffenou[fiqduygbghbczdsjcs]drfpocohdrhunajvmu
+rklvlmyqqxbttuhuzos[bihsvfaluvhdwqwcz]gbrlkbxpivsdykcjx[qoudfwhqcnbrmru]npquvyoxliacxpr[txyzvzsszqedximgecr]srcqshisakuwljrulf
+oiiruuqsdsjguri[qfzwehlhoinyhjv]jwayjxoutcbbsxquluz[kbgrvqmxzsukught]bgspboampsgsivvuwe[swvxxnjbmcpffrayd]txmyfolzjpxdvqzdtq
+resryrrtzhhnpbdrw[hnirhiummudhyylnky]gmwqolwapineiokcl[iqptxfvtgabqyxex]npeatmzdsfknpajsub
+aqjfwyrtqtrhnxdmfq[xacmscejzrlppqhlziu]bxvptkrvkahygexqsub[vrzjqbhlpywxzenkod]lqvsohrjrymprniyn
+obdgtytdzpcbnelm[scsrytqyknxdmzugidh]fpbpxshhnyxedvvna[fgebgketwucucajqip]cdmbxelnfsomsguvxdu
+yuluzhzwsfvngixjn[gjmdiyftbqimhxiv]gxjmpelluljxmuhz
+icsqqjcnwckhskoc[rhanawaofgbzenhxtfl]vsvuwijhjnaurwlb
+zbqzykdfeunfcwslv[fnqtxugkwojhjjqg]vetgfnapdhvbdaiya
+uxpnaesrcrudsmuxvk[zmffkqaufmoxgoelq]jldwuldydprcfgod
+lcaqgsbmhyfmfszya[brvxpxjvmtrdkdmfm]cphjfsilvnsdqmpxob
+cwxycngzriigcet[xltlzayrmdowajvins]rbfmarruugyqhvegod[nbyobbfqprdigngp]nkrwqcyinzutnklqb[ajhqjuhqzahxzjbk]nfyrxcupuphkbxjqlai
+xqwbcunarmghbsosq[jrmjtqqlogscgojnldm]bnzhiagvdwgwhuawz[toxpipinabgmkbwhtd]uxpgoorspsohkmd[dtadhrgzvfownrufn]xslrmvbosoeoeaewnfr
+lllhkodepygrzesxp[zeohwydmclhucevd]hbnsvtijajahmkclbei[byxhckkvqixiwtg]ekezugmyyavcwxtilwt
+jtjbuoavqyjhlaw[vbjakzkppzloxxfx]vibdluddkdsdexqnwl[ofqpidngtagumrk]kfoqunkkvyoassxlgg[ngbosgdywnmslnszsa]hxpciqkkafpdgfki
+nenfymvefbgzvag[wiqscyftlldcvsnp]pchooarrvfpzhwvcjpl[wtitvzxuvfufwviff]opjkauasyyfyspzoufc[pelszbarccpqtxvawi]cmkfptidaetuqkwz
+hitjejomylbutupmkeu[qdzbydybpabfnlkwkv]bdlbevsgqmwnbolnhfi[qeujppfhpzjbtafrgl]zvirtzxdzoojcwfohx[ftgmwthtcanqrxzks]bsafidxuxypaueoxg
+gclocruwassudla[imoknvpznyxchnrvl]qgninncvnnwjovnm[jwqccerrryoiwsqf]chcucyiszjrnobxal
+wqlihvvkfdyrhbqu[vizkatngyvpxuwhsfr]mrxbfaovpijyrmtjxw[mrkexdpmoaarqfj]kmnbalnjnbjcsdulczi[rkidvuivyaequway]jmyicruofboygakaozg
+dvyalwumbdjeaocae[zonftyvegiqiquqac]osgmsdmqoclweiqi[xhgqrjylvorhpfkh]mmpkmrsideufseuyaj[ogtngcelyserepmqi]kjezmzobtremfefqz
+ewovyikmmawzzrf[hcnunsbuuzhvduvyo]pdkiewvktjzzpqwvpdw
+pwfklqtvnpsajdvtyoz[gntgytituioaybkpjqv]wteojggsgedrjqdi[xzvkngdojribistpis]xftjryqatcesygfzoa[zddmnkhceqxmznq]bssablulgiiovynaqrh
+ztqjirnmogqbcfifh[vyeztcrzfxnegdyeed]redtifioqpfzykudrih
+osawcjcmfchcpgyi[ffwhlengegnjvwqehkm]rvtkttwkeoefydz[cokaihziodpeurmbp]spjznidsrkpqhsoag[mautcyrrmxsnrlw]dastqkwpjbubonqagfx
+jctsgqoqjqtodkhvvuu[ylovawrcpwpnzkfp]xtjdibtsmpbidvvdh[mmaecjrzneokajhkzc]wbwaapxadknspjujtp
+izxxelepmvtrpcb[xwoxroumisiqgpqr]lvhyjhchdicledub
+lqvelunldllnngme[lomutagiggypbbw]hdubyftczrctokdhvbl[ymxlvpbfiojaausmi]uqvhoaigwswemktiu[iipvkifnptbwuax]nidlqwimfttkbnmms
+sewpymbrjgtmkqd[tldvdouashkzpbu]qjujogijyyqwbvzqe[xmhewesgbeyrqkbfj]heapyhfvnqovmlkz[sdffbynjptvodwocru]lwqkbkjseujzmqprv
+oegfarvdcswdpnss[xgbroqaseklyoxl]wticmsitljjhgos
+bfhlklvvprpfgxt[wczpqxciyyulsgf]fhlzqdaxyerlulakhbi[xgklnelwoygvyged]ynhbzkafydsmevse[dfcrqsfpouuvsycxi]otcdmymmlomedultqa
+pvyddrxqxuxvzfqfl[nipfbquzzbmecwuu]pxzmehysojqnpna
+vthwugdifklqusu[fmffwynjxyagyycbup]eaompujnjzaowbxmg
+djekvgwpzkgwzwardaq[sjycmrggjjtzpzoq]zgagtgosiowypvz
+bicemnivninwfubpi[enghcgyjwfuwqvfcrh]crycaojgzeqgyxdq[zxgbztjljhdhzpoy]ygxqydxramuikbawdoz
+wdigyfqqrkjeseda[yjezqvkmaqfkcxgu]dwpaveednjywzth
+vjeaiuwrhweqviyv[twssdwyckfswwqg]bujjzsuffbcddcqd
+ouivgjbmmsmiezanss[mltubwnsjkijprjae]dxjbngvqbuzmtnxj[actzjkmbxwewlhmpz]aeweucknsntthwwvkmk
+hqxgwpeaugpibuu[ftohsergcnnghmultwv]oobxyesnifpglsyumqx[wthgkfckhzdlzeh]tbvnqcewxwzutlf[dbsokgifbtstadxjlyv]hcagowbeupbbxvnnudp
+fpgthpsgglztrnrjvs[rznddjrlsjtdrnufotn]nfoxdbhyvovsaratt
+idauaxxyrjljwtqk[jtrvbiyczhqigjxfam]bsmzdrpeytyegsvitk
+poxzegvwjgitaomcy[eatpylidmcjifnbyt]pxsatbkkqdylippyjd[nuwjwmoghmaptwgm]tarinkguhfewrxedty
+whrppysnyuopewxlch[tqeujwwbfviqker]qvintkkgeyiysbl[zmhfxkhgptetdsq]jazfxamrhsjvlcwr[ybdhlaudcktfgpjajk]vnedwkbznnxoegxe
+wmgrbjddretekijeqaq[wxoqrjnhathlpva]nqrxdfrjrvsaxzgn[voeyknzetkswzmonnh]qexvtsdihbxdwzeympo[mplyvliqtgoezpr]bsjrjqbvgcrxwnpdqs
+txicytmsosvlzftbikp[hwjajoqvcmhmitvqnh]gndimhsqdssjugsp
+scuaijeujwpdvdlzf[byroacgumqpoawl]lofgfiiquoftdrrxnhb[vowfcxvalicqrtpvkga]vdehstpbvncodihewhv[tqrtdbglbqthqfjyu]loycwsbaxhkfanhnp
+qgexpbjlhcciuhouo[apvfnzznkuufvlo]njoupqjamycblyd[tbviqvflseyhhsmxz]lvpemusmcuajelt
+jvrllpusmfmsnwy[yqlfrmtxpvwcllrfev]hpuqtteqblrjbnkx[puadngfdbecfuhuvrqb]myxzjgttaacbhzlpipf[gcjfzcrweoksbywfdc]mnchtfuqvmltrxakz
+ywmkwcztiqykpmju[zmkryfneelvtwfnm]zhuiojbicjnfdmsdhi
+jhgrwzznkirrskfzfbl[ftjkmxrdyljxzov]wcszeohqiseprjde[ngrtygnnwfandfuvr]lqcatjwzlsbuqnzyhw[hdhijvlmfotjdaaivaf]glgrbynrgpcxjihg
+ujtcxpupjndfftyfay[wzspgaqtsinvgbd]oskncvkxhimahafzkp[tbtuibverwndjkyrbtb]vubbwzxvzotdhtvvx
+dgjxjkogwuxxgavcit[shbqapwgyduxmjdzs]sqmxfuntsqibnshlszq
+byysjubuacsviouubxd[idvdypsyblnsmvvv]llcmcxizvdvtmksphjf
+bfphxfyrcoddphmhwh[xvbfcujmhltkfiqaejg]wxxbzpwusjrylub[vcxoevvppeirkcl]bmsyjsnoixvozodjpm
+amhqkszrkzcvumwjbr[wgobbxkqavcfedi]blkqusznjzozcwyatzt
+chzanckbvfhvxoikx[jeyndyycqesiujnj]midrrqwphhqptlbgy[dcelctfpcmitlbrdu]wmrripumgjowiedxpcu
+rbpkmcggsbshhytszrb[rjftwgbycnmyxxockku]nrtwwneopxuypblr[hovauqqiboxesfrqqfx]ytyygtytusfdjwco
+ytuvowkwojtdqfjtmj[ssrmnlgjawuaqqrdpv]ugahrlchntdmkwkygr[ojlgerllesmyzdbnvc]zaztsxmsddgciyz[jdimgvtyvojseeavk]qvyupywbpmhgoppfwru
+eirfjumdodlaevcsigl[befivodoxdnhfmqwkxc]qjaeppumixfpezjf
+lqkzkupjsinhxws[oibgvhxxpewuebro]qbweuxvitezbungy[lapasshrjxcjgdooj]hmxejqpigbcprqregtu[pqqqhbjetacltithm]zhectfbzhtyyvkyazu
+ihfadsstuwooioj[dfqkggnfiplpdcsnmx]ylmhqzhlwtxaxhx[yyqzppjaxhmgnlll]orngviyezsyopwfxmhu[pucykxnzcwdwnjzruf]axfmqcflmrxdldubnca
+rsaoluhtqbbhahhk[ursokfyrzqvmjsq]xlniovtwozkeahaydy[nyualslnfurebmbnv]ehgueldltahorrpbbyr
+lviuzeeixehupjezj[gzwzktpbujzeyypbqyi]ecapnyxygcmgfhgmfav[qclblpzrkfredwm]wcdfuzpoxtmzkif[okgiecyymbnmziyyke]zflgxeqtxzeezvc
+wzpeboftsvuwnxel[hmqswpadnffutphylpg]hbapzwwtxulrfaenb[hgsimoxqivllbthuavr]jpxhxohhxhlhlfemuz
+xbojluzthxlygkyzkwr[hjnkqiofmyuospv]gaglxxtcdnnbfvjubea
+uxtugntiubziynpzbju[onxffxfoxibzzzd]wineojjetzitpemflx[jlncrpyrujpoxluwyc]fxvfnhyqsiwndzoh[lkwwatmiesspwcqulnc]cbimtxmazbbzlvjf
+bezefpkmcyawtdlbnmy[yxmpaexxuojocuutf]gybqtynhfakfryzyoot[rzddrwizmjilbaevypd]wjfzotxmdlvmjcklea
+psehcauaffyyegx[pwkfxlhukfaavgq]pprwkzrtyyghtmsciep[rbobphjpqsmeuvgrjt]vlobomuxuflrqfwjo[nijmtbnuuzplcprb]snfbebpcogbvkwf
+cwflkfoevdvovrmn[xfkkrwrohqcdsdyuomb]ohirkxwgudwyepwtvm[ootlpxttypewmdjq]snhujgngvmxwpmagis[fmbwhgzljomkrdcph]pvfendnvzctahabni
+eoczaktxgrdpwordn[rbhnrlgckthgxxuzu]htgvsgazuzqpkjoejg
+wwadqndhcahxivixrpr[byzxpjmhnwsplkf]zgwftzdjcyjhuefzynn[pvifqpqbtfpvxmhma]atwcwmmvncdisnmw
+cjbhnctazhwdvcvza[ydnxbdfkufaflga]tyxejwcbirwrznjbf[wmrholfqzuzmywhlx]yuglypghwrwzmduczd
+sucrzntdgccanozz[dbyodxkqvfamarbda]iwcomrnnifahrolyhj[lldsewtcmdwovjto]kxnjfljadgqmjmmr[jpceairekkatfdo]loulprskwdwpwupvlow
+rmkxvrnxpnlpgxk[ymfqtqhsulsvevgy]mwlnvrwgovdeimq
+cjytdtwgtpfaoqpo[ekwzzukvazymdgcjbax]qmhoxsmtmokxfyggfsl[ghoubcwbxpcflxaoiqr]mhzvuhnaesfygwphehq
+fjfuuxzzuifgatypkx[pqxsrnqgcfmmojf]drmywevzjvfsdwoe
+aaltjjojczwavnn[wsduayllqabakudvkzo]lnkpzrwwahybafhnmlt
+trzcoixqxcnlfmu[kxdaqkezsbtcrsel]aimhkjueidtzheak
+knsjvqpezxmhuhawprd[zfschikoyuarwrpvh]jnwcjfkahqerhof[eiezpktdgiogoghnyq]xumsccawinipdfbk
+qdxlgihyxpurnyesn[uoqazfufeeorudagpbq]doynfpdydwxymmbnh
+hhxsolxzfchrnjue[qibcadmwrkmkbeye]xydgasalivcqoag[oyblkffxdgogkbjkk]denthwhcbyimeeyyb
+oomceudfrpdpinwaw[umnoeimbzecoaprmqr]vnswrzldpdlfoaaaxv[ysmxmvvxuzozxtkar]eatvxgtbqcoquhhzzn
+mrgnhaqqyhhvdfoo[brbrzbaajkxnrbkpsx]qknvrvpfabkczng
+xtvcrctmszksrojch[bqfzfdhhsfkolghur]dwqpjaqisitqmhpnkxb[omfmirdtvkdoehc]dgogacudqnrtshre[nudirbvfeacxjhb]igdfrdrqycnowffn
+vrgmsmohxhgyybr[shaciuypkvkjaqoho]dlwfavdhohiruaef[iowdifdsyckgfaixzbi]rbkuyahekeohyxnyxmo
+giaemyheoijyiqs[dditjewdytotrevtph]nrcosaxnrsfnglxyrbh
+aqpquczuuqsqfmiynf[rytylbwxvhzymqtqal]olufblbfhnqfhbdpjc[njyewyvnezayxeqkooz]yawvjaofjaqcpsaqnlj
+ynntsleqhquylfosn[esbohqcciuuyintjnn]krtinqbvgjtfvdttys[cahezzmqcfayrtijrl]jlquffpwepfjhij[gsryvmkutwbfvekc]xwuhwthwkpiprtpn
+wcifpmwramdtgbyx[mnetsyvjbkzlemkkrj]ghtuuasxyhlhdiqi[oidnivyrbzficmrkxa]sshjteaabilnbbv
+jpzlvsyhfjewjsp[zaukqnrnkxuyblu]itarroefggdtpkwknhm
+nxdmkipobgdhcekuk[edajmdcmxhcxntroa]vgrzzrytukuxdetf
+elfvvedwjbltwcnsbat[wlyogdvixiwmkxvshnm]cwhhqukydgvfwzkw[hendekbuynbsgeza]unurlefaaduvvpbi[uriiixudeogykwckty]tilfmprasfargwjoeaz
+ehllosfwjnemfpzkjbh[paefpdhywomalbjjwco]jynaehuopnolwbg[cusfqbvxlvqtqbuxgyg]dnvunkjnzqnxcginfx
+jfdeexfzxrfxleh[xqkthmkzmmfbesrfa]ddwxrlspxpefvpkhiz
+fpexyleujiphzrejgu[rjjuimrbnfxihopoasz]xiovbrwkxkchdagu[rssesjbgdfwwomrpdxi]xurzdbytoxjkwyzl
+wtudecnnxchnjhuz[ntnjpmwnwqpqqkcevi]xibzynwnkahwfizkxni
+hxvhhsyrupdpvjymv[jgionvwaxuiemcdtvn]riesyfkfymxxite
+ndpfqkkiqgvdiciv[qwegblwhxefkszrc]ddticzcfwxoylaheuam[kyqomblpykgrsofpbz]woykqlgorinilldl
+lupajnaqxzgawmnb[zfmybtxebhkalxwfwyt]sknfwfxgdqpbnqebbt
+qkttfgfwmqxgpbcgqvg[zkftxwwbappqdllajhi]ducnsepawowmjggv[osygsyvnhlhkrzahzoa]iygudcaycsrtbkohbrd
+akdvrmxjbjaahjcfhz[nueiutbritxbampij]vjirxewhgmmwlora[uauyvvwvrfhbxituz]omfdcitqhjhentxgfu[fucgdtoxvryasxib]wyvdxqpofoszluslht
+eorazrawyakawjfxdtw[bpyrfrsjhfualcoyfjc]gfgrienuzeifrfvw
+mcfhxjmwxlcreeloqkj[xlhrkjackiehnqj]iubxmjyssnwjolapvs[tnxnpotyzdxhqamjfu]qakefkzqtcahednybux[tosvyefshtbgasbf]uimrnuvlevqylbpkq
+emyfqgrtebopsxa[qwacgpmlcpoitzmdq]weqwomfyfqhxmkjalw
+dgnbvzkwdnxzuduvdee[palmkulrnlnjdyeavyi]cjgsjpbxpairrderw[nnoxigqxpkjzjhfxgxx]xdyxrtslnpmmtpotla[undscmvmhuxzohsdg]ghxcwnjphcmvttna
+uppsitifhxdcjbn[yiqjsnlktwkbfyho]dpftntebjwcyuih[rrqikyarnxteelpkc]qbjeplbraadbjxoicjn
+mqjlmaekarsttdmnl[cwdajzaopmbrikcv]vfhztmfwqcwsbdnyebk[puetgqkczejvdjbfqc]hdkqfycmizzpuoxumm
+maldhmhtlcsjqyzrb[zjbfpjpvdszrqkpzf]xspijlrjyzjputpz[mcjmewdtmgfqutbah]hebhshxtiedpjpjngu
+hiqikcyyvddlcggnq[ehsopbptguatpmyb]wfayjslqiqivsbrhedh
+zriahyyoezygvjmepy[dujudufydhkqlbc]ndalzjrjswnjujfm
+silotorivixpdydnd[wtsojgrfgugwoyo]pfihyfhusblbdodtej[hfclibenimixyexhble]gaglopphfrhqxikvw
+ddejnfspvmvffpfyozn[odqqmwgalivbswfio]rbbkjhvnszgvfjtgog[fgvufpphptnjcmraha]adsajvzndnajmilk[ukslffqfzyvxyxy]njzcfhdqyrzzctmnxn
+ehdmevcrfoeejfedbnz[cidowzljgyawbjmtzun]mxyjuechgccpwlxj[ynbdkyqvibsfwekcjr]qjilshucvucbebxmeyu
+wfyklfdesrxsopcnj[otmmdkdasnvomdhef]lpbexhubcjmfwlt[maeuvtcgzoxemnreol]qbwqszxalocdbfbtge[wbvswinrpyzjbfrsr]tinsrsxtrfkizkeu
+grorjgszsijwlhxfrjv[hmjhqmbipfjguwkzebl]kgphtaonflqlgbyk[qxnjzdupbhhsevc]tyflwvcpxchibnttwsn[ukpfpknbyacpxmoxzmp]dxzkerytewihuptx
+csyjgthhgyhnjuxxg[sjqffhahrjyoqxncjcj]owwprabojlpraeyk
+ibcaffhxenjnmvrnog[shqpfncawueqmpyj]hawlfakyplonsim
+ftaeqqsyebdeveutf[tnifrefjkddtblslzwd]cbdooorsorxwxugrp
+ioigxerknwyrzoztkv[ffkgwjfeowgtoxnyt]zhkhaqrcdjsvxctdj[ebntbwbxzbbqrdasjz]solgzrowmzozovz
+jfmlobddfxzipyzyaj[qghvghaxzmuhrpifyf]idrqkcfvatwsyom[wncyawwmennmgio]luzaexvwjhxbryah
+pjcydgylusqdexbb[nsoyssffvolztzns]mntwrdacovyfxcqfn
+tagdiyuylrtvuyu[exjzdpmovyftjpxgj]vnswkkhaoldjfkwd
+atowdglgkmbnrvyt[uzgadzquqpggiapdznk]snpqanyoeufutazn
+nltynylwgqezegky[rawbwledrpbduldc]isupsldtvjtahlwjgz[upmovvichcymgwuoqrc]gyjptxtuaqcfixjuanz[cxzbiosnqkeaxlkrxh]yglfdtzazlkxgmrlel
+ezensxwulgqdgytdfo[ozlmpzteuyjqrxocn]crruxzecnvrcpjurn
+ycflwfbhueatnpimmkm[tbcsifgtkkwtxosxau]vsnyspuvhhfozxgjbbp[adcyzxtdknieifc]hjkfmbmxkrnksewsqjn
+gffllhgsmlpxkktcq[wjqwhqrwepermblfolw]wzgcjyrpisbwyhnz[yjvzaqjsmdgazjuep]gregropoulmnagcvx[gfjkkejnxmpfbtecy]ufbqwnifaugffsai
+xfrmlrlrhxsownybek[ryhsyltyflhjbmltndc]agtvigglsugquzbc
+rshzvotgovlabfxr[sbuytwdobnvpwcax]bynmysulnnjmhkf
+cevbpuyyvlutjcuutl[pfwloktlqbxfcogrc]dflejqcyvpasjowhsj[nscuwnjsrzehqamogtw]scemydqevrcuvhwxpe
+nsbvubuyjrzsalkdwz[fooatkopdyvkxjgfho]jwojdgxqtlzxgna[vmkwusptfjbgmhq]xkzpfgkklnxunma
+jovdewpqyfouyzpegwg[eigxaawljopqauy]cjvieeexlyiovsugif[wtkkpylnxtqrepkjei]jrdmibhhcftoeauh
+flpwanunpldmcnated[unzsihvveyitclcf]gqxlznjbnpmiojuunu[kxihijtbrbyhkzosvk]xoxdqctctmroxoppilv[equfcbnltdiwdmahu]sxfloedvbznwctnuqt
+wtktlikeigdndpyw[dspimpajtzfzmfya]rmmuigyferofztnuir
+thnfrvngjhjrwdatdc[vwmnddbpbakuapirel]qojpomziuupsfysyfng[gkgjyjoovotmjwwgvrq]xxfsycfupudisdbtk[hnieklknhbwcfka]qbanhtkdijnnfegs
+mazcgrfwolhhbtman[jokgcthhpopluovccrg]eybriinzdwjyfjes
+kwxxubruqgrsifrpuxe[pqjcuxzpykriher]rcjvrturrhxqhjndj[umqwgmhgidzakfnk]nzbbrgxxsmkxahvqzs[rnqcmdjyrldnzrr]nhztvrovbpifyxbcvti
+kgojbczgybkjpoz[nyemqsvkokdfxiata]lrstpiuovispfmuoi[jifgmwihkzirfnblzqu]dixnvdkqejtatylghtd
+owhhzrmvmuosrtiwaf[xvdujvnkkrunymvh]dihbvchdelxcqsmlxe
+atcmrejivvyxxbsexp[cjlvkmfgfjslzeno]liavdjycjpirlux
+snvgwihgkhrsgdzysbh[bbyzthwnbpquvtrmlc]cdwvzdogbisfoopk
+lccrydahkgmzirmjzfv[rkkdtcqmlfkxmke]xkercumbulkzrlgxng[deksxliclevazssc]yhidzcmnbvgacmdv[ucxflzawmxnmpxa]hrfaesdlnukcblbqlm
+jdajqnzqyhcomekhejp[tyrtsgspmlmrbkm]nyfcgbagjplztrigokr[ntzzerjwsgafymxw]ftckmtirxfdfcqpi[pulepgarnqxbvlqmvog]qashqfzwglljzexbnsv
+kjvalulqegxybfhx[djfulullrbsebeknl]bcxpgathyauumxcrsmk
+fihxcyovovcmukir[gucbridfutpdnto]abzjiaponkgoposvhw[vpqwcnzmovnwdwwo]zrkqlpnszeioesnhk
+nyvobmkhkbenucug[dwpifbppiwftzokarg]vxxalauqmooacfmdox[intaxgcpfajzdwmcsk]brknzsnhuukxjuv[fkheyxevpuphuflvzkk]levqirhqhynkthsef
+uwdcywcarjujlnh[qvtowczbkenlghcmara]kfhcbnrkorcoyhkww[mzzwrpwwkrnnfavjxk]hcjjzxeynegdpfwdw
+xtgkbqtzbeptcxndjxl[jzmbcxsmcrtjtqi]wnhqmctldgxjbrtio[brnnosnckhalqzqsyyv]uhungebnygpsmpzmj
+xrqpqqsqazzlqcdglgf[ziiwwokpqiinmqe]stagyposntgyxnh[ubxzaskwfzlfrmw]fimsoerydnghxlg
+bdqtpixvllcdhgfqby[xurgfxznrblksso]wgfyjdmpjqirhiqvgg[pbgnckfbdinlepkb]mqbqboepuqheaop
+xxlhstlmqypoyhb[czlhqkifhucxqanafx]jkaaxiwxrnneudczrtn
+jhcmhtveqenmeczz[rcpnnuwvwiyfjxo]bvtashqfjcnbrqy[ebgihcdcimvgdwochq]pmallgnuofajusz
+ltzknsdqzdmbpxipt[golssizcvkrcmquotrj]nqjkcgdagjqzvri[xzehrntfgcnmgrh]devpsfftuonmevocw
+wgklxpmeoznyxtukh[nevjkmpvlbaulxjieh]wopqaknwlwjquxt[mxzczmngcaxharjipt]tuvwngrmylububv[ryewaqhshtogggdvc]xpkbqydbwshscjcw
+uglrhqngbxqtqmdlyym[ihdwlwfqiwnigvyarcw]miyynkctggbwzfkq[rqycaudamvwoxju]mmnzentjyyddntnpgxf[qjryduwnivawjepknli]toodveiqtzjxjvq
+tkgmnxgifkqzuut[csyogdborjrnygg]rpcbucosajyyyelju[bbujqtlveymlqesvg]wvyfimibeynzhsotymx[tqxldisulrhuckef]kgqjgtaluastnwev
+qifwiunabpnzezlmhh[ffwsncvlqpulttkx]wlwdpgntblnoubom[fksogvukjlzupwetlef]cfszpnemoifasqw[ttmonrrbhknspuqx]htucxamhxsoigvt
+putioshxpafnkcwdejm[dellcuoevwyyhvwurpv]zezpevhlmpzbevln[rigyoryyhoxwlbg]zkdzexpizgsumkuiuy[hycpaavxiqnlngrc]gknnfredhsmpofldn
+eknxasjdtsksamfc[dhtgifeezlgfhlyvfdz]xfttcwzqucrtngdpcmf
+uyiazdptoxzxbzo[bmuglholukatdbf]ascjhcllcatoapyvn[isqfrvbbkzsxixjuqrq]ncwzqqgudgwrtxvzfe[spqvftdlddlfglgg]zrqbukmufumytpc
+czefxpifdsqjjkoxgj[klwshjzagbrgtpiht]xofokkhzlnjplefofcj[xodekgjbgraikdley]dgsrqzqxjxjqftn
+ertbujoaanuvqskr[hsgeexqdgsqfkiunhpa]orgvxylmsdlzeyjzf[mdkgzwdnvtyoogulx]nbapgjckrfxeniiqotx
+wgywdqnvxooqjsefac[qgpmwggewotnmloq]bqdvbzpvqwadroh[bvbsnhmdurzcubvsno]ndwqyjenerqdupuob
+patbwuitsfeqvswby[htsntyfmofqldcbwgv]zolnndvkaimzdmevb[feyvwvkelmujnppg]tjajsdtevgjukkgrwr
+hoznvyznwitnxlvu[kigfxgwcrdmfwgsqnf]lhiqoaqezmswakdcd[gxmjrmvoxkdfmgcpqnn]ditkwvolcazfuxzfroy[qqlbrrwfedrgtrgm]iysjaakrbnqicefqxsr
+ufrkrtywkhfhfah[vufpfwhtxzbdqnraz]kklboeggazttzui
+tplrraxhaaaoczdpg[vzbnososnioajien]dvdckrkfdetoofpi[bywkgphzoglisygthku]gxtnstjmffnepin[evccrlnwjthfxhhqzc]lisguwkfwswblzc
+lyluhnglmfippljtwww[wnkwnwwsasqbrnlo]nilnannzjbpgbjs
+iknqwrvlcztavivxmh[vtfyhjzauqbyjchjt]zxmasnczpxlusknrmtf[yvfnxlrwgfxkdlj]otlivjvbvilezalha
+xbrzzccetyjzrlt[buwwhcatpcchdvhel]wosdwuuzpekifdhhvpy[twwoaezcowxvioqsrrd]uuygkhojhlcofza
+wqeintsbeqzjpuvx[wqlcamjmpbtqqzjcy]czhyqcurqkfnnkoltja[lozjcddygpevnxebmqd]avwqdpfxcrcvmalaczo
+aecvebozlythtcfzt[uisdkrrjeboxpuclbg]sjxcgygpeuirukx[zeoyaxgdyzfkprewiyc]rdlnzpbwgztivpdon[sfcqbpfgffkchksmfjp]yfgrlxiixyurxupuoij
+vnglyokdpxlgphpw[bjnaqkjojazyryswr]bekdduuwrqabarzwzh
+fcggyliuipcvnimphib[adkvjaembjcqbcc]envpiocijefswhv
+pgraswoweceiftu[khhpmbjghxgmhsud]axqjkekmecwunefk[pvelpeorryjcstk]lruensapttjtyxnr
+jomdrazkwryxuyc[qolcqhwdidalguboza]fcofbrgowezhbyqckrw[wurpvelnhdewfoita]swxwyfynaymvrhleuj[icdlergnbqmowlxjl]vxcwgvrvpdejoybt
+axbedlkxkmbvwacv[uabrmhoepcgtsdmjjzy]iqqpitszpejeeophjmv
+gmltcuvpeuofwteput[eyxdpnceufobjelir]hvajyjjzgkyrtgvrfs
+sfyyzksaymsvykmr[xjewfmfhhbrmwzf]cbzjmltnzvcodwtytbz[ewgckbdvfnkkyxyj]dfcrjyoakdyggbsxm
+wxjalqmicwmwkzakcy[mothnmmvgypeacecvz]hbjasxlsbbgxpfdptk
+qtsgwqpihqjgmjadkjz[skpdhegagxxbmayy]eaojrccgpxovqpi[ixyljrfgswullqnbzdz]etvomvkwpzpxxcj
+mbnifyngahvfhtfhql[azcbyxkvcnoatuo]scgddcntikvavaseu
+uciiofzqjkhndnzx[hoyxdxfahorycpfcofk]epeazzccheaegyobu[sculkaizijfqcrpjl]nrvfdtpvgoqioomvmv[axmvmzytxnbfcsjf]fccriiwmdaveeyamwp
+sxizvuhprsyyxgfqgqx[zwszjxransryibshzw]ikquiagnkoqexlsqypb[zpuqrhaqvkuvhiqk]pvuqiqxpjtsyqgcyr
+svjudmyxlshxbbvawl[inswkufalzfwoumcv]hrobewddabqsiuej[ulhptknpxcwqxjxanjd]osfyeygptwfjmvrma[pnuynwtwuulsizw]srhurplerqabvouelhn
+islwmbcjeljkceppiw[whvcrbqzgtcfbcuv]tcyzkgyzdaekgnzzmz[ddefwmnklcddlhow]npzbtwmzmhjtzljnr
+lgdjrkugqewlqxvn[wtvrzflzauwcxkyp]qbswluceqlesdfwy[kbtmzcvoubbiqfc]honrvxwcqsgphvkt[djuuancygxacmka]knseftjiunzuxdi
+miapzpluxnmdfvi[edlbwflzitzghywio]vizzhfxgilwpwhr[ochurvodstmhiypp]rycvogpcnysngytixb[mqnrhpbvojfefcicx]zxqxoinunlkjvetkvrv
+spsecopdywuheqbnm[npwovcwlwooxqhyp]hkuizzsdvysvhvmlc
+oqchahhsrywoeteaeg[ucowjiwrzkfhyebbco]efxdrribepcvduwjgf[nvyogembujkkmcm]kmfrlcaeawrvofxrim[izjebqewubrbvguzk]ngmugyprdvrbqskn
+vwlikshqcpgxqvqshv[izqveivxdxgytqgdk]abnvmprwbvwmrwlkkp[iffpegqsxjwfyvixtwk]iseiapjkgnkcepr[gtfhysdedzxwrhcgt]ktaeihyqegeozdfuz
+aieqqwhwfwxpldni[huyxdcvpglqqkeyeia]teztoyeycqohfli[uqvfjzbsvttphqxsy]afsxoqbqvtxtgriuzjm[psumrbbtxdxlwpk]qwpuwevhjellemzp
+surpbndlvplunisu[alnojwsmgbtaomke]zjyikoebzazpwql[lkgsnxodocsrniokroa]mrcipdncevvazafvkb
+dkszjaqhbkyxwvwj[wykmzcvppharrax]pvrqzqhabqtuhrj[qfxnormttaxsldn]kxjwkrjwvbiutgnfnw[mbspfflblosguqzt]nifozavfsfkngds
+uwafdvptgkfikprb[xhmrwxqxnbkfpdz]efhnfwvovbvglrrt
+kozevksryerpsrgmub[dbtinyialvlkgilue]pyqdyodlttsnrsmfvca
+mgfmdcxibcgzhrfmm[mzvyabccrdzlaiij]arnetejwseofkwqvxi[fylixbrjhxdfhiewbnb]wvndnswxdnbcktp[tetomqdkfmcndddruy]biuxgrvctlbbrqmxjp
+snjnfgbtgpkouxlpd[vapbqurlxyrduxqy]meyhgdsbvkdadsfozf
+fgknedldithvaoxqpl[mihhhdrtpjmoridqamt]vfupazymsipoana[ngqkziyavxkyukp]qqysmfkyaxbuytr
+fugbgojgdeavlmrut[zpukymkjkapibmhg]mmdesmcwbhlfugkdiz
+lhhhlyioiiknkray[omilmxkodlmvzhkgbaf]cyftkgjpvjvdnortlj[ifljdtkgscmnmxsq]nxtettqnuaotfsh
+whayrxopbtvnpobokn[jfbobalkbfjxcsn]jjucgwedwbcfrdginaf[atdoatealbqhiks]alzapbxuvmivqfgpg[qhzdwsbvcbtlpchem]pxxskedydgisthkatn
+xzreuonsdqobzpxr[zamxighfvnaxqum]olbigclentyvugtuvg[ysrgcksohtkvcqmksqr]gnaqqezdmnfbbnir
+gmmabzkwsehkwjnevvd[uuzdntitdazeykwek]aebpajrwpyknqgx[kczhcuveeawmdiwljzl]ugwigmilwkczrcqnfo[piezzmfwnfdhnlbranp]qhremthdwdegacvptfe
+tcqhlxasqmbwzuiuirp[kfqoequocdsfwqt]ikhdkpkmeezfzfyyilf[lrorfowgsqkflwauhu]zshoiccvfwohudsmdcr[zohspdmqcdvgagdknr]zabaqgsmrwkrtcuyct
+fzanofpykognmio[ladtxyissyfrssobo]xqpwrgdmglgqhwawqok
+hynipihszohrqwaezga[iqtpgjpngbwhpailzg]wfgimkpjrjnkroueh
+lpmrkesaqdojkqrp[dcgsayoowgpiwam]arphrffqpcdntlxsza[ogneaqyckrvdcvqxbm]xlogrojsovrzfzjtjbd[qjoiyyatxkwsrvldp]gffgmieinxlfzpiej
+jaeayfunulncspts[stghconfjhkqkrxncwi]kcnaqhyukuirsaeebp[vynwfnoxxxbqztj]gddvegwjuryfnkgkpqq[jnhmbdpvsxreqhoek]pgpikslhvbnmbxbkbc
+lajiqiaxcxgpvsbu[bfetstragmoosbw]hzurjpxhecnadwosn[dquibbrojgurqiqd]aceccsnyrnfmcsd[quqxmzleqvspvsemjpn]noxrndgdrkffsdvh
+bytcvwxuavajevmde[nhmjatzolmbdfgogup]qpildujniqlnfbmuf[gxpgorlbxpqfsoreuey]hcfyjmkoywueuivrio
+amvudustnspjqsbpjp[wdudhbvvlgzbbbwlafg]kwpyjvuerzyzmzft
+vwpklmfpzssyoifbb[bwtpxodxedpdsvgu]azathmhdnqkhbmrdlxn
+iwzncixpjxypnmykke[wlhvfjbumhmtachoab]wtftbolwhpwnropnzv[zhfcmkbwizknymev]twrumqadwvsaciwbwoi[evodjtvrucrzgtwio]fmmbddkwwpaziycik
+dkodbaotlfdaphwzbcc[ldzeemqiovyqjgs]qxibabdusgaistkru[usglloxgycyynmp]aaocvclsocababbzxeg[liaacgfxytuqudp]jvvqsypuoduyhvraak
+bwzsacxgqkbjycgfw[dbnligvrmqscasutn]rbgybqqsgjvlonkut
diff --git a/2016/aoc7/src/main.rs b/2016/aoc7/src/main.rs
new file mode 100644
index 0000000..254f23d
--- /dev/null
+++ b/2016/aoc7/src/main.rs
@@ -0,0 +1,95 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+fn main() {
+ let lines = read_file();
+ let mut ssl_count = 0;
+ for line in lines {
+ let mut in_squares = false;
+ let mut char_buffer = [' '; 3];
+
+ let mut abas = Vec::new();
+ let mut babs = Vec::new();
+
+ let mut chars = line.chars();
+ char_buffer[0] = chars.next().unwrap();
+ char_buffer[1] = chars.next().unwrap();
+ char_buffer[2] = chars.next().unwrap();
+ if is_aba(char_buffer) {
+ if in_squares {
+ babs.push(char_buffer);
+ } else {
+ abas.push(char_buffer);
+ }
+ }
+
+ for c in chars {
+ match c {
+ '[' => {in_squares = true;},
+ ']' => {in_squares = false;},
+ _ => {}
+ }
+ char_buffer[0] = char_buffer[1];
+ char_buffer[1] = char_buffer[2];
+ char_buffer[2] = c;
+
+ if is_aba(char_buffer) {
+ if in_squares {
+ babs.push(char_buffer);
+ } else {
+ abas.push(char_buffer);
+ }
+ }
+ }
+
+ //println!("ABA {:?}", abas);
+ //println!("BAB {:?}", babs);
+
+ let mut is_ssl = false;
+ for aba in &abas {
+ for bab in &babs {
+ is_ssl = is_ssl || correspond(aba.clone(), bab.clone());
+ }
+ }
+
+ //println!("Is SSL? {}", is_ssl);
+
+ if is_ssl {
+ ssl_count += 1;
+ }
+ }
+ println!("SSL_count: {}", ssl_count);
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
+
+fn is_abba(char_buffer: [char; 4]) -> bool {
+ char_buffer[0] != char_buffer[1] &&
+ char_buffer[0] == char_buffer[3] &&
+ char_buffer[1] == char_buffer[2] &&
+ char_buffer[0] != ']' &&
+ char_buffer[1] != ']' &&
+ char_buffer[0] != '[' &&
+ char_buffer[1] != '['
+}
+
+fn is_aba(char_buffer: [char; 3]) -> bool {
+ char_buffer[0] != char_buffer[1] &&
+ char_buffer[0] == char_buffer[2] &&
+ char_buffer[0] != ']' &&
+ char_buffer[1] != ']' &&
+ char_buffer[0] != '[' &&
+ char_buffer[1] != '['
+}
+
+fn correspond(aba: [char; 3], bab: [char; 3]) -> bool {
+ //assumes both follow the aba pattern, so [0] == [2]
+ aba[0] == bab[1] && aba[1] == bab[0]
+}
diff --git a/2016/aoc7/test_input.txt b/2016/aoc7/test_input.txt
new file mode 100644
index 0000000..a675097
--- /dev/null
+++ b/2016/aoc7/test_input.txt
@@ -0,0 +1,4 @@
+aba[bab]xyz
+xyx[xyx]xyx
+aaa[kek]eke
+zazbz[bzb]cdb
diff --git a/2016/aoc8/Cargo.lock b/2016/aoc8/Cargo.lock
new file mode 100644
index 0000000..dd33856
--- /dev/null
+++ b/2016/aoc8/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc8"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc8/Cargo.toml b/2016/aoc8/Cargo.toml
new file mode 100644
index 0000000..c49deb6
--- /dev/null
+++ b/2016/aoc8/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc8"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc8/input.txt b/2016/aoc8/input.txt
new file mode 100644
index 0000000..d827762
--- /dev/null
+++ b/2016/aoc8/input.txt
@@ -0,0 +1,194 @@
+rect 1x1
+rotate row y=0 by 7
+rect 1x1
+rotate row y=0 by 5
+rect 1x1
+rotate row y=0 by 5
+rect 1x1
+rotate row y=0 by 2
+rect 1x1
+rotate row y=0 by 3
+rect 1x1
+rotate row y=0 by 5
+rect 1x1
+rotate row y=0 by 3
+rect 1x1
+rotate row y=0 by 2
+rect 1x1
+rotate row y=0 by 3
+rect 2x1
+rotate row y=0 by 7
+rect 6x1
+rotate row y=0 by 3
+rect 2x1
+rotate row y=0 by 2
+rect 1x2
+rotate row y=1 by 10
+rotate row y=0 by 3
+rotate column x=0 by 1
+rect 2x1
+rotate column x=20 by 1
+rotate column x=15 by 1
+rotate column x=5 by 1
+rotate row y=1 by 5
+rotate row y=0 by 2
+rect 1x2
+rotate row y=0 by 5
+rotate column x=0 by 1
+rect 4x1
+rotate row y=2 by 15
+rotate row y=0 by 5
+rotate column x=0 by 1
+rect 4x1
+rotate row y=2 by 5
+rotate row y=0 by 5
+rotate column x=0 by 1
+rect 4x1
+rotate row y=2 by 10
+rotate row y=0 by 10
+rotate column x=8 by 1
+rotate column x=5 by 1
+rotate column x=0 by 1
+rect 9x1
+rotate column x=27 by 1
+rotate row y=0 by 5
+rotate column x=0 by 1
+rect 4x1
+rotate column x=42 by 1
+rotate column x=40 by 1
+rotate column x=22 by 1
+rotate column x=17 by 1
+rotate column x=12 by 1
+rotate column x=7 by 1
+rotate column x=2 by 1
+rotate row y=3 by 10
+rotate row y=2 by 5
+rotate row y=1 by 3
+rotate row y=0 by 10
+rect 1x4
+rotate column x=37 by 2
+rotate row y=3 by 18
+rotate row y=2 by 30
+rotate row y=1 by 7
+rotate row y=0 by 2
+rotate column x=13 by 3
+rotate column x=12 by 1
+rotate column x=10 by 1
+rotate column x=7 by 1
+rotate column x=6 by 3
+rotate column x=5 by 1
+rotate column x=3 by 3
+rotate column x=2 by 1
+rotate column x=0 by 1
+rect 14x1
+rotate column x=38 by 3
+rotate row y=3 by 12
+rotate row y=2 by 10
+rotate row y=0 by 10
+rotate column x=7 by 1
+rotate column x=5 by 1
+rotate column x=2 by 1
+rotate column x=0 by 1
+rect 9x1
+rotate row y=4 by 20
+rotate row y=3 by 25
+rotate row y=2 by 10
+rotate row y=0 by 15
+rotate column x=12 by 1
+rotate column x=10 by 1
+rotate column x=8 by 3
+rotate column x=7 by 1
+rotate column x=5 by 1
+rotate column x=3 by 3
+rotate column x=2 by 1
+rotate column x=0 by 1
+rect 14x1
+rotate column x=34 by 1
+rotate row y=1 by 45
+rotate column x=47 by 1
+rotate column x=42 by 1
+rotate column x=19 by 1
+rotate column x=9 by 2
+rotate row y=4 by 7
+rotate row y=3 by 20
+rotate row y=0 by 7
+rotate column x=5 by 1
+rotate column x=3 by 1
+rotate column x=2 by 1
+rotate column x=0 by 1
+rect 6x1
+rotate row y=4 by 8
+rotate row y=3 by 5
+rotate row y=1 by 5
+rotate column x=5 by 1
+rotate column x=4 by 1
+rotate column x=3 by 2
+rotate column x=2 by 1
+rotate column x=1 by 3
+rotate column x=0 by 1
+rect 6x1
+rotate column x=36 by 3
+rotate column x=25 by 3
+rotate column x=18 by 3
+rotate column x=11 by 3
+rotate column x=3 by 4
+rotate row y=4 by 5
+rotate row y=3 by 5
+rotate row y=2 by 8
+rotate row y=1 by 8
+rotate row y=0 by 3
+rotate column x=3 by 4
+rotate column x=0 by 4
+rect 4x4
+rotate row y=4 by 10
+rotate row y=3 by 20
+rotate row y=1 by 10
+rotate row y=0 by 10
+rotate column x=8 by 1
+rotate column x=7 by 1
+rotate column x=6 by 1
+rotate column x=5 by 1
+rotate column x=3 by 1
+rotate column x=2 by 1
+rotate column x=1 by 1
+rotate column x=0 by 1
+rect 9x1
+rotate row y=0 by 40
+rotate column x=44 by 1
+rotate column x=35 by 5
+rotate column x=18 by 5
+rotate column x=15 by 3
+rotate column x=10 by 5
+rotate row y=5 by 15
+rotate row y=4 by 10
+rotate row y=3 by 40
+rotate row y=2 by 20
+rotate row y=1 by 45
+rotate row y=0 by 35
+rotate column x=48 by 1
+rotate column x=47 by 5
+rotate column x=46 by 5
+rotate column x=45 by 1
+rotate column x=43 by 1
+rotate column x=40 by 1
+rotate column x=38 by 2
+rotate column x=37 by 3
+rotate column x=36 by 2
+rotate column x=32 by 2
+rotate column x=31 by 2
+rotate column x=28 by 1
+rotate column x=23 by 3
+rotate column x=22 by 3
+rotate column x=21 by 5
+rotate column x=20 by 1
+rotate column x=18 by 1
+rotate column x=17 by 3
+rotate column x=13 by 1
+rotate column x=10 by 1
+rotate column x=8 by 1
+rotate column x=7 by 5
+rotate column x=6 by 5
+rotate column x=5 by 1
+rotate column x=3 by 5
+rotate column x=2 by 5
+rotate column x=1 by 5
diff --git a/2016/aoc8/src/main.rs b/2016/aoc8/src/main.rs
new file mode 100644
index 0000000..cb783ae
--- /dev/null
+++ b/2016/aoc8/src/main.rs
@@ -0,0 +1,117 @@
+extern crate regex;
+use regex::Regex;
+
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+
+struct Screen {
+ data: [[bool; 6]; 50]
+}
+
+impl Screen {
+ fn new() -> Screen {
+ Screen {
+ data: [[false; 6]; 50]
+ }
+ }
+
+ fn rect(&mut self, a: usize, b: usize) {
+ for x in 0..a {
+ for y in 0..b {
+ self.data[x][y] = true;
+ }
+ }
+ }
+
+ fn rotate_row(&mut self, y: usize, b: usize) {
+ let mut row_copy = [false; 50];
+ for x in 0..50 {
+ row_copy[x] = self.data[x][y];
+ }
+ for x in 0..50 {
+ self.data[x][y] = row_copy[(x+50-b)%50];
+ }
+ }
+
+ fn rotate_col(&mut self, x: usize, b: usize) {
+ let mut col_copy = [false; 6];
+ for y in 0..6 {
+ col_copy[y] = self.data[x][y];
+ }
+ for y in 0..6 {
+ self.data[x][y] = col_copy[(y+6-b)%6];
+ }
+ }
+
+ fn print(&self) {
+ for y in 0..6 {
+ for x in 0..50 {
+ print!("{}", if self.data[x][y] {'#'} else {'.'});
+ }
+ println!("");
+ }
+ }
+
+ fn count_on(&self) -> u32 {
+ let mut count = 0;
+ for y in 0..6 {
+ for x in 0..50 {
+ if self.data[x][y] {
+ count += 1;
+ }
+ }
+ }
+ count
+ }
+}
+
+
+fn main() {
+ let lines = read_file();
+ let mut screen = Screen::new();
+ for line in lines {
+ if line.starts_with("rect") {
+ //rect 3x4
+ let re = Regex::new(r"rect (\d+)x(\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as RECT. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rect(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+
+ }
+ else if line.starts_with("rotate row") {
+ //rotate row y=0 by 4
+ let re = Regex::new(r"rotate row y=(\d+) by (\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as ROTATE ROW. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rotate_row(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+ }
+ else if line.starts_with("rotate column") {
+ //rotate column x=1 by 1
+ let re = Regex::new(r"rotate column x=(\d+) by (\d+)").unwrap();
+ let cap = re.captures(line.as_ref()).unwrap();
+ println!("{} parsed as ROTATE COLUMN. A={}, B={}",
+ line,
+ cap.at(1).unwrap_or(""), cap.at(2).unwrap_or(""));
+ screen.rotate_col(cap.at(1).unwrap().parse().unwrap(), cap.at(2).unwrap().parse().unwrap());
+
+ }
+
+ screen.print();
+ }
+
+ println!("On: {}", screen.count_on());
+}
+
+fn read_file() -> Vec<String> {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .collect()
+}
diff --git a/2016/aoc9/Cargo.lock b/2016/aoc9/Cargo.lock
new file mode 100644
index 0000000..00bd2f7
--- /dev/null
+++ b/2016/aoc9/Cargo.lock
@@ -0,0 +1,98 @@
+[root]
+name = "aoc9"
+version = "0.1.0"
+dependencies = [
+ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
+"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
diff --git a/2016/aoc9/Cargo.toml b/2016/aoc9/Cargo.toml
new file mode 100644
index 0000000..de293f1
--- /dev/null
+++ b/2016/aoc9/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "aoc9"
+version = "0.1.0"
+authors = ["Justin Worthe <justin.worthe@entelect.co.za>"]
+
+[dependencies]
+regex = "0.1" \ No newline at end of file
diff --git a/2016/aoc9/input.txt b/2016/aoc9/input.txt
new file mode 100644
index 0000000..6692559
--- /dev/null
+++ b/2016/aoc9/input.txt
@@ -0,0 +1 @@
+(6x6)AFPLBX(2x3)ZE(53x13)(4x7)ZGQO(2x4)NJ(1x8)M(24x11)(18x7)HMLOASMJNGZHMCEVEX(11x2)(6x6)TRDPQX(157x12)(60x12)(2x3)SB(7x1)FBSAUFK(4x1)NMZK(10x2)RLIIHFEKRY(10x6)GMDUIQDOZJ(71x8)(1x11)N(19x5)EHNAZSRTFYXOZNFTOOQ(6x4)XKARLK(13x1)IRATYZQMJXHAH(4x8)VFUJ(8x6)AOOEHHBF(27x6)(11x9)(5x15)KTTHB(5x6)AELEZ(17x10)AOGNMNTGDJDYEMMEH(7x8)BOIOHRF(6x2)ZKXONV(172x8)(6x5)(1x8)V(17x6)WEVFHKUDETBOZVKIO(2x14)ZI(75x9)(5x5)EXKDZ(4x4)BOGK(10x5)SXYSSOACJR(3x15)FHO(24x10)YBZPMZIPUCEIYNGYAUPVFOKB(43x3)(13x2)MERJWKSXBIEKP(2x4)CR(4x5)DFDQ(2x15)ZM(89x5)(43x6)(16x8)RIGCVPPOSBRJSJCB(2x9)XI(1x11)M(2x8)QT(8x6)(3x8)XVC(20x15)SBWQFWQWPQHXZXDWSXIR(4393x15)(25x5)TEAACSAHWYWPYJZEPDIHUMIPB(1026x1)(1x7)K(768x7)(388x3)(113x9)(70x11)(12x10)HDEPKSMDLHAX(2x5)RU(29x13)BIOENKVYNENIFNCSWNZIJGCZXBUVF(3x1)JRO(30x2)(11x9)NCTAXULXPBY(1x5)K(2x7)WQ(76x10)(13x7)UDCLRUKNLOAEL(17x10)(11x8)TLRICJOXJPO(26x13)HBPYKHNJRGJHSXUFGJAAHODUDG(177x13)(58x14)(17x15)MWIVHZEKJKLDWPYEN(7x5)MLNEAXO(1x2)F(10x2)GMUPKWMFFU(51x13)(2x12)TG(29x1)CJZOBLWTYDISRYKVWHJKRDDNHSABE(3x5)VDV(36x7)(7x2)JOQSKQM(10x4)SSQKRCQCYQ(3x3)HRU(7x6)(2x7)CG(271x13)(14x12)TPDOYGCYWKAOQU(223x5)(15x1)WKAGRMIPECLUUPH(68x2)(10x15)VRFPOQRGAW(5x6)MEVXZ(11x13)INACCUVBTIP(1x12)M(10x5)ECIALUKBGQ(29x5)LDVPFVNKSBWVZCJUOLIJZHYNOXLHZ(42x9)(11x14)HKDQCRYGEWD(3x5)DDV(10x8)KRRTDJEMKB(39x8)(13x8)IWLYAVYPLTFBF(14x8)PMPTEZESXEQSYM(13x12)SYBXETSKQLUYU(12x5)(7x3)(2x4)FH(69x10)(63x7)(6x4)RVKPXJ(46x1)(19x14)YCVJOBRSCSVKJJWUBJI(4x6)VUOI(5x15)WIFPK(237x15)(230x7)(51x15)(45x5)(9x11)BUZLRCBIY(2x5)ZZ(8x6)DNEOUHUT(5x2)QFOTV(164x11)(30x14)YOCHTVEXSZYELWOMGCXOISALUWCWTJ(8x15)QIINZKAI(1x1)F(88x5)(8x1)SIZRWUDB(49x7)AWSFCZFEGKBUKONNMQQSIGHMKQFAMUEBLTQFGEZLMUTNWXOCH(1x12)T(8x7)ZOTXRWXA(7x15)HGGWNTM(1484x6)(691x6)(53x6)(2x14)IB(39x3)ASFVSLNNXYBFSSOPECXZOEVPRIGJCTMLWCFSVTZ(72x4)(66x1)(38x7)(17x7)DXTENHWTOXYZMQFLF(2x2)OG(3x6)ATG(16x1)IBSUFIGHTLDMGRZE(9x5)DKNZYEYGJ(288x11)(165x9)(16x4)MDBGELYWXPUTRCEZ(14x14)PHSIPUMMXOMBWF(57x9)(13x13)WIVFVHXPHBTWO(4x6)XSWT(9x5)CPSCDHORP(1x2)M(3x8)JJE(12x4)ZADOSQULBZRT(34x10)EUJRPXWESNMXYDAUHFPLCLOYZCUKOSDPTZ(108x12)(10x13)CJVGTNJFUE(37x10)LDQKJRVQQKTVRBMNRIFDMZBJOQZKJSBZPWWLQ(24x5)FXOCHIJNODJUEGYPZYTIADPF(11x4)FUNCENOZTTS(237x7)(106x6)(9x6)SBSWNIMDC(58x11)(6x8)VJZVTK(5x2)QRAXJ(3x2)KAC(9x11)EWJHYTQXW(9x2)TSWWFYDYC(21x2)EXPZWOLLWOALTQGUZXTUS(117x2)(6x8)TLGPET(3x7)GBW(39x6)(32x10)VGSULYHYHHFVDEIQYAXVUGNDVDCDGANM(46x13)(14x6)VYXTECTXLBJFWZ(12x6)IFRBYZIXFTOC(2x14)HF(14x7)(8x10)AFPWFLXJ(726x6)(160x5)(45x13)(1x4)K(8x2)(2x14)WF(19x11)EDIZTWWQBGFLFXEWHFA(17x10)WIGPDKRTBSOJTFXKY(15x2)ADLZSCNVATBMRBV(34x12)IVGRGESBMMRDBWKCIDCLYWVXANHCWQQEQL(15x12)WGFAYDKOFYOZWHU(464x6)(42x14)(35x12)(5x12)TVUTT(2x13)RK(2x10)RC(3x1)LXD(20x1)(14x6)OJOAQUIEOIUVXE(152x6)(16x1)IIDXUSCZEOEHDVIP(98x6)(18x4)AFGQQZEGERPRXYXDTI(15x13)UPZDHXFYQRGBNBZ(45x10)GEJVEKLGJBCATXONOSOJWLLZESRRGSLNTRDKDKJKNAOYC(20x4)SHUJGLTDVLVMUBGUYCCQ(202x2)(29x4)(23x9)ZNKNMTBUBYEMBVCDGNHMZRB(123x6)(8x8)QCPLTVYD(2x5)YQ(13x3)XFKTLSHCQAPID(30x1)DRTIAMQDRSIQQIZKAXMVZDLCRHYVWS(41x11)SLVGMXLAUIETLVILQABUODBTBFZZHOSFRUJKLQPSE(21x8)(4x9)EXQY(6x13)QAFDCI(4x10)XYII(15x5)VZTRXIMIYNGDQKZ(75x4)(6x11)RFOKPH(2x15)ZH(10x15)ZDWQPCMXCQ(32x7)DJRJDFDSGKZBQZMNIKCOLHWSLYCQXEKH(1x14)H(27x2)(21x3)GCUQEXKSVPNXNOTUOZBWR(1828x7)(1107x13)(550x1)(177x11)(30x15)(1x13)T(3x1)MTN(9x14)EDQQAMGTE(39x4)(14x2)NPINNXFQEZICDQ(13x3)QYHEGLYNFPMMQ(88x13)(22x13)GLVPCEBDDABCPDHXXXZDTT(1x3)A(1x3)J(40x14)LPRDKSIGCUXWPZIPZKUGMNGLLGQHFDNXLHRNVPEM(14x7)TPYKUDKFRLVPPF(135x10)(10x7)GWRRITBPFN(5x5)ECPKJ(50x6)(4x10)DORU(1x12)S(9x3)YQFICKCXH(7x3)ZJFMLPD(2x9)HK(3x7)HWQ(39x6)NPYOZFXSQJMVHMGSMHMKBOQLXAUVSZZRUGFOIUL(122x13)(7x5)WQPCNYP(35x14)(21x4)UIBUUSAWFXCJOAAOQYWKD(3x3)VKI(17x11)YCWPDYLDDKIDATXKY(38x4)(4x2)FPPY(16x8)ETEICDHDZBPINNTA(2x4)RR(66x3)(59x15)(9x10)WLRKNQFPX(4x3)OCJF(8x1)QSOOLMPP(4x6)DKRV(8x5)PBRRNJTD(377x10)(88x7)(81x11)(17x8)RPFNVFZNWFZCEDXYR(3x3)DMM(6x1)ZOBJHV(1x10)S(26x3)MLOILGCEQPKNQPYBABPWRMGTCU(13x2)KNRNZAANDYZVG(2x15)UR(1x5)Y(242x12)(144x11)(8x6)HUOOXYEN(35x2)HGPTAFHSMKKPDMGARWVNYVCJWMZETRIJNXM(4x4)TJDP(28x5)UKOZMKRXJLSBZJRRVABSWSIEIDMC(40x14)HCTILCVYQXWNUZHZAZGCXKXRZDHFNTKISPMUOLAD(8x6)(3x9)NXB(44x15)(3x13)GZF(9x7)XCHQMMOXC(2x8)EO(8x12)GTHAWKXZ(3x4)TFJ(12x7)JOAKSXHVNNNX(157x14)(150x8)(11x13)(5x15)GVWWA(125x1)(14x12)OALPJNHTLRQGRJ(24x15)EEWRKUJFKQFVCFVVGRNXRNMO(23x12)SWMZOIWGOVLKIRKBHSIAYFY(16x6)VQBYRVNJQKQZUXYC(15x8)SRQFUMLAWWDVVCY(166x3)(8x4)ROOZHNPS(1x5)G(140x3)(5x11)NNJCA(122x8)(12x10)ACNODOEIPNFS(36x7)(2x3)HI(9x12)WVTUTLVXH(1x14)L(1x11)R(28x13)TFKQTKVMFXBNHUCUGXXBKSPBSYOI(2x8)RL(13x5)(8x5)BMGHNIWS(80x2)(4x5)CLIN(64x13)(12x7)PUIYXOSOYXRH(23x9)(1x14)J(1x10)L(3x12)BRJ(11x3)(5x12)LIYCT(446x9)(1x14)A(128x1)(86x9)(15x1)XKXMQLFUXTGSIUI(36x8)UUZAZBICEWZOHBKMLKFMOPRGDNIIXYZIRYBO(16x10)(3x1)DCZ(2x10)RG(15x1)TVCSLSBSQOEZORE(9x12)(4x5)FOWX(67x7)(27x3)(20x11)QHEAAUEGZRHVTYXMHWGD(27x14)(1x6)C(14x15)EHUGFRTEFCLPYB(223x13)(192x1)(27x13)(8x1)ECDZKCJY(8x12)HNTSWDYP(14x1)SMPGAHCDMTHRPF(43x6)(2x9)QY(3x1)NGD(7x11)QBFWGLX(3x4)JCI(1x10)L(31x2)(3x10)NIH(16x2)SFTKKDPDSTPUVOQA(46x3)(1x11)N(19x13)RGTNKUTACWUHOBKHPAF(2x9)JH(1x5)D(18x5)ELEQYVKHCZWCPDKGET(4430x14)(6x6)SGLJXG(1303x14)(8x3)PBGTOJDF(472x9)(1x14)U(299x2)(71x12)(2x14)UZ(13x11)(7x13)OYMYFOR(22x12)MLXGMMRGPSASXFVDRWWYGU(9x5)(3x14)NFY(96x1)(22x8)XALEFGLORBLTMHIWSARRDS(24x12)(17x14)QARJVLVCJVIJEJOLE(8x13)(3x8)HPO(16x14)UMCNXKMHFCKLLSTQ(96x11)(3x8)IYF(82x5)(3x1)OBQ(30x14)UJYENTNVNGKUFYSGTPROKDUVXVAAAP(18x14)OFJNLBOUNGILMQMTBO(7x2)UJJJZAX(3x2)JTL(2x10)YM(112x1)(83x7)(50x6)(4x11)TSPK(2x2)AU(6x15)XSSYWL(3x12)DCS(6x13)OIDFMJ(1x14)N(13x12)EEZZPERSDPKOT(17x7)SBEJBRDQAVFLLCNUW(3x11)ZGN(25x3)(18x15)CSVBGEAPPCXHRXBYIK(1x4)M(664x4)(337x14)(99x5)(12x11)QQXQUTFBUNIV(7x7)ALTZFYQ(15x4)VBFROTJMHRPGBJW(40x12)(23x8)UTBYEFQMPFIEXVVLZXVDWWJ(6x2)BMJTZF(4x3)NRUY(6x12)TKXPAM(62x6)(3x15)RQS(1x5)K(41x8)(12x9)NJRYDQRLHCNB(17x7)AEPPXIYSGQCVSPVMF(135x14)(72x7)(2x9)FB(4x10)OGAV(26x6)QXHCWFQUDQKXVJJGIZDZLTBIKY(3x10)CXD(9x5)IDBZUGYPE(14x2)KYYCJLAYHWQQVD(30x13)(7x11)YXUUJZQ(11x3)YRHZXTLPZJF(311x14)(49x6)(42x12)BLCUHNHXNFKMUKOHBMVPXMURVUESFYMANQKXIQEVOG(79x1)(73x8)(5x3)JGNSI(20x11)DVUPOLXLRCUFVJYHXWJV(15x2)OPIKHDJPHQPXYYX(9x10)FWYSCUOMU(164x1)(91x13)(6x13)UPDAGP(14x5)LIKFHUVDMDQAAK(31x13)FEJFKXKSSAJYNJAKXKRQPUZMHNTBTGI(7x7)OLHMUKA(4x7)EGNE(59x12)(4x7)JSRJ(4x7)JCES(15x6)QTFXSXGYBARIWUP(8x6)LQDBINXU(1x12)H(127x1)(12x5)RHGPFMZRPSFB(4x11)URMZ(93x2)(87x7)(75x9)(11x14)NXGIGQVUUMV(1x6)N(38x3)IUHTFEASJJFMMTHJFEQAAYMSIUUGNMTUUQSOCN(2x7)CN(1x8)B(894x11)(876x12)(587x11)(2x10)BQ(178x12)(96x3)(14x14)BLIWCROJXSLVTK(8x15)KIYKJSRQ(54x15)KTAQJDJHFWAVGGYOZUWYLIBCBQIXHICNALPOGMROGJLDFEAYDTVTNR(2x6)NS(11x1)JKXMXJTBIDP(29x4)(7x13)EBVJEZD(10x3)XRDYMAZSBY(10x10)OIRMTHQLNG(132x2)(31x11)YAGJSHBUQNJREUVAPLXJGSPVFNQVGBD(54x12)(1x12)Y(5x6)UPPMP(9x7)HAVOGCOLF(10x6)TUKIFLCHLV(2x1)YJ(2x11)JJ(19x9)(1x5)M(8x4)UEZWDQZC(45x4)(39x9)(6x9)UWXBMZ(2x12)JJ(3x2)KDB(7x7)FLZMQSC(196x9)(26x7)YUUQIHKCXYRRGSMXGLWMSSAIAP(1x2)W(3x5)XGY(115x5)(8x13)YUGCSANY(10x12)ZVBPLBCJQK(9x7)RGODHRSNC(54x13)KFVTGSWIAKERKDISXRYZDZJEPXSKGAVZKGIKWRSSOTYSYRPEBHOWRC(4x5)PSBS(21x10)(5x7)PKBSK(6x1)CISVQM(241x6)(39x5)(32x14)XIRRYTZBERAKPMGIMOLYNEODGWELVAJP(113x15)(5x10)USAHI(2x13)ZP(88x4)(12x9)WBDEFGCZAMPM(8x11)DZMSAIVZ(3x15)XCK(23x5)LUKNXCCEPEPKSODMGEZJDYY(11x12)CJTACNNPKPZ(61x12)(3x7)YRN(30x7)GCJRMCZOJFMKFZJAJTZOMYXNWIFVSE(11x3)(5x13)BZFIF(2x2)GO(2x15)EM(18x10)YIGMSZEGBPPIMGKUHO(4x14)FUKK(1851x10)(164x11)(117x3)(109x10)(56x15)(3x13)MSN(11x15)VPUOKCEWGFX(7x7)UKXWCWX(2x11)QB(3x13)QFE(12x13)(7x1)WTMANLW(21x5)SDTRPSRMRYUZKIZIMCYLO(33x11)(16x4)(4x8)ASQN(1x10)M(6x1)(1x5)F(1006x3)(21x13)(15x4)WHEZYMBJXTBYCZG(462x9)(227x1)(33x11)(2x10)VR(11x8)PLIFVKRPUWO(3x1)WFI(53x4)(5x11)GUHAR(9x6)OTBCHHMTJ(4x7)JJQH(5x8)TTUUW(4x6)GRAX(1x10)I(27x14)(12x9)TPXYVLAYHHUB(4x3)WNYV(81x3)(20x3)YXDCPPYIDNNAQJMWXFFM(5x8)FZLRN(5x7)BKMSG(12x4)ZVRYPOOSYOMA(11x3)UGUWOKXVITR(220x15)(8x7)IRFZJLCM(34x4)(8x7)KIQHQWLZ(8x1)RTGQVPLE(3x8)RVU(60x14)(3x12)UJP(8x14)NYDICRGG(23x8)CHISDWBISOZYDWRNEBRWDSJ(3x6)EJG(14x12)PIWNBDAEREATVW(73x9)(14x3)IEPNRGKUCCEERW(4x7)FCWC(3x14)EXU(29x1)CDLSEHSCOEUZKWARMGBPXCHYMVQFP(188x3)(7x6)YNYVYUC(43x10)(15x11)YHQHLIEPOVAHHJQ(15x1)(2x12)EC(2x5)KR(113x1)(8x8)ZJHMLYAU(74x12)(5x3)CQZMJ(4x2)QGWN(3x9)LAE(7x1)OCFJMDJ(29x8)FIWUGBREHYRACQYOVVQJBDFHDGMEQ(13x4)GRPUVTXRVSHVM(1x5)F(307x3)(225x10)(47x6)(17x13)VURYAUGWWOIHHQJDD(8x3)WPVVCPUT(5x5)BFBOB(59x1)(8x3)UWPCOMZH(3x13)NRQ(4x13)WUJV(12x5)FUSBMTPOWDTX(3x12)RXT(45x8)(16x6)MTVMZPSDFMLDYLLD(16x14)JUHUHFNBYHGFWLVG(50x2)(2x9)GR(4x6)URSQ(27x10)LAGGDJBKBLVLPJVVDEZCXEJLFBJ(67x14)(7x15)OMHMPKM(2x7)BH(9x14)LDAFCOKEL(25x12)(5x1)QMTQH(1x15)I(2x15)RV(5x1)KKFYZ(639x15)(295x4)(8x10)SLSXUAJJ(160x7)(5x14)ICLSB(86x3)(6x7)CUYULZ(24x14)RZUPMSJMKASMGYUKSAZQKMBC(23x7)NINZWUFKIZZNKOZUAQOROBG(9x15)YJKHZIZFP(2x7)HC(30x5)(8x2)OBZCEUCF(10x10)LNGPRAITSF(8x11)(2x14)NG(106x14)(24x9)ACQDRKVEOEDULYMLYBGOMSIJ(19x2)UBUHEYIJEGFMCZSTDDO(35x4)HFNTQACPTELDNRWVUVKNKPBVIJMZWAZEOKS(5x3)RSIAK(330x8)(179x6)(34x8)(13x1)CCRZOVJLZOBBO(3x14)WPC(1x6)L(15x13)VAVFETWJRRFZFPE(11x13)VKJLGKAOCUC(92x12)(20x10)MRTDKUJPLGPXMTVLRSUF(2x6)QZ(11x15)MHFLVOFUNDC(25x11)SONLCWNGCZFGMSXYJXSFPVGVY(3x2)QRI(136x15)(45x13)(6x4)QQSQCM(1x9)U(7x4)VIDEIXN(10x3)WFRKVWNLJM(50x7)(13x4)OYFDFFFLITCIR(16x6)CIRLRKXBHVHNUPFZ(3x15)GRD(11x3)FMDUOABWGPB(5x15)EWSOH(3x4)JYH(338x8)(331x5)(324x1)(194x3)(2x4)ZF(48x12)(3x9)JVP(4x2)BWLT(24x15)KPNIHTTPTNNAHSSSDLAKDDNT(6x3)SZJQKG(64x15)(19x14)RSMBLFUAZBGBCJPQDES(5x11)KLUTW(1x9)J(5x13)UYNTL(5x8)NVICZ(43x11)(20x6)HURCGFJBVQOKDECLQELO(3x4)XID(4x9)WOCX(38x5)(2x8)KV(25x2)(18x13)SEYOWGYPRRKBHNVVGI(72x14)(18x10)RXBCYLJENTUPCKCIDO(22x8)(5x5)ZPUYC(7x9)LXRWCDN(2x3)XD(7x4)DEKJLWL(1794x8)(1786x4)(297x10)(289x14)(162x10)(78x9)(1x9)T(28x11)WCIFRVQWPNOEEBPKGYPFCOTNMRAP(12x7)IYTEKBFTEZIX(4x6)ALRX(5x2)QSCXQ(72x4)(25x8)OHCTVXZIEWNMEZBVFKTLIMGQW(4x13)XEBD(6x13)UZZITD(12x13)QPGHTTJTMMFJ(103x9)(24x4)FOJJCXKNPHEGIRYIFBLDVUES(66x14)(15x14)AJEUHOVVHZVHGAV(5x9)CVIBX(15x8)WIHEKYSJZCLABUK(8x5)UYQLGBEY(3x14)QAR(690x4)(14x3)KRIBLTDDRJSFGY(4x9)MMCG(338x15)(15x4)(4x3)VIER(1x7)J(76x14)(8x6)VNTBZCVR(47x6)(24x3)HDWQXSRQWIFPKUSRADRBXAPD(11x8)GSSDBTQZINR(5x3)TWHSS(74x2)(5x3)DMUEM(4x2)FLBE(48x14)(10x8)YLSBTQPTJJ(2x10)ZP(8x7)JFXOKRXJ(5x11)WDHLN(82x2)(7x12)IEXUOMG(8x11)PVPIWSQY(36x7)NXNEYNWWPODZRJBIQFLDLZVSEDRPRWZUUXQS(7x11)WWTZGJK(59x11)(52x11)(17x14)QMXUKMPFATJEJQASH(22x6)WEXAZYBXEIIIWKEYRNINYH(246x5)(7x14)XMWZOQI(225x13)(9x6)(4x4)RMSV(35x9)(12x15)FSEJCGTVXEUT(1x7)L(5x5)IALLO(83x2)(5x5)HEUVE(26x8)BGAOGWCKQJVESARPQNTDIKKOKN(34x12)DGCKPWQBLZNXDLLYIWKRAOVPCXIIEWLSMN(75x6)(6x6)RHDULO(16x11)CRXVYYDZXJFFSPOR(5x14)OXTUY(24x4)UHCHXFDOONZXAZTTBFSINOEG(55x14)(12x12)ZKOOCWQTVQUS(19x10)WNHJGQATSCBTMLIVOYB(5x1)ZHQEA(710x7)(2x14)FD(170x9)(162x11)(11x10)MJTMRWMKRNT(28x10)(21x14)MJZQATVTRTWDEQNSZOXKK(59x15)(1x10)K(16x6)AVTYFAJYHSKETUYI(1x15)M(4x15)CDYM(7x15)TGWTHWL(29x11)HWMXLXCZVSSUPDBTIXDEGPNJJZNGX(2x6)KM(487x11)(3x14)UIF(84x4)(5x14)MDENR(66x12)(12x11)WQEVOLYPOSEK(30x5)LKBXTFFEOHNEJHOHKMMUKSDISVVQZE(5x10)PFZCP(197x12)(24x15)JLPYUIJVFQRWOACTFMQPLYHI(55x3)(14x1)KUTCZEZNWSISPL(8x7)YNZXWQMY(6x1)EZVHCC(6x3)AEVYOO(2x6)DE(68x6)(13x3)KRBXMIIHZERUV(3x2)TLR(35x4)LWCSHQCLMZAPMNSXKWCGVGDTKWUQAIWWLWU(17x11)FWYFWEMLVLQQGCJLJ(176x8)(4x2)ICOL(63x7)(37x14)SQVVGHBVLPVSLAYFZBLEGOKEHFSXSVEJOSRXO(2x2)IF(6x10)APYCKZ(73x15)(20x3)EARRAATGOHPONSTXOUVI(20x4)GBRNRAGYDCTGEODHJDUB(1x2)Z(1x15)R(3x4)QBQ(1x2)M(7x6)KJQAHCJ(24x6)UHLVTEERAYIUBGMUKOJFHRUJ(36x7)(30x2)(1x14)H(17x1)BSZIJHGVILXXURQDI(18x12)PSFBREKMLZRFFFRLZG(236x1)(52x7)(2x12)WK(16x10)CRNLMDQWZECYSFOT(3x10)ISI(6x13)FPJKZE(7x9)XOCUXIU(125x5)(105x5)LPOXYLAWSIIRQDNUWVHOLUDYOZSCFNCORKVFMSYIMMNCMNSOUGJHSBYKITYGFWUYHBJCQELUIMYXAFRFIAOSXSOIMGYEPJFPWQXSZYCDD(8x8)ILXIPPGD(7x13)TYZVRQS(14x12)(3x3)WXE(1x9)Q(40x10)(34x7)(2x2)AZ(10x15)UPJJICKDLA(5x6)CHXZV(153x7)(13x8)LCBGVTVMPVNMJ(30x8)(6x8)KXMWXG(6x1)DJRTOU(2x15)FW(79x10)(13x9)RIFNFQDLAWBSQ(3x2)ERQ(19x1)TTHLBYCOPMTXIIDSBXX(9x14)SBPSPMMCK(7x8)MKNEMLA(6x11)YPDDWG(220x9)(65x3)(2x6)LT(13x3)XFOPJCJBLRXYH(8x5)BKPDBCLE(6x2)UNKPOA(9x15)THYQVMZUG(50x15)(9x11)AAXOWDYIN(12x14)IWTCMNVXNJAX(10x4)JPSIYYKGVJ(86x8)(29x10)ORMIZOTUMSVKNEJDCQDQHESLAQKOF(8x14)SHFMBHHV(1x9)L(14x2)QQHGYTMVZAZRDK(5x7)COVRS(51x2)(11x2)ZDTVQIWFFND(5x8)RQTFS(1x9)B(5x9)SINCP(3x3)ACU
diff --git a/2016/aoc9/src/main.rs b/2016/aoc9/src/main.rs
new file mode 100644
index 0000000..622819c
--- /dev/null
+++ b/2016/aoc9/src/main.rs
@@ -0,0 +1,143 @@
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+#[derive(Debug, Clone, Copy)]
+struct Marker {
+ take: usize,
+ repeat: usize
+}
+#[derive(Debug, Clone, Copy)]
+enum Token {
+ Marker(usize, Marker),
+ Literal(usize)
+}
+
+impl Token {
+ fn size(self) -> usize {
+ match self {
+ Token::Marker(x, _) => x,
+ Token::Literal(x) => x
+ }
+ }
+
+ fn is_marker(self) -> bool {
+ match self {
+ Token::Marker(_, _) => true,
+ Token::Literal(_) => false
+ }
+ }
+
+ fn unwrap_marker(self) -> Marker {
+ match self {
+ Token::Marker(_, marker) => marker,
+ Token::Literal(_) => panic!("Bad unwrap marker")
+ }
+ }
+}
+
+fn main() {
+ let mut tokens = parse(read_file());
+ tokens.reverse();
+ let mut length: u64 = 0;
+
+ while tokens.len() > 0 {
+ let next = tokens.pop().unwrap();
+
+ if next.is_marker() {
+ let marker = next.unwrap_marker();
+ let mut used_take = 0;
+
+ let mut tokens_to_repeat = Vec::new();
+ while used_take < marker.take {
+ let next_token = tokens.pop().unwrap();
+ if used_take + next_token.size() <= marker.take {
+ tokens_to_repeat.push(next_token);
+ }
+ else {
+ assert!(!next_token.is_marker());
+ //assume splits only happen on literals
+ tokens_to_repeat.push(Token::Literal(marker.take - used_take));
+ tokens.push(Token::Literal(next_token.size() - marker.take + used_take));
+ }
+ used_take += next_token.size();
+ }
+
+ tokens_to_repeat.reverse();
+ for _ in 0..marker.repeat {
+ for &token in &tokens_to_repeat {
+ tokens.push(token);
+ }
+ }
+ } else {
+ length += next.size() as u64;
+ }
+ }
+ println!("Length: {}", length);
+}
+
+fn parse(text: String) -> Vec<Token> {
+ let mut tokens = Vec::new();
+ let mut chars = text.chars();
+ let mut current_char = chars.next();
+ while current_char.is_some() {
+ let c = current_char.unwrap();
+ if c == '(' {
+ let mut char_count = 1;
+ let mut take_str = String::new();
+ let mut repeat_str = String::new();
+ loop {
+ let n = chars.next().unwrap();
+ char_count += 1;
+ if n == 'x' { break; }
+ take_str.push(n);
+ }
+ loop {
+ let n = chars.next().unwrap();
+ char_count += 1;
+ if n == ')' { break; }
+ repeat_str.push(n);
+ }
+
+ let take: usize = take_str.parse().expect(format!("Tried to parse take {}", take_str).as_ref());
+ let repeat: usize = repeat_str.parse().expect(format!("Tried to parse repeat {}", repeat_str).as_ref());
+ tokens.push(Token::Marker(char_count , Marker{take: take, repeat:repeat}));
+ } else {
+ assert!(c != '(' && c != ')');
+ tokens.push(Token::Literal(1));
+ }
+
+ current_char = chars.next();
+ }
+ collapse_literals(&mut tokens);
+
+ tokens
+}
+
+fn collapse_literals(tokens: &mut Vec<Token>) {
+ let mut i = 0;
+ while i < tokens.len()-1 {
+ match (tokens[i], tokens[i+1]) {
+ (Token::Literal(l1), Token::Literal(l2)) => {
+ tokens[i] = Token::Literal(l1+l2);
+ tokens.remove(i+1);
+ },
+ _ => {
+ i += 1;
+ }
+ }
+ }
+}
+
+fn read_file() -> String {
+ let file = BufReader::new(File::open("input.txt").unwrap());
+ file.lines()
+ .map(|line| line.unwrap().trim().to_string())
+ .filter(|line| line.len() > 0)
+ .next()
+ .unwrap()
+ .trim()
+ .to_string()
+
+// "(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN".to_string()
+}
diff --git a/2017/Cargo.toml b/2017/Cargo.toml
new file mode 100644
index 0000000..d84b5bd
--- /dev/null
+++ b/2017/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "advent_of_code_2017"
+version = "0.1.0"
+authors = ["Justin Worthe <justin@worthe-it.co.za>"]
+
+[dependencies]
+regex = "0.2.3"
+lazy_static = "1.0.0"
+structopt = "0.1.6"
+structopt-derive = "0.1.6" \ No newline at end of file
diff --git a/2017/LICENSE b/2017/LICENSE
new file mode 100644
index 0000000..026d0f3
--- /dev/null
+++ b/2017/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Justin Worthe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/2017/inputs/day_1.txt b/2017/inputs/day_1.txt
new file mode 100644
index 0000000..7a4debd
--- /dev/null
+++ b/2017/inputs/day_1.txt
@@ -0,0 +1 @@
+21752342814933766938172121674976879111362417653261522357855816893656462449168377359285244818489723869987861247912289729579296691684761143544956991583942215236568961875851755854977946147178746464675227699149925227227137557479769948569788884399379821111382536722699575759474473273939756348992714667963596189765734743169489599125771443348193383566159843593541134749392569865481578359825844394454173219857919349341442148282229689541561169341622222354651397342928678496478671339383923769856425795211323673389723181967933933832711545885653952861879231537976292517866354812943192728263269524735698423336673735158993853556148833861327959262254756647827739145283577793481526768156921138428318939361859721778556264519643435871835744859243167227889562738712953651128317624673985213525897522378259178625416722152155728615936587369515254936828668564857283226439881266871945998796488472249182538883354186573925183152663862683995449671663285775397453876262722567452435914777363522817594741946638986571793655889466419895996924122915777224499481496837343194149123735355268151941712871245863553836953349887831949788869852929147849489265325843934669999391846286319268686789372513976522282587526866148166337215961493536262851512218794139272361292811529888161198799297966893366553115353639298256788819385272471187213579185523521341651117947676785341146235441411441813242514813227821843819424619974979886871646621918865274574538951761567855845681272364646138584716333599843835167373525248547542442942583122624534494442516259616973235858469131159773167334953658673271599748942956981954699444528689628848694446818825465485122869742839711471129862632128635779658365756362863627135983617613332849756371986376967117549251566281992964573929655589313871976556784849231916513831538254812347116253949818633527185174221565279775766742262687713114114344843534958833372634182176866315441583887177759222598853735114191874277711434653854816841589229914164681364497429324463193669337827467661773833517841763711156376147664749175267212562321567728575765844893232718971471289841171642868948852136818661741238178676857381583155547755219837116125995361896562498721571413742
diff --git a/2017/inputs/day_10.txt b/2017/inputs/day_10.txt
new file mode 100644
index 0000000..6544f8c
--- /dev/null
+++ b/2017/inputs/day_10.txt
@@ -0,0 +1 @@
+187,254,0,81,169,219,1,190,19,102,255,56,46,32,2,216
diff --git a/2017/inputs/day_11.txt b/2017/inputs/day_11.txt
new file mode 100644
index 0000000..c31c097
--- /dev/null
+++ b/2017/inputs/day_11.txt
@@ -0,0 +1 @@
+s,s,sw,se,s,nw,nw,ne,n,ne,n,n,n,n,n,n,n,ne,n,ne,ne,se,ne,n,ne,n,n,ne,se,sw,se,s,se,se,se,se,s,se,se,s,se,se,nw,se,se,se,s,s,nw,s,s,se,nw,s,n,s,nw,s,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,sw,sw,s,sw,s,nw,sw,sw,s,sw,ne,sw,sw,s,se,sw,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,se,sw,nw,nw,sw,sw,sw,s,sw,nw,se,nw,se,nw,sw,nw,nw,se,n,sw,s,s,s,nw,sw,sw,nw,se,nw,sw,sw,sw,nw,sw,sw,nw,nw,nw,nw,ne,n,nw,nw,ne,nw,nw,nw,nw,nw,se,nw,nw,n,nw,nw,nw,sw,n,nw,nw,nw,nw,n,s,nw,ne,nw,s,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,s,sw,n,n,nw,nw,n,n,nw,nw,n,nw,n,n,nw,n,s,n,nw,ne,n,nw,n,nw,n,n,n,n,se,s,n,s,n,s,n,n,n,nw,n,s,n,n,n,n,n,ne,n,n,n,n,s,n,n,n,n,sw,n,n,n,nw,n,n,n,n,nw,se,n,ne,n,n,ne,n,ne,ne,n,n,n,n,ne,n,n,nw,n,n,n,n,ne,se,se,ne,ne,ne,n,ne,n,ne,ne,nw,ne,ne,n,n,n,ne,ne,ne,n,ne,nw,n,s,ne,ne,ne,ne,ne,n,s,ne,ne,ne,n,ne,ne,ne,sw,ne,ne,ne,s,n,ne,ne,n,ne,ne,ne,ne,ne,se,ne,ne,se,ne,ne,ne,ne,se,ne,se,ne,nw,nw,sw,s,n,ne,ne,ne,ne,ne,sw,ne,ne,ne,sw,ne,ne,ne,ne,sw,se,ne,ne,ne,ne,se,s,se,s,nw,ne,ne,n,se,ne,ne,ne,sw,ne,s,s,nw,se,nw,ne,s,ne,se,ne,n,ne,n,s,n,ne,ne,s,ne,se,se,ne,sw,nw,s,n,nw,n,se,ne,se,se,sw,ne,ne,sw,se,se,se,se,sw,ne,se,s,ne,ne,n,se,ne,sw,ne,ne,se,se,nw,se,ne,ne,nw,sw,se,s,s,se,se,se,s,se,nw,se,ne,se,se,se,se,se,se,se,sw,nw,se,se,se,se,se,se,sw,se,sw,ne,se,se,se,se,se,se,se,se,s,se,se,se,se,se,se,ne,se,se,s,sw,s,se,se,se,se,se,se,se,s,se,sw,se,se,n,s,se,s,ne,se,se,se,s,se,s,se,se,ne,se,se,sw,s,se,se,se,se,nw,se,n,ne,s,s,nw,se,se,s,se,n,se,se,s,se,se,s,se,se,ne,se,se,se,s,s,sw,s,s,se,s,se,s,se,s,se,se,se,s,se,s,nw,s,s,se,se,se,se,sw,sw,s,se,s,se,se,s,n,se,se,se,se,s,se,se,s,se,se,se,sw,s,s,s,se,se,s,s,se,s,s,se,s,s,n,s,nw,s,n,s,sw,s,nw,s,s,se,se,sw,s,s,s,sw,se,s,n,s,se,n,s,se,se,se,s,s,s,se,ne,s,se,n,se,s,se,se,s,ne,sw,se,s,s,se,s,s,s,s,s,s,s,s,se,s,nw,s,s,s,s,s,s,s,s,s,s,s,ne,ne,s,s,s,s,s,s,s,s,s,ne,ne,s,s,s,s,s,s,s,s,nw,s,s,se,sw,s,sw,s,s,nw,s,s,s,s,s,s,s,s,s,n,ne,se,s,s,s,s,n,se,s,sw,s,sw,sw,sw,s,s,sw,s,s,s,nw,sw,s,s,s,s,s,ne,sw,s,s,sw,s,s,s,s,s,s,sw,s,s,se,s,s,sw,n,sw,s,s,sw,s,s,s,s,s,sw,s,ne,s,s,s,s,sw,ne,s,ne,n,sw,s,s,s,sw,s,sw,nw,s,s,ne,sw,sw,nw,s,s,sw,sw,s,ne,s,s,sw,se,s,s,sw,s,s,sw,s,sw,sw,s,s,s,s,sw,sw,sw,s,n,ne,s,ne,s,sw,s,se,s,sw,sw,s,sw,sw,sw,sw,s,s,s,s,se,s,sw,sw,sw,sw,n,s,sw,s,s,sw,sw,s,s,n,sw,s,sw,sw,ne,sw,sw,s,sw,sw,sw,sw,sw,s,s,sw,se,sw,sw,sw,sw,s,s,sw,s,sw,sw,nw,sw,sw,se,sw,s,s,nw,nw,s,s,sw,sw,s,n,s,sw,sw,se,s,sw,sw,ne,sw,sw,sw,sw,sw,ne,sw,s,sw,sw,n,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,n,nw,s,sw,s,s,n,ne,sw,sw,sw,sw,n,sw,se,sw,sw,s,se,sw,sw,sw,sw,sw,sw,s,ne,ne,ne,sw,sw,sw,ne,s,sw,sw,sw,sw,nw,s,sw,sw,s,s,sw,sw,n,nw,nw,sw,sw,sw,se,nw,nw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,n,sw,sw,sw,nw,nw,se,sw,sw,sw,sw,sw,ne,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,s,sw,sw,se,sw,s,sw,sw,nw,nw,nw,sw,sw,nw,sw,se,ne,sw,sw,sw,sw,ne,sw,sw,nw,sw,se,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,n,nw,sw,sw,sw,s,sw,sw,nw,n,s,sw,n,nw,nw,sw,sw,nw,sw,sw,se,sw,sw,nw,sw,sw,s,sw,nw,sw,nw,sw,nw,nw,nw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,nw,nw,ne,n,nw,sw,sw,nw,sw,sw,nw,nw,nw,sw,sw,sw,ne,s,sw,nw,nw,sw,nw,sw,s,nw,n,nw,sw,sw,nw,nw,sw,nw,nw,n,sw,nw,sw,nw,sw,n,sw,nw,sw,sw,sw,sw,n,sw,n,nw,nw,s,sw,se,sw,sw,nw,n,sw,sw,sw,n,sw,nw,sw,ne,nw,sw,sw,s,n,nw,sw,nw,nw,nw,sw,sw,sw,nw,nw,ne,sw,s,sw,nw,n,sw,sw,sw,nw,ne,ne,sw,nw,nw,sw,s,s,sw,sw,nw,ne,sw,nw,sw,nw,nw,sw,sw,sw,sw,nw,nw,s,se,nw,sw,nw,ne,s,nw,nw,ne,sw,nw,nw,n,nw,nw,sw,sw,sw,nw,nw,nw,sw,nw,nw,n,sw,sw,nw,s,n,sw,nw,nw,sw,nw,n,nw,nw,nw,nw,nw,nw,sw,sw,n,n,sw,sw,nw,nw,nw,nw,ne,nw,nw,nw,sw,nw,nw,nw,nw,ne,nw,nw,nw,nw,n,nw,nw,nw,s,nw,nw,sw,nw,s,nw,ne,ne,nw,nw,sw,nw,nw,nw,nw,sw,nw,se,sw,nw,sw,nw,nw,ne,nw,n,nw,nw,sw,nw,nw,nw,sw,nw,ne,s,nw,nw,sw,s,nw,sw,sw,nw,nw,nw,sw,s,nw,nw,nw,nw,se,nw,s,nw,nw,nw,se,ne,ne,nw,nw,nw,nw,nw,sw,nw,ne,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,ne,nw,nw,s,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,ne,nw,n,nw,nw,ne,n,nw,sw,nw,n,nw,n,sw,nw,ne,s,se,n,ne,se,nw,ne,nw,ne,nw,ne,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,ne,nw,s,se,nw,n,n,nw,ne,nw,nw,nw,nw,ne,nw,nw,s,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,n,nw,nw,s,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,sw,n,nw,nw,nw,nw,nw,nw,nw,s,nw,se,n,n,n,nw,se,nw,nw,s,s,nw,nw,n,nw,nw,s,nw,nw,nw,se,nw,nw,nw,se,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,n,nw,n,ne,nw,nw,nw,se,ne,nw,nw,nw,n,nw,nw,ne,n,n,nw,nw,sw,nw,nw,nw,nw,se,nw,n,s,nw,nw,n,n,nw,se,n,nw,nw,nw,n,nw,nw,nw,n,nw,se,n,se,sw,s,n,s,nw,nw,nw,nw,n,n,s,nw,nw,se,nw,nw,se,nw,n,n,nw,n,se,nw,n,n,nw,n,nw,n,nw,nw,n,nw,n,s,nw,nw,nw,nw,ne,ne,se,sw,nw,n,n,nw,s,n,nw,nw,n,n,nw,n,nw,nw,nw,nw,nw,n,nw,n,n,sw,n,se,nw,n,n,nw,n,nw,nw,n,s,sw,nw,ne,nw,n,sw,nw,nw,n,nw,sw,s,nw,n,n,nw,se,n,nw,n,ne,n,nw,nw,n,nw,nw,n,nw,n,nw,nw,nw,n,se,sw,nw,nw,nw,sw,nw,nw,nw,nw,se,n,n,ne,n,nw,nw,n,nw,nw,n,sw,n,se,nw,nw,n,n,n,nw,n,nw,n,nw,n,ne,n,n,nw,n,n,n,nw,se,sw,n,sw,n,nw,nw,n,n,n,se,nw,sw,ne,n,se,nw,nw,n,n,n,n,n,n,nw,n,n,nw,sw,nw,n,sw,n,n,se,sw,n,n,n,nw,sw,nw,n,n,n,n,nw,n,n,nw,n,s,n,n,sw,n,nw,ne,s,nw,ne,n,n,n,ne,s,n,n,n,n,n,n,se,nw,nw,n,n,nw,n,n,s,se,n,nw,n,n,n,n,n,n,nw,n,n,n,nw,nw,nw,n,n,n,nw,nw,sw,n,se,n,s,n,n,n,n,n,n,ne,n,se,n,n,n,se,n,nw,n,nw,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,ne,n,n,nw,n,n,sw,n,nw,n,n,sw,n,n,n,nw,se,n,n,n,nw,n,s,n,n,n,n,n,n,n,s,n,n,n,n,nw,n,n,sw,sw,nw,n,nw,nw,sw,n,n,n,n,n,n,n,n,n,n,n,s,n,n,n,n,nw,n,n,n,n,n,n,n,s,n,nw,n,sw,nw,ne,n,nw,n,sw,n,n,n,n,n,ne,n,nw,n,n,n,n,n,n,n,ne,n,n,n,n,ne,n,n,n,n,ne,n,n,n,n,ne,n,n,s,n,n,se,n,n,n,n,n,n,n,nw,n,ne,nw,sw,ne,nw,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,ne,n,n,se,n,ne,n,ne,n,n,n,n,ne,n,ne,se,s,ne,nw,se,n,n,n,n,se,n,n,ne,s,n,nw,n,nw,nw,n,n,n,n,n,n,n,n,n,s,n,n,n,s,n,nw,n,n,n,n,n,n,n,n,n,n,n,n,ne,ne,n,sw,n,se,n,n,n,n,n,n,n,se,n,ne,n,ne,n,n,n,n,n,sw,n,n,s,nw,n,n,n,ne,ne,n,n,n,ne,n,n,se,n,n,n,n,ne,n,n,n,s,n,se,ne,n,n,n,n,n,n,n,n,s,ne,s,nw,n,ne,s,ne,n,n,n,n,ne,n,n,n,n,n,n,n,n,n,ne,n,se,ne,n,ne,ne,ne,ne,se,n,n,ne,n,n,n,n,nw,ne,sw,ne,n,n,ne,se,n,n,n,n,se,n,n,n,ne,n,se,ne,ne,n,s,nw,n,ne,n,n,nw,n,n,ne,n,ne,n,sw,n,se,n,ne,nw,ne,ne,n,n,n,ne,n,ne,nw,n,s,n,n,n,n,ne,n,n,ne,n,nw,n,n,n,ne,n,s,n,n,n,n,n,ne,ne,n,sw,n,ne,n,n,sw,ne,n,ne,ne,n,n,ne,ne,ne,n,ne,ne,ne,n,ne,sw,n,n,ne,ne,ne,se,n,ne,ne,ne,n,nw,n,ne,n,n,n,ne,n,n,n,n,n,ne,ne,n,ne,s,nw,ne,n,ne,ne,ne,n,n,n,n,nw,n,n,ne,ne,ne,n,ne,n,ne,ne,n,ne,ne,nw,ne,nw,n,n,ne,se,ne,se,ne,n,nw,n,n,s,n,se,ne,ne,n,ne,n,ne,s,n,n,sw,ne,ne,se,n,ne,n,n,n,n,sw,ne,ne,nw,n,n,ne,ne,ne,n,ne,n,sw,ne,ne,ne,ne,n,ne,se,ne,sw,n,n,n,ne,ne,sw,ne,ne,ne,n,ne,ne,n,ne,se,ne,s,nw,n,sw,n,ne,n,n,n,n,ne,n,sw,ne,ne,nw,n,ne,se,ne,ne,ne,ne,n,ne,ne,n,ne,n,ne,ne,ne,n,s,s,ne,ne,ne,s,ne,ne,ne,sw,n,n,ne,n,s,ne,n,n,nw,n,se,sw,ne,ne,ne,s,n,n,ne,ne,n,ne,ne,nw,ne,ne,ne,s,se,ne,ne,ne,n,ne,nw,n,ne,ne,sw,n,n,ne,ne,ne,n,ne,ne,se,ne,ne,n,ne,ne,ne,sw,s,n,n,n,se,n,s,ne,ne,ne,sw,ne,ne,se,ne,ne,ne,ne,ne,n,s,se,ne,ne,ne,n,ne,sw,se,s,ne,n,ne,ne,n,n,n,ne,n,ne,ne,se,ne,ne,n,ne,ne,ne,ne,ne,s,ne,ne,ne,nw,ne,ne,ne,ne,ne,n,ne,s,ne,ne,ne,n,ne,sw,n,n,n,ne,ne,n,ne,s,n,n,n,ne,ne,n,ne,ne,ne,sw,se,sw,ne,ne,s,ne,nw,ne,nw,se,nw,n,ne,se,n,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,sw,ne,ne,ne,ne,n,ne,s,ne,s,ne,ne,n,ne,se,ne,ne,nw,n,ne,ne,ne,s,ne,sw,ne,n,ne,ne,n,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,se,n,ne,ne,ne,ne,sw,ne,n,ne,se,ne,ne,ne,se,se,ne,sw,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,sw,n,n,ne,ne,n,ne,ne,ne,sw,ne,n,ne,ne,ne,se,ne,ne,nw,nw,sw,ne,ne,ne,ne,sw,ne,se,ne,n,ne,ne,ne,nw,ne,ne,ne,ne,ne,ne,sw,ne,ne,nw,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,s,sw,ne,ne,s,sw,sw,ne,ne,ne,nw,ne,n,se,ne,ne,ne,ne,n,ne,nw,ne,ne,n,se,ne,ne,ne,ne,sw,ne,ne,s,ne,s,ne,ne,ne,ne,ne,ne,ne,nw,ne,ne,ne,se,ne,ne,ne,ne,se,ne,ne,sw,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,sw,n,ne,ne,nw,se,ne,ne,ne,ne,se,ne,sw,ne,ne,n,se,ne,ne,se,ne,sw,nw,ne,ne,ne,ne,ne,ne,s,ne,se,sw,ne,s,ne,se,se,se,ne,ne,s,ne,ne,s,ne,se,ne,nw,s,ne,se,ne,ne,ne,sw,ne,se,ne,ne,ne,sw,ne,ne,ne,ne,nw,ne,ne,nw,ne,ne,s,ne,ne,se,ne,ne,nw,ne,ne,se,se,se,ne,se,ne,se,se,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,s,se,ne,sw,ne,ne,se,ne,ne,ne,ne,s,ne,se,ne,ne,se,n,n,ne,se,s,ne,s,ne,se,nw,ne,se,ne,ne,se,ne,se,se,ne,ne,se,ne,ne,ne,n,se,ne,ne,ne,ne,s,se,se,n,ne,se,se,ne,ne,se,ne,se,se,ne,ne,sw,ne,ne,ne,ne,ne,ne,nw,se,ne,se,ne,se,ne,s,ne,ne,sw,ne,ne,ne,ne,ne,s,se,ne,ne,s,se,ne,ne,ne,nw,ne,ne,ne,se,ne,ne,ne,ne,se,ne,ne,ne,se,ne,ne,se,n,s,ne,ne,ne,se,s,n,se,se,ne,sw,ne,ne,n,ne,se,n,se,n,s,n,s,ne,se,ne,ne,ne,ne,n,ne,se,sw,se,ne,se,nw,ne,ne,ne,se,se,ne,ne,ne,ne,ne,ne,ne,ne,nw,ne,n,s,ne,ne,ne,ne,ne,se,se,se,se,sw,s,n,ne,s,ne,ne,sw,se,se,ne,ne,ne,ne,ne,ne,se,se,s,ne,se,ne,nw,n,ne,se,se,ne,se,ne,ne,se,se,se,ne,ne,sw,se,nw,se,nw,se,se,se,se,ne,n,n,ne,se,se,ne,ne,se,ne,ne,se,ne,sw,ne,se,ne,n,se,nw,sw,ne,ne,se,ne,se,ne,ne,se,ne,se,ne,ne,ne,se,ne,se,se,n,nw,ne,ne,ne,ne,sw,n,ne,ne,ne,nw,ne,se,se,ne,ne,s,nw,n,ne,ne,ne,ne,ne,ne,ne,se,ne,sw,se,ne,s,n,ne,ne,se,ne,se,se,ne,se,ne,se,se,ne,se,se,se,ne,ne,ne,ne,se,ne,ne,nw,ne,ne,se,ne,s,se,ne,se,ne,ne,ne,ne,n,se,ne,se,se,ne,ne,ne,nw,ne,se,se,nw,ne,se,se,ne,sw,ne,ne,ne,n,ne,ne,ne,n,se,ne,se,ne,n,n,se,ne,se,se,se,ne,se,se,sw,se,ne,se,ne,sw,sw,ne,ne,ne,s,n,ne,ne,nw,ne,n,se,se,se,se,ne,nw,ne,ne,ne,se,ne,se,n,n,se,n,se,se,se,se,se,ne,sw,ne,se,ne,se,se,se,ne,sw,se,s,se,se,ne,se,se,se,n,ne,se,se,ne,ne,ne,ne,se,se,ne,se,se,ne,se,ne,ne,se,se,nw,se,se,ne,se,sw,se,ne,n,ne,se,se,se,nw,se,se,se,ne,se,ne,se,se,ne,se,se,ne,ne,se,se,sw,ne,se,se,sw,se,se,s,ne,ne,se,ne,s,ne,se,se,ne,se,nw,n,se,se,s,se,ne,se,ne,ne,sw,ne,ne,n,se,s,n,ne,se,se,ne,nw,ne,ne,se,se,ne,sw,ne,ne,ne,se,sw,ne,se,se,ne,n,ne,se,nw,se,se,se,ne,se,ne,ne,ne,s,ne,nw,ne,ne,ne,se,se,se,nw,se,ne,se,se,se,ne,se,ne,se,se,se,ne,se,se,se,n,se,ne,ne,se,se,se,se,sw,ne,se,se,se,ne,se,nw,n,ne,ne,ne,sw,n,se,n,se,se,n,ne,se,se,ne,se,ne,se,nw,se,se,se,s,sw,ne,se,sw,se,se,se,ne,ne,se,ne,se,se,se,se,ne,se,se,ne,se,se,ne,se,ne,se,se,se,ne,se,ne,ne,se,s,ne,ne,nw,se,ne,n,ne,se,se,ne,se,n,ne,ne,se,ne,se,se,se,ne,se,se,ne,ne,nw,ne,s,se,se,se,se,se,sw,nw,n,se,se,s,se,se,se,nw,se,n,nw,se,ne,ne,se,nw,se,se,se,se,se,se,ne,se,se,se,se,ne,se,se,ne,se,se,se,se,ne,se,se,se,se,ne,ne,nw,se,se,se,se,se,se,s,se,se,se,n,se,ne,ne,ne,se,se,se,se,ne,se,se,ne,se,se,se,se,se,se,se,sw,se,ne,ne,s,se,se,ne,se,se,se,ne,ne,se,se,se,se,se,se,se,s,sw,se,ne,se,se,se,se,se,se,se,n,se,sw,se,se,se,ne,se,se,se,se,se,s,ne,nw,se,se,se,se,se,sw,se,ne,sw,se,ne,se,se,ne,se,ne,n,ne,se,se,ne,se,ne,nw,nw,se,se,se,se,se,se,se,se,se,se,sw,se,se,se,se,se,nw,se,n,se,se,ne,se,se,nw,se,se,se,se,se,ne,nw,nw,se,se,se,se,ne,se,se,se,ne,ne,se,se,se,se,se,se,se,se,se,se,se,sw,s,se,se,ne,nw,se,se,se,se,se,se,sw,sw,se,ne,sw,nw,se,se,se,se,se,n,se,se,ne,se,se,se,nw,se,ne,se,se,se,s,se,se,n,se,se,ne,se,s,se,ne,se,se,se,nw,se,se,n,se,s,n,se,se,se,nw,se,s,sw,se,ne,se,se,se,nw,se,sw,se,se,sw,s,se,n,ne,sw,se,n,nw,se,ne,se,se,se,se,se,ne,se,se,se,se,se,se,se,se,n,se,se,se,ne,se,se,se,sw,se,nw,se,se,ne,se,se,se,se,n,ne,se,se,se,n,se,se,se,se,se,se,se,s,s,se,se,se,s,ne,se,se,se,se,se,se,se,se,se,se,se,se,se,n,n,se,se,se,se,se,se,se,se,se,s,sw,se,se,se,n,nw,se,se,se,se,ne,ne,se,n,se,se,sw,ne,sw,se,se,ne,se,se,se,se,se,se,se,se,se,n,se,nw,se,se,se,sw,s,se,se,se,se,se,se,se,se,ne,s,se,se,se,nw,s,se,n,se,se,se,s,sw,se,se,se,se,nw,ne,se,se,se,ne,s,se,sw,se,se,se,se,se,se,s,se,s,se,sw,se,ne,s,se,se,nw,se,se,nw,n,se,se,se,nw,nw,se,se,se,se,se,nw,s,se,se,ne,se,se,se,se,se,se,se,sw,se,se,se,se,se,se,nw,se,se,s,se,se,se,se,s,s,se,se,se,s,se,se,se,s,s,n,se,se,se,se,n,n,se,sw,nw,se,s,se,nw,se,s,nw,nw,se,s,se,se,se,se,se,se,sw,nw,se,se,s,se,se,se,se,se,se,n,n,ne,se,s,s,se,se,se,se,se,se,s,se,se,s,se,se,n,se,se,s,se,s,se,s,se,sw,se,se,sw,se,ne,se,sw,se,se,se,s,nw,se,ne,n,se,se,nw,se,ne,se,se,se,s,se,se,nw,se,s,se,se,se,nw,se,se,sw,s,se,s,se,se,nw,s,se,se,s,se,se,s,se,se,se,se,se,sw,s,se,se,s,sw,nw,ne,nw,se,nw,se,s,se,se,se,se,se,s,se,se,se,se,sw,s,sw,se,se,se,s,sw,sw,s,n,se,s,se,nw,se,se,se,ne,se,se,se,se,s,se,se,s,nw,s,se,s,nw,se,se,se,se,se,n,s,se,ne,n,se,se,nw,se,s,se,n,se,nw,s,s,s,se,nw,s,s,se,s,se,se,nw,s,se,s,se,se,se,se,n,se,se,s,se,se,se,se,s,s,se,s,se,se,s,se,s,n,se,n,se,se,s,se,s,se,se,s,s,se,se,s,se,se,se,se,s,s,s,se,s,nw,s,se,se,se,ne,nw,se,se,se,se,se,se,n,se,se,se,se,se,se,nw,se,se,se,s,s,nw,se,ne,se,s,se,ne,se,se,nw,se,se,se,sw,n,se,sw,se,se,nw,ne,s,se,sw,se,s,s,s,se,s,se,n,sw,sw,se,se,se,ne,se,s,se,sw,n,se,se,se,s,s,se,s,se,n,s,ne,se,se,s,se,se,s,sw,s,se,se,ne,s,n,se,se,se,s,s,s,se,se,s,s,ne,se,s,se,nw,se,s,se,se,s,s,s,se,n,se,se,ne,se,se,s,sw,se,s,ne,se,se,se,s,s,se,se,se,se,se,se,se,s,ne,se,s,se,s,s,nw,nw,s,s,nw,s,se,se,ne,se,se,se,n,s,s,s,s,se,se,s,s,s,nw,sw,se,s,s,n,se,s,s,s,s,n,s,se,s,s,se,sw,nw,nw,se,se,se,s,sw,se,se,se,s,se,se,s,s,s,se,ne,s,se,s,s,se,s,ne,se,se,se,se,se,se,ne,se,ne,s,se,se,se,se,se,s,s,s,n,se,nw,nw,s,se,sw,se,se,s,se,se,nw,s,s,s,ne,nw,se,se,se,n,ne,se,s,se,ne,se,ne,sw,ne,se,s,sw,se,se,se,s,s,ne,s,se,se,sw,s,s,s,s,se,se,s,s,se,s,se,s,s,nw,s,s,s,s,nw,nw,se,s,s,sw,s,se,nw,s,se,s,se,s,se,n,sw,n,ne,s,s,s,se,se,nw,s,n,se,s,s,s,se,s,s,s,sw,se,se,se,se,se,se,sw,s,nw,se,n,s,se,sw,nw,se,se,se,se,s,ne,se,ne,s,s,se,se,se,s,s,s,s,n,se,sw,n,s,nw,s,se,s,se,se,se,s,se,n,s,se,nw,se,s,s,se,se,se,s,s,n,s,se,s,s,s,se,se,se,s,s,s,s,se,se,s,se,s,s,s,s,s,s,s,s,nw,nw,se,n,sw,s,s,ne,s,nw,s,se,s,s,sw,s,se,nw,se,s,s,s,s,s,s,s,se,se,s,se,ne,s,se,se,se,s,s,s,se,ne,s,ne,s,s,se,s,s,ne,s,s,se,s,s,s,s,s,se,n,sw,n,s,se,se,s,s,nw,s,sw,se,n,s,se,s,s,sw,s,s,s,s,s,nw,s,nw,se,se,s,s,nw,se,s,s,sw,sw,s,se,se,s,s,s,se,s,se,s,s,s,se,s,ne,s,s,se,s,s,se,se,s,s,s,n,s,s,s,s,se,s,s,se,s,s,se,s,s,s,nw,se,s,s,se,se,se,nw,s,se,ne,s,se,s,n,nw,se,sw,se,se,s,se,s,se,s,sw,s,se,se,se,nw,s,s,s,s,sw,s,s,s,n,s,sw,s,s,se,se,se,s,se,s,s,s,se,s,se,se,nw,s,s,se,ne,s,se,s,se,se,se,s,s,s,s,se,s,s,s,s,se,s,s,s,s,se,se,se,sw,s,se,s,s,nw,s,s,se,s,se,s,se,s,sw,s,ne,s,s,ne,s,sw,s,s,ne,n,s,se,se,s,s,s,s,se,se,s,s,se,se,s,nw,s,s,n,s,ne,se,n,s,s,s,s,s,sw,s,n,n,s,s,sw,s,sw,n,se,s,s,s,s,nw,se,s,s,s,s,s,s,se,s,s,sw,s,s,s,se,se,ne,s,s,s,ne,se,se,s,s,se,n,n,se,n,sw,s,sw,se,nw,n,s,n,s,nw,sw,s,se,se,s,s,s,s,s,s,se,s,s,se,s,s,s,s,s,sw,se,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,nw,se,s,se,s,s,s,s,s,s,s,s,se,nw,se,s,s,s,se,nw,s,s,ne,s,s,se,se,sw,s,ne,n,s,s,se,n,ne,se,s,s,s,s,nw,s,ne,s,s,n,s,s,s,s,s,se,s,s,s,s,se,s,s,s,s,n,s,se,s,n,s,s,sw,s,s,s,s,s,se,s,ne,s,sw,n,s,n,se,nw,nw,s,sw,ne,n,sw,n,sw,s,n,s,se,s,se,s,s,s,s,nw,se,s,s,s,se,sw,s,se,s,s,s,s,s,s,s,s,s,s,se,ne,nw,s,s,s,s,s,se,s,ne,sw,se,se,sw,sw,s,se,ne,s,nw,ne,n,s,s,s,s,s,ne,s,s,s,s,se,s,se,s,s,s,sw,s,s,se,s,s,s,s,n,se,s,ne,s,s,s,s,se,sw,se,s,s,s,s,s,se,s,n,n,s,s,sw,s,s,s,s,ne,s,sw,s,s,s,s,s,sw,s,s,n,s,n,s,s,s,n,se,s,s,s,s,s,s,s,s,s,s,s,s,ne,sw,s,s,ne,nw,se,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,nw,s,s,se,se,s,n,s,se,s,s,s,se,s,nw,s,s,s,s,se,s,s,s,ne,s,s,s,se,s,s,s,s,s,s,s,n,s,s,s,s,s,ne,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,s,ne,se,sw,s,sw,s,s,s,se,s,s,s,s,se,s,s,ne,s,s,s,s,se,ne,se,n,n,n,n,n,n,nw,nw,sw,sw,nw,ne,sw,ne,sw,nw,sw,ne,s,sw,sw,sw,sw,s,sw,sw,sw,sw,nw,s,s,s,nw,s,s,s,se,s,se,s,se,n,se,s,se,s,nw,sw,se,se,s,se,se,se,se,se,se,se,se,nw,se,se,se,se,se,ne,se,ne,s,se,se,se,se,se,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,s,ne,nw,ne,sw,ne,ne,ne,ne,ne,ne,ne,se,n,ne,ne,se,ne,ne,n,se,ne,ne,sw,ne,ne,n,ne,n,ne,n,n,n,sw,n,ne,n,ne,ne,se,ne,n,n,ne,n,n,s,n,n,ne,n,s,n,n,n,s,n,ne,n,n,n,n,n,se,nw,nw,n,n,nw,n,se,n,sw,s,n,nw,nw,se,nw,nw,nw,nw,n,n,se,n,n,n,nw,nw,n,nw,ne,n,nw,n,nw,sw,nw,n,n,n,ne,se,nw,n,nw,n,n,nw,n,nw,n,nw,n,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,se,sw,sw,nw,se,nw,s,nw,nw,nw,nw,nw,nw,nw,s,n,nw,nw,nw,sw,nw,se,nw,nw,nw,nw,sw,sw,nw,s,sw,nw,s,nw,nw,sw,nw,sw,sw,nw,sw,se,nw,nw,nw,nw,nw,sw,sw,nw,se,sw,sw,nw,sw,nw,se,sw,nw,nw,nw,n,nw,sw,nw,ne,nw,nw,s,nw,nw,nw,sw,nw,sw,nw,sw,sw,sw,sw,n,sw,nw,s,sw,nw,ne,sw,n,s,sw,sw,sw,sw,ne,sw,sw,sw,nw,sw,s,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,n,sw,s,sw,sw,n,sw,sw,s,s,sw,sw,sw,sw,sw,sw,sw,s,s,sw,sw,sw,ne,sw,sw,s,sw,s,nw,sw,sw,se,se,sw,sw,sw,s,s,s,sw,nw,sw,nw,s,sw,sw,sw,sw,sw,sw,s,sw,s,sw,sw,sw,s,sw,s,sw,s,sw,s,sw,s,sw,s,sw,sw,s,s,s,sw,n,sw,s,n,s,s,s,sw,s,n,s,sw,sw,sw,sw,s,s,s,s,s,s,s,s,sw,sw,s,sw,se,s,s,s,sw,s,s,sw,s,ne,s,s,s,s,s,s,s,s,s,n,se,s,s,nw,s,s,s,se,s,s,s,s,s,s,s,s,s,s,nw,se,s,s,s,sw,s,s,s,s,s,s,s,ne,n,s,se,s,s,s,s,s,s,se,se,nw,nw,s,s,s,s,s,se,sw,s,s,se,s,s,s,s,s,s,s,s,s,n,s,s,s,se,s,s,s,s,s,s,se,s,s,n,s,s,se,s,s,s,se,s,s,nw,s,s,s,n,s,s,se,s,se,s,n,ne,s,s,s,s,se,ne,n,s,se,s,se,s,s,se,s,s,s,s,s,se,s,sw,s,se,se,s,se,s,s,ne,s,ne,ne,se,s,ne,se,s,ne,s,se,ne,se,se,se,sw,s,se,se,se,se,se,n,s,s,se,s,se,s,s,se,se,s,s,se,se,nw,se,ne,s,s,se,se,se,se,se,s,se,ne,se,se,s,ne,se,sw,se,se,se,se,se,nw,se,se,se,se,se,se,se,s,ne,n,sw,ne,se,se,se,se,se,ne,se,se,se,se,se,se,se,se,se,n,se,s,s,se,se,sw,nw,s,se,se,ne,se,se,ne,s,se,se,se,se,se,se,se,se,n,se,se,se,se,se,se,ne,se,ne,nw,se,se,ne,nw,nw,se,se,se,se,sw,se,se,sw,n,se,se,sw,se,se,se,se,nw,se,se,se,se,se,nw,sw,ne,ne,ne,se,ne,ne,nw,se,se,nw,se,se,se,se,se,ne,se,s,se,se,s,ne,se,ne,se,se,se,ne,s,se,ne,ne,ne,ne,se,n,se,se,se,se,ne,se,n,ne,se,se,se,ne,sw,nw,nw,ne,se,ne,se,se,se,n,se,ne,se,se,se,se,ne,se,ne,n,se,se,ne,nw,ne,ne,se,se,n,se,se,s,se,sw,ne,ne,ne,se,se,se,ne,ne,se,n,ne,ne,se,ne,ne,ne,se,ne,sw,n,ne,s,se,se,se,sw,ne,se,se,se,sw,ne,se,ne,ne,ne,sw,ne,ne,s,ne,s,ne,se,ne,ne,se,se,se,nw,ne,ne,ne,se,ne,se,se,ne,ne,ne,se,sw,ne,ne,ne,ne,se,ne,sw,ne,sw,ne,n,nw,sw,ne,ne,ne,sw,ne,se,sw,n,ne,ne,se,n,se,ne,n,ne,se,ne,nw,ne,ne,s,n,se,ne,nw,ne,se,ne,ne,ne,se,ne,se,se,ne,ne,ne,se,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,se,nw,ne,ne,ne,ne,ne,ne,ne,se,se,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,ne,ne,nw,n,n,ne,nw,ne,ne,sw,se,ne,s,ne,nw,ne,nw,ne,ne,ne,ne,ne,ne,ne,n,n,ne,n,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,n,n,ne,s,ne,ne,ne,nw,se,ne,nw,nw,ne,n,n,ne,ne,nw,ne,n,ne,sw,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,n,ne,ne,ne,ne,ne,n,n,ne,ne,se,sw,ne,n,ne,n,ne,ne,sw,ne,ne,n,ne,ne,se,sw,ne,ne,ne,s,n,n,s,ne,n,se,ne,ne,sw,s,ne,nw,n,n,ne,nw,ne,n,n,s,s,n,ne,ne,n,n,nw,ne,n,ne,ne,ne,ne,n,s,n,se,sw,se,ne,ne,ne,n,ne,ne,ne,n,nw,ne,n,n,ne,nw,ne,ne,sw,n,n,se,ne,n,ne,nw,se,ne,ne,ne,n,ne,ne,n,ne,ne,ne,ne,n,ne,ne,s,n,s,nw,n,n,nw,ne,ne,ne,s,n,s,ne,ne,ne,n,se,ne,ne,nw,n,n,n,ne,s,sw,n,ne,n,n,sw,n,ne,n,ne,n,sw,ne,ne,ne,sw,n,ne,ne,sw,ne,ne,n,n,se,ne,ne,s,ne,ne,n,nw,s,n,n,ne,nw,sw,ne,n,ne,ne,n,ne,n,se,n,ne,sw,sw,n,n,n,ne,ne,n,ne,n,s,ne,se,ne,nw,n,n,n,n,se,nw,ne,n,n,n,n,nw,nw,ne,n,se,ne,n,n,n,ne,n,ne,ne,ne,sw,n,s,n,n,n,ne,se,n,n,ne,ne,ne,sw,ne,ne,n,n,n,n,n,n,ne,ne,n,s,n,n,n,n,ne,ne,ne,n,n,se,nw,n,n,n,n,s,n,ne,n,n,n,n,n,n,n,n,sw,n,n,ne,n,n,n,s,ne,nw,n,nw,sw,n,n,n,n,s,n,n,ne,n,n,n,n,n,n,n,s,s,n,n,n,ne,n,s,ne,n,se,n,n,n,sw,n,n,n,ne,n,n,n,n,sw,se,n,sw,n,n,n,sw,ne,s,n,n,sw,s,se,n,n,n,n,ne,n,n,n,n,se,n,n,n,n,n,n,se,n,sw,n,n,n,nw,s,sw,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,sw,n,n,se,n,nw,se,n,sw,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,n,sw,n,nw,ne,n,n,n,n,n,n,n,nw,n,n,sw,n,n,n,n,n,n,n,n,ne,n,s,n,n,n,n,ne,n,s,ne,n,n,n,nw,n,n,n,n,n,se,nw,n,nw,sw,n,n,ne,n,n,n,n,nw,n,n,n,nw,n,n,nw,n,n,n,sw,ne,n,n,s,n,n,n,nw,n,ne,n,nw,n,n,nw,nw,n,nw,nw,n,n,n,nw,sw,n,n,nw,sw,sw,n,nw,n,s,nw,n,s,nw,nw,nw,nw,n,se,n,n,nw,sw,nw,n,nw,n,ne,n,n,nw,nw,n,n,nw,nw,ne,nw,se,nw,nw,sw,n,n,n,sw,sw,n,n,n,n,nw,n,nw,nw,n,nw,n,nw,s,n,n,nw,nw,n,n,nw,n,sw,nw,nw,n,n,nw,nw,s,n,n,n,n,s,nw,n,n,n,n,n,nw,n,n,nw,n,nw,n,n,n,nw,n,n,nw,ne,nw,nw,n,nw,nw,n,n,nw,n,nw,ne,n,nw,n,n,nw,nw,nw,ne,nw,nw,n,n,n,se,ne,n,nw,n,n,n,n,nw,nw,n,nw,n,n,s,n,n,n,n,nw,n,nw,nw,se,n,nw,n,n,nw,nw,nw,nw,n,n,n,s,nw,nw,nw,ne,s,nw,nw,nw,n,nw,nw,sw,nw,n,nw,nw,n,nw,nw,n,nw,sw,n,n,n,n,nw,nw,nw,n,n,n,n,nw,n,n,ne,n,nw,nw,nw,ne,ne,n,n,nw,nw,ne,n,nw,nw,nw,nw,n,n,n,nw,nw,n,n,n,ne,nw,nw,nw,se,n,n,nw,n,nw,n,nw,nw,n,s,nw,n,nw,nw,nw,nw,nw,ne,nw,nw,n,nw,n,n,n,nw,n,n,ne,nw,n,n,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,se,n,nw,nw,nw,nw,nw,nw,s,nw,n,nw,n,nw,nw,nw,nw,nw,se,s,nw,se,nw,n,ne,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,n,ne,nw,se,n,nw,nw,nw,nw,sw,n,nw,nw,n,nw,n,nw,nw,ne,n,nw,n,ne,se,n,sw,nw,ne,nw,sw,nw,ne,n,nw,ne,se,nw,nw,nw,nw,nw,ne,nw,n,nw,s,nw,nw,nw,ne,nw,nw,nw,nw,s,nw,n,sw,s,nw,se,nw,ne,nw,n,nw,sw,nw,n,nw,nw,sw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,s,s,nw,nw,nw,se,nw,nw,nw,nw,sw,nw,nw,n,nw,n,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,s,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,sw,nw,nw,nw,nw,nw,s,nw,sw,nw,nw,nw,se,nw,nw,sw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,n,nw,sw,n,nw,nw,se,nw,sw,se,sw,nw,sw,n,nw,nw,nw,ne,nw,nw,nw,se,nw,ne,ne,nw,nw,nw,nw,nw,s,nw,ne,n,nw,ne,nw,sw,nw,nw,sw,nw,se,nw,nw,ne,nw,ne,nw,sw,sw,nw,nw,nw,nw,nw,sw,nw,nw,nw,se,sw,sw,nw,s,sw,nw,nw,nw,nw,ne,nw,ne,nw,nw,sw,nw,nw,nw,sw,nw,nw,nw,ne,sw,s,nw,ne,nw,nw,se,se,n,nw,nw,sw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,n,nw,sw,nw,s,nw,sw,nw,nw,nw,sw,nw,nw,se,nw,n,nw,nw,ne,sw,nw,ne,nw,se,s,nw,nw,n,n,nw,nw,nw,nw,ne,se,sw,nw,nw,nw,nw,se,nw,nw,nw,sw,nw,nw,s,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,sw,nw,sw,nw,nw,nw,ne,nw,sw,nw,sw,nw,sw,nw,nw,nw,sw,ne,sw,nw,sw,nw,se,nw,se,nw,nw,n,sw,nw,nw,nw,nw,sw,sw,nw,sw,nw,nw,nw,nw,nw,sw,sw,nw,nw,nw,sw,nw,nw,nw,nw,ne,nw,n,nw,sw,sw,nw,nw,nw,nw,nw,sw,nw,sw,nw,sw,sw,nw,nw,sw,sw,nw,nw,nw,ne,sw,ne,sw,sw,nw,nw,nw,nw,nw,nw,nw,sw,se,nw,nw,sw,sw,nw,nw,s,nw,nw,sw,nw,nw,nw,n,sw,nw,sw,sw,n,nw,nw,nw,sw,sw,nw,s,nw,nw,nw,sw,nw,n,nw,nw,nw,nw,n,nw,nw,nw,sw,nw,nw,nw,se,nw,sw,nw,sw,sw,sw,nw,ne,s,sw,ne,nw,nw,s,nw,sw,nw,s,nw,sw,sw,sw,s,nw,se,nw,nw,nw,sw,sw,sw,n,nw,sw,nw,nw,nw,nw,nw,nw,sw,n,nw,nw,nw,s,nw,nw,nw,nw,sw,sw,sw,nw,nw,sw,sw,nw,nw,sw,nw,sw,nw,sw,sw,sw,sw,sw,nw,sw,s,nw,nw,sw,sw,sw,sw,nw,sw,sw,nw,sw,ne,nw,sw,nw,nw,sw,nw,se,nw,n,sw,nw,s,nw,ne,nw,se,sw,sw,sw,n,ne,sw,nw,sw,nw,sw,se,s,sw,sw,nw,sw,sw,nw,nw,sw,nw,sw,nw,sw,nw,sw,sw,sw,ne,sw,nw,sw,nw,nw,sw,nw,n,nw,sw,n,nw,nw,sw,sw,se,nw,nw,sw,nw,sw,sw,sw,sw,nw,se,sw,sw,nw,nw,sw,sw,sw,nw,sw,nw,nw,nw,sw,n,nw,sw,n,nw,s,nw,nw,sw,s,sw,sw,nw,sw,sw,sw,nw,ne,sw,ne,sw,s,sw,sw,nw,sw,nw,sw,sw,nw,nw,nw,sw,sw,ne,sw,n,sw,sw,sw,n,sw,sw,nw,sw,n,n,sw,sw,sw,nw,s,sw,sw,sw,sw,nw,nw,sw,nw,sw,sw,s,sw,nw,sw,sw,sw,s,sw,sw,n,nw,sw,n,sw,sw,s,nw,se,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,nw,sw,sw,sw,s,ne,se,nw,sw,sw,sw,nw,s,nw,nw,sw,sw,s,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,nw,nw,nw,nw,nw,nw,s,nw,sw,sw,sw,sw,sw,n,sw,se,sw,sw,s,sw,sw,sw,sw,sw,s,s,sw,s,ne,sw,sw,s,sw,sw,nw,sw,sw,sw,sw,ne,se,sw,sw,sw,sw,n,sw,sw,sw,sw,s,nw,se,nw,nw,sw,sw,nw,se,nw,se,sw,sw,sw,nw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,se,nw,nw,sw,sw,sw,n,s,sw,nw,nw,se,sw,ne,sw,n,s,sw,sw,nw,sw,sw,sw,sw,sw,ne,sw,sw,se,sw,sw,sw,sw,nw,sw,sw,ne,sw,nw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,se,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,se,sw,sw,se,sw,sw,ne
diff --git a/2017/inputs/day_12.txt b/2017/inputs/day_12.txt
new file mode 100644
index 0000000..80e4ce6
--- /dev/null
+++ b/2017/inputs/day_12.txt
@@ -0,0 +1,2000 @@
+0 <-> 199, 1774
+1 <-> 350, 1328, 1920
+2 <-> 477, 984, 1419
+3 <-> 1465, 1568
+4 <-> 359, 1047, 1215, 1580, 1969
+5 <-> 613
+6 <-> 49, 617, 1213
+7 <-> 1263
+8 <-> 410
+9 <-> 1224
+10 <-> 1157
+11 <-> 304, 1168, 1875
+12 <-> 868, 891, 1369, 1712
+13 <-> 958, 1371
+14 <-> 1814
+15 <-> 261, 556
+16 <-> 830, 1646, 1901, 1933
+17 <-> 962, 1778
+18 <-> 109, 1229
+19 <-> 239, 1070, 1886, 1930
+20 <-> 327, 1307, 1801, 1905
+21 <-> 943, 1950
+22 <-> 1310
+23 <-> 659, 917
+24 <-> 373
+25 <-> 369
+26 <-> 947, 1023
+27 <-> 338, 1901
+28 <-> 1691
+29 <-> 132, 1219, 1699, 1962
+30 <-> 424, 822, 1419
+31 <-> 1444, 1464
+32 <-> 702, 1517
+33 <-> 1639
+34 <-> 909
+35 <-> 690, 1655
+36 <-> 988, 1149, 1166
+37 <-> 649, 1300, 1441, 1699
+38 <-> 1848
+39 <-> 382
+40 <-> 827, 1203, 1510
+41 <-> 714, 1056, 1184
+42 <-> 1018, 1873
+43 <-> 214
+44 <-> 670, 957
+45 <-> 45
+46 <-> 1195
+47 <-> 559, 1504
+48 <-> 1958
+49 <-> 6
+50 <-> 50, 1248
+51 <-> 1151
+52 <-> 52, 521, 1791
+53 <-> 304
+54 <-> 601
+55 <-> 1328
+56 <-> 939
+57 <-> 1583, 1995
+58 <-> 1422, 1694
+59 <-> 395, 1233
+60 <-> 862, 1811
+61 <-> 345, 1694
+62 <-> 62, 276
+63 <-> 280
+64 <-> 199
+65 <-> 117, 930
+66 <-> 364, 697
+67 <-> 1043
+68 <-> 287, 504, 1554
+69 <-> 498, 706
+70 <-> 77, 333, 713, 972, 1299
+71 <-> 1643
+72 <-> 694
+73 <-> 1381
+74 <-> 955, 1790
+75 <-> 1691, 1743
+76 <-> 76, 638, 1429
+77 <-> 70
+78 <-> 1513
+79 <-> 1397, 1716
+80 <-> 897
+81 <-> 968, 1841
+82 <-> 649
+83 <-> 522
+84 <-> 84, 125, 399, 498
+85 <-> 880, 1554, 1888
+86 <-> 86
+87 <-> 579, 1947
+88 <-> 470, 1451, 1750
+89 <-> 805, 1434
+90 <-> 453
+91 <-> 1208
+92 <-> 688, 1358, 1746
+93 <-> 357, 647
+94 <-> 234, 1270, 1520
+95 <-> 620, 1454
+96 <-> 390, 869, 919
+97 <-> 693, 1783
+98 <-> 259, 529, 782, 1018
+99 <-> 678
+100 <-> 1215
+101 <-> 459, 887
+102 <-> 888, 1135
+103 <-> 1006
+104 <-> 1375, 1422
+105 <-> 1657, 1730
+106 <-> 216, 1434
+107 <-> 333
+108 <-> 468, 1654
+109 <-> 18, 1791
+110 <-> 372
+111 <-> 111, 861, 1383
+112 <-> 1359, 1937
+113 <-> 414, 736, 1446
+114 <-> 426, 1457
+115 <-> 1605, 1672
+116 <-> 116, 713, 1584, 1602
+117 <-> 65
+118 <-> 1611, 1897
+119 <-> 541, 1569
+120 <-> 412, 787
+121 <-> 1344
+122 <-> 698, 752, 1693
+123 <-> 1173, 1576, 1634, 1802
+124 <-> 735
+125 <-> 84, 1032
+126 <-> 126, 225, 332
+127 <-> 1350
+128 <-> 128, 319, 327, 1582
+129 <-> 129, 654, 1260
+130 <-> 1080, 1296, 1350
+131 <-> 131
+132 <-> 29, 856, 1064
+133 <-> 659, 1367, 1776
+134 <-> 648, 1147, 1450, 1910
+135 <-> 411
+136 <-> 353, 935, 1590
+137 <-> 228
+138 <-> 194, 452, 1746, 1794
+139 <-> 139, 494, 1635
+140 <-> 681
+141 <-> 1507
+142 <-> 1288
+143 <-> 845
+144 <-> 1516
+145 <-> 502, 1146, 1155, 1809
+146 <-> 146, 750
+147 <-> 1600
+148 <-> 1206
+149 <-> 829, 1457
+150 <-> 675, 915
+151 <-> 651, 1678
+152 <-> 888, 1503
+153 <-> 498, 960, 1515
+154 <-> 1468
+155 <-> 751
+156 <-> 528, 803, 1655
+157 <-> 1486, 1937
+158 <-> 590, 1876
+159 <-> 159, 185, 1287, 1550, 1588
+160 <-> 160, 548
+161 <-> 1303, 1364
+162 <-> 1855
+163 <-> 1181
+164 <-> 442
+165 <-> 490
+166 <-> 1105
+167 <-> 1121
+168 <-> 760, 1129
+169 <-> 747
+170 <-> 1890
+171 <-> 1644
+172 <-> 593, 665
+173 <-> 1092, 1869
+174 <-> 705
+175 <-> 1345, 1999
+176 <-> 234, 606
+177 <-> 557, 688
+178 <-> 373
+179 <-> 1376
+180 <-> 638
+181 <-> 1996
+182 <-> 1094, 1206, 1748
+183 <-> 931
+184 <-> 880
+185 <-> 159, 1058, 1704
+186 <-> 765, 1178, 1877
+187 <-> 732
+188 <-> 188
+189 <-> 189, 1871
+190 <-> 395, 1639
+191 <-> 441
+192 <-> 192, 1034
+193 <-> 494
+194 <-> 138, 995, 1308
+195 <-> 1024
+196 <-> 226, 1632, 1919
+197 <-> 786
+198 <-> 286, 758, 1852
+199 <-> 0, 64, 1646
+200 <-> 314
+201 <-> 459, 658
+202 <-> 321, 492, 599, 1081, 1460
+203 <-> 225
+204 <-> 331, 462, 600
+205 <-> 898
+206 <-> 734, 1321
+207 <-> 558, 991
+208 <-> 397
+209 <-> 1145, 1886
+210 <-> 1343, 1925
+211 <-> 840, 1409
+212 <-> 1308
+213 <-> 1813
+214 <-> 43, 282
+215 <-> 1270
+216 <-> 106, 836, 1275, 1507
+217 <-> 312
+218 <-> 290, 386, 639, 1920
+219 <-> 784, 1001
+220 <-> 220, 322
+221 <-> 1681
+222 <-> 1616, 1653
+223 <-> 436, 1272, 1625
+224 <-> 1398, 1696
+225 <-> 126, 203, 1182
+226 <-> 196, 1655
+227 <-> 623
+228 <-> 137, 923
+229 <-> 253, 1387
+230 <-> 1374
+231 <-> 389, 1499
+232 <-> 442
+233 <-> 473, 1406
+234 <-> 94, 176
+235 <-> 235
+236 <-> 607, 838, 1487, 1856
+237 <-> 818
+238 <-> 387, 628
+239 <-> 19
+240 <-> 818
+241 <-> 1027, 1524
+242 <-> 1085, 1971
+243 <-> 1942
+244 <-> 299, 390, 916
+245 <-> 906
+246 <-> 246, 534, 763, 1427
+247 <-> 531, 1675
+248 <-> 336, 1832
+249 <-> 1497
+250 <-> 1836
+251 <-> 1309
+252 <-> 581, 1104
+253 <-> 229, 877, 1743
+254 <-> 254, 621
+255 <-> 831, 866, 874
+256 <-> 1942
+257 <-> 906
+258 <-> 1224
+259 <-> 98, 316, 419, 718, 1519
+260 <-> 1223, 1516, 1547, 1845, 1944
+261 <-> 15, 278, 1607, 1808
+262 <-> 1112, 1172
+263 <-> 424
+264 <-> 680
+265 <-> 1968
+266 <-> 804, 1252
+267 <-> 1739
+268 <-> 538, 546
+269 <-> 1265
+270 <-> 270
+271 <-> 1150
+272 <-> 272
+273 <-> 1208, 1537
+274 <-> 1427
+275 <-> 1349, 1829
+276 <-> 62, 906
+277 <-> 461, 634, 1887
+278 <-> 261, 1224, 1904
+279 <-> 303, 537
+280 <-> 63, 280, 926, 931
+281 <-> 862, 1041, 1119, 1863
+282 <-> 214, 488, 644
+283 <-> 646, 1124
+284 <-> 860, 1759
+285 <-> 746
+286 <-> 198
+287 <-> 68, 1045
+288 <-> 332, 1133, 1277, 1628, 1744, 1770, 1934
+289 <-> 1578, 1766
+290 <-> 218, 439, 1661
+291 <-> 596, 1377, 1620
+292 <-> 700, 848, 1099
+293 <-> 293, 1592, 1938
+294 <-> 653, 1948
+295 <-> 1505, 1936
+296 <-> 625, 925
+297 <-> 1105, 1185
+298 <-> 298, 544, 1444
+299 <-> 244, 933, 1012
+300 <-> 300, 1461, 1883
+301 <-> 880, 1698
+302 <-> 1221
+303 <-> 279, 375
+304 <-> 11, 53, 967, 1362
+305 <-> 777
+306 <-> 344
+307 <-> 582, 770
+308 <-> 792, 1895
+309 <-> 539
+310 <-> 390, 1482
+311 <-> 441, 1294
+312 <-> 217, 743
+313 <-> 1522
+314 <-> 200, 502, 835, 1084, 1134
+315 <-> 1970
+316 <-> 259
+317 <-> 1302, 1437
+318 <-> 365
+319 <-> 128, 976
+320 <-> 1056, 1466, 1778
+321 <-> 202
+322 <-> 220, 1431
+323 <-> 838, 1465, 1895
+324 <-> 443
+325 <-> 1056
+326 <-> 463, 1741, 1761
+327 <-> 20, 128, 681, 1797
+328 <-> 328, 348
+329 <-> 378, 1738
+330 <-> 459
+331 <-> 204, 331
+332 <-> 126, 288
+333 <-> 70, 107, 1747
+334 <-> 517, 614
+335 <-> 1259
+336 <-> 248, 550, 1485
+337 <-> 337
+338 <-> 27, 1212, 1264
+339 <-> 430, 963
+340 <-> 769
+341 <-> 341
+342 <-> 593, 718, 895
+343 <-> 569
+344 <-> 306, 1440, 1650, 1742
+345 <-> 61, 1006, 1664
+346 <-> 448, 1928
+347 <-> 1022, 1052
+348 <-> 328, 1232
+349 <-> 1232
+350 <-> 1, 526, 1086, 1821
+351 <-> 584
+352 <-> 518, 686, 1324, 1437
+353 <-> 136, 936
+354 <-> 1470
+355 <-> 1173, 1814
+356 <-> 698
+357 <-> 93
+358 <-> 737, 986, 1169
+359 <-> 4
+360 <-> 363
+361 <-> 417, 841
+362 <-> 928
+363 <-> 360, 1751
+364 <-> 66, 364, 1596
+365 <-> 318, 1766
+366 <-> 366
+367 <-> 367
+368 <-> 1897
+369 <-> 25, 369, 1460
+370 <-> 370
+371 <-> 1568
+372 <-> 110, 582
+373 <-> 24, 178, 1924
+374 <-> 374
+375 <-> 303
+376 <-> 1331, 1990
+377 <-> 388, 601, 837
+378 <-> 329
+379 <-> 623
+380 <-> 671
+381 <-> 938
+382 <-> 39, 1458
+383 <-> 383, 1490, 1763, 1844
+384 <-> 832
+385 <-> 745, 1673
+386 <-> 218, 779
+387 <-> 238
+388 <-> 377, 1817
+389 <-> 231, 656, 1038, 1960
+390 <-> 96, 244, 310, 721, 1094, 1501
+391 <-> 438, 819, 1870
+392 <-> 697
+393 <-> 443, 1275, 1463
+394 <-> 480
+395 <-> 59, 190, 1117, 1997
+396 <-> 595
+397 <-> 208, 397, 1727
+398 <-> 1153
+399 <-> 84
+400 <-> 825, 1693
+401 <-> 812
+402 <-> 1191
+403 <-> 1446, 1820
+404 <-> 442, 871, 1637
+405 <-> 426, 1067
+406 <-> 460, 1290
+407 <-> 1951
+408 <-> 1335, 1391, 1897
+409 <-> 984, 1217
+410 <-> 8, 1607
+411 <-> 135, 411, 454, 1393
+412 <-> 120
+413 <-> 1208
+414 <-> 113
+415 <-> 415, 1803
+416 <-> 428
+417 <-> 361
+418 <-> 1129
+419 <-> 259
+420 <-> 628
+421 <-> 1485
+422 <-> 1110, 1785
+423 <-> 1418
+424 <-> 30, 263
+425 <-> 1497
+426 <-> 114, 405, 780
+427 <-> 427
+428 <-> 416, 782
+429 <-> 429
+430 <-> 339, 1513
+431 <-> 886, 1408
+432 <-> 586, 1725
+433 <-> 889, 1753, 1881
+434 <-> 1078, 1120
+435 <-> 660, 1194, 1662
+436 <-> 223, 1332
+437 <-> 1487
+438 <-> 391
+439 <-> 290
+440 <-> 1828
+441 <-> 191, 311, 1003, 1561, 1702
+442 <-> 164, 232, 404
+443 <-> 324, 393
+444 <-> 1215, 1251
+445 <-> 792
+446 <-> 1015, 1392
+447 <-> 777
+448 <-> 346, 1097
+449 <-> 1117
+450 <-> 1395
+451 <-> 1414, 1845
+452 <-> 138
+453 <-> 90, 453
+454 <-> 411
+455 <-> 1801
+456 <-> 456, 791, 902, 1111
+457 <-> 457, 1075, 1384
+458 <-> 770, 1600
+459 <-> 101, 201, 330, 1108
+460 <-> 406, 1529
+461 <-> 277, 839, 1552
+462 <-> 204
+463 <-> 326, 1899
+464 <-> 1098
+465 <-> 764, 1630, 1779
+466 <-> 627
+467 <-> 904
+468 <-> 108, 1849
+469 <-> 469, 603, 780
+470 <-> 88, 1276, 1533
+471 <-> 1492
+472 <-> 472, 1048, 1409, 1518, 1758
+473 <-> 233, 1413, 1826
+474 <-> 780
+475 <-> 1005, 1968
+476 <-> 809
+477 <-> 2
+478 <-> 753
+479 <-> 479, 1296, 1615
+480 <-> 394, 775, 1623
+481 <-> 774, 1604
+482 <-> 763
+483 <-> 522, 591, 1344
+484 <-> 894, 1219
+485 <-> 507, 1114, 1250, 1351
+486 <-> 1099, 1879
+487 <-> 487
+488 <-> 282, 1164, 1189
+489 <-> 900, 1889
+490 <-> 165, 918, 1007
+491 <-> 1800
+492 <-> 202
+493 <-> 615, 899, 1200, 1326
+494 <-> 139, 193
+495 <-> 704, 1988
+496 <-> 496
+497 <-> 1149, 1216
+498 <-> 69, 84, 153
+499 <-> 1125, 1149
+500 <-> 642
+501 <-> 524, 1176
+502 <-> 145, 314
+503 <-> 1330, 1626
+504 <-> 68, 699
+505 <-> 672
+506 <-> 1083
+507 <-> 485, 1743
+508 <-> 520, 1236, 1296
+509 <-> 1676
+510 <-> 875, 1066
+511 <-> 511
+512 <-> 512, 1240
+513 <-> 705, 812
+514 <-> 1758
+515 <-> 1165, 1168
+516 <-> 811
+517 <-> 334, 1132, 1339
+518 <-> 352, 1674
+519 <-> 824, 1396, 1659
+520 <-> 508
+521 <-> 52, 915
+522 <-> 83, 483, 1637
+523 <-> 1317
+524 <-> 501
+525 <-> 525
+526 <-> 350, 850, 930
+527 <-> 527, 1338, 1449
+528 <-> 156
+529 <-> 98
+530 <-> 691, 1175, 1505
+531 <-> 247, 785, 1389, 1623
+532 <-> 1159
+533 <-> 1152, 1297
+534 <-> 246
+535 <-> 1144, 1491, 1622, 1935
+536 <-> 708
+537 <-> 279, 1656
+538 <-> 268, 538, 1756
+539 <-> 309, 802
+540 <-> 1239
+541 <-> 119, 1679, 1741
+542 <-> 1204
+543 <-> 642, 1926
+544 <-> 298
+545 <-> 1971
+546 <-> 268
+547 <-> 1465, 1613, 1614
+548 <-> 160
+549 <-> 820
+550 <-> 336
+551 <-> 1733
+552 <-> 552, 1563
+553 <-> 1654
+554 <-> 554, 1641, 1665
+555 <-> 555
+556 <-> 15
+557 <-> 177, 1204
+558 <-> 207, 1004
+559 <-> 47, 1297
+560 <-> 1189, 1709
+561 <-> 1013, 1709
+562 <-> 762, 912
+563 <-> 563
+564 <-> 585
+565 <-> 1333, 1494
+566 <-> 566, 938
+567 <-> 894
+568 <-> 586, 1397
+569 <-> 343, 1572
+570 <-> 704, 1220, 1459
+571 <-> 1451
+572 <-> 651, 846, 909
+573 <-> 1881
+574 <-> 1866
+575 <-> 1379
+576 <-> 1060, 1210
+577 <-> 1837
+578 <-> 1346
+579 <-> 87
+580 <-> 1509
+581 <-> 252, 1548
+582 <-> 307, 372
+583 <-> 624, 1599, 1753, 1908
+584 <-> 351, 774
+585 <-> 564, 977
+586 <-> 432, 568, 773, 1789
+587 <-> 826
+588 <-> 1854
+589 <-> 719, 845, 1214
+590 <-> 158, 1259
+591 <-> 483
+592 <-> 743, 898
+593 <-> 172, 342, 852, 943, 1053
+594 <-> 594
+595 <-> 396, 928
+596 <-> 291, 596
+597 <-> 597
+598 <-> 1980
+599 <-> 202, 1764
+600 <-> 204
+601 <-> 54, 377, 1340
+602 <-> 1718, 1866
+603 <-> 469, 789
+604 <-> 1006, 1033, 1626
+605 <-> 1535
+606 <-> 176
+607 <-> 236, 911, 1218
+608 <-> 1193, 1825
+609 <-> 1657
+610 <-> 733, 841
+611 <-> 747, 1892
+612 <-> 1098, 1196, 1267
+613 <-> 5, 1372
+614 <-> 334, 1492
+615 <-> 493, 798
+616 <-> 1025, 1940
+617 <-> 6, 666, 1155
+618 <-> 762, 1621, 1895
+619 <-> 1187
+620 <-> 95, 1761
+621 <-> 254
+622 <-> 784, 1476
+623 <-> 227, 379, 1081
+624 <-> 583
+625 <-> 296, 1222, 1882
+626 <-> 905
+627 <-> 466, 1692
+628 <-> 238, 420, 1004, 1412
+629 <-> 1532
+630 <-> 630
+631 <-> 977, 1092, 1458, 1713
+632 <-> 777, 1049, 1404
+633 <-> 994
+634 <-> 277
+635 <-> 635
+636 <-> 703, 1756
+637 <-> 840, 1585
+638 <-> 76, 180, 1373
+639 <-> 218, 639, 1835
+640 <-> 1559
+641 <-> 1800
+642 <-> 500, 543
+643 <-> 1808
+644 <-> 282
+645 <-> 1253, 1475
+646 <-> 283, 646, 864
+647 <-> 93, 1508
+648 <-> 134, 956, 1762
+649 <-> 37, 82
+650 <-> 1480, 1916
+651 <-> 151, 572, 1357
+652 <-> 1261
+653 <-> 294, 653
+654 <-> 129, 1139, 1176
+655 <-> 1251, 1656
+656 <-> 389
+657 <-> 1604
+658 <-> 201, 1208
+659 <-> 23, 133, 1868
+660 <-> 435
+661 <-> 1634
+662 <-> 1667, 1701
+663 <-> 974
+664 <-> 664, 1167
+665 <-> 172, 1370
+666 <-> 617
+667 <-> 1824
+668 <-> 952, 1605
+669 <-> 1822
+670 <-> 44, 670
+671 <-> 380, 1145, 1693, 1906
+672 <-> 505, 693
+673 <-> 1610
+674 <-> 1249, 1302
+675 <-> 150, 777
+676 <-> 1675
+677 <-> 910, 1282
+678 <-> 99, 1004
+679 <-> 679
+680 <-> 264, 917, 1137, 1687
+681 <-> 140, 327, 746
+682 <-> 682
+683 <-> 794, 1315
+684 <-> 1000, 1342
+685 <-> 1111, 1348, 1523, 1932
+686 <-> 352
+687 <-> 979, 1667
+688 <-> 92, 177
+689 <-> 937, 1939
+690 <-> 35, 1608
+691 <-> 530, 691
+692 <-> 1871
+693 <-> 97, 672
+694 <-> 72, 694
+695 <-> 1076
+696 <-> 1954
+697 <-> 66, 392, 1892
+698 <-> 122, 356, 698
+699 <-> 504, 1470
+700 <-> 292, 1407
+701 <-> 1231, 1327
+702 <-> 32
+703 <-> 636, 1083, 1210
+704 <-> 495, 570
+705 <-> 174, 513, 1332
+706 <-> 69, 1088
+707 <-> 1036, 1867
+708 <-> 536, 805, 1958
+709 <-> 709
+710 <-> 915, 1578
+711 <-> 711, 1478
+712 <-> 813, 927
+713 <-> 70, 116, 1469, 1539
+714 <-> 41
+715 <-> 840, 1473, 1562, 1705
+716 <-> 716
+717 <-> 949, 1864
+718 <-> 259, 342, 1557, 1853
+719 <-> 589, 781, 802
+720 <-> 1125
+721 <-> 390, 878
+722 <-> 1026
+723 <-> 1039, 1467
+724 <-> 1535
+725 <-> 883
+726 <-> 1832, 1917
+727 <-> 1245
+728 <-> 1291
+729 <-> 1203
+730 <-> 824
+731 <-> 1984
+732 <-> 187, 1214
+733 <-> 610, 1079, 1198
+734 <-> 206, 872, 1479, 1855
+735 <-> 124, 1371
+736 <-> 113, 736
+737 <-> 358, 1426
+738 <-> 974, 1024, 1717, 1842
+739 <-> 1489
+740 <-> 1634
+741 <-> 873, 1695
+742 <-> 1700
+743 <-> 312, 592, 1493
+744 <-> 948, 1306, 1400
+745 <-> 385, 1029, 1315, 1474
+746 <-> 285, 681, 793
+747 <-> 169, 611, 814, 1548
+748 <-> 748
+749 <-> 1134, 1498
+750 <-> 146
+751 <-> 155, 783, 1856
+752 <-> 122, 1417
+753 <-> 478, 1505
+754 <-> 810, 1742, 1955
+755 <-> 1735, 1847
+756 <-> 978, 1095
+757 <-> 1153, 1730
+758 <-> 198, 1476
+759 <-> 759
+760 <-> 168
+761 <-> 1496
+762 <-> 562, 618
+763 <-> 246, 482, 1258
+764 <-> 465
+765 <-> 186
+766 <-> 1448
+767 <-> 893, 896, 1019
+768 <-> 1730
+769 <-> 340, 1043, 1065
+770 <-> 307, 458, 1453
+771 <-> 1168
+772 <-> 911
+773 <-> 586
+774 <-> 481, 584, 774, 1148
+775 <-> 480, 1485, 1894
+776 <-> 926
+777 <-> 305, 447, 632, 675
+778 <-> 1690
+779 <-> 386
+780 <-> 426, 469, 474
+781 <-> 719, 1543
+782 <-> 98, 428, 903
+783 <-> 751, 1558
+784 <-> 219, 622
+785 <-> 531
+786 <-> 197, 911, 1312
+787 <-> 120, 880
+788 <-> 1089, 1487
+789 <-> 603, 844, 1681, 1731
+790 <-> 790, 1126
+791 <-> 456, 1363
+792 <-> 308, 445
+793 <-> 746
+794 <-> 683, 951
+795 <-> 1732, 1986
+796 <-> 1210, 1878
+797 <-> 804
+798 <-> 615
+799 <-> 1651
+800 <-> 851, 860, 1907
+801 <-> 1110, 1537, 1773
+802 <-> 539, 719
+803 <-> 156, 1528
+804 <-> 266, 797, 1549
+805 <-> 89, 708, 962
+806 <-> 1429
+807 <-> 1800
+808 <-> 873, 1421
+809 <-> 476, 809
+810 <-> 754
+811 <-> 516, 965
+812 <-> 401, 513
+813 <-> 712, 1023
+814 <-> 747
+815 <-> 1145
+816 <-> 1413
+817 <-> 1235
+818 <-> 237, 240, 1506
+819 <-> 391, 857
+820 <-> 549, 1162
+821 <-> 1410, 1607
+822 <-> 30, 1485
+823 <-> 1445, 1454
+824 <-> 519, 730, 1824
+825 <-> 400, 1381, 1472
+826 <-> 587, 1040, 1198, 1618
+827 <-> 40
+828 <-> 1870
+829 <-> 149
+830 <-> 16
+831 <-> 255
+832 <-> 384, 1890, 1913
+833 <-> 1529
+834 <-> 834
+835 <-> 314
+836 <-> 216, 1166
+837 <-> 377, 988
+838 <-> 236, 323
+839 <-> 461, 1825
+840 <-> 211, 637, 715, 1710
+841 <-> 361, 610, 841, 1815
+842 <-> 1669
+843 <-> 874, 1468
+844 <-> 789
+845 <-> 143, 589, 1053
+846 <-> 572
+847 <-> 1285
+848 <-> 292
+849 <-> 849
+850 <-> 526
+851 <-> 800, 1368, 1497
+852 <-> 593, 1798
+853 <-> 1339, 1593, 1749
+854 <-> 1445, 1787
+855 <-> 1026, 1356
+856 <-> 132
+857 <-> 819
+858 <-> 1511
+859 <-> 1191
+860 <-> 284, 800, 1619
+861 <-> 111, 1266
+862 <-> 60, 281
+863 <-> 1605
+864 <-> 646
+865 <-> 873
+866 <-> 255, 924
+867 <-> 871, 1707
+868 <-> 12
+869 <-> 96, 1278
+870 <-> 1307
+871 <-> 404, 867, 1482
+872 <-> 734, 1200
+873 <-> 741, 808, 865, 873
+874 <-> 255, 843, 1201
+875 <-> 510, 1325, 1797
+876 <-> 1504, 1825
+877 <-> 253
+878 <-> 721
+879 <-> 948, 1291, 1847
+880 <-> 85, 184, 301, 787, 1503, 1617
+881 <-> 1688
+882 <-> 882
+883 <-> 725, 1582, 1874
+884 <-> 1352
+885 <-> 885, 1974
+886 <-> 431, 1650
+887 <-> 101
+888 <-> 102, 152
+889 <-> 433, 1016
+890 <-> 890
+891 <-> 12
+892 <-> 1402, 1923
+893 <-> 767
+894 <-> 484, 567
+895 <-> 342, 1123, 1158, 1648
+896 <-> 767
+897 <-> 80, 986, 1418
+898 <-> 205, 592, 1019
+899 <-> 493, 1053
+900 <-> 489
+901 <-> 901
+902 <-> 456
+903 <-> 782
+904 <-> 467, 904, 1924
+905 <-> 626, 1881
+906 <-> 245, 257, 276
+907 <-> 907, 1101, 1826
+908 <-> 908, 1230
+909 <-> 34, 572, 1186
+910 <-> 677, 961
+911 <-> 607, 772, 786, 1196, 1405
+912 <-> 562
+913 <-> 1636
+914 <-> 1892, 1963
+915 <-> 150, 521, 710
+916 <-> 244
+917 <-> 23, 680, 1336
+918 <-> 490, 1483
+919 <-> 96
+920 <-> 1880
+921 <-> 921
+922 <-> 975, 1255
+923 <-> 228, 1202, 1452
+924 <-> 866
+925 <-> 296, 1270
+926 <-> 280, 776, 1170, 1788, 1970
+927 <-> 712
+928 <-> 362, 595, 1103
+929 <-> 929
+930 <-> 65, 526, 1256, 1500, 1722
+931 <-> 183, 280, 1484
+932 <-> 1737
+933 <-> 299
+934 <-> 1387, 1851
+935 <-> 136, 935, 1537, 1775
+936 <-> 353
+937 <-> 689, 1347
+938 <-> 381, 566
+939 <-> 56, 1762
+940 <-> 1559, 1860
+941 <-> 1504, 1671, 1723, 1724
+942 <-> 1293
+943 <-> 21, 593
+944 <-> 1335
+945 <-> 1650
+946 <-> 1556
+947 <-> 26
+948 <-> 744, 879
+949 <-> 717, 1604
+950 <-> 1201, 1322
+951 <-> 794
+952 <-> 668, 1371
+953 <-> 1272
+954 <-> 954
+955 <-> 74
+956 <-> 648, 1870
+957 <-> 44, 1769
+958 <-> 13, 1388, 1660
+959 <-> 959
+960 <-> 153
+961 <-> 910
+962 <-> 17, 805
+963 <-> 339, 1783
+964 <-> 1100
+965 <-> 811, 1677
+966 <-> 966
+967 <-> 304, 1029, 1269, 1910
+968 <-> 81, 1091
+969 <-> 1379, 1693
+970 <-> 1289
+971 <-> 971
+972 <-> 70
+973 <-> 973
+974 <-> 663, 738, 1005
+975 <-> 922
+976 <-> 319
+977 <-> 585, 631
+978 <-> 756, 1628
+979 <-> 687, 979
+980 <-> 1151, 1317
+981 <-> 1199, 1902
+982 <-> 1223
+983 <-> 1931
+984 <-> 2, 409
+985 <-> 985
+986 <-> 358, 897, 1564
+987 <-> 987, 1644
+988 <-> 36, 837
+989 <-> 1275
+990 <-> 990, 1295
+991 <-> 207, 1415
+992 <-> 1242, 1397, 1467, 1579
+993 <-> 1042, 1767
+994 <-> 633, 1595, 1813
+995 <-> 194
+996 <-> 1096, 1369
+997 <-> 1231, 1973
+998 <-> 1367
+999 <-> 999
+1000 <-> 684, 1078
+1001 <-> 219
+1002 <-> 1442
+1003 <-> 441
+1004 <-> 558, 628, 678
+1005 <-> 475, 974
+1006 <-> 103, 345, 604
+1007 <-> 490, 1274
+1008 <-> 1708, 1819
+1009 <-> 1009, 1118
+1010 <-> 1223, 1803
+1011 <-> 1867
+1012 <-> 299, 1923
+1013 <-> 561, 1187, 1477, 1926
+1014 <-> 1861
+1015 <-> 446, 1015, 1858
+1016 <-> 889
+1017 <-> 1435
+1018 <-> 42, 98
+1019 <-> 767, 898, 1764
+1020 <-> 1020
+1021 <-> 1666
+1022 <-> 347, 1022, 1310
+1023 <-> 26, 813, 1109, 1538, 1988
+1024 <-> 195, 738
+1025 <-> 616
+1026 <-> 722, 855, 1337, 1415
+1027 <-> 241, 1309
+1028 <-> 1028
+1029 <-> 745, 967
+1030 <-> 1577, 1689
+1031 <-> 1031
+1032 <-> 125
+1033 <-> 604, 1127, 1194
+1034 <-> 192
+1035 <-> 1992
+1036 <-> 707, 1509
+1037 <-> 1347
+1038 <-> 389
+1039 <-> 723, 1535
+1040 <-> 826, 1245, 1918
+1041 <-> 281
+1042 <-> 993
+1043 <-> 67, 769, 1142
+1044 <-> 1690
+1045 <-> 287
+1046 <-> 1561
+1047 <-> 4
+1048 <-> 472, 1703
+1049 <-> 632, 1816
+1050 <-> 1157, 1899
+1051 <-> 1818
+1052 <-> 347, 1904
+1053 <-> 593, 845, 899
+1054 <-> 1983
+1055 <-> 1599
+1056 <-> 41, 320, 325, 1567
+1057 <-> 1372, 1569
+1058 <-> 185
+1059 <-> 1112, 1939
+1060 <-> 576, 1314, 1557, 1751, 1752
+1061 <-> 1285
+1062 <-> 1162, 1338, 1739
+1063 <-> 1291
+1064 <-> 132
+1065 <-> 769, 1317
+1066 <-> 510
+1067 <-> 405, 1452, 1953
+1068 <-> 1200
+1069 <-> 1069
+1070 <-> 19
+1071 <-> 1361, 1382
+1072 <-> 1307, 1534
+1073 <-> 1282
+1074 <-> 1323, 1653
+1075 <-> 457
+1076 <-> 695, 1703
+1077 <-> 1180
+1078 <-> 434, 1000
+1079 <-> 733
+1080 <-> 130, 1757
+1081 <-> 202, 623
+1082 <-> 1082
+1083 <-> 506, 703, 1279
+1084 <-> 314, 1812
+1085 <-> 242
+1086 <-> 350
+1087 <-> 1524
+1088 <-> 706, 1900
+1089 <-> 788
+1090 <-> 1260
+1091 <-> 968, 1522
+1092 <-> 173, 631, 1850
+1093 <-> 1093, 1390
+1094 <-> 182, 390
+1095 <-> 756
+1096 <-> 996
+1097 <-> 448
+1098 <-> 464, 612
+1099 <-> 292, 486
+1100 <-> 964, 1326
+1101 <-> 907, 1799
+1102 <-> 1927
+1103 <-> 928, 1103
+1104 <-> 252
+1105 <-> 166, 297
+1106 <-> 1106, 1896
+1107 <-> 1107
+1108 <-> 459
+1109 <-> 1023
+1110 <-> 422, 801
+1111 <-> 456, 685
+1112 <-> 262, 1059
+1113 <-> 1267
+1114 <-> 485
+1115 <-> 1115, 1827
+1116 <-> 1596
+1117 <-> 395, 449, 1382
+1118 <-> 1009
+1119 <-> 281, 1670
+1120 <-> 434, 1165
+1121 <-> 167, 1121
+1122 <-> 1809
+1123 <-> 895
+1124 <-> 283
+1125 <-> 499, 720, 1308
+1126 <-> 790, 1526
+1127 <-> 1033
+1128 <-> 1500
+1129 <-> 168, 418, 1642, 1947
+1130 <-> 1454
+1131 <-> 1683
+1132 <-> 517, 1784
+1133 <-> 288
+1134 <-> 314, 749, 1586
+1135 <-> 102
+1136 <-> 1136
+1137 <-> 680
+1138 <-> 1755
+1139 <-> 654
+1140 <-> 1140
+1141 <-> 1141
+1142 <-> 1043, 1862
+1143 <-> 1550
+1144 <-> 535, 1144, 1849
+1145 <-> 209, 671, 815, 1268
+1146 <-> 145
+1147 <-> 134
+1148 <-> 774
+1149 <-> 36, 497, 499, 1652
+1150 <-> 271, 1150
+1151 <-> 51, 980, 1651
+1152 <-> 533
+1153 <-> 398, 757
+1154 <-> 1313
+1155 <-> 145, 617, 1336, 1721
+1156 <-> 1838
+1157 <-> 10, 1050
+1158 <-> 895
+1159 <-> 532, 1708
+1160 <-> 1357
+1161 <-> 1200, 1999
+1162 <-> 820, 1062
+1163 <-> 1821
+1164 <-> 488, 1572
+1165 <-> 515, 1120
+1166 <-> 36, 836
+1167 <-> 664
+1168 <-> 11, 515, 771, 1967
+1169 <-> 358
+1170 <-> 926
+1171 <-> 1666, 1827
+1172 <-> 262, 1439
+1173 <-> 123, 355, 1341
+1174 <-> 1204, 1525
+1175 <-> 530
+1176 <-> 501, 654
+1177 <-> 1311, 1796
+1178 <-> 186, 1536, 1551, 1853
+1179 <-> 1822, 1947
+1180 <-> 1077, 1264
+1181 <-> 163, 1181
+1182 <-> 225
+1183 <-> 1237, 1715, 1798
+1184 <-> 41
+1185 <-> 297, 1185
+1186 <-> 909
+1187 <-> 619, 1013
+1188 <-> 1698
+1189 <-> 488, 560
+1190 <-> 1834, 1933
+1191 <-> 402, 859, 1191
+1192 <-> 1839
+1193 <-> 608, 1438
+1194 <-> 435, 1033, 1754
+1195 <-> 46, 1828
+1196 <-> 612, 911, 1975
+1197 <-> 1503, 1854
+1198 <-> 733, 826
+1199 <-> 981
+1200 <-> 493, 872, 1068, 1161
+1201 <-> 874, 950
+1202 <-> 923
+1203 <-> 40, 729, 1719
+1204 <-> 542, 557, 1174
+1205 <-> 1332
+1206 <-> 148, 182
+1207 <-> 1207
+1208 <-> 91, 273, 413, 658, 1234
+1209 <-> 1995
+1210 <-> 576, 703, 796
+1211 <-> 1227, 1891
+1212 <-> 338, 1362
+1213 <-> 6
+1214 <-> 589, 732
+1215 <-> 4, 100, 444, 1842
+1216 <-> 497, 1745
+1217 <-> 409, 1354
+1218 <-> 607
+1219 <-> 29, 484, 1712
+1220 <-> 570
+1221 <-> 302, 1429
+1222 <-> 625, 1412
+1223 <-> 260, 982, 1010, 1591
+1224 <-> 9, 258, 278, 1506, 1893
+1225 <-> 1906
+1226 <-> 1226
+1227 <-> 1211
+1228 <-> 1773
+1229 <-> 18
+1230 <-> 908
+1231 <-> 701, 997
+1232 <-> 348, 349
+1233 <-> 59
+1234 <-> 1208
+1235 <-> 817, 1994
+1236 <-> 508
+1237 <-> 1183
+1238 <-> 1529
+1239 <-> 540, 1524, 1552
+1240 <-> 512
+1241 <-> 1241
+1242 <-> 992, 1685
+1243 <-> 1934
+1244 <-> 1574, 1839
+1245 <-> 727, 1040
+1246 <-> 1380
+1247 <-> 1506, 1923
+1248 <-> 50, 1610
+1249 <-> 674
+1250 <-> 485
+1251 <-> 444, 655, 1718
+1252 <-> 266, 1862
+1253 <-> 645, 1709
+1254 <-> 1254
+1255 <-> 922, 1255, 1341
+1256 <-> 930, 1346
+1257 <-> 1465, 1844
+1258 <-> 763
+1259 <-> 335, 590, 1259
+1260 <-> 129, 1090
+1261 <-> 652, 1261, 1838
+1262 <-> 1262, 1912
+1263 <-> 7, 1438, 1554
+1264 <-> 338, 1180
+1265 <-> 269, 1265
+1266 <-> 861, 1281, 1423
+1267 <-> 612, 1113, 1289
+1268 <-> 1145
+1269 <-> 967
+1270 <-> 94, 215, 925, 1860
+1271 <-> 1376
+1272 <-> 223, 953
+1273 <-> 1301
+1274 <-> 1007, 1860
+1275 <-> 216, 393, 989, 1275
+1276 <-> 470
+1277 <-> 288
+1278 <-> 869
+1279 <-> 1083, 1755
+1280 <-> 1588
+1281 <-> 1266
+1282 <-> 677, 1073, 1575, 1625
+1283 <-> 1571
+1284 <-> 1828
+1285 <-> 847, 1061, 1641
+1286 <-> 1494, 1649, 1889
+1287 <-> 159
+1288 <-> 142, 1288
+1289 <-> 970, 1267, 1668
+1290 <-> 406
+1291 <-> 728, 879, 1063, 1885
+1292 <-> 1407
+1293 <-> 942, 1318, 1459
+1294 <-> 311, 1754
+1295 <-> 990, 1512
+1296 <-> 130, 479, 508
+1297 <-> 533, 559
+1298 <-> 1839
+1299 <-> 70
+1300 <-> 37, 1886, 1998
+1301 <-> 1273, 1340
+1302 <-> 317, 674, 1485
+1303 <-> 161, 1624
+1304 <-> 1304
+1305 <-> 1410
+1306 <-> 744
+1307 <-> 20, 870, 1072
+1308 <-> 194, 212, 1125
+1309 <-> 251, 1027
+1310 <-> 22, 1022, 1777
+1311 <-> 1177
+1312 <-> 786
+1313 <-> 1154, 1706
+1314 <-> 1060
+1315 <-> 683, 745
+1316 <-> 1793, 1898
+1317 <-> 523, 980, 1065, 1787
+1318 <-> 1293
+1319 <-> 1319
+1320 <-> 1320
+1321 <-> 206
+1322 <-> 950, 1957
+1323 <-> 1074, 1823
+1324 <-> 352
+1325 <-> 875, 1740
+1326 <-> 493, 1100
+1327 <-> 701, 1633
+1328 <-> 1, 55
+1329 <-> 1633
+1330 <-> 503, 1687, 1782
+1331 <-> 376, 1531, 1766
+1332 <-> 436, 705, 1205
+1333 <-> 565
+1334 <-> 1805
+1335 <-> 408, 944
+1336 <-> 917, 1155
+1337 <-> 1026
+1338 <-> 527, 1062
+1339 <-> 517, 853
+1340 <-> 601, 1301, 1708
+1341 <-> 1173, 1255
+1342 <-> 684
+1343 <-> 210
+1344 <-> 121, 483
+1345 <-> 175
+1346 <-> 578, 1256
+1347 <-> 937, 1037, 1735
+1348 <-> 685
+1349 <-> 275, 1594
+1350 <-> 127, 130
+1351 <-> 485
+1352 <-> 884, 1352
+1353 <-> 1604, 1800
+1354 <-> 1217
+1355 <-> 1355, 1985
+1356 <-> 855, 1840
+1357 <-> 651, 1160, 1388
+1358 <-> 92
+1359 <-> 112
+1360 <-> 1455
+1361 <-> 1071, 1909
+1362 <-> 304, 1212
+1363 <-> 791
+1364 <-> 161, 1426
+1365 <-> 1365
+1366 <-> 1366, 1433
+1367 <-> 133, 998
+1368 <-> 851
+1369 <-> 12, 996, 1425
+1370 <-> 665
+1371 <-> 13, 735, 952, 1371, 1857
+1372 <-> 613, 1057
+1373 <-> 638, 1511
+1374 <-> 230, 1593
+1375 <-> 104
+1376 <-> 179, 1271, 1639
+1377 <-> 291
+1378 <-> 1919
+1379 <-> 575, 969
+1380 <-> 1246, 1501, 1903
+1381 <-> 73, 825, 1922
+1382 <-> 1071, 1117, 1541, 1810
+1383 <-> 111
+1384 <-> 457
+1385 <-> 1878, 1966
+1386 <-> 1396
+1387 <-> 229, 934, 1853
+1388 <-> 958, 1357, 1424
+1389 <-> 531
+1390 <-> 1093, 1603
+1391 <-> 408
+1392 <-> 446
+1393 <-> 411
+1394 <-> 1866
+1395 <-> 450, 1851
+1396 <-> 519, 1386
+1397 <-> 79, 568, 992
+1398 <-> 224
+1399 <-> 1443, 1799, 1915
+1400 <-> 744
+1401 <-> 1685
+1402 <-> 892
+1403 <-> 1714
+1404 <-> 632
+1405 <-> 911, 1532
+1406 <-> 233, 1606
+1407 <-> 700, 1292
+1408 <-> 431, 1408, 1416
+1409 <-> 211, 472
+1410 <-> 821, 1305
+1411 <-> 1653, 1993
+1412 <-> 628, 1222
+1413 <-> 473, 816
+1414 <-> 451
+1415 <-> 991, 1026
+1416 <-> 1408
+1417 <-> 752
+1418 <-> 423, 897
+1419 <-> 2, 30
+1420 <-> 1420
+1421 <-> 808
+1422 <-> 58, 104
+1423 <-> 1266
+1424 <-> 1388
+1425 <-> 1369
+1426 <-> 737, 1364, 1847, 1913
+1427 <-> 246, 274
+1428 <-> 1964
+1429 <-> 76, 806, 1221
+1430 <-> 1430
+1431 <-> 322
+1432 <-> 1719
+1433 <-> 1366, 1988
+1434 <-> 89, 106
+1435 <-> 1017, 1730
+1436 <-> 1997
+1437 <-> 317, 352
+1438 <-> 1193, 1263
+1439 <-> 1172
+1440 <-> 344
+1441 <-> 37
+1442 <-> 1002, 1860
+1443 <-> 1399
+1444 <-> 31, 298
+1445 <-> 823, 854
+1446 <-> 113, 403
+1447 <-> 1508, 1720
+1448 <-> 766, 1791
+1449 <-> 527
+1450 <-> 134
+1451 <-> 88, 571
+1452 <-> 923, 1067
+1453 <-> 770
+1454 <-> 95, 823, 1130, 1454
+1455 <-> 1360, 1533
+1456 <-> 1456, 1489, 1529
+1457 <-> 114, 149, 1956
+1458 <-> 382, 631, 1458
+1459 <-> 570, 1293
+1460 <-> 202, 369
+1461 <-> 300
+1462 <-> 1636
+1463 <-> 393, 1659, 1939
+1464 <-> 31
+1465 <-> 3, 323, 547, 1257, 1732
+1466 <-> 320
+1467 <-> 723, 992, 1706
+1468 <-> 154, 843
+1469 <-> 713
+1470 <-> 354, 699
+1471 <-> 1471
+1472 <-> 825
+1473 <-> 715
+1474 <-> 745
+1475 <-> 645
+1476 <-> 622, 758
+1477 <-> 1013, 1645, 1669
+1478 <-> 711
+1479 <-> 734
+1480 <-> 650
+1481 <-> 1481
+1482 <-> 310, 871
+1483 <-> 918, 1504
+1484 <-> 931
+1485 <-> 336, 421, 775, 822, 1302
+1486 <-> 157, 1631
+1487 <-> 236, 437, 788, 1980
+1488 <-> 1560
+1489 <-> 739, 1456
+1490 <-> 383
+1491 <-> 535
+1492 <-> 471, 614
+1493 <-> 743
+1494 <-> 565, 1286
+1495 <-> 1627
+1496 <-> 761, 1496
+1497 <-> 249, 425, 851
+1498 <-> 749
+1499 <-> 231
+1500 <-> 930, 1128
+1501 <-> 390, 1380
+1502 <-> 1713
+1503 <-> 152, 880, 1197
+1504 <-> 47, 876, 941, 1483, 1945
+1505 <-> 295, 530, 753
+1506 <-> 818, 1224, 1247
+1507 <-> 141, 216, 1565, 1726
+1508 <-> 647, 1447, 1521, 1590
+1509 <-> 580, 1036, 1605, 1609
+1510 <-> 40, 1885
+1511 <-> 858, 1373
+1512 <-> 1295
+1513 <-> 78, 430
+1514 <-> 1772
+1515 <-> 153
+1516 <-> 144, 260, 1818
+1517 <-> 32, 1616, 1806
+1518 <-> 472
+1519 <-> 259
+1520 <-> 94, 1542
+1521 <-> 1508
+1522 <-> 313, 1091, 1631
+1523 <-> 685
+1524 <-> 241, 1087, 1239
+1525 <-> 1174
+1526 <-> 1126
+1527 <-> 1835
+1528 <-> 803
+1529 <-> 460, 833, 1238, 1456
+1530 <-> 1784
+1531 <-> 1331
+1532 <-> 629, 1405
+1533 <-> 470, 1455, 1533, 1796
+1534 <-> 1072
+1535 <-> 605, 724, 1039
+1536 <-> 1178
+1537 <-> 273, 801, 935
+1538 <-> 1023, 1734
+1539 <-> 713
+1540 <-> 1748
+1541 <-> 1382, 1683
+1542 <-> 1520
+1543 <-> 781
+1544 <-> 1631
+1545 <-> 1910
+1546 <-> 1942
+1547 <-> 260
+1548 <-> 581, 747
+1549 <-> 804
+1550 <-> 159, 1143
+1551 <-> 1178
+1552 <-> 461, 1239, 1846
+1553 <-> 1553, 1982
+1554 <-> 68, 85, 1263, 1597
+1555 <-> 1713, 1931
+1556 <-> 946, 1556
+1557 <-> 718, 1060
+1558 <-> 783
+1559 <-> 640, 940
+1560 <-> 1488, 1806, 1898, 1949
+1561 <-> 441, 1046
+1562 <-> 715, 1889
+1563 <-> 552
+1564 <-> 986
+1565 <-> 1507, 1689
+1566 <-> 1570
+1567 <-> 1056
+1568 <-> 3, 371
+1569 <-> 119, 1057, 1852
+1570 <-> 1566, 1570
+1571 <-> 1283, 1736
+1572 <-> 569, 1164, 1995
+1573 <-> 1573, 1784, 1987
+1574 <-> 1244, 1574
+1575 <-> 1282, 1575, 1866
+1576 <-> 123
+1577 <-> 1030
+1578 <-> 289, 710
+1579 <-> 992, 1684
+1580 <-> 4
+1581 <-> 1581
+1582 <-> 128, 883
+1583 <-> 57
+1584 <-> 116
+1585 <-> 637
+1586 <-> 1134
+1587 <-> 1587
+1588 <-> 159, 1280
+1589 <-> 1915
+1590 <-> 136, 1508
+1591 <-> 1223
+1592 <-> 293, 1891
+1593 <-> 853, 1374
+1594 <-> 1349, 1886
+1595 <-> 994, 1595
+1596 <-> 364, 1116
+1597 <-> 1554
+1598 <-> 1729
+1599 <-> 583, 1055
+1600 <-> 147, 458, 1600
+1601 <-> 1894
+1602 <-> 116
+1603 <-> 1390
+1604 <-> 481, 657, 949, 1353, 1983
+1605 <-> 115, 668, 863, 1509
+1606 <-> 1406
+1607 <-> 261, 410, 821
+1608 <-> 690
+1609 <-> 1509
+1610 <-> 673, 1248
+1611 <-> 118, 1788
+1612 <-> 1854
+1613 <-> 547
+1614 <-> 547, 1807
+1615 <-> 479
+1616 <-> 222, 1517
+1617 <-> 880, 1989
+1618 <-> 826
+1619 <-> 860, 1807
+1620 <-> 291
+1621 <-> 618, 1957
+1622 <-> 535
+1623 <-> 480, 531
+1624 <-> 1303
+1625 <-> 223, 1282
+1626 <-> 503, 604
+1627 <-> 1495, 1933
+1628 <-> 288, 978
+1629 <-> 1629
+1630 <-> 465, 1872
+1631 <-> 1486, 1522, 1544
+1632 <-> 196
+1633 <-> 1327, 1329
+1634 <-> 123, 661, 740
+1635 <-> 139
+1636 <-> 913, 1462, 1752
+1637 <-> 404, 522
+1638 <-> 1779, 1813
+1639 <-> 33, 190, 1376, 1639
+1640 <-> 1816
+1641 <-> 554, 1285
+1642 <-> 1129
+1643 <-> 71, 1844
+1644 <-> 171, 987
+1645 <-> 1477
+1646 <-> 16, 199
+1647 <-> 1702
+1648 <-> 895
+1649 <-> 1286
+1650 <-> 344, 886, 945
+1651 <-> 799, 1151
+1652 <-> 1149, 1961, 1984
+1653 <-> 222, 1074, 1411
+1654 <-> 108, 553
+1655 <-> 35, 156, 226, 1992
+1656 <-> 537, 655
+1657 <-> 105, 609
+1658 <-> 1658
+1659 <-> 519, 1463
+1660 <-> 958
+1661 <-> 290, 1929
+1662 <-> 435
+1663 <-> 1855
+1664 <-> 345
+1665 <-> 554
+1666 <-> 1021, 1171
+1667 <-> 662, 687
+1668 <-> 1289
+1669 <-> 842, 1477, 1795, 1975
+1670 <-> 1119, 1921
+1671 <-> 941
+1672 <-> 115
+1673 <-> 385
+1674 <-> 518
+1675 <-> 247, 676
+1676 <-> 509, 1987
+1677 <-> 965, 1677
+1678 <-> 151, 1692
+1679 <-> 541
+1680 <-> 1680
+1681 <-> 221, 789
+1682 <-> 1736, 1767, 1947
+1683 <-> 1131, 1541
+1684 <-> 1579
+1685 <-> 1242, 1401
+1686 <-> 1736
+1687 <-> 680, 1330
+1688 <-> 881, 1829
+1689 <-> 1030, 1565
+1690 <-> 778, 1044, 1900
+1691 <-> 28, 75
+1692 <-> 627, 1678
+1693 <-> 122, 400, 671, 969
+1694 <-> 58, 61
+1695 <-> 741
+1696 <-> 224, 1958
+1697 <-> 1935
+1698 <-> 301, 1188
+1699 <-> 29, 37
+1700 <-> 742, 1883
+1701 <-> 662
+1702 <-> 441, 1647
+1703 <-> 1048, 1076
+1704 <-> 185
+1705 <-> 715
+1706 <-> 1313, 1467
+1707 <-> 867
+1708 <-> 1008, 1159, 1340
+1709 <-> 560, 561, 1253, 1976
+1710 <-> 840
+1711 <-> 1711
+1712 <-> 12, 1219
+1713 <-> 631, 1502, 1555
+1714 <-> 1403, 1714, 1902
+1715 <-> 1183
+1716 <-> 79
+1717 <-> 738
+1718 <-> 602, 1251
+1719 <-> 1203, 1432
+1720 <-> 1447
+1721 <-> 1155
+1722 <-> 930
+1723 <-> 941
+1724 <-> 941
+1725 <-> 432
+1726 <-> 1507
+1727 <-> 397
+1728 <-> 1728, 1937
+1729 <-> 1598, 1913
+1730 <-> 105, 757, 768, 1435, 1730
+1731 <-> 789
+1732 <-> 795, 1465
+1733 <-> 551, 1765, 1835
+1734 <-> 1538
+1735 <-> 755, 1347
+1736 <-> 1571, 1682, 1686
+1737 <-> 932, 1795
+1738 <-> 329, 1738
+1739 <-> 267, 1062, 1848
+1740 <-> 1325
+1741 <-> 326, 541, 1952
+1742 <-> 344, 754
+1743 <-> 75, 253, 507
+1744 <-> 288
+1745 <-> 1216
+1746 <-> 92, 138
+1747 <-> 333
+1748 <-> 182, 1540
+1749 <-> 853
+1750 <-> 88
+1751 <-> 363, 1060
+1752 <-> 1060, 1636
+1753 <-> 433, 583, 1873
+1754 <-> 1194, 1294
+1755 <-> 1138, 1279
+1756 <-> 538, 636
+1757 <-> 1080
+1758 <-> 472, 514
+1759 <-> 284
+1760 <-> 1760
+1761 <-> 326, 620
+1762 <-> 648, 939, 1989
+1763 <-> 383
+1764 <-> 599, 1019, 1941
+1765 <-> 1733
+1766 <-> 289, 365, 1331
+1767 <-> 993, 1682, 1767
+1768 <-> 1768, 1859
+1769 <-> 957
+1770 <-> 288
+1771 <-> 1875
+1772 <-> 1514, 1772
+1773 <-> 801, 1228
+1774 <-> 0
+1775 <-> 935
+1776 <-> 133
+1777 <-> 1310
+1778 <-> 17, 320
+1779 <-> 465, 1638
+1780 <-> 1906
+1781 <-> 1969
+1782 <-> 1330
+1783 <-> 97, 963, 1960, 1983
+1784 <-> 1132, 1530, 1573
+1785 <-> 422
+1786 <-> 1786
+1787 <-> 854, 1317
+1788 <-> 926, 1611
+1789 <-> 586, 1829
+1790 <-> 74, 1790
+1791 <-> 52, 109, 1448
+1792 <-> 1860
+1793 <-> 1316, 1981
+1794 <-> 138
+1795 <-> 1669, 1737, 1861
+1796 <-> 1177, 1533
+1797 <-> 327, 875
+1798 <-> 852, 1183
+1799 <-> 1101, 1399, 1964
+1800 <-> 491, 641, 807, 1353
+1801 <-> 20, 455
+1802 <-> 123
+1803 <-> 415, 1010
+1804 <-> 1804
+1805 <-> 1334, 1926
+1806 <-> 1517, 1560
+1807 <-> 1614, 1619
+1808 <-> 261, 643
+1809 <-> 145, 1122
+1810 <-> 1382
+1811 <-> 60
+1812 <-> 1084
+1813 <-> 213, 994, 1638
+1814 <-> 14, 355
+1815 <-> 841, 1996
+1816 <-> 1049, 1640
+1817 <-> 388
+1818 <-> 1051, 1516
+1819 <-> 1008
+1820 <-> 403
+1821 <-> 350, 1163
+1822 <-> 669, 1179, 1927
+1823 <-> 1323
+1824 <-> 667, 824, 1879
+1825 <-> 608, 839, 876, 1965
+1826 <-> 473, 907
+1827 <-> 1115, 1171
+1828 <-> 440, 1195, 1284, 1913
+1829 <-> 275, 1688, 1789
+1830 <-> 1830
+1831 <-> 1831
+1832 <-> 248, 726
+1833 <-> 1833
+1834 <-> 1190
+1835 <-> 639, 1527, 1733
+1836 <-> 250, 1836
+1837 <-> 577, 1970
+1838 <-> 1156, 1261
+1839 <-> 1192, 1244, 1298
+1840 <-> 1356
+1841 <-> 81
+1842 <-> 738, 1215
+1843 <-> 1843
+1844 <-> 383, 1257, 1643
+1845 <-> 260, 451
+1846 <-> 1552
+1847 <-> 755, 879, 1426
+1848 <-> 38, 1739
+1849 <-> 468, 1144
+1850 <-> 1092
+1851 <-> 934, 1395
+1852 <-> 198, 1569
+1853 <-> 718, 1178, 1387
+1854 <-> 588, 1197, 1612
+1855 <-> 162, 734, 1663
+1856 <-> 236, 751
+1857 <-> 1371
+1858 <-> 1015
+1859 <-> 1768
+1860 <-> 940, 1270, 1274, 1442, 1792
+1861 <-> 1014, 1795
+1862 <-> 1142, 1252
+1863 <-> 281
+1864 <-> 717
+1865 <-> 1865
+1866 <-> 574, 602, 1394, 1575
+1867 <-> 707, 1011
+1868 <-> 659, 1868
+1869 <-> 173, 1991
+1870 <-> 391, 828, 956, 1880
+1871 <-> 189, 692
+1872 <-> 1630
+1873 <-> 42, 1753
+1874 <-> 883
+1875 <-> 11, 1771
+1876 <-> 158
+1877 <-> 186
+1878 <-> 796, 1385
+1879 <-> 486, 1824
+1880 <-> 920, 1870
+1881 <-> 433, 573, 905
+1882 <-> 625, 1954
+1883 <-> 300, 1700
+1884 <-> 1884
+1885 <-> 1291, 1510
+1886 <-> 19, 209, 1300, 1594
+1887 <-> 277
+1888 <-> 85
+1889 <-> 489, 1286, 1562
+1890 <-> 170, 832
+1891 <-> 1211, 1592, 1973
+1892 <-> 611, 697, 914
+1893 <-> 1224
+1894 <-> 775, 1601
+1895 <-> 308, 323, 618
+1896 <-> 1106
+1897 <-> 118, 368, 408
+1898 <-> 1316, 1560, 1944
+1899 <-> 463, 1050
+1900 <-> 1088, 1690, 1951
+1901 <-> 16, 27
+1902 <-> 981, 1714
+1903 <-> 1380
+1904 <-> 278, 1052
+1905 <-> 20
+1906 <-> 671, 1225, 1780
+1907 <-> 800
+1908 <-> 583
+1909 <-> 1361, 1940
+1910 <-> 134, 967, 1545
+1911 <-> 1973
+1912 <-> 1262
+1913 <-> 832, 1426, 1729, 1828
+1914 <-> 1914
+1915 <-> 1399, 1589
+1916 <-> 650, 1916
+1917 <-> 726, 1917
+1918 <-> 1040
+1919 <-> 196, 1378, 1919
+1920 <-> 1, 218
+1921 <-> 1670, 1952
+1922 <-> 1381
+1923 <-> 892, 1012, 1247
+1924 <-> 373, 904
+1925 <-> 210, 1935
+1926 <-> 543, 1013, 1805
+1927 <-> 1102, 1822
+1928 <-> 346, 1928
+1929 <-> 1661
+1930 <-> 19
+1931 <-> 983, 1555
+1932 <-> 685
+1933 <-> 16, 1190, 1627, 1933
+1934 <-> 288, 1243
+1935 <-> 535, 1697, 1925
+1936 <-> 295
+1937 <-> 112, 157, 1728
+1938 <-> 293
+1939 <-> 689, 1059, 1463
+1940 <-> 616, 1909
+1941 <-> 1764
+1942 <-> 243, 256, 1546
+1943 <-> 1950
+1944 <-> 260, 1898
+1945 <-> 1504
+1946 <-> 1946
+1947 <-> 87, 1129, 1179, 1682
+1948 <-> 294
+1949 <-> 1560
+1950 <-> 21, 1943
+1951 <-> 407, 1900
+1952 <-> 1741, 1921
+1953 <-> 1067
+1954 <-> 696, 1882
+1955 <-> 754
+1956 <-> 1457
+1957 <-> 1322, 1621
+1958 <-> 48, 708, 1696
+1959 <-> 1959
+1960 <-> 389, 1783
+1961 <-> 1652
+1962 <-> 29
+1963 <-> 914
+1964 <-> 1428, 1799
+1965 <-> 1825
+1966 <-> 1385
+1967 <-> 1168
+1968 <-> 265, 475
+1969 <-> 4, 1781
+1970 <-> 315, 926, 1837
+1971 <-> 242, 545, 1971
+1972 <-> 1972
+1973 <-> 997, 1891, 1911
+1974 <-> 885
+1975 <-> 1196, 1669
+1976 <-> 1709
+1977 <-> 1977
+1978 <-> 1978
+1979 <-> 1979
+1980 <-> 598, 1487
+1981 <-> 1793
+1982 <-> 1553
+1983 <-> 1054, 1604, 1783
+1984 <-> 731, 1652
+1985 <-> 1355
+1986 <-> 795
+1987 <-> 1573, 1676
+1988 <-> 495, 1023, 1433
+1989 <-> 1617, 1762
+1990 <-> 376
+1991 <-> 1869
+1992 <-> 1035, 1655
+1993 <-> 1411
+1994 <-> 1235, 1994
+1995 <-> 57, 1209, 1572
+1996 <-> 181, 1815
+1997 <-> 395, 1436
+1998 <-> 1300
+1999 <-> 175, 1161
diff --git a/2017/inputs/day_13.txt b/2017/inputs/day_13.txt
new file mode 100644
index 0000000..87bfdb7
--- /dev/null
+++ b/2017/inputs/day_13.txt
@@ -0,0 +1,43 @@
+0: 3
+1: 2
+2: 4
+4: 4
+6: 5
+8: 6
+10: 6
+12: 6
+14: 6
+16: 8
+18: 8
+20: 8
+22: 8
+24: 10
+26: 8
+28: 8
+30: 12
+32: 14
+34: 12
+36: 10
+38: 12
+40: 12
+42: 9
+44: 12
+46: 12
+48: 12
+50: 12
+52: 14
+54: 14
+56: 14
+58: 12
+60: 14
+62: 14
+64: 12
+66: 14
+70: 14
+72: 14
+74: 14
+76: 14
+80: 18
+88: 20
+90: 14
+98: 17
diff --git a/2017/inputs/day_13_example.txt b/2017/inputs/day_13_example.txt
new file mode 100644
index 0000000..0de4bec
--- /dev/null
+++ b/2017/inputs/day_13_example.txt
@@ -0,0 +1,5 @@
+0: 3
+1: 2
+4: 4
+6: 4
+
diff --git a/2017/inputs/day_14.txt b/2017/inputs/day_14.txt
new file mode 100644
index 0000000..1155654
--- /dev/null
+++ b/2017/inputs/day_14.txt
@@ -0,0 +1,2 @@
+uugsqrei
+
diff --git a/2017/inputs/day_14_example.txt b/2017/inputs/day_14_example.txt
new file mode 100644
index 0000000..e0ffae2
--- /dev/null
+++ b/2017/inputs/day_14_example.txt
@@ -0,0 +1 @@
+flqrgnkx
diff --git a/2017/inputs/day_15.txt b/2017/inputs/day_15.txt
new file mode 100644
index 0000000..ffb6d14
--- /dev/null
+++ b/2017/inputs/day_15.txt
@@ -0,0 +1,2 @@
+Generator A starts with 591
+Generator B starts with 393
diff --git a/2017/inputs/day_16.txt b/2017/inputs/day_16.txt
new file mode 100644
index 0000000..8e74751
--- /dev/null
+++ b/2017/inputs/day_16.txt
@@ -0,0 +1 @@
+x3/4,pm/e,x15/7,pp/l,x5/8,s15,x2/6,s9,x0/4,s7,x8/12,pc/b,x2/14,pe/d,x10/11,pg/o,x9/14,ph/n,x15/8,s13,pe/i,x3/7,s2,pd/b,x4/15,s11,x0/14,s10,x7/3,s8,x2/1,pj/i,s8,x10/14,s5,x4/1,pa/h,s11,x12/6,s1,x1/14,s11,x5/12,s4,pn/b,x7/9,pj/l,x1/8,pd/e,s6,pp/g,x10/2,pi/o,x15/5,pp/l,x6/13,s3,x5/12,pk/f,x1/8,s4,x11/10,s10,x4/15,pe/n,x1/5,s14,x7/2,pc/i,x4/10,pj/p,x6/15,s12,x5/0,pa/n,x8/12,s14,x3/5,pb/d,x4/12,s3,x9/6,pg/h,x3/1,s5,x4/10,pm/f,x12/2,s11,x15/13,pa/g,x0/2,s13,pj/i,s13,x6/10,pn/a,x2/1,pm/f,x10/12,s4,pi/c,x14/13,s4,x15/0,s7,x14/8,s5,x5/2,pe/d,x3/9,s14,x7/0,s10,x6/14,s8,x3/15,pn/j,x2/1,pf/a,x13/10,pe/m,x8/0,s2,x4/7,pc/l,s4,x2/0,s4,x3/4,s12,x11/2,s3,x5/8,s2,x4/6,pn/f,x15/5,s15,x4/12,s11,x1/13,pm/b,s13,pj/h,s15,x9/3,pd/l,x14/15,po/i,x10/7,pd/g,x11/13,s5,x9/14,s6,x1/0,s7,x5/8,s7,x0/11,s10,x7/12,s2,x8/9,s7,pb/j,x3/2,s10,x6/0,pe/l,x4/8,pf/p,x6/0,po/i,x7/2,s10,x10/3,pb/n,x2/13,s3,x15/3,ph/c,s14,x1/8,s10,x13/10,s5,x14/7,s7,x1/5,pk/f,x7/0,s11,x13/2,pc/d,x8/10,pi/h,x5/1,pe/f,s8,pa/j,x13/10,pc/f,s12,x9/12,pa/h,x7/0,s15,x8/13,s8,x15/11,pl/d,x2/8,s8,x3/14,s1,pa/e,x4/8,pp/n,x0/14,s3,x10/12,pg/c,x14/9,s2,x0/10,s11,x9/3,pn/a,x5/4,s15,x12/1,s6,x14/6,pf/c,s7,x15/5,s1,x12/13,s13,x9/4,s13,pb/p,x10/5,pe/c,x6/15,s7,x2/14,s15,x7/6,s13,x5/10,pb/l,x9/7,s14,x1/3,s12,x9/10,pn/h,x7/12,pc/k,x9/4,s2,x5/15,s10,x9/0,s2,x11/4,pg/e,x8/1,pm/h,x3/4,s14,x12/2,pi/d,x1/4,s15,x11/15,s14,x13/10,pb/o,x9/12,s5,x6/2,s13,x7/4,ph/m,s4,x8/12,pi/n,s15,x2/5,pj/p,x10/0,s4,x15/9,pn/m,x14/13,pd/b,x10/9,s5,x1/5,s2,x15/3,pe/j,s7,x0/6,s2,x8/9,s3,x2/3,s9,x5/12,pp/b,x6/3,pf/l,x9/0,s15,x3/2,s12,pb/m,x14/6,s12,x3/15,ph/f,x5/1,s13,x0/15,s8,x1/9,pa/p,s9,x15/13,s7,pf/b,x2/8,ph/g,x10/3,pi/o,x13/5,s1,x4/3,s7,x7/8,s13,x0/13,pn/h,x12/15,s14,x2/6,pc/d,x8/12,s5,x5/3,s10,x10/9,pb/p,x4/11,pm/k,x14/3,s12,po/h,x6/1,s14,x15/3,s13,x7/5,pe/i,x12/6,s8,x8/13,s2,x12/15,s15,x2/4,s13,x10/7,s11,x15/1,s4,x5/11,s8,x1/15,s15,x8/13,s8,x1/15,s5,pb/c,x11/10,s13,pm/p,x0/8,s12,x2/5,pj/i,x14/3,pl/o,x2/11,pe/j,x13/1,pa/l,x3/10,s11,x7/4,pj/m,x5/10,ph/g,x13/9,s5,x3/4,s1,x15/8,s4,x0/1,s5,pd/j,x9/12,s6,pk/g,x4/6,s4,x1/3,ph/n,s9,x4/10,pf/i,s10,pk/j,x3/1,s11,pe/h,x12/4,s6,x10/5,s12,x12/13,s15,x7/5,pn/l,x12/15,s9,x14/11,s8,x5/10,s2,x12/8,pc/b,x3/10,po/n,s14,x6/14,pl/j,x3/10,s4,x1/13,pe/c,x15/0,pa/b,x8/4,s4,pk/c,x5/12,s2,pi/g,x11/7,pe/l,x14/12,s5,x8/4,pg/f,x1/7,s8,x4/13,s12,x10/14,pc/h,x13/2,s1,x15/11,s3,x3/14,s5,pb/g,x2/7,s13,x9/3,s9,x13/1,s9,x3/14,s6,x5/0,s6,x8/14,s3,x11/13,s9,x1/5,s12,x4/2,pf/m,x6/5,pi/o,x15/2,s5,x12/5,pc/b,s2,x9/8,s9,x14/0,s6,x6/1,pe/n,x8/9,po/k,x15/4,pl/f,x11/14,s3,x7/15,s14,x14/12,pe/o,x15/7,s15,x6/1,s13,x13/12,pg/h,x5/0,pe/b,x1/9,s1,x8/2,s2,x3/1,pl/k,x9/0,s5,x8/2,pi/c,s1,x6/14,ph/p,x11/15,s4,x4/14,pn/i,x0/3,ph/p,x4/5,s6,x3/7,s3,pj/g,x0/4,po/k,x3/13,s14,x12/2,s8,x15/5,s11,x1/10,pj/e,x6/9,s14,x0/3,s12,x8/5,s10,x4/15,s13,x11/2,pi/m,x13/1,s13,x8/10,s9,x0/13,s14,x5/10,pd/a,x12/8,pg/h,s12,x9/0,s2,x5/2,pi/m,x6/0,s8,x15/13,s10,x6/2,pc/b,x10/4,s12,x15/1,s2,x12/5,pe/d,x10/8,pc/f,s10,x14/1,s9,x6/10,s2,x5/1,s2,x10/0,pp/l,x3/7,s8,x8/2,s13,x13/12,s11,x7/14,pc/k,x0/5,s15,x11/12,pa/g,x13/8,s11,x4/2,s14,x11/5,s8,x0/7,s15,x4/2,pj/n,x11/8,s10,pg/a,x6/10,s9,x2/11,po/h,x8/3,s12,pf/l,x0/1,s12,x10/9,pg/m,x5/2,pl/e,x12/6,s9,x1/14,s12,x10/5,pa/k,x6/12,pe/g,x10/7,pj/d,x13/0,s8,pm/k,x5/12,ph/a,x15/3,po/l,x9/6,pk/g,x7/3,s14,x4/14,s7,x10/11,pp/m,x8/14,s11,x15/0,s1,pe/d,x13/12,pa/k,x8/14,s5,x9/7,pm/g,x8/12,pd/j,x1/13,s9,x10/6,s2,x14/5,pf/e,s1,x4/2,s8,x3/13,pi/k,x11/10,pn/j,x3/7,s3,x1/12,s10,x14/2,s13,x0/10,s4,x12/8,pp/e,x6/7,s13,x5/13,s13,x3/10,s4,x9/12,s12,po/b,x5/4,s6,x0/10,s4,x12/5,pf/c,s10,x10/15,pe/l,x4/9,s14,x6/5,s1,x2/9,pb/m,s1,x4/8,s7,x1/12,s13,x0/14,pa/o,x12/7,pk/m,x1/10,s11,x15/13,s10,x9/0,s8,x1/7,s11,x9/12,s1,x10/13,s3,x11/14,s3,x12/2,s3,x13/7,s11,x11/0,pf/l,x8/10,s10,x12/7,s8,x8/5,s5,x15/1,pj/n,s9,pp/i,x6/12,s15,x0/1,pg/a,x10/15,s1,x1/0,s7,x12/14,pm/d,s15,x6/11,s1,x7/12,pa/h,x3/9,s12,x8/5,pm/b,x9/1,pp/j,x8/7,pb/k,x1/5,s12,x10/9,pa/i,x1/4,s15,x2/0,s3,x15/10,s14,x11/9,s14,x6/14,s11,x13/2,pl/g,x7/11,s10,x4/15,s15,x12/0,s8,x3/6,pa/f,x11/2,s6,x13/6,s10,pk/d,x10/9,po/m,x13/12,pc/b,x8/4,s13,x1/11,pn/o,x8/13,s14,x15/0,s8,x13/9,s15,pa/i,x6/2,s8,x15/1,pc/m,x10/9,s6,x6/5,s3,pg/l,x8/3,s13,pa/m,x2/13,s15,x0/12,s12,x5/11,s3,po/k,x1/15,pa/f,x14/6,s15,x1/15,s3,x14/4,s4,x15/9,s15,pm/n,x1/5,s15,x3/2,pp/h,x13/5,s13,pm/e,x7/10,s5,x15/9,s10,pn/g,x10/6,pb/l,x0/8,s9,x13/1,s14,x5/8,s7,x15/11,s2,x13/4,s14,x12/3,s15,pe/n,x4/0,pk/i,x13/9,s14,x5/15,s11,x3/11,pa/e,x4/5,s13,x3/10,pf/d,x14/0,s14,x10/12,pk/e,s1,x0/1,pm/o,x3/8,s13,x15/9,s7,x11/10,pg/n,s6,ph/p,s12,x12/15,pi/a,x9/0,pe/m,x4/13,pi/p,x11/5,pj/k,x7/6,s7,x3/12,s7,x0/9,pa/d,x15/10,s9,x2/11,s4,x6/1,s4,x13/9,pb/c,x0/11,po/n,x13/6,s7,x5/1,pj/e,x4/10,pp/h,x13/11,pc/d,x3/8,s12,x4/9,s5,pg/m,x13/14,pa/f,x15/3,pi/k,x9/5,pb/e,x3/12,s8,x5/10,s8,po/j,x7/2,s10,x10/11,pg/m,x8/4,s14,x9/11,s5,x2/3,s6,x1/14,pf/h,x2/3,s11,pc/b,s1,x5/6,s11,x13/10,ph/j,s8,x14/9,s5,x4/1,pf/n,x6/13,pc/h,s1,x12/2,pa/j,x1/4,s8,x12/5,ph/o,x6/11,s4,x7/2,pl/b,x9/6,s14,x8/10,pk/h,x0/4,s1,x2/10,pd/o,x4/13,s5,x0/14,s11,x4/10,pl/b,s6,x14/7,pf/o,x6/15,s12,x4/1,s4,x12/13,s6,x8/10,pd/h,s9,x11/0,pb/a,x12/5,pg/h,x15/11,s4,x8/12,s11,x7/14,s15,x8/3,s2,x12/4,po/e,x6/15,s10,x8/10,pi/d,x6/4,pk/g,x5/12,pa/i,x2/9,s13,x15/12,pc/g,x11/9,s11,x2/12,s5,x1/5,pj/p,x15/8,s9,x12/1,s1,x0/2,pf/l,s3,x11/6,s8,x0/10,s9,x5/1,pn/i,x9/2,pd/k,x4/1,pp/l,x10/5,s10,x8/3,s2,x6/9,pg/e,x8/4,s13,x9/2,s8,x14/0,pb/m,x15/3,pi/g,x13/11,s2,x4/14,pj/o,x7/12,s10,x5/2,pm/d,x6/14,pj/b,x10/4,s15,x9/14,s1,x13/3,s7,x8/9,s5,x11/10,pc/a,s12,x9/6,s5,x13/8,s9,x15/12,s5,x0/6,s13,x15/1,s2,x6/3,pd/g,s3,x1/14,s13,x15/7,s6,x12/11,ph/n,x13/2,s12,pm/d,x12/15,pc/p,s12,x14/3,s6,x7/12,pl/h,x6/2,s1,x7/0,pn/c,x13/15,pe/b,x6/11,s1,x2/8,s6,x6/9,s7,x14/1,ph/i,s15,x13/3,s14,x5/6,pm/p,x10/3,s7,pn/d,x12/14,s10,x4/7,s5,x9/2,s9,x10/5,s13,x12/13,ph/k,x15/6,pg/c,x11/4,s1,x9/7,s1,x4/15,pf/m,s10,x6/10,pi/o,x12/2,s8,x4/8,pn/h,x9/6,pd/g,x0/3,s9,x1/7,pj/h,x6/12,pk/f,x7/10,pi/n,x12/0,pb/k,x14/3,pc/g,x7/1,po/n,x4/10,s11,x3/8,s9,x12/6,s13,x7/10,pb/k,x13/5,pc/a,x7/15,s2,x9/12,s14,x11/2,s10,pb/j,x14/5,s14,x4/10,s12,x6/14,s3,x3/13,po/n,x14/7,pb/m,x9/2,pa/k,x14/8,pc/l,x6/10,pj/m,s9,x13/12,pn/a,x15/1,s14,x5/8,pm/c,s1,x11/0,pn/d,x5/14,pc/b,x9/1,s14,x2/8,pi/l,x13/15,s14,x11/2,po/b,s11,x12/10,s12,x7/4,s7,x14/13,pd/n,x6/12,ph/m,x3/10,pp/f,x0/2,pl/g,x5/6,s3,x2/12,s11,x6/5,s11,x13/2,s8,x10/1,s7,pp/d,x11/14,s3,x9/13,pk/o,x2/12,s11,x4/7,s7,x15/2,pl/j,x1/12,s1,x5/9,s12,x12/15,s15,x3/7,s2,x5/8,s14,x2/10,po/m,s9,x5/7,s13,x11/9,pk/g,x3/14,pb/m,x5/2,pk/p,x4/11,s7,x3/6,s4,pe/h,x5/10,pn/j,x0/13,pg/k,x3/11,s11,x4/8,s13,x2/7,po/p,x5/9,pi/f,x8/4,s3,pn/j,x3/13,s2,x12/14,s5,x1/5,s8,x11/15,pf/c,x14/10,s10,x12/0,pa/d,x15/8,s8,x3/0,s15,x1/10,s11,x2/14,pb/n,x5/10,ph/j,x2/12,s12,x8/0,pa/d,s1,x9/15,pm/g,x14/4,s5,x11/9,s14,x14/0,pj/f,x15/6,s14,x9/13,s14,x7/4,s3,x12/10,s4,x9/13,pd/l,x10/6,pe/f,x0/13,pm/h,x6/1,s1,x12/9,pf/p,x2/14,s11,x8/7,ph/l,x15/3,s15,x11/5,pf/p,x15/2,pm/g,x0/10,pe/n,s11,x5/8,pl/o,x0/7,pa/e,x14/10,s11,x15/5,s13,x9/6,pl/o,x14/7,s5,x8/13,pp/m,x0/3,s12,x1/10,pd/l,x15/11,pj/f,x14/10,s5,x1/3,pl/p,x4/7,s8,x12/9,pe/m,x8/14,pa/n,x3/12,ph/o,s10,pi/e,x5/0,pm/g,x3/14,s8,x12/8,s13,x3/13,pc/j,x1/14,s2,x10/6,pe/f,x7/4,s13,x15/12,s7,x2/7,s1,x11/0,s6,x10/7,pd/n,s5,x4/0,s2,x12/10,s13,x9/2,s8,x14/13,s2,x12/0,pk/m,s14,x1/10,pj/c,x9/15,pm/p,x5/14,s5,x0/13,s11,x12/15,s7,x0/13,pl/i,x4/5,pn/o,x8/6,s5,x5/1,pp/b,x14/15,pc/m,x4/3,s3,x5/7,pb/f,x6/8,pi/l,x11/0,pb/a,x6/14,s4,x8/13,s9,x9/7,s9,pc/o,x2/14,s9,x15/10,pl/i,x2/1,s15,pp/b,x8/13,pk/n,x3/11,s11,x6/4,s1,x15/13,pd/i,x5/7,s8,x15/14,s4,x12/3,s4,x13/2,s4,x10/3,s10,x1/14,s14,x9/0,s1,x8/14,pp/o,x0/11,pd/c,x12/9,s3,x14/6,s13,x4/11,s2,x9/12,pn/e,x0/6,pk/l,x11/4,s9,pd/c,x7/9,po/a,s14,x14/4,s10,pd/j,x6/15,s4,x4/11,pl/h,x1/8,pj/k,x2/10,s14,x14/1,pl/o,x11/0,s4,x13/10,ph/e,x1/6,s8,pm/j,x0/8,pc/o,x15/10,pf/m,x7/3,s10,x15/0,s1,x6/1,pe/l,x13/7,s10,x8/1,s12,x4/6,s11,x5/15,s15,x14/7,pb/g,x0/12,pf/o,x1/9,s8,x0/7,s10,x1/11,s7,x4/15,pl/j,x3/9,s9,x14/15,s12,x9/1,s7,x5/8,pm/n,x6/13,pk/b,x0/7,s8,x11/10,s3,x13/12,pn/h,x10/4,pa/p,x13/15,s12,x4/14,s13,x2/1,s5,x15/10,s10,x9/3,po/m,x15/11,s11,x8/6,s1,x11/9,s7,pb/l,s8,x8/0,s15,x15/5,s14,x8/10,s5,x15/14,pf/h,x10/13,s14,x5/9,pm/c,x14/8,s9,x9/7,pg/a,x1/11,s14,x8/3,pm/n,x9/4,s4,x2/6,s3,x3/5,pf/a,x9/0,pp/k,x13/14,s1,ph/e,x1/5,s13,x3/15,s5,x12/9,s3,x7/11,s1,x6/12,pm/b,x10/11,s7,x4/1,pn/l,x6/5,s6,x12/7,ph/o,x0/8,pg/f,x12/6,s5,x0/2,s1,x10/9,pa/c,x6/1,s12,pl/j,x4/15,pi/o,x3/11,s6,x6/9,s7,x2/8,ph/j,x9/12,s14,x6/4,s6,pm/k,x13/15,s10,x9/11,pp/c,x7/6,s2,x11/10,s15,x14/8,pl/i,x4/5,ph/c,x13/12,pl/g,x8/11,pd/p,x4/9,ph/e,x12/6,s5,x13/10,pn/c,x3/5,s5,x1/8,pk/d,x14/6,s10,x4/3,s10,x12/11,s2,x5/2,pi/j,s14,x11/15,s9,x1/9,pm/k,x10/15,pp/f,x5/4,s4,x2/7,s5,x10/13,pn/o,x1/11,s10,x0/12,pe/b,x5/4,s15,x12/14,pc/i,s2,x13/4,s14,x14/1,s1,x2/4,ph/m,x14/1,s15,x3/13,pc/b,x14/9,s4,x6/8,s9,x12/14,s5,x10/9,pa/k,x14/13,s3,x5/7,s4,pj/i,x6/4,s1,pe/a,x8/5,s14,x12/9,s9,x13/14,s11,x3/15,s3,x13/11,s6,x12/7,pc/m,x8/11,s11,x10/1,s10,x15/12,pp/g,x3/4,pm/c,x15/13,s12,x10/8,s8,x5/12,pj/h,x13/4,s7,x11/9,s15,x10/12,s7,x2/11,pf/m,s13,x15/4,s4,x5/3,s4,ph/p,x4/8,s6,x9/14,pa/b,x5/4,s11,x11/8,pf/m,x15/7,s7,x4/2,s4,x15/9,pp/g,x5/7,s1,x13/11,pd/m,x5/0,s6,x3/8,pb/e,x12/2,s3,x3/6,s15,x13/2,pg/o,x5/1,s9,x10/13,s1,x2/14,s5,x10/6,s9,x5/1,pj/h,x10/3,pc/b,x2/8,pd/j,x12/1,s9,x13/8,s12,x15/12,s5,x8/9,s15,x13/0,s9,x2/11,pm/i,x8/10,s3,x14/0,s10,x10/8,s12,x2/5,s8,x1/14,pa/d,x2/0,s3,x14/9,s15,x1/0,s8,x13/7,pi/g,x0/1,s10,x10/13,pl/d,s7,x2/8,s10,x0/15,s12,x4/3,pi/k,x11/5,s3,x7/2,s15,pg/f,x4/0,pp/c,x10/15,s10,pj/a,x4/2,pg/o,s13,x9/8,pi/f,x5/7,s12,x12/9,pe/m,x2/6,s5,x11/0,s8,x6/12,pd/a,x0/2,s7,x9/7,ph/e,x14/11,pl/c,x4/3,s11,x7/0,pd/b,x8/2,s7,x15/13,pf/p,x9/11,s9,x0/10,pd/g,x2/4,pa/j,x3/8,s5,x12/1,s12,x15/5,pb/e,x9/10,pj/p,x6/5,pm/k,x11/7,pd/h,x4/0,pf/b,x10/5,pn/a,x14/11,s14,pj/l,x7/1,s9,x5/13,pg/h,x1/11,po/c,s11,x7/12,s12,x2/14,s2,x15/10,pb/d,x8/13,po/h,x12/6,pl/e,x9/11,s6,x14/15,s13,x12/13,ph/d,x9/7,s5,x11/10,pj/b,x5/13,s12,x2/11,s3,x5/6,s11,x10/4,s2,x13/11,s15,x0/2,pa/n,x12/13,pb/h,x14/3,pf/e,x9/6,s8,pj/l,x12/13,pd/k,x15/0,s5,pg/m,x14/10,pe/k,x4/3,s14,x1/9,s1,x15/0,s5,x3/8,s10,x2/1,pn/i,x0/4,s10,pj/p,x7/5,s15,x3/14,s15,x7/5,s4,x15/6,s10,x7/3,s2,x8/12,s13,x10/14,s15,x3/12,pg/i,x1/9,s6,x4/3,ph/b,x0/5,s5,pa/c,s7,x15/8,s8,x0/10,s9,x9/12,s6,x11/7,s2,x15/1,pm/p,x8/2,s15,x3/4,s3,x6/5,pa/f,x14/8,pm/b,x15/11,s2,x0/3,s6,x12/9,pi/e,x15/7,pp/n,x4/2,s15,x15/0,pf/g,x13/14,pj/m,x1/0,pe/i,x10/11,pp/d,x15/6,s2,x10/13,pj/o,x12/9,ph/e,x14/10,pm/a,x3/0,s4,x15/4,s11,x14/8,pp/n,x6/0,s3,x10/3,s3,x13/0,s7,x5/2,s2,x1/13,pk/j,x9/10,pn/a,s14,x13/8,pc/k,x6/10,pi/j,x3/12,s2,x9/8,s7,x3/1,pl/e,x12/15,po/m,x5/1,s1,x2/7,pk/l,x3/15,s10,pi/c,x11/10,s15,x12/0,pj/g,x8/7,pi/k,x11/15,s6,x1/13,s11,x14/8,s11,x13/5,s2,x15/4,s9,x1/9,pm/p,x3/11,pb/g,s13,x9/0,pl/k,x6/2,pb/f,x11/4,s14,x8/3,s6,x4/6,s10,x13/15,s9,x9/6,s6,x14/4,pd/i,x10/12,pl/h,x11/13,po/n,x6/9,pg/p,x14/7,s1,x0/11,s13,x9/3,pi/j,x14/1,s8,x8/13,s12,x4/11,s8,x13/3,pd/e,x6/7,s10,x2/5,s11,x9/14,pl/g,x15/1,pn/a,x14/12,s8,x1/15,s11,x6/9,s8,x3/7,pd/g,x11/0,pj/b,s10,x8/1,pa/m,x4/10,pe/d,x2/6,pg/b,x13/0,s14,x3/12,s11,x9/15,s6,x14/10,pk/p,x6/3,s7,x13/15,s10,x10/3,pa/e,x4/0,s13,x3/7,pl/n,s5,x5/15,pj/b,x0/1,s10,x12/13,s2,x0/6,pl/g,x3/12,pm/c,x5/1,pn/p,x4/6,pk/d,x8/2,s6,x14/12,pi/l,x3/9,s12,x6/5,s1,x2/10,s12,x12/3,pe/n,x15/4,pf/l,x12/14,pb/d,s13,x7/9,s4,x11/3,pe/f,x6/13,po/j,s8,pe/h,s12,x11/12,s15,x1/3,pl/g,s12,x10/13,s9,x5/8,s6,x0/6,s4,x5/3,pj/m,x10/2,s13,x15/7,pe/g,x5/3,s12,x1/9,s12,x2/14,s4,x11/0,s11,x2/7,pi/k,x11/9,po/b,x14/13,s11,x2/12,s10,x6/5,s11,x8/11,s14,x3/4,s3,x12/8,s2,x11/6,s8,x7/5,s9,x3/9,s13,x10/14,s2,x2/0,s8,x5/7,s5,x14/2,s1,x4/13,s5,x14/8,s2,pp/m,s15,x13/1,s5,x6/7,s4,x11/12,s5,x14/3,s2,x8/10,s7,pb/f,s1,x7/6,s7,x15/9,s13,x13/12,pg/h,x3/4,s13,x13/9,s5,x12/6,pk/c,s10,x8/1,s11,x14/0,pm/p,s12,x2/1,pb/h,x0/4,pm/l,x13/6,s3,x5/14,s14,x10/3,po/j,x0/9,s12,x1/5,s9,x8/4,s1,x12/6,ph/g,x10/11,s5,x12/9,pd/n,x1/14,s6,x11/4,pi/e,x2/1,pn/f,x11/13,s1,x5/0,s2,x6/9,pa/e,x0/10,pg/f,x13/15,s9,x5/11,po/c,x15/13,s15,x1/7,pp/l,x6/15,pg/k,x12/14,s7,x10/1,s12,pf/i,x2/7,s9,x13/4,pl/d,x14/10,s10,pm/k,x15/1,pd/e,s1,x11/12,s2,pg/o,x6/9,s14,x14/2,s4,x8/10,s4,x4/14,s15,pa/k,x3/11,s14,x14/15,pl/c,x8/3,s13,x5/1,s14,x14/8,s13,x3/7,pf/p,x13/8,pg/l,x7/6,s2,x11/9,ph/o,x0/2,pd/e,x4/6,s5,x7/2,s2,pj/i,s5,x5/12,s13,x0/10,s5,x7/8,s1,x4/1,s6,x7/9,s10,x3/15,pd/p,x2/11,s9,x0/10,pa/f,x15/4,s1,x6/10,pb/p,x4/14,s7,x2/13,pg/c,x12/10,s1,x13/4,s1,x1/7,s4,x4/5,pn/k,x11/10,pj/i,x1/0,s7,x14/6,s9,x11/5,s10,x4/13,s7,x1/12,s9,x3/14,s13,x0/1,pc/d,x11/10,s7,x8/2,s2,x5/11,s8,x15/6,pf/j,x10/0,s5,pm/d,s5,x7/5,s6,pg/a,x1/9,s4,x3/14,s14,pj/k,x12/10,s4,x15/3,pn/p,x6/11,pa/d,x10/8,s15,x9/11,s2,x2/3,po/g,x12/15,s15,x0/13,pj/p,x4/9,s6,x15/11,pk/g,x5/12,s3,x9/4,pj/a,s6,x0/14,s12,x12/7,pm/k,x2/0,s7,x6/1,pa/l,x14/5,s12,x1/4,s10,pn/g,x14/10,s8,x6/8,po/p,s8,x1/10,pc/a,x9/2,pg/h,s15,x10/11,pc/m,x14/4,s8,x11/7,s13,x9/12,s1,x6/2,pj/b,x1/12,s1,x10/6,ph/i,x3/13,s10,x2/7,s9,x14/4,s8,x3/5,s7,x7/8,pk/m,x12/15,s14,x0/9,s6,x5/4,s13,x0/11,s15,x15/14,pa/h,x4/9,s10,x5/0,s1,x13/14,s8,x12/15,s6,x2/4,pp/l,x5/6,pk/o,x13/3,s3,x8/10,s5,x11/12,ph/a,x5/0,s2,x6/13,pp/m,x5/2,pe/d,x6/13,po/n,x7/9,s13,x14/8,pm/f,x1/11,s6,pj/i,x2/9,s10,x15/5,pf/l,x14/9,s6,x15/1,s2,x4/8,pm/o,x15/13,s10,x8/1,pc/b,s6,x3/7,s1,x13/2,s4,x4/1,s4,x2/11,pe/m,x14/4,s10,x7/9,pd/k,x2/13,po/c,x3/9,s10,x13/8,s14,x4/7,s5,x2/0,pb/f,x12/6,pe/p,x11/9,s9,x12/7,pm/i,x4/3,s6,x2/13,pg/j,x12/0,s3,pl/b,x11/13,s10,x15/8,s2,x9/5,s4,x6/10,s2,x5/13,s13,x7/11,s15,x4/2,s8,x0/11,ph/p,x5/2,pm/n,x4/0,pe/l,x13/8,s13,x10/6,pp/b,x7/9,s14,x1/0,po/i,x3/13,s5,x8/12,pm/e,s10,x9/0,pp/k,x4/13,s8,x5/10,s5,pc/d,x14/4,s5,x12/10,pj/l,x13/11,s2,x8/1,s11,x3/12,s6,x10/2,s6,x0/12,s15,x9/7,pb/p,s7,x2/3,s11,x8/1,pk/m,x5/15,pf/d,x11/6,s10,x1/8,s11,x10/9,pm/p,x7/11,pn/b,s5,x13/6,s2,x8/9,s5,x7/13,s13,x4/1,s12,x3/9,pd/f,x13/14,s8,x2/0,s10,x10/14,pb/h,x11/1,s2,x15/3,s5,x10/6,s11,x8/1,pm/g,x11/12,pa/b,x5/4,s12,x7/12,pg/o,x1/15,pn/d,x13/9,s7,x2/4,s4,x12/14,pm/i,s5,x8/11,pb/g,x9/0,s6,x1/14,s3,x4/9,pd/i,x2/6,s14,x3/7,s4,x8/13,pf/k,x6/9,s7,x10/14,s3,x8/9,s8,x0/15,s1,x8/9,pl/n,x11/12,s12,x3/9,pc/a,x11/4,s2,x1/12,s12,x4/10,pb/l,x3/8,s3,x0/1,s1,x10/8,s6,x7/6,pn/e,s6,x9/8,s12,x7/5,pm/k,x14/0,pb/i,x12/5,s1,x15/3,s14,x6/10,s15,x15/11,pa/f,s7,x3/4,pj/h,s9,x8/2,pb/g,x4/3,s15,x2/11,s9,x1/4,s2,x0/12,pf/c,x13/10,s11,x5/14,s8,x9/0,s9,x11/8,pj/n,x2/15,s8,pf/k,s10,pb/j,x10/6,s13,x13/2,pg/n,x11/10,pi/j,x6/0,s12,x10/9,s10,x12/2,s11,x7/13,pa/d,x3/15,s2,x11/12,s11,x10/5,s6,x8/12,s8,x5/15,s15,x13/6,s3,po/i,x11/12,s9,x15/1,pb/f,s2,x12/6,s9,x13/4,s5,pp/d,x5/2,s6,x0/6,s9,x9/11,s14,pa/o,x15/3,s8,x9/1,s8,x11/12,pe/i,x6/3,s8,x0/4,po/f,x7/11,pm/n,x15/8,pg/o,x12/3,s8,x14/8,pk/b,x12/1,s8,x9/4,s7,x10/12,s12,x4/6,pe/d,x10/2,pb/c,s15,x4/12,s10,x9/1,po/n,s8,x3/2,pm/g,x4/1,pi/p,s11,x13/15,pk/a,x9/0,pe/m,x15/14,s4,x6/7,pl/k,x10/13,s14,x7/3,pg/e,x11/1,ph/k,s9,x15/7,s11,x14/9,pc/i,x6/15,pn/f,s6,x9/3,pk/c,x1/8,s2,x9/4,s8,x7/13,s3,pa/o,s11,x14/15,pm/e,x11/8,s1,x6/0,pb/k,x11/15,s14,x12/6,s4,x1/8,pa/h,s9,x5/0,s4,x10/9,s3,x0/4,s1,x12/7,s8,x5/15,s3,x11/0,s1,x5/12,s7,x0/6,s14,pd/c,x3/7,pa/n,s5,x12/4,s2,x3/13,pg/e,x2/15,s10,x4/1,s12,x8/15,pn/l,x3/14,s4,x1/15,pe/j,x5/4,s6,x14/7,s2,x12/13,pc/g,x2/3,pn/b,x0/6,s9,x10/2,pc/a,x15/8,pf/g,x10/11,s1,x8/13,pe/h,x4/6,pj/g,s15,x9/12,pm/l,x15/10,s8,x7/12,s8,x6/9,pn/i,x4/0,pd/a,x3/1,s7,x2/4,s1,x10/0,s4,x9/11,pe/k,x12/15,s13,pf/i,x14/11,s2,x0/15,s11,x12/13,po/k,x1/7,pi/j,x5/2,pk/m,x0/10,s2,x5/4,pp/d,s6,x8/12,pe/c,x0/14,s6,x11/6,s9,x9/7,s7,x6/0,s10,x5/2,s5,x14/11,s12,x0/4,pp/a,x9/12,pm/d,x14/6,s2,x15/4,pl/c,x11/12,s4,x7/5,po/j,x14/1,s12,pn/e,x10/4,pm/a,x2/13,s10,x12/6,s2,x9/2,s4,x3/6,s6,x2/0,s15,x11/14,pn/c,x15/13,s4,x14/0,s4,x11/9,s13,x2/6,pm/b,s8,x15/1,po/n,x9/10,s10,x5/0,pg/j,x2/8,s13,x0/15,s7,x9/1,s3,x8/6,s9,x4/0,po/l,x14/5,pd/h,x8/4,pa/l,x13/11,s7,x15/14,pb/n,x10/8,pj/f,x15/13,s13,x6/5,s15,x1/11,pd/o,x3/9,s4,x14/11,pb/m,x5/15,pa/h,s6,x1/11,pj/b,x5/14,s15,x15/3,s11,x5/12,pa/m,x9/11,s1,x10/1,s5,x12/11,pc/i,x4/1,s6,x11/13,pl/f,x1/6,s11,x15/11,pi/h,x7/10,s14,x2/9,pd/m,x8/1,s13,x0/3,s3,x7/12,pj/e,x2/14,s7,x9/12,s4,x1/10,pp/g,x9/13,s14,x12/0,s13,x1/3,pi/o,x5/9,s5,x4/12,pf/m,s15,x11/3,s11,x13/4,po/k,x5/0,s11,x7/13,pl/d,x15/11,s14,x13/6,s14,pe/o,s11,x12/14,s14,pc/j,x5/7,pa/g,x6/15,s1,x14/3,pd/j,s15,x1/8,s14,x2/6,s3,x1/0,pb/n,x14/6,pg/e,x4/13,s4,x7/0,pf/n,s10,x6/12,pj/o,x9/14,s10,x11/1,pi/m,x7/8,pf/d,x11/14,s10,pm/b,x4/5,s9,x9/7,po/j,x4/15,pi/b,s4,x8/2,s1,x3/13,s12,x15/1,s11,pm/d,x11/8,s1,x12/6,pf/g,x1/7,pm/p,x15/5,s11,x8/14,pl/h,x0/1,pe/a,x4/10,pm/p,x6/12,po/f,x7/2,pp/m,x14/3,s4,x10/15,pa/f,x0/14,pc/b,x7/11,s1,x15/9,pa/o,x3/5,pd/e,x11/6,po/m,x15/12,s5,x10/6,pb/h,x2/12,s5,x10/4,pg/i,x14/12,s4,x8/1,s13,x3/13,pj/b,x5/0,s3,x6/14,pg/m,x7/3,s4,x10/1,pb/l,s12,x8/15,s6,pm/f,x6/9,s14,x14/3,pg/k,x5/12,pd/n,x6/14,pj/f,x10/12,s1,x14/1,pc/g,x10/7,s11,x4/14,s9,x3/15,s12,x12/11,s8,x5/1,s6,x2/13,s5,x6/8,pm/k,x14/5,pf/p,x0/11,s12,x7/13,s3,x3/14,pj/h,x6/2,pe/k,x4/7,po/h,x3/8,s5,x14/10,s12,x12/4,s7,x13/14,pm/i,x4/0,po/d,x12/7,pp/b,x15/10,s7,x8/5,pl/a,x6/10,s7,x13/15,s6,x3/8,s11,x13/12,s13,x14/6,pb/m,x13/9,pe/j,x15/11,pb/f,x5/13,s3,x4/1,s3,x12/7,s5,pk/c,x15/10,s11,x1/13,s15,x9/5,s1,x14/3,pn/p,s10,x7/15,s2,pl/d,x0/2,pa/m,s7,x1/13,s10,ph/e,x6/12,pn/a,x3/15,pg/i,x10/8,pd/o,x7/13,pc/a,x10/0,pi/b,x3/12,pc/h,x15/1,s1,x0/11,pe/f,x3/15,pm/k,x8/4,pf/b,x7/10,s3,x2/13,po/k,x6/1,pl/h,x7/3,s6,pf/o,x8/1,s10,x14/13,pl/p,x4/8,s5,x14/5,pb/o,x13/2,pf/c,x9/1,pk/o,x6/11,s4,x7/0,s6,x3/11,s3,pc/b,x2/5,s15,x4/15,pm/o,s11,x7/5,pb/n,x12/10,s11,x13/15,pp/c,x8/14,s12,x3/1,s1,pe/g,x4/14,s6,x3/13,pc/p,x10/8,pn/e,s11,x4/11,s1,x7/10,s4,x5/14,pd/g,x2/12,s5,x3/13,s14,pp/b,x14/4,pk/n,x3/1,pd/g,x11/10,pe/p,s6,x9/8,s10,x11/3,s1,x5/10,s13,x8/15,s2,x12/9,s1,x0/10,pa/i,x1/9,pd/o,x5/12,s13,x2/0,s10,x13/9,s14,pb/p,x0/10,pa/h,x9/5,s3,pm/k,x4/8,s10,x6/10,s4,x11/3,s12,x4/7,s13,x9/6,s5,pd/i,x7/10,po/l,x4/14,s1,x0/2,s6,x1/5,s9,pm/c,x14/4,pp/n,x2/5,pl/k,x15/4,s2,x1/14,s9,x0/13,s14,pm/i,s1,x8/2,s10,x12/13,s1,x8/2,s3,x6/1,pb/e,x4/3,s2,x2/12,s6,x0/5,po/j,x8/4,pi/a,x10/2,pp/f,s5,x4/8,pl/g,x1/0,s8,x12/3,s3,x5/15,s4,x3/0,pm/n,x11/6,s5,x14/13,s14,x6/3,s7,x2/1,s15,x7/6,s14,x5/9,s9,x1/15,s9,x6/0,s12,x7/9,s13,x13/12,s14,x14/9,s15,x8/13,s5,x5/14,s8,x11/13,pj/b,x2/3,pn/o,x15/5,s4,x6/13,s6,pd/l,x9/8,s1,x0/14,s10,x6/5,s2,pp/i,x12/9,s7,x14/2,ph/f,s4,pi/l,x15/11,s12,x13/2,pn/h,s6,x4/10,s15,x13/6,s15,x15/8,s5,x4/14,pf/i,x3/7,po/g,x2/4,s5,x14/8,s10,x9/3,s4,x2/13,pf/a,x15/11,pd/c,x12/13,s1,x10/11,s12,x1/7,s10,x14/15,s10,x6/3,s12,x9/15,s14,x3/10,s11,pa/b,x14/2,s12,x5/13,s5,x9/2,pn/k,x7/1,s7,x4/5,s13,x13/6,s5,x15/3,s4,x13/1,pa/h,s8,x3/4,pm/e,x5/10,pb/g,x3/15,pe/i,s7,x4/5,s2,x2/15,s1,pm/a,x6/0,s5,x13/11,pp/b,x5/9,s6,x2/10,pk/o,x1/13,s3,x10/14,s1,x6/5,s11,x2/7,pg/i,s12,x13/9,s8,x2/10,s11,pm/a,x5/14,pg/o,x11/4,s11,x6/13,pd/p,x4/5,s1,x10/13,s15,x0/2,s1,x3/10,s4,x5/9,s11,x3/13,s13,x5/9,s1,x11/8,s14,x14/4,s9,x12/6,pm/f,s15,x7/2,pc/k,x5/6,s14,x13/1,pa/i,s10,x4/9,ph/c,x6/5,s1,x11/14,s1,x9/13,s14,pa/j,x7/14,pi/b,x12/10,pd/a,x0/11,s15,x12/7,pb/i,s12,x9/15,pe/f,x5/3,s7,x10/4,pg/i,s2,x1/6,s15,x8/14,po/j,s10,x9/11,pe/d,x2/3,s11,x14/10,s5,x13/3,pm/l,x7/15,pn/e,x12/6,s12,x8/5,s1,x1/14,s5,x6/7,s2,x3/12,s3,x5/15,s4,x13/3,s2,x11/2,pd/b,x7/0,s10,x13/8,s6,x6/5,s13,x7/8,pg/l,s10,x11/9,pn/a,x8/1,pm/f,s14,x15/14,s14,x2/9,s12,x13/11,s8,x5/2,pk/o,x7/11,pf/j,x15/13,pi/m,x1/7,s15,x13/14,s3,x12/0,s4,x6/1,s9,ph/l,x8/2,s4,x12/10,pm/n,x11/1,pl/j,x2/6,s7,x8/5,s7,x15/13,s6,x8/7,s2,x2/3,pk/p,x0/9,s9,x6/10,po/e,x3/14,pa/p,x8/15,s6,x3/7,s12,x14/9,s13,x2/8,pi/c,x13/15,s6,x1/3,pp/j,x5/10,s8,x15/1,po/f,x13/6,s13,x10/12,pp/j,x2/7,s14,x5/4,pe/a,x3/11,s9,x13/9,s10,x5/11,pg/n,x9/7,pa/l,x1/14,s6,x9/10,s14,x13/3,pn/o,x15/9,s3,x11/10,s7,x13/3,s7,x12/10,s1,x7/14,s4,x9/15,s8,x8/7,s3,x5/14,s7,x11/13,pc/g,x4/9,pi/n,x2/3,s11,x11/10,s13,x5/12,pf/e,x3/2,s4,x10/1,s12,po/m,x9/0,s6,x2/14,pl/f,x12/3,s6,x9/2,s10,x15/6,pi/c,x2/7,s7,x14/0,pl/m,x13/1,pe/p,x9/2,pb/j,x8/1,s11,x3/11,s4,x15/12,s7,x14/9,pg/l,x3/0,pa/p,x13/4,s5,x1/8,s10,x10/3,s6,x6/12,s8,x10/7,s1,x9/13,pk/h,x2/7,s15,pi/b,s5,pe/j,x12/6,pn/k,s14,x4/5,pi/b,x14/15,s15,x7/1,pc/a,x8/10,s6,x0/1,s4,x7/9,s10,x13/1,ph/l,x15/11,pg/a,x7/3,s4,x15/1,s1,x14/7,s13,x6/15,s8,x0/10,pm/o,x4/6,s8,x3/13,s2,x9/6,pg/p,x3/11,pi/k,x6/14,s7,x7/10,pe/l,x8/15,s9,pg/c,x7/11,pf/d,x2/8,s12,x15/11,s6,x5/9,pk/i,s5,x7/10,pa/g,x12/8,s5,x7/15,s6,x13/1,pf/b,x3/7,ph/n,x15/13,s4,x9/4,pc/g,x3/2,s12,x11/12,pm/o,x14/6,s6,pj/i,x3/4,s7,x12/0,pk/b,s11,x15/1,s14,pn/d,x11/0,pg/m,x12/1,s4,x5/7,s8,x9/15,s3,pj/h,x0/1,s10,x2/4,pd/m,x13/14,s11,pb/p,x3/10,s5,x15/8,pm/c,x4/14,s4,x5/8,s2,pa/h,x14/2,pe/i,x15/10,pp/b,x14/5,s15,x13/7,s12,x5/6,pa/c,x11/12,s9,x10/5,s7,x0/13,ph/f,s10,x3/12,s8,x15/2,pp/a,x5/0,s14,x13/11,s2,pn/e,x15/0,s11,x4/13,po/c,x2/5,s13,x11/1,s5,x12/2,s15,x15/13,s14,x9/5,s10,x13/12,pn/e,x10/8,pk/i,x0/9,s8,x2/10,s1,x8/0,po/c,x10/14,pb/h,x0/5,pn/i,x14/10,s2,x3/6,s8,x1/10,s15,x2/0,s13,x15/8,pc/h,x2/3,s15,x5/9,s11,pb/a,x14/4,s10,x13/7,s11,x6/2,s1,x5/4,pj/e,x9/3,ph/l,x15/4,s3,x5/0,s4,x10/3,s4,x4/14,pm/d,x13/9,s3,x15/7,s6,x9/14,s8,x2/10,s7,x0/4,s4,x11/6,pp/a,x13/4,s4,x0/12,s9,x14/8,pc/n,x4/2,s14,x11/9,pj/k,s14,x15/10,pd/g,x6/7,s8,x8/15,s8,pm/j,x11/1,pg/a,x5/8,pk/i,x10/2,s13,x5/14,s15,x1/15,pl/m,x5/14,s3,x10/3,pj/g,x13/9,ph/p,x5/2,pi/o,x15/12,s11,x6/10,pg/l,x8/5,s8,x4/13,pe/k,x3/0,pn/j,x2/5,s3,x10/8,pd/m,s10,x2/12,s14,x0/7,s10,x15/3,s15,x6/13,s14,x4/0,s15,x11/6,s2,x3/13,s8,x4/14,ph/k,s2,x15/6,pe/o,x3/14,s11,x1/7,s7,x2/11,pa/l,x3/0,pf/o,x4/7,s10,x11/6,pg/i,s6,pj/n,s14,x9/4,ph/d,x2/12,s13,x13/0,s13,x3/8,po/p,x14/11,s1,x0/10,pj/m,x12/1,s10,x15/11,pn/a,x2/14,ph/j,s3,x10/11,s12,x6/15,s3,x11/14,pp/c,x5/6,s4,x14/12,s8,x7/15,s2,x10/2,pl/m,x0/12,po/n,x8/5,s3,x4/14,pi/a,s13,x12/5,pd/j,x15/2,s13,x14/7,s5,x5/3,s13,x11/6,pa/c,x4/12,pp/e,x14/0,s13,x8/11,s6,x14/13,s10,x2/11,pk/i,s9,ph/f,x5/9,s5,x7/12,pk/a,x11/8,pb/n,x15/0,s3,x6/4,pl/m,x12/11,s10,x4/15,s15,x13/10,pj/p,x8/14,pg/m,x4/3,s10,x0/2,s15,x6/4,s14,pd/f,x3/12,s3,x14/9,pp/l,x3/15,s10,x4/14,pi/d,x12/1,s1,x4/11,s3,x14/3,s2,x5/8,s12,pj/p,x2/10,s3,x3/12,s14,x11/1,s1,x13/3,s5,x6/0,pl/g,x4/2,s6,x14/10,s11,x0/11,ph/j,x14/2,s13,x3/11,s5,x10/7,s8,x15/12,s8,x4/5,s10,x13/14,s11,x5/8,pg/p,x1/7,s13,x11/8,s8,x1/4,pf/h,s5,x9/12,po/k,x1/4,s10,x3/7,s8,x9/8,s13,x5/1,s11,x13/14,s2,x8/10,pf/e,s1,x12/9,po/k,s10,x11/15,s6,x7/1,s6,x8/9,pe/p,s13,x10/3,s2,x8/9,pb/c,x2/15,s11,x7/11,s3,x9/10,s15,x6/7,s5,x10/13,pa/e,x7/11,s10,x12/10,pm/l,x8/13,s9,pj/n,x15/11,pf/i,s11,x7/2,s14,x0/10,s15,x1/5,s7,x8/3,s8,x5/11,s15,pl/h,x4/2,s10,x6/8,s8,pb/g,x12/2,s11,x6/11,s6,pc/j,x14/12,s5,x6/8,s9,x11/9,s13,x12/5,s5,x3/14,s12,x1/0,pd/b,x4/5,s3,x0/6,s5,x14/15,pa/e,x7/1,s6,x11/15,s13,x14/1,s15,x10/6,pm/i,x13/2,pl/n,x6/15,pj/i,x5/7,s3,x0/8,s4,x2/9,s11,x1/3,pg/c,x11/15,pf/k,x0/9,s11,x10/7,pl/d,s11,x14/1,s1,x0/7,s12,pp/e,x10/6,pf/d,x9/4,pj/c,x7/0,s12,x14/3,s1,x9/12,s2,x15/11,s2,x12/14,s12,x4/5,pp/d,x15/12,po/h,x13/9,s4,x3/6,pa/g,x8/10,po/d,x12/14,s7,x13/9,s4,x7/12,s7,x1/6,pg/m,x2/4,s11,x5/9,s7,pc/i,x13/2,s4,x6/15,pg/o,x8/11,s15,x4/6,s5,x10/12,pe/b,x9/14,pc/a,x4/6,s10,pg/f,s5,x12/9,s9,x13/15,s9,x0/5,s10,x8/10,s1,x6/5,s9,x2/0,ph/e,x4/14,s12,x2/11,pd/k,x13/9,s4,x7/4,ph/n,s11,x8/13,pp/i,x6/11,s2,x5/15,s4,pl/c,x12/3,s10,x1/15,pg/n,s9,x11/4,s3,x9/8,s7,x11/15,s10,po/f,x5/0,s15,pa/g,x14/3,ph/m,x15/12,s8,x8/2,s3,x1/6,s1,pf/b,x7/3,s12,x11/12,po/g,x13/4,s4,pi/n,x6/9,s4,x5/13,pj/f,x6/10,s7,x3/11,s3,pg/p,x1/15,po/k,x6/0,s11,x13/2,pe/m,x0/5,s15,x1/14,s7,x2/6,pf/l,s6,x15/9,s15,x8/12,pg/o,x10/1,s8,x7/9,pa/e,s9,x0/13,pj/d,x15/9,s5,x11/4,s4,x5/7,s15,x12/1,s14,x11/15,s3,x10/0,s13,x9/14,s11,pb/h,x8/12,pn/f,x0/14,pp/l,x8/13,s10,x2/1,s11,po/f,x14/8,pn/j,x2/5,pc/h,x7/10,pn/e,x8/15,s15,x12/11,pd/l,x13/3,s9,x1/11,s3,x12/13,pb/k,x2/9,pd/m,x7/5,pf/g,x13/11,s12,x14/2,s10,x3/13,pj/e,x7/15,s2,x9/10,pc/d,x6/8,s10,x7/9,pm/e,x12/6,s10,x7/8,pp/a,x0/9,s2,pj/i,x8/1,s15,x7/10,s10,x0/3,po/g,x13/14,s4,x15/3,s11,x4/8,s2,pp/d,x7/11,s1,x9/8,s3,x15/5,s15,x3/12,s12,x9/14,pa/j,x8/0,s7,x4/5,pk/o,x7/3,s9,x6/0,s10,x4/7,pe/i,s8,x13/8,s4,x9/0,pd/k,x5/13,s8,x10/15,pf/a,x11/9,s5,x6/7,s3,x5/11,s3,x15/1,pb/d,s11,x2/8,s15,x3/15,pg/c,x2/8,pl/k,x0/9,s9,pg/h,x7/4,pa/f,s3,x13/3,pd/i,x6/12,s2,x13/9,pa/n,x0/5,s5,x3/12,s15,pl/k,x7/6,s1,x2/11,s14,x3/4,s9,x14/12,s15,pj/i,x4/3,pg/p,x15/0,po/a,x7/3,pp/n,x15/4,pd/o,s4,x5/13,ph/c,s3,x1/3,pj/i,x7/11,pd/g,x9/10,po/i,x11/5,pk/h,x8/2,s4,x0/12,pf/l,x9/5,pa/g,s2,x13/3,pk/c,x11/0,s10,x3/8,s10,x10/1,pg/o,x3/11,s11,x9/12,s4,pm/n,x3/14,s5,x15/0,s4,x10/12,ph/b,x15/0,pj/o,x2/1,s6,x9/10,s11,x7/12,pm/l,x1/8,pi/e,x2/12,pb/f,x1/10,pm/j,x14/4,pf/h,x2/3,pc/d,x13/1,s4,x4/7,pk/g,x3/6,s9,x0/14,s6,x6/11,s1,x10/1,s5,x11/12,pp/o,x14/3,s13,x7/5,s8,x11/4,s12,pk/e,x6/5,po/m,x1/15,s3,x8/4,s15,x1/5,s4,x4/15,s9,x13/3,pg/d,s2,x7/5,s9,x13/2,pk/n,s3,x9/4,s1,x0/6,s15,pb/i,x14/10,pl/j,x1/12,pp/i,x14/15,s14,pn/m,s9,pj/b,x6/3,s12,pe/k,x1/10,po/b,x13/6,ph/l,x5/8,pk/e,x6/15,pn/b,x13/7,pe/f,x10/15,s14,x8/5,ph/b,x15/2,pj/k,x9/5,s12,pi/o,x0/2,s13,x4/12,pe/c,x9/5,pg/h,x3/2,pa/m,x0/10,s10,x12/9,pc/g,x1/5,s15,x6/12,pl/m,x1/8,s4,x11/10,pb/k,x12/14,pg/i,x0/7,pj/e,s1,x12/8,s12,x7/11,pm/p,x14/8,pl/e,s14,x9/2,pk/d,x8/10,s9,x6/4,s5,x2/1,pn/j,x5/7,s2,x9/10,s12,x8/12,s7,x3/10,s2,pp/l,x7/11,pf/a,x14/8,s15,x15/4,po/k,x14/2,s7,x11/5,pc/b,x1/9,s1,x8/11,s13,x1/15,pj/p,x9/7,pe/a,x11/0,pg/i,x9/15,s13,x4/8,pa/l,x13/14,pg/d,x15/1,s10,x7/11,s3,x4/3,s9,x7/14,pi/k,x15/9,s3,x8/6,s6,x14/5,pa/m,x8/9,pc/f,s5,x5/6,s11,pi/l,x11/4,s13,x8/7,pm/c,x12/15,pl/g,x0/2,s3,x11/8,ph/m,s3,x3/14,s3,pn/j,x10/4,s5,x6/5,s9,x9/10,pm/i,x0/7,s5,x8/6,pg/e,x11/12,s7,x14/4,s7,x1/8,pn/d,x12/3,pl/f,x5/10,s12,x0/11,s8,x7/3,pg/j,x0/13,s15,x14/9,s2,x8/4,po/p,x13/10,pn/f,x15/9,s8,x5/2,s2,pg/o,x9/11,s7,x12/0,pl/c,x13/11,s11,x7/9,po/j,x5/13,s4,x9/6,s9,x11/5,s1,x1/2,s15,x3/5,s8,x10/15,pb/n,x2/1,s7,x10/4,s1,x3/5,pd/p,x12/1,s1,x11/8,s1,x6/10,s3,x15/1,pf/k,x5/2,pn/h,x3/12,pp/o,x11/5,s11,x3/10,s3,x8/0,s13,pc/d,x15/11,po/a,x13/2,ph/l,s8,pb/i,x1/12,pe/o,x13/5,ph/n,s6,x2/3,s7,x14/1,s13,x8/15,s5,x4/13,pi/b,x8/2,s10,x10/9,ph/k,x6/14,pc/n,x9/12,ph/a,x7/8,s4,x11/1,s10,x12/2,s1,x0/5,po/l,s11,pa/d,x1/14,s13,x10/13,pg/e,s4,x1/7,s5,x4/13,pf/h,x2/6,pi/p,x10/3,s13,x0/5,pg/l,x10/8,s4,x15/2,s15,x13/4,pk/c,x3/14,s5,x4/11,s13,x8/6,s7,x5/2,pi/g,x14/13,s8,x11/5,s9,x10/15,pc/b,x8/2,s15,x5/0,pm/p,x13/4,s11,x5/9,pe/c,x11/0,po/d,x7/9,s6,x11/0,s5,x13/12,ph/k,x3/15,s6,x2/6,s13,x1/10,s14,x9/5,s9,x10/7,s1,x15/6,s7,x4/11,s7,x7/6,pa/j,x0/14,pe/g,x9/6,s7,x10/3,pi/l,x15/12,pk/g,x6/13,s15,x15/1,s3,x11/8,s8,pa/n,x7/15,s10,pi/p,s15,x1/13,s13,pc/a,x8/12,s9,x11/4,pl/m,x14/8,s10,x9/15,pj/p,x7/3,s4,x9/15,pn/b,x6/8,s4,x11/1,pa/g,s9,pk/i,x4/12,s8,x0/13,pn/j,x14/10,s2,x15/7,s5,x9/8,s15,x5/1,s15,x4/11,s6,x8/15,s12,x10/14,s14,x6/1,po/m,x10/3,s6,pe/i,x1/13,pc/l,x4/9,s2,pg/p,x2/13,s9,x3/6,s13,x10/13,s11,x0/8,pe/m,s5,x2/9,pi/c,x13/6,pm/h,s14,x5/4,pa/e,x15/7,s12,x13/2,s6,x1/4,s4,x11/5,s5,x9/14,pn/f,x12/5,s12,x9/0,s3,x15/3,s4,x10/9,po/j,x7/4,s12,x14/5,pb/h,x10/11,po/j,x14/4,s4,x11/5,s12,x12/15,pb/n,x5/13,pl/e,x14/12,pj/m,x3/6,s2,x4/12,s3,x9/5,ph/o,x1/4,s7,x6/5,s2,x0/8,pc/m,x12/4,s13,x7/1,s14,x9/4,s13,ph/k,x10/3,pe/d,x5/7,pb/n,x1/11,s7,x14/12,s4,x5/8,s15,x9/2,s2,x8/10,s15,x4/1,pd/a,x8/3,pk/b,x2/11,pg/o,x15/5,s2,x1/6,pp/n,x0/5,pf/g,s1,x14/12,s11,x2/6,pj/l,x3/7,s1,x4/15,ph/a,x3/6,s14,x2/12,pi/p,x15/13,pd/m,x3/2,pg/l,x5/13,s9,x4/14,pj/c,x5/13,s6,x0/7,s10,x8/10,pm/i,x12/4,s13,x10/0,s2,x5/6,s4,x3/7,pl/j,x12/10,s6,x9/6,s5,x14/8,s2,x1/2,s12,x6/12,pn/m,x11/7,s3,x0/12,s11,pb/p,s15,x10/8,s12,x4/1,s6,x15/5,pi/a,x9/1,s14,x15/5,s11,x8/12,po/g,x4/9,s3,pn/m,s14,pl/f,x3/2,pa/p,x14/4,s9,pe/n,x11/2,pc/b,x13/10,s14,x3/11,s3,pp/d,x14/15,s13,x11/9,s14,x0/12,s7,x6/14,s2,x8/9,s2,x2/10,s13,x14/11,pe/n,x9/6,s5,x5/0,s9,x11/14,ph/d,x1/12,s3,x9/0,pb/c,x6/1,pl/m,x7/0,s5,x2/8,pc/e,x9/11,pk/m,x0/4,pi/p,x7/9,s3,x11/4,s5,x9/15,s10,x7/14,ph/n,s8,x9/5,s14,x8/12,s3,x5/7,s7,x12/3,s7,x13/7,pi/d,x8/2,s15,x3/13,s11,x8/15,s2,x12/7,s13,x3/4,s11,x15/0,pl/o,x4/2,s10,pb/d,x7/8,s12,x10/3,s3,x5/0,pl/k,x9/2,s11,x10/7,s11,pi/h,x13/0,pm/j,x11/14,s8,x7/13,pk/c,s2,x6/14,pn/i,x5/1,s5,x10/8,s11,x9/13,s1,pb/c,x8/2,s13,pd/j,x15/5,s2,x3/2,s8,x11/7,s8,x2/1,s5,x9/10,s6,x4/7,s14,x11/15,s3,x1/14,s7,x7/9,s1,x8/13,pb/e,x6/11,pp/i,x2/5,s13,pa/n,x12/13,s2,x11/7,pi/k,x1/5,s3,x11/9,s2,x2/6,pc/l,x12/9,s6,x2/15,pi/a,x6/10,pn/d,x0/1,s11,x15/6,s13,x4/11,pg/f,s7,x6/9,s14,x1/11,po/m,x14/9,s9,x15/6,s10,x5/0,s12,x3/8,s12,x10/4,s13,pb/d,x11/9,pf/e,x8/6,s10,x9/14,s10,x1/10,s5,pl/n,x12/4,pp/f,x15/8,s5,x0/4,s11,x10/12,s13,x11/1,s6,pm/l,x5/2,s9,pf/a,x10/12,s5,x0/13,pk/p,x10/7,s8,x14/11,pj/f,x0/8,pl/b,x3/9,pe/n,x8/5,pm/d,x15/6,s13,x2/13,pp/n,x6/4,s4,x7/13,s1,x2/11,s3,x14/7,pi/a,x4/3,s3,x15/7,s1,x14/4,s6,x7/5,s13,x0/12,s10,ph/b,x3/10,pn/d,x2/1,pk/f,x3/5,pd/e,s3,x11/7,s8,x14/3,s3,x7/8,s2,x4/1,pm/f,x6/11,s4,x10/7,s9,x11/0,pj/i,s5,x3/1,s6,x5/0,pc/d,x11/13,s14,pf/j,x4/12,s6,x14/0,pm/n,x3/5,po/i,x13/12,pk/b,x0/15,s9,x2/5,s9,pa/j,s6,x3/12,s12,x8/2,pe/m,x13/5,s13,x7/4,s2,x2/15,po/h,x8/0,s15,pj/g,x9/12,s10,x13/6,s13,pl/n,x2/10,s6,x5/12,pe/p,x4/11,s13,x2/14,s14,x10/4,pj/h,x2/11,pi/p,x13/5,s12,x9/0,s14,x2/11,s8,x12/15,s7,x8/10,pe/j,x6/11,s12,pp/m,x5/4,pn/k,x7/6,s13,x12/5,s10,x10/0,s11,x1/6,pm/h,x13/9,pa/d,x10/3,s15,x0/13,s11,x6/1,s2,x0/7,s2,x13/14,pp/h,x0/5,pj/d,x7/9,pb/i,s2,x0/14,s4,x4/5,s11,x11/10,s14,x7/12,s8,x5/6,s12,x8/3,pg/m,x2/13,s12,x9/5,pc/o,x3/6,pe/b,x14/2,s4,x0/1,s14,x13/4,s2,x11/9,pa/k,x12/14,s4,x13/4,pg/p,x5/11,pb/d,x8/7,pa/n,x13/6,pd/g,x10/0,s8,pm/n,x13/4,pk/d,s9,x3/5,s6,x1/4,s15,x9/12,pm/b,x5/11,pl/a,x3/8,s2,x2/1,s11,x7/10,s8,po/c,x12/5,s4,x6/9,pl/p,x1/11,s8,x14/12,pa/i,x10/8,pl/e,x7/13,s14,x10/0,s9,x6/4,s14,x10/11,ph/g,x0/9,s4,x6/2,s10,x3/7,s14,x6/5,pj/k,s2,x3/10,s3,x5/8,pp/d,x9/3,s11,x12/6,s11,x8/10,s6,x5/6,ph/n,x4/1,s13,x2/8,pl/p,s7,x6/5,s5,x3/4,s4,x7/11,s15,x13/14,pb/g,x9/8,po/n,s14,x2/15,s13,x12/3,s15,x9/13,pa/f,x3/6,s13,x1/4,pn/b,x7/0,pl/f,x1/10,pa/c,x2/7,s5,x15/14,pj/g,s13,x3/0,s7,pc/d,x12/6,pa/p,x15/8,s13,x0/9,pm/l,x4/12,pk/a,x0/3,pg/i,x2/12,s13,x4/1,pe/p,x6/0,pm/a,x15/2,pe/l,x0/6,po/f,x11/10,s5,x6/0,s9,x11/15,s5,x1/7,s8,x9/3,pg/i,s4,pb/e,x11/6,pl/k,s3,x2/3,pf/b,x1/13,pk/h,x2/5,s6,x3/6,pn/f,x5/1,pe/h,x14/12,pn/j,x10/2,s3,x1/15,s12,x13/3,s12,x1/6,pm/k,x8/15,s5,x10/14,pg/c,s6,x8/2,s14,x4/12,pj/i,x8/0,s14,x13/15,po/e,s15,x7/1,s11,pj/h,x3/5,pb/n,x11/1,s13,x8/9,s10,x0/14,s8,x9/7,s7,x4/12,s6,pc/m,x13/0,s1,x8/15,s1,x0/2,s6,x10/3,s5,x7/12,s4,x1/2,s12,x13/4,s14,x12/2,pe/n,x0/9,s5,x5/15,s8,x3/0,s4,x5/1,pg/k,x4/6,s9,x13/3,s15,x10/7,s6,x9/15,pp/n,x6/11,pd/j,s10,x1/7,s10,x13/10,s15,x4/1,s6,x2/9,pp/h,x11/14,s6,x4/0,s1,x1/5,pn/c,x8/11,s6,pp/f,x0/13,pe/m,x3/8,s9,x2/6,s12,x8/7,s14,x12/1,s1,x13/3,s1,x4/11,s9,x7/2,pn/j,x15/6,s9,x13/9,s9,x3/0,pk/c,x14/10,pf/e,x13/3,s7,x7/4,pk/p,s8,x14/2,s9,x15/3,s13,x5/6,pd/l,x8/2,s5,pm/c,x11/3,pe/g,x6/5,s4,x15/0,s10,x14/9,pc/l,x7/12,pf/i,x14/2,s2,x11/6,s10,x15/12,pg/l,x3/14,pp/h,x9/8,pl/a,x0/14,pi/m,x7/9,s8,pg/c,x2/0,pe/l,s7,x5/6,s15,x9/0,s12,pf/d,x4/11,s12,x15/1,pi/e,x4/14,pb/k,x3/0,s4,x2/14,s9,x1/6,s7,x11/7,s12,x1/10,pp/n,x15/6,ph/k,x4/11,s11,x7/0,po/g,x15/8,s3,x12/14,pl/j,x11/5,pe/d,x6/13,ph/k,s8,x10/4,s7,x14/11,pn/b,x7/1,s3,x10/3,pj/k,x11/4,s4,x13/5,s14,x1/9,s12,x0/6,s8,x15/11,s1,x5/4,po/c,x14/0,pe/k,x5/8,pb/j,x15/14,s2,x0/10,s9,x11/9,s7,x3/0,s12,x5/14,s11,pc/p,x7/2,s3,x12/1,s5,x6/0,s13,x11/5,pm/b,x14/13,pd/j,x7/1,s10,x11/14,s5,x4/13,s12,x10/8,s14,x5/12,s6,x9/4,pm/c,x10/15,s6,x3/0,pk/o,x6/13,s11,x4/11,ph/e,x1/13,s6,x2/0,s13,x3/13,s7,x14/12,s10,pk/p,x8/9,s11,x10/2,s2,x7/6,pa/l,x14/13,s11,x3/15,s3,x12/11,s10,pb/c,x0/6,pe/n,x10/4,pf/c,x2/5,pj/e,x14/13,s12,x7/3,pd/n,x10/1,pc/b,x4/3,ph/k,x9/13,s2,x14/6,s2,x5/9,s5,x2/14,s7,pa/m,x11/0,s13,x7/3,s2,x4/1,pd/l,x7/13,pp/b,x8/4,s6,x10/5,pe/g,s14,x1/12,s12,x11/6,s6,x5/8,s5,x11/15,ph/c,x6/0,po/m,x4/10,s2,pe/d,s15,x11/15,ph/c,x1/9,s6,x3/8,pf/b,x10/11,pp/n,x5/13,pj/g,s4,x12/9,s14,x4/15,s6,x1/9,s1,pp/f,s4,x15/11,pa/g,x14/2,pn/o,s9,x8/3,s12,x6/13,pa/j,x1/10,pc/h,x3/12,s14,x2/5,pk/l,x12/7,pg/i,x2/15,pk/f,x14/5,pd/g,x4/6,pj/n,x10/13,s1,x15/3,s11,x4/8,s5,x15/12,s14,x9/10,pf/b,x8/3,s2,x0/15,s14,x14/7,po/d,x5/0,s5,x8/14,s2,x3/4,s4,x0/2,s2,x5/4,s9,pb/j,x15/9,pe/p,x0/5,s12,x2/12,s15,x13/0,s15,x10/9,s8,x4/6,po/g,x11/15,pc/f,x10/2,s11,x5/11,s12,x2/1,pd/j,s14,x12/5,s14,x11/6,pi/l,x7/5,s9,x6/2,s3,x7/15,s14,x3/2,s10,x0/10,pp/f,x11/14,s9,x10/13,s3,x9/2,po/e,x12/10,s2,x7/6,s10,x8/3,s11,x11/10,pf/j,x1/5,s9,x15/4,pb/g,x11/0,pk/f,x12/14,s10,x8/2,s5,x6/10,pi/n,s12,x0/8,pm/g,x4/13,s3,x6/3,pn/p,x8/9,s15,x3/4,s1,x5/9,pm/a,x1/4,pe/b,x8/13,s7,x6/7,pk/j,s11,x3/1,s4,x2/9,s14,x6/4,s14,pb/l,s13,x0/3,pf/j,x1/10,s8,x12/11,s12,pe/h,x14/15,s10,x13/3,s11,x6/12,s10,x5/0,s7,x10/14,s11,x4/3,pk/j,x13/0,s8,x14/9,s12,x3/13,pi/m,s11,x9/11,s9,x4/3,s9,x12/7,s3,x0/11,s14,x2/8,pl/h,x5/14,s12,x11/7,s13,x12/2,po/c,x11/8,s3,pm/n,s15,x15/10,pl/c,x8/0,s6,x1/6,pb/p,x4/0,s1,x5/3,pd/i,x2/1,pl/k,x4/13,s8,x3/1,s2,ph/p,x11/4,s5,x9/10,s13,x15/14,pl/f,x2/6,pi/e,x10/0,s3,pn/k,x15/5,s6,x10/9,s8,x8/0,pi/l,x7/1,pg/a,x9/8,pb/p,x7/5,pj/h,x10/0,s9,x11/1,s8,x15/8,s8,x3/9,pd/a,x14/2,pf/c,x10/3,s5,x6/5,s8,x0/10,pd/j,x15/2,s4,pn/o,s13,pj/i,x0/9,pl/b,s12,x11/1,po/g,x13/9,pe/k,x0/15,pl/m,x9/14,po/i,s7,x6/13,s8,x8/1,s3,x12/11,s15,x3/13,s12,x5/0,pk/c,s7,x10/9,pf/m,x3/8,s3,x9/7,s8,x0/4,s7,x14/3,s1,x1/9,pg/a,s3,x5/15,pe/f,x6/13,pb/k,x4/3,po/n,x8/14,pg/i,x11/15,pd/c,s14,x1/0,s13,x15/14,s4,x12/5,s5,x15/7,ph/e,s2,x5/13,s4,pg/k,x2/3,pa/n,x15/5,ph/l,s9,x13/9,s13,x0/8,pb/p,x13/2,s9,x11/4,pk/j,x6/5,s7,x7/1,s5,x5/2,pm/p,x9/14,s11,x2/10,pg/c,x8/9,s5,x4/11,s13,pn/a,x9/0,s13,x5/8,s1,x9/0,s2,pi/p,x4/8,s13,x12/0,pb/m,x4/3,s6,pk/i,x7/12,s11,x11/9,pc/e,x15/14,pn/m,x4/8,pc/e,x9/11,pi/a,x14/6,pl/o,x0/12,pa/g,x9/7,s1,x6/5,s1,x9/3,ph/k,x7/5,s10,x11/1,s4,x5/13,s13,x7/9,pb/c,x5/13,pd/a,s5,x1/6,s5,x13/5,s8,x0/12,pj/g,x13/2,s12,po/e,x5/4,pk/d,x9/13,pp/a,x10/5,pg/n,x0/7,s4,x12/2,pi/k,x5/15,pb/e,s13,po/g,x7/11,pd/a,x12/9,ph/e,x8/2,po/n,x12/7,pg/k,x6/5,s5,x12/4,s2,x10/5,pf/e,s4,x8/2,s5,x5/14,s10,x7/15,s5,x2/9,s8,x3/6,s11,x0/8,s8,pm/a,x3/13,pb/l,x8/4,pa/j,x11/6,s6,pn/k,x7/15,s14,x6/8,pj/a,x14/0,s3,x13/8,ph/i,s13,x3/1,pj/d,x10/14,s10,x7/4,pm/h,x13/10,pp/j,x14/9,pa/h,x2/15,s7,x6/1,s4,x0/4,s6,pj/p,x7/9,s13,x6/4,ph/b,x12/11,pd/f,x4/10,pb/h,x13/7,s8,x11/15,pn/d,x14/3,s11,x12/15,s2,x2/6,s5,x15/3,pk/l,x5/12,s2,x14/8,pc/g,x6/7,pf/p,x8/3,s12,x10/11,pm/o,x7/6,s10,x2/1,pp/j,x15/10,pa/n,x1/0,s9,x8/13,pg/e,x0/4,pd/m,x15/14,pc/j,x1/7,s4,x0/6,pb/o,x9/15,s15,x10/13,s2,pj/d,s9,x12/6,s5,x11/15,s7,x1/0,s6,x4/6,s2,x11/5,ph/n,x6/12,s14,x4/5,s6,x15/6,s8,x12/2,pb/i,x6/9,s15,x8/13,s2,x5/1,s6,x0/10,pe/d,x7/8,s10,x14/1,s13,x8/4,s12,x11/5,pb/m,x7/9,s2,x11/6,s11,x12/9,po/k,x11/4,pc/m,x1/8,pf/o,x3/13,s8,x10/9,s3,x13/12,pb/g,s8,x7/9,s9,x11/4,s4,x10/8,pi/m,x13/3,pa/d,x0/15,s6,x11/10,s14,x8/4,s13,x5/15,ph/n,x10/8,s4,x0/12,s1,x11/14,s5,x6/0,pa/b,s12,x1/11,s7,x3/9,pf/e,x13/15,pm/l,s1,x8/5,ph/f,x6/0,pe/m,x7/14,s1,x5/1,s11,x14/12,po/j,x13/15,pk/f,x4/11,ph/j,x5/8,s11,x15/1,s14,x2/13,s5,x14/1,pl/g,x11/2,s9,x8/7,pb/c,x2/14,s9,x9/12,s3,x4/3,s3,x10/11,s6,x1/15,pl/f,s13,x7/11,pm/n,x3/6,pl/p,x10/4,s10,x7/6,s6,x3/11,s8,x5/2,s1,x15/8,pj/g,x10/0,pa/e,x4/2,pp/c,x12/13,s3,x8/15,s5,x4/2,pf/l,x14/5,s1,x12/10,s4,pi/a,x3/2,po/e,x8/7,pi/c,x5/6,s11,x9/7,s3,x13/12,s15,x10/3,s3,x0/7,s7,x6/8,pj/l,x15/11,s14,x9/7,pp/a,s4,pk/g,x1/2,s7,x14/6,ph/i,x0/9,pp/f,s8,x5/3,s15,pc/b,x10/2,s15,x1/3,s6,x15/12,s6,x9/1,pm/f,x12/11,s3,x10/15,pj/k,x3/5,s5,x4/6,s15,x12/1,s11,x14/2,s14,x1/15,pb/d,x2/10,s4,x14/4,s5,x2/7,s15,pk/l,x10/14,pd/b,x0/1,s11,x14/7,pi/l,s3,x1/11,pb/m,x5/7,s12,x4/1,pk/c,s8,x11/2,s8,x1/13,s11,x3/14,pp/m,s15,x8/10,pk/b,x6/7,pf/j,x14/8,s7,x12/7,s6,x4/11,pe/n,s5,x1/3,s13,x5/14,pm/d,s9,x11/12,s8,x2/1,s2,x0/12,pg/p,x15/13,s14,x3/12,s8,x14/6,pe/j,x0/11,s10,x3/4,pp/b,x6/12,s6,x5/2,pc/h,x8/4,pp/k,x14/5,s14,x7/13,s3,x2/10,s3,x11/1,s4,pl/b,s9,x0/12,ph/i,x15/8,s12,pl/p,x5/0,s1,x2/9,s4,x15/4,s14,po/m,x2/14,s1,x4/7,s14,x8/6,s13,x5/10,s4,x3/11,s5,x9/2,s6,x5/10,pd/a,s11,x8/0,s6,x7/13,s4,pg/i,x11/3,s15,x15/13,pk/d,x7/8,pi/l,x1/2,pk/a,x9/13,s2,x12/14,s8,x13/9,s2,x0/15,pg/f,x11/4,pi/o,x0/7,s7,x6/4,pk/n,x14/5,s10,x13/12,pf/l,x3/14,s13,x8/11,pg/n,x1/9,s12,x5/14,s8,x7/3,s11,pf/j,x10/12,pd/e,x13/11,s13,x1/4,pc/n,x7/8,s9,pa/k,s9,x9/1,s9,x7/11,s10,x9/2,s7,x10/15,ph/d,x7/6,pl/m,x3/2,ph/f,x5/10,pp/g,s13,x12/6,pj/c,x10/8,s3,x6/11,pk/o,x12/15,s12,x10/0,pf/l,x6/1,pc/g,x0/4,s1,x15/7,s10,x9/12,pj/n,s12,x4/5,s7,x9/6,s10,x15/10,s10,x4/9,s10,x0/8,s6,x7/3,pm/g,x15/1,s13,x2/7,s12,x6/15,s2,x5/2,s3,x15/14,s5,x4/3,pc/l,x10/9,pa/e,x3/11,s4,x0/13,s2,x15/10,s8,x0/4,pp/j,x14/13,pl/d,s6,x1/6,pe/o,x14/13,ph/c,x0/6,s3,x1/2,pb/e,x4/5,s11,x1/3,pc/o,x2/9,s14,x12/11,pm/j,x1/7,s11,pi/l,x5/6,s12,x15/8,pj/f,x5/1,s9,x11/12,s3,pb/n,x10/2,s10,x1/4,s11,x12/0,s7,x13/7,s14,x0/3,s9,x8/15,pi/j,x0/11,s5,x13/15,s11,x7/11,ph/f,x8/10,pm/n,x13/12,ph/j,x8/10,s6,x7/5,s7,x4/3,pa/o,x8/15,s4,x3/1,s8,x6/10,s9,ph/c,s6,x12/14,s12,pp/i,s8,x4/9,s1,x8/12,s3,x2/6,s14,x4/11,s2,x8/5,s10,x7/4,s14,x8/12,s4,x5/2,s1,x8/9,s5,x7/12,pb/a,x11/3,s14,x13/12,s4,x9/6,pi/l,x15/2,pk/c,x12/7,pa/d,x9/4,s14,x1/14,pm/e,x6/9,s3,x7/8,s7,x6/14,s12,x3/7,s15,ph/d,s9,x6/12,pc/a,x7/11,s6,x8/12,s1,x3/5,s1,pm/p,x8/15,s14,x0/2,pn/d,x14/8,ph/c,x13/12,pg/i,s5,x8/14,pk/m,x15/2,pp/l,x0/12,s5,x2/7,pk/e,x1/13,pi/h,x6/9,s1,x2/12,s13,x7/10,s12,x12/14,po/k,x11/4,s1,x3/8,s1,x10/2,s9,x5/4,pj/h,x13/10,s8,x8/2,pd/p,x6/3,pi/n,s9,x4/12,pj/e,s5,x8/0,s9,x4/5,s12,x10/7,pm/d,x6/8,pe/i,x0/4,pb/j,s11,x3/13,s8,pg/c,x4/11,s9,x14/5,pl/n,x10/11,s6,x5/0,pk/b,x1/3,s13,x13/4,ph/n,x2/8,s10,x11/3,s6,x7/10,po/c,x3/14,pa/k,s1,x11/8,pb/n,x0/12,s4,x5/9,s6,x2/1,s6,x6/8,s3,x5/13,ph/f,x10/1,pb/l,s9,x12/11,s15,x5/15,s8,x3/1,pd/p,x11/0,s7,x9/15,s5,x0/7,pc/n,x12/10,ph/j,x14/9,s2,x15/0,s1,x7/10,pa/n,x2/15,s1,x11/4,s14,x2/6,pj/i,x13/11,s7,x14/10,pb/f,x8/6,s11,x7/12,pm/i,x13/14,pk/o,x7/12,s12,x3/8,pj/g,x13/7,s15,x1/4,ph/n,x0/15,pl/g,x12/5,s15,pd/h,s11,x9/3,pa/n,s2,x12/6,pk/j,x10/0,s7,x3/8,s13,x0/7,pa/i,x12/11,pj/f,x5/1,s11,x13/12,s9,x15/3,pp/m,x9/5,s8,x8/2,pd/e,s8,pm/n,x10/13,s7,pd/h,x4/9,pj/c,x3/7,s10,pa/l,x12/1,s3,x2/3,pi/o,x10/5,s7,x14/0,pl/m,x2/13,s1,x5/7,s7,x14/1,pi/e,s6,x2/15,s12,x9/3,pf/n,s2,x12/13,s2,x8/1,pa/k,x7/14,pe/p,x11/6,s8,x0/9,s6,x2/15,s13,x7/9,s3,x2/10,pc/o,x3/11,s15,x15/9,pp/k,x4/12,s14,x9/11,pl/i,s13,x6/0,s9,x2/14,pc/g,x9/11,s9,x2/12,s2,x0/3,pd/j,s5,pg/p,x9/6,s8,x10/12,s9,x7/5,s8,x14/13,s13,x8/11,pa/l,x1/0,s8,x11/5,pm/n,x3/10,s2,pc/g,x2/4,pj/d,x15/7,pc/b,s5,x10/12,s8,x15/14,pj/i,x4/11,s8,x1/7,s2,x13/3,pe/p,x15/2,ph/i,x7/10,s12,x13/11,s15,x14/1,s9,x6/11,s12,x1/12,s11,x4/9,s2,x12/8,pd/p,x5/3,po/f,s3,x14/1,s1,x0/3,s9,x8/9,s14,x4/0,s5,x2/6,s2,x0/14,s2,x3/12,s2,x15/9,s6,x6/3,s3,x4/7,pd/g,x2/3,s2,x7/0,s7,x11/6,s10,x9/15,s10,x5/3,s6,x9/2,pf/p,s9,pl/c,s14,x7/11,s3,x5/15,s1,x9/11,s6,x0/13,ph/g,x12/14,s12,x7/4,pm/k,x12/11,s4,x3/7,pl/h,x10/14,s2,pj/g,x0/11,s10,x9/15,s7,x1/7,s14,x3/10,s8,x12/1,s12,x2/5,pp/i,x4/6,s9,x8/2,s14,x0/4,s11,x11/9,s11,x13/6,s8,x0/1,pb/e,x10/5,s3,x2/13,s7,x7/15,s6,x6/8,pn/d,x10/14,s7,x13/5,pf/m,x7/0,pg/l,x8/2,s4,x9/0,pa/m,x2/7,s8,x10/0,pb/f,x15/1,s3,x9/10,pk/d,x14/0,s7,x12/1,pf/h,x9/7,s9,x4/11,pi/n,x0/14,s3,x5/2,s8,x11/0,s11,x15/5,pg/a,x4/6,pk/m,s4,x2/11,s4,x3/8,pi/o,x13/4,s6,x14/9,s14,x3/15,pl/j,x0/9,s12,x2/12,s8,x13/8,ph/n,x10/9,s9,x0/1,s1,x12/5,s3,x3/15,s14,x10/2,pi/p,x1/12,pd/b,s3,x11/2,s13,x10/15,s6,x12/3,s10,x6/15,s3,x10/3,s1,x4/13,s6,x14/5,po/m,x7/0,s6,x5/2,s11,x3/13,pb/d,x7/12,s15,x4/15,pp/c,x5/1,pg/n,x14/15,s13,x12/4,s3,x5/7,s15,x11/4,s3,x13/7,pl/k,x4/0,s3,x1/3,s3,x10/12,s7,pe/i,x11/6,s6,x0/15,s7,x14/12,s9,x10/3,pf/p,x1/11,po/c,s10,x3/15,s10,pi/k,x6/4,pm/g,s11,x1/10,s8,x6/13,s7,x2/14,s11,x15/13,s14,x5/2,pf/b,x13/0,pm/i,s7,x1/2,s13,x11/7,s9,x5/9,s10,x11/15,pb/o,x13/10,s11,x2/6,s4,x8/12,s3,x10/13,pc/n,s14,x7/9,pf/m,x6/8,pi/g,x13/9,s1,x15/3,pl/m,x1/5,s5,x3/4,pd/j,x14/9,s15,pe/f,x6/5,s11,x10/11,s11,x7/15,pp/a,s9,x11/14,po/c,s13,x8/13,s7,x7/11,pi/f,x14/6,s6,x10/15,pj/a,x13/6,s14,x7/1,pl/b,x2/14,s10,x3/15,s2,x9/8,po/d,x12/15,pn/h,x4/1,s5,x2/15,pp/f,s6,x10/7,s8,x3/1,s13,x11/5,s5,x2/1,pb/h,x15/0,s12,x10/4,s13,x9/6,s4,x3/4,s9,x9/8,s15,pj/e,s13,x12/11,s1,x8/14,s7,x12/11,po/g,x4/14,pa/e,s12,x6/2,pp/o,x7/10,s1,x11/5,ph/m,x7/1,pn/o,x5/15,pm/i,s12,x9/0,s3,x5/7,pa/n,x10/11,pk/b,s2,x6/14,pi/f,s2,x9/4,s4,x12/2,s6,x13/14,s13,x10/1,pk/e,s10,x6/3,s5,pd/n,x4/5,s10,pe/i,x1/14,s5,x12/10,pj/f,x0/9,pc/d,x13/14,s11,x3/5,pn/l,x6/2,s10,x1/3,s15,x2/14,s1,x4/10,s13,x7/13,s5,x3/1,s8,x7/2,pi/a,s15,x9/14,s14,x11/0,s5,x1/5,pj/c,x10/6,pp/k,x3/13,s5,x11/12,s13,x15/0,pl/c,x4/11,s2,x10/5,po/b,x8/2,pa/m,x0/11,s14,x6/15,s14,x5/12,pg/j,s5,x9/4,s4,x3/12,po/n,x15/11,ph/m,x4/13,pi/e,s12,x3/6,s13,pd/n,x8/11,s11,x3/0,s12,pc/b,x12/1,pf/d,x3/6,s4,x5/13,s2,x2/4,s2,x15/10,po/g,x14/6,s5,x12/8,s12,x3/7,s7,x14/8,pf/j,s5,x15/11,s8,x3/7,s12,x0/8,po/g,x3/10,pe/m,s13,x15/9,s7,x10/8,s8,x14/15,s13,pl/a,x6/2,s9,x7/9,pe/b,x2/15,s14,x3/13,s7,x14/7,s13,x0/4,s14,x13/9,pk/l,x15/6,s4,x13/4,po/c,x2/1,pa/p,x4/9,s14,x15/10,ph/c,x14/12,pj/g,s8,x2/6,s9,x0/1,s9,x7/11,s10,x5/15,pm/e,x9/14,pb/c,x3/15,s9,x6/7,pk/f,s8,x9/4,pg/b,x0/7,pn/j,x11/15,pf/e,x5/13,pb/m,x12/0,s6,x2/9,s7,x5/6,ph/l,s5,x1/0,pg/f,x8/6,pn/d,x0/14,po/a,x2/15,pb/c,s10,x13/4,po/l,x6/1,pc/h,s10,x2/3,pe/b,x12/7,s15,x9/0,s5,x13/8,s1,x5/6,pk/c,x13/11,s10,x7/14,s2,x10/1,s13,x5/14,pe/l,x8/13,po/b,x11/7,s10,x2/0,s4,x9/13,s13,x3/14,s13,x4/10,s14,x14/2,pj/g,x3/1,s15,x11/6,s3,x13/4,s1,x6/1,s14,x4/14,s6,pk/a,x12/11,s11,x9/15,s6,x12/2,ph/j,x0/1,pe/b,x14/6,s10,x13/7,pi/f,x14/2,s14,x12/0,s7,x1/9,pj/h,x14/13,pg/d,x6/12,s15,x1/7,s5,x9/0,s10,x1/7,pc/e,x15/14,s5,x13/0,s10,x15/7,pj/i,s3,x4/0,s14,x7/3,s15,x14/5,pf/m,x2/1,pb/a,x3/6,pe/n,x9/2,pk/i,x10/15,s2,x4/7,s13,x15/13,s11,x2/6,pp/j,x15/11,s15,x14/5,pn/i,x4/12,s13,x2/6,pg/p,x0/3,pd/a,x15/8,pk/b,x9/14,pf/n,s11,x10/12,pl/a,x2/1,s8,x11/8,pf/h,x12/2,pc/e,x11/5,s6,po/m,x13/9,s5,x0/6,s1,x5/14,s5,x2/8,s11,pj/n,x11/15,s2,x2/3,pe/f,x4/15,s15,x3/6,s14,x0/1,s15,x12/11,pa/c,x5/1,s2,x14/9,pn/p,x0/7,s5,x14/5,s7,pd/c,x11/9,s15,x2/8,pi/b,x15/9,pk/g,x7/3,s15,x2/1,ph/o,x14/6,s7,x12/2,s7,x6/3,s4,x2/8,s3,x4/11,s3,x6/8,s5,x14/15,pe/p,x4/10,s3,x2/6,s2,x15/7,pg/o,x8/11,pc/a,x12/15,s14,x7/13,s4,x14/8,pl/h,s14,pb/p,x12/5,pe/a,x4/7,ph/c,x10/2,pj/m,x6/7,pd/b,s6,x4/9,s12,x10/12,pl/p,x3/8,s13,x10/6,pj/b,x14/15,pn/a,x1/8,s13,x14/6,po/h,x12/9,s7,x5/2,s3,x8/12,s14,x5/14,pe/a,x0/1,s1,x12/3,pl/p,s9,x9/2,s13,x11/1,pg/d,x12/2,ph/f,s10,x11/3,s9,x4/2,pd/e,x14/9,pn/l,x13/6,pi/k,x15/1,s14,x6/12,s6,x15/0,s4,x8/11,pp/j,x9/0,pd/e,x11/4,s15,x8/9,pj/i,x15/10,s3,x5/2,pl/h,x15/8,pe/p,x12/4,s9,x8/2,s5,x10/6,s14,x0/9,s14,x5/3,pm/c,x11/1,pd/o,x9/15,s10,x4/8,s14,x6/7,s12,x14/5,s9,x12/11,s2,x10/13,pi/m,s15,x15/5,s7,x10/2,s6,pk/l,x12/6,pd/h,x11/10,s9,x1/14,s3,x7/12,pf/e,s14,x3/2,s5,x0/12,s8,pc/b,x1/8,s5,x6/9,s3,x10/8,po/m,x14/9,s4,x13/15,pn/f,x3/8,s6,x15/0,ph/d,x13/3,pi/l,s13,pa/p,x12/8,pb/j,x5/13,s2,x3/15,s5,ph/p,x4/1,pj/k,x11/2,s1,pl/o,x7/1,s4,x15/12,s3,x10/4,s10,x0/2,s7,x5/4,s10,x10/1,pb/c,s8,x13/8,s3,pd/p,x6/15,s1,x13/4,s3,x0/7,s8,x8/6,s4,x2/3,s5,x9/4,s4,x3/14,s15,x15/1,s12,x2/5,pg/i,x11/9,pc/d,x3/2,s14,x15/10,pj/p,x7/13,pg/f,x12/15,po/n,x5/1,s14,x6/3,s6,x5/4,s13,x0/7,s1,x1/5,s15,x3/8,s1,x14/11,s11,x5/3,s1,x11/4,s10,x14/9,s4,x13/11,s12,x12/10,s2,x9/2,s6,x12/6,s1,x9/1,pd/f,x10/4,pe/p,x12/3,s9,x2/11,s12,x1/12,s3,x3/4,s1,x9/12,pj/n,x11/10,s3,x6/14,s2,x4/8,s7,x11/14,s3,x9/1,s7,x5/13,po/d,x9/10,pj/e,x1/6,s5,x13/3,pc/d,s8,x4/1,pp/n,x10/11,pd/o,x5/13,s4,x10/8,s13,x12/1,s14,x9/2,s9,x4/0,s6,x11/10,s12,x15/5,s9,x12/6,s7,x15/1,s6,x9/8,s1,x5/15,pm/c,x6/14,s1,x1/10,s2,x11/5,s5,x0/3,s6,x14/1,pl/o,x8/10,s1,x2/14,s6,x15/5,pg/i,x3/8,s1,x0/6,s10,x1/14,s10,x13/2,s7,x6/10,s3,x2/15,s14,x11/0,pk/h,x10/12,s3,x1/6,s8,x10/9,pp/m,x5/7,s14,x8/15,s14,x0/9,pa/l,x13/15,pc/g,s13,x1/14,s5,x15/7,s7,x12/3,s5,x15/4,s8,x13/11,pk/d,x2/15,pp/l,x14/1,s4,x8/5,pm/i,x9/11,po/g,x1/7,s15,x9/13,s12,x3/6,s15,pa/n,x7/1,s14,x15/11,pm/p,x14/6,ph/b,x15/2,s3,x4/9,s4,x5/7,s5,x3/13,s6,x11/14,s8,x2/8,s6,x6/0,s5,x1/10,s6,x14/13,s1,x7/8,pm/e,x1/3,pb/j,x15/4,s10,x6/12,s9,x0/10,s15,pk/p,x5/4,s2,x3/9,pb/l,x10/13,s8,x2/15,pa/f,s14,x12/1,pe/k,x4/14,ph/j,x1/3,pd/l,x0/4,pb/k,x7/11,s12,x4/12,s4,x0/14,s8,x1/15,s9,x13/9,s2,x6/7,s3,x12/13,pg/e,x4/6,pf/c,x0/1,s10,x12/13,s2,x9/10,pe/g,x6/2,pl/f,x7/12,s2,x6/10,pj/g,s11,x3/2,s11,x11/0,po/a,x14/9,pg/l,x4/12,s7,x5/11,pm/b,s11,x12/10,po/a,x5/3,s3,x0/9,s6,x15/4,s3,x6/11,s1,x9/2,s9,x10/6,pe/g,s7,x9/2,s8,x10/13,s11,x6/15,s14,x12/11,pm/a,x7/14,po/c,x9/3,s13,x2/5,pd/f,x13/12,s10,pe/n,x4/9,pk/c,x2/5,s3,x8/10,s1,x1/7,s9,x6/14,s6,x8/4,pf/n,x0/9,s13,x14/2,pl/c,x11/8,pd/a,x2/9,s9,x7/5,pm/b,x1/11,s8,x0/4,pc/f,x12/13,s12,x11/6,s4,x4/3,ph/i,x15/1,pm/g,x4/3,s3,x2/8,s13,x14/0,pj/b,x7/2,pg/i,x11/13,pa/f,x15/7,s11,pn/i,x11/6,pd/g,x9/3,s14,x1/4,s6,x6/11,s10,x15/2,s11,x11/1,s10,x6/4,s6,x14/7,s9,ph/n,x5/11,s8,pj/e,x7/9,s6,x6/11,s2,pc/h,x10/7,s14,x9/1,s7,x15/5,pk/o,s3,x14/7,s7,x0/2,s12,x1/14,pp/a,s8,pk/m,x12/8,s12,x9/13,s6,pj/i,x10/6,s12,x4/15,pp/g,x7/5,s7,x14/15,s6,x5/13,s4,x9/8,pe/a,x0/11,s14,x15/2,pm/o,x11/7,s10,pi/g,x8/5,po/m,x3/12,s5,pg/c,x1/8,pd/o,x11/10,s2,x6/5,ph/p,x14/11,po/b,x9/2,s15,pj/i,s15,x12/14,s10,x11/7,pm/p,s5,x10/3,s10,x7/8,s15,x11/5,po/b,s5,x15/14,s10,x3/6,pd/f,x2/10,pm/e,x4/14,s12,x5/11,s8,x12/8,s11,x10/5,s12,x0/8,s3,x5/2,s10,x11/14,s4,x4/7,pl/n,s10,x14/8,s13,pm/k,x10/15,pi/f,s1,x0/14,s11,x2/13,pc/o,x10/4,pi/g,s1,x13/14,pa/j,x9/5,s1,x4/7,s5,x1/13,s4,x5/9,pi/b,x8/11,pj/a,x2/10,pe/f,x4/12,s10,x0/3,s5,x7/12,s11,x11/6,pi/k,x5/1,s1,x0/2,pl/f,x5/15,pp/c,x14/10,pa/k,s14,x7/11,ph/b,x0/5,pe/a,x14/7,ph/i,x0/13,s9,pb/j,x1/9,pc/k,x3/8,ph/n,x10/6,pi/o,x15/7,s15,x0/14,pj/f,s1,x4/5,s11,x12/11,s4,x3/6,s5,x1/12,pp/l,x2/4,s15,x8/3,s7,x7/12,pj/o,x4/13,pe/d,s2,x6/3,s15,x5/8,s14,x3/9,s1,x7/0,s11,x2/8,pp/i,x12/13,s15,x9/11,s4,x3/4,po/n,s12,x2/11,s14,x7/6,s4,x9/14,pm/a,x2/13,s12,x9/14,s14,x5/3,pp/j,x15/7,pd/k,x0/6,s9,x12/11,pn/i,s8,x5/14,s11,x4/10,s7,x11/6,s7,x5/2,s6,x11/7,s2,x0/9,ph/d,x1/2,s7,x3/8,s11,x6/9,po/e,x0/2,s9,x8/7,s12,x4/0,pb/n,x5/11,s4,x8/1,pm/p,x12/5,s6,x2/7,s9,x6/13,pk/f,x15/3,s15,x0/5,pi/j,x11/14,pl/e,x8/4,s10,x12/9,s3,x6/1,s3,x8/9,pg/k,x6/10,s3,x15/3,s1,x8/0,s1,x6/13,pa/h,x8/7,s4,pb/f,x9/2,s10,pi/a,x1/0,pl/j,x14/3,pf/d,x9/1,pe/i,x8/4,pa/f,x7/12,pc/h,x1/10,s13,x9/15,pb/f,x5/1,ph/j,x14/12,s10,pf/p,x8/1,s4,x6/2,pa/b,x3/7,pp/k,x5/11,ph/f,x10/12,s3,x0/8,pk/d,x10/4,pb/c,x0/13,pg/o,x10/2,s14,pb/k,x5/1,s3,x10/9,ph/j,x4/8,s7,x9/7,s6,x1/5,s9,x14/13,s3,x11/6,s15,x13/9,s4,x5/7,pn/b,x10/12,s8,x1/8,s7,x3/0,s9,pj/f,x7/6,s4,x8/1,s7,x12/5,pe/b,s13,x9/13,pn/d,x14/8,pb/f,x4/7,s9,x9/14,s13,x2/11,s15,x6/4,pn/g,x3/9,s5,x8/14,pp/m,x11/7,s6,pi/e,x15/1,s9,x10/8,s1,x6/1,s6,ph/n,x4/8,pd/k,s10,x9/0,s8,pf/g,x4/8,pk/l,s4,x7/0,s2,x1/10,s9,x8/6,pf/b,x3/11,ph/j,x6/14,pk/l,x2/1,pp/m,x4/10,pa/k,x11/8,pg/j,x6/13,pe/k,x11/9,pg/o,s2,x13/6,s1,x14/4,s2,x3/9,s6,x11/13,s7,x14/15,pe/l,x11/6,pf/d,x9/15,pn/h,x2/4,s7,pg/m,x3/15,s10,x4/11,s1,x7/10,po/d,x12/11,s1,x10/9,s1,x8/7,s6,x1/2,s10,x8/5,s14,x13/9,s10,x2/1,pl/p,x7/4,s12,x0/3,pm/k,x8/1,pp/d,x14/15,s15,x6/11,s4,x9/4,s8,x1/12,pj/a,x8/9,s14,x13/5,pd/f,x8/4,s1,x0/15,pm/p,x4/7,pf/e,x3/5,pp/k,x12/10,s11,x4/14,pn/f,x11/13,s3,x8/2,pi/j,x14/13,s1,x12/15,pd/l,x14/4,po/b,x9/6,s4,x10/2,s2,x1/0,s9,x5/7,pk/g,s7,x14/15,s13,x9/4,s9,pa/m,x1/3,pf/e,x6/2,pd/l,x13/9,s5,pj/n,s11,x4/7,pi/f,x10/3,pb/l,x4/7,pj/g,x15/13,s5,x8/7,s4,pk/l,x9/12,s4,x2/0,s9,po/g,x6/4,pb/k,x5/0,s4,x13/4,pe/l,s11,x14/1,s4,x7/11,s11,x10/6,s10,pj/h,s14,x13/9,s15,x4/1,pe/c,x11/15,s15,x5/2,pd/i,x1/3,pb/a,x2/11,s6,x0/12,s9,pj/i,x1/3,pb/e,s13,x6/15,s7,x7/14,pp/h,s11,x3/15,s6,x7/12,s9,x1/14,pl/m,x6/8,pd/j,x2/11,s7,x15/1,s8,x3/6,s1,x15/9,pi/g,x7/1,pd/b,x6/5,s3,x13/4,s1,x0/2,pp/e,x9/15,pa/n,x8/2,s4,x1/7,s14,x11/6,pg/f,x3/1,pl/o,x6/15,pg/p,x1/12,s12,x0/6,pe/b,x15/10,s6,x3/2,s14,x14/1,s6,x9/12,s2,x14/2,s11,x3/5,ph/a,x10/2,s15,x12/13,pg/n,s2,pe/a,x4/11,s15,x15/7,s7,x14/0,s15,x10/9,pd/l,x12/4,s4,x15/5,pn/i,x10/1,pc/j,x5/12,s13,x2/9,s10,x15/10,s12,x11/9,s13,x13/14,pe/a,x15/8,s7,pj/h,x0/11,s3,x10/6,pe/m,x13/5,pc/k,x11/0,pf/j,x6/4,pe/o,x8/0,pj/c,x15/13,s7,x10/8,s10,x5/6,s1,x2/15,s6,x9/4,pb/h,x8/12,pe/o,x7/9,pp/k,s9,x0/2,s5,x8/14,s2,x0/3,pj/m,x4/12,pg/n,s8,x5/1,s7,x4/14,s15,x5/8,s5,x0/14,s9,x9/2,s4,x14/15,pj/l,x0/13,s4,x14/15,pn/k,x1/8,s15,x2/5,po/c,x6/7,ph/a,s6,x8/1,pm/b,s2,x7/13,s7,x6/5,s14,x0/7,s9,x2/1,s7,x15/14,po/e,x3/13,s8,x14/7,pk/c,x15/4,s14,x5/10,s6,pp/m,x11/6,s10,x5/9,s6,x10/11,s4,x13/14,pa/h,s2,x3/5,s10,x6/11,pm/e,s4,x8/3,s14,pj/l,x1/0,s9,pn/i,x11/3,pg/j,x4/10,pk/n,x0/8,pc/p,x3/15,pd/j,x9/7,pg/i,x12/1,s11,x3/8,pp/a,x0/14,pf/j,x12/13,s14,x8/9,pi/m,x13/3,s3,x7/6,pd/h,s2,x8/0,s5,pa/p,x4/12,s13,x1/2,s1,x8/5,pf/k,x11/1,s12,x10/7,s11,x13/1,s3,x2/6,pc/i,x15/8,s6,x14/7,s7,x11/1,pn/h,x13/5,s10,pj/c,x9/3,po/l,x14/0,pj/p,x8/3,s13,x0/7,s13,x1/14,pl/m,x11/10,s15,x4/2,s11,x13/7,s1,pd/j,x1/4,s4,x6/3,s13,x15/7,s9,x0/3,pi/n,x4/5,pm/e,x14/13,po/n,x5/12,pd/i,x7/3,s2,x8/11,ph/a,x3/14,s4,x5/4,pd/c,x12/3,s15,x10/7,s9,x8/11,pf/n,x5/15,s4,x7/10,pm/c,s14,x15/9,pg/o,x1/7,s6,x9/5,s15,x2/3,pp/d,x13/7,pb/c,x1/8,s5,x2/12,s13,x14/13,s10,x15/9,s10,x8/3,s1,x1/11,s10,x3/9,pi/l,x7/5,s10,x14/1,pn/p,s1,x0/4,s14,x12/11,s6,pg/h,x2/4,pc/a,x14/13,s3,x11/6,pl/k,x3/14,s9,x10/2,pm/o,x3/5,pd/k,x13/4,s7,x3/14,ph/i,x13/4,s6,x5/12,s15,x8/15,s11,x9/3,pc/g,x10/14,s9,x8/5,pe/m,s10,x15/11,pk/h,x4/10,pi/a,x0/11,s4,x3/9,ph/e,x11/8,pn/f,x10/1,pb/h,s12,x2/9,s7,x10/15,pp/d,x11/7,s12,x5/15,pk/h,x8/1,s1,x14/15,s7
diff --git a/2017/inputs/day_17.txt b/2017/inputs/day_17.txt
new file mode 100644
index 0000000..67bf40f
--- /dev/null
+++ b/2017/inputs/day_17.txt
@@ -0,0 +1 @@
+371
diff --git a/2017/inputs/day_18.txt b/2017/inputs/day_18.txt
new file mode 100644
index 0000000..8b74206
--- /dev/null
+++ b/2017/inputs/day_18.txt
@@ -0,0 +1,41 @@
+set i 31
+set a 1
+mul p 17
+jgz p p
+mul a 2
+add i -1
+jgz i -2
+add a -1
+set i 127
+set p 735
+mul p 8505
+mod p a
+mul p 129749
+add p 12345
+mod p a
+set b p
+mod b 10000
+snd b
+add i -1
+jgz i -9
+jgz a 3
+rcv b
+jgz b -1
+set f 0
+set i 126
+rcv a
+rcv b
+set p a
+mul p -1
+add p b
+jgz p 4
+snd a
+set a b
+jgz 1 3
+snd b
+set f 1
+add i -1
+jgz i -11
+snd a
+jgz f -16
+jgz a -19
diff --git a/2017/inputs/day_19.txt b/2017/inputs/day_19.txt
new file mode 100644
index 0000000..b4826aa
--- /dev/null
+++ b/2017/inputs/day_19.txt
@@ -0,0 +1,201 @@
+ |
+ +-----------------------+ +-------------------------------------------------------------------------------------------+
+ | | | | |
+ +-------------------|-----------------------|-----------------------+ +-----------------------------------------------------------------------|-----+ |
+ | | | | | | |
+ +-----------+ | +---------------------------------|-------------------------+ | | |
+ | | | | | | | | |
+ | +-----+ | | | | +---------------------|---------------------------------------+ | | |
+ | | | | | | | | | | | | |
+ | | | | +---|-------+ +---------------------------|---------------------------------------------------------------------|-----|-------------+
+ | | | | | | | | | | | | |
+ +-------|-------------------------------|-+ +-+ | | | +---------------------+ +-+ | +-----------------------+ +-------------+
+ | | | | | | | | | | | | | | | | | | | | |
+ | +---|---------|-----------------------|---|---|---|---------------|-----------------+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | |
+ | | | +-|-----+ | | | | | | | | +-------------------------------------|-----------------------------------------|-+
+ | | | | | | | | | | | | | | | | | | | | |
+ | +-------------|-----------------------|---|---|----Y------|-------|-----------------------------------------------------------+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | +-----------------------------------------------------------|-----|-------------------|-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | |
+ | | +---------------------------|-----------|---------------|-------------------------------------------------------------------------------------|-----------------+ | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | +---------------------------+ | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-+ | | | | | | | | | | | | +-+ +-------------------------------------|-----------------------------------|-----+ | +-----+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | +-|-|-------------------|-------------|-|---------|---+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | +---|-+ | | | | | | | +-----|-------------|-----------|---|-------------------------------------------------------------|-|-----|-----------|-------|-|---+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | +-|---|---+ | | | | | | | | +-------|-----|-|---------|-------|-|-----+ | | | | | | | | +-|---+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | +-|---+ | +---------|---|-----|-------------------------------|-----------------------|-----------+ +-|-------|-|---+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | +-|---------------|-------|-----|-------------|-----|---------+ | | +-|---+ | +-------------------+ | +-------------------|---------|-+ | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | +-------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------|---+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | +-|---|-|-------|-----------|-----|---------|-------|-------|-+ | | +-+ | | | | +-----------+ | | | +-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | +-----------------|---|---|-|---+ | +-----------------------|-------+ +-+ | | +-|-|---|-|-------|-+ | | +-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | +---|-----|-------------|---|-+ +-------|---------+ | | | | | | | | | | | | | | | | | | | | +-+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +-|-|-----|---|-|-|-------------------------------------------|-----|-|-------+ | | | | +-----|---|---------+ | | +-----------|---------+ | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-|---|-|-|-+ | +---|---|-------------------------+ | | | | | +---|-------|---|-+ +-|-|---|-|-----------|-----------|-----|-|-----|---|-|-----+ | +---|-----|---+ | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | +-----|-------------------+ | | | | +---|---------+ | | | | | | | | | | +-------|-|-----|-----|-------+ | | | +-+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | +---------------------|-+ | | | | | | +-----|---+ | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | +-|-|-----|---|---|-|-|-|-|-------------------+ | | | | | | | | | +-|-----+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | +-|---|---------------------------|-------------+ | +---+ | | | | | | | | | | | | | | +-----|-----------|-----|-------|---|---+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | +---------|-|-|-----------------------|-|-----------|---------------|-----|---|---------|---|-|---|-|-|-----|-----------|-------|---+ | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | E | | | | | | | | | | | | | | |
+ | | | | | | | | | | +-----|-----------|---|---------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | +-|---|-+ | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | +-|-------------|-|-|-----|----------U----|-|---|-------|-------------|-|-|---|---+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | +---------------|---------------------------|-----|---------|-----|-------------|-----------------+ | | | | | | | | | +-+ | +-|---|-----------------+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | +-|-----+ | +-|-+ +---------------|-|---+ | | | | | | | | | | | | | | | | | +-------|-----------------------|-|---|---|-|-----|---------|-|---------|---------+ T | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +-----------------------+ | | | | | +---+ | | +-|-----|---|-|-|-+ | | | | | +-------|---+ +-+ +-|-|-+ | | +---+ | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | +-----------|-----|-----------|-----|-----|-----------------|-|---|-------------|---|---|---|-----|---------|---------|-------|-----------+ | +---|-|-|-|-|---|---|-----+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | +---+ | | | | | +-|-----|-----|-------|---------|-+ | | | | | +---|-----|---------|---------|-------------+ | | | +-----------|---|-------|-----+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +---------|-----|-|-----|-------|-|-----------|-|-|-----|---|-------|-------|---|-|--D------|-|---|-------------|---------+ | +-------------|-|-----------------|-|---|-|-|-------|-------+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | +---------|---+ +-------|---|-------+ | | | | | | | | | | | | | | | +---|---------|---+ | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---------------|---|-|-----|-----+ | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------+ +-+ | +-|-----|-----|-----|-|-|-------|-|-------|-|-|-|---+ | | | +-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | +-|-------|-------|-----------------------------------|-+ | | | | | | | | | | | | | +---------------|---|-|-----|-|-|-------|-|-------+ | | | | +-|-|---|-+ +-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | +---|-|---------|-|---------|-|---|-|-----|-----|-|-|-----+ +---------+ | | | | | | | | | +---|-|-|-|-+ | | | +-----+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | +-------------|-|-----------------|-----------|-|-----|-----|-----|-|-----+ | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | +-----|-|-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---------|---+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-|-+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | I | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | +-|---------|-----|---------------------------+ | | | | | | | | | | | | | | | +-|-------+ | | | | | | | | | | | | | | | | | | +-+ | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +-|---|-------|---|-----|-|-----|---------------|-----|-----|-----------|---|-----------|-|-----|-----|---------------|---------|-|-|-+ | | | +-------|-------+ | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | +---|-|-+ +---------+ | | +-------|-----|-----|---------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-|-------|---+ | | | | | | | | +-----------------|-|---------------|---+ | | | | | | | +---|---|-----------|-|---+ | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | +---|---|-|-------------------------|-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-|-------|---|-----|-----|-----------|-------------------------|---|-+ | | | | | | | | | | | | | | | | | | +-----|-----------|---|---|---+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-------------|-|-|-------|-----|-------|---------|---------|-------------------|-|---------+ +-|---|-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-|-------------|---------|---|-|-----|-|-------------------|-|-----|-----|---------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +-----------|---|---+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | +-----|---|-----------|-|-|---------|-----|-|-------------|---|-------+ | | | | | | | | | | | | | | | | | | | | +---------|-|-----------|---|-+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | +---------|-----|---|-|-----|-----|-----|-|-|-----|-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | +-|-|---|---|---|-------|-----------|-|-+ +-|-|-----+ | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | +-----|-|-+ | | | | | | | | +-----------|---|-----|-|-------|-|---|-|N|-|-----|-------|-|-----------|---|-|-----|-+ | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | +-|-|-------|-|---|-------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-----+ | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---|-------|---|-+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | +---|-----|-----------|-|-|-|-----|-|---|---|-+ | | | | | | | | | | +-|-|-|-+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | +---+ +---|-------|---------------|---|---|-------------------|-------------------|-|---|-|-|---|-|-------------------|-----|-----|-|---|---+ | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +-----|---------------|-----------|---|-------|-----------------|-------|-------|-----------|-------|-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | +-|---|---|-------------------|-----|-----|-----|-|-|-|-----------+ | | | | | | | +-|-|---+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +-----|---------------|-------|---|---+ | | | | | | | +-----|-|-----|-|---|---|---|-|-|---------|---------|---------|---------+ | +-----------+ | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-|---------------|---|---|---|-|---------|-|---+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | +-------|-|-|-------|-------|---|---------|-------|-----------+ +-|---+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | +-------|---------|-----|---------|---------------------|-----|-----------|-|-----------|-+ | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | X | | | | | | | | | | | |
+ | | | | | | | | | +-----|-----|-|-|---------+ | | +-----------+ | | | | | | | | | | | | | | | +-----------+ +-|---+ | +-|-------|-+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | +-----------------|-|---+ | | | +-------|-|-------------|-------------|-----+ | | | | +-|---|-----|-+ | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +---------|-----------|-----------------|---|---|-----|-+ | | | | | | | | +-----|-|-|---|-------|-----|---------------|-----|-----|-|---|-----------|-----|---------|-----+ | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +---+ | | | | | +---------------------|-----|-----|-|-------------|-----|-----|-|-----------|-|-|-|-|---|-------------|---------|-----+ | +-----------|---------|---|-----|-----|-|---|-+ |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | +---|---|-----|---|-----|-------|-------|-----------|---------------------------|-|-|---------------------|-|-|---------------------|---+ | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | +-------|-----|-----------------+ | +-+ | | | | | | | | +-|-|---|-+ | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | +-|-----|---+ | | | | | | | | | | +-|-|-------------|-|-----|---------+ | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | +-|-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-+ |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-----|-|-|-------|---|---------|-------|---------|---|-----|-|-------------------|-------|-------------|-----|-|---------|-|---------------|---|-----------------|-------|-|---|-----------|---------+
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +---------+ | | | | | | +-----|---|-----|-----|---|-|-------------------------|-|-|-----------|-|-----|---------|-----|-----------------|-----|-----|-|-------|-----------------|---------+
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | +---|-|-----------|-|-|-----|---------|-----|-----------|---|-|---+ | | | | | | | +-----------|-+ | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | A | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-----|-----|-|---|-+ | | | +---+ +-----|---|-------------------------+ | | | | | +---------|---------------|-----------|-----|-+ | | | | | | +-|-------------|-|-|-|---|---+
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | +-----|-----------|-+ | | | | | | | | | | | +-+ | | | | | +---|---|---+ | | | | | +---+
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +-|-----|-|-------|-----------+ | | | | | | | | | | | | | | | | | | | | | | | | | +-+ | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | +-----|-|-----------|-+ | | | | | | | +-------|-|-------------|-----|-----|-----|---------------------|-|-------|---|-|---|---|---|-----|-----|---+ |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | +---|---+ | | | | | | +-|-|---+ | | +-+ | | | | | | | | +---|---|-|---|-------|-+
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | +-------------|-+ | | +-|-----------------------------------+ | | | +---|-----+ | | | | | | | | | | | | +-|-----------+ | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +---|-|-------|-+ | | +---|-------+ | | | +---------------------------|-----------|---|-------|-----|-----|---------------------------------|-------------------+ | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +-------|---+ +-------------+ +---+ +-|-|-------|-------------|-|---------------------------|-+ | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | +-------|---+ | | | | | | | | | | | +-+ +-------------------|-----+ +-+ +-----|-+ | +---+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | +-----|-------------------|---------|---|-------|-|---+ | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+ +-+ +---|-----------|-----------------------------------------------------------------------|-------|-----------|-----|-----------------------------------+ | +-------------------+ +-|-+
+ | | | | | | | | | | | | | | | | | | | | | | | | | P
+ | +-------|---------+ | | +-------------|-------------------------|---------|---|---------|-------------|-------------------------+ | +-----------------+ | |
+ | | | | | | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +-----------------------------|-----+ | +-------|-------------|---+ | +-----|---+ | | | | |
+ | | | | | | | | | | | | | | | | | | | | | | | |
+ | +---+ | +-|-------------+ | | | +---------+ +-------+ +-------------+ +---+ | | +---+ |
+ | | | | | | | | | | | |
+ +-----+ +-----+ +-+ +-----+ +-----------------------------------------------------------------------------------+ +-----------------+
+
diff --git a/2017/inputs/day_2.txt b/2017/inputs/day_2.txt
new file mode 100644
index 0000000..f2f1f5e
--- /dev/null
+++ b/2017/inputs/day_2.txt
@@ -0,0 +1,16 @@
+493 458 321 120 49 432 433 92 54 452 41 461 388 409 263 58
+961 98 518 188 958 114 1044 881 948 590 972 398 115 116 451 492
+76 783 709 489 617 72 824 452 748 737 691 90 94 77 84 756
+204 217 90 335 220 127 302 205 242 202 259 110 118 111 200 112
+249 679 4015 106 3358 1642 228 4559 307 193 4407 3984 3546 2635 3858 924
+1151 1060 2002 168 3635 3515 3158 141 4009 3725 996 142 3672 153 134 1438
+95 600 1171 1896 174 1852 1616 928 79 1308 2016 88 80 1559 1183 107
+187 567 432 553 69 38 131 166 93 132 498 153 441 451 172 575
+216 599 480 208 224 240 349 593 516 450 385 188 482 461 635 220
+788 1263 1119 1391 1464 179 1200 621 1304 55 700 1275 226 57 43 51
+1571 58 1331 1253 60 1496 1261 1298 1500 1303 201 73 1023 582 69 339
+80 438 467 512 381 74 259 73 88 448 386 509 346 61 447 435
+215 679 117 645 137 426 195 619 268 223 792 200 720 260 303 603
+631 481 185 135 665 641 492 408 164 132 478 188 444 378 633 516
+1165 1119 194 280 223 1181 267 898 1108 124 618 1135 817 997 129 227
+404 1757 358 2293 2626 87 613 95 1658 147 75 930 2394 2349 86 385
diff --git a/2017/inputs/day_20.txt b/2017/inputs/day_20.txt
new file mode 100644
index 0000000..f249f9e
--- /dev/null
+++ b/2017/inputs/day_20.txt
@@ -0,0 +1,1000 @@
+p=<-317,1413,1507>, v=<19,-102,-108>, a=<1,-3,-3>
+p=<1639,477,-2519>, v=<-79,-102,130>, a=<-9,9,12>
+p=<613,-993,-305>, v=<-39,27,-48>, a=<-2,8,11>
+p=<1343,190,-1565>, v=<-82,31,31>, a=<1,-4,5>
+p=<735,-285,2387>, v=<-20,-64,-67>, a=<-2,8,-6>
+p=<963,456,-1888>, v=<-42,-73,88>, a=<-1,5,1>
+p=<-1659,1444,-463>, v=<-14,-25,-77>, a=<10,-5,10>
+p=<-443,-95,-1185>, v=<142,-14,81>, a=<-12,2,-2>
+p=<-2590,3249,-710>, v=<35,-30,36>, a=<10,-14,0>
+p=<-1602,-171,924>, v=<83,-50,-20>, a=<0,6,-3>
+p=<-633,2195,-458>, v=<31,-200,31>, a=<4,0,2>
+p=<-347,-49,-1976>, v=<-19,-50,151>, a=<8,9,5>
+p=<852,314,125>, v=<-56,-83,-22>, a=<-4,9,2>
+p=<-10088,3682,-5210>, v=<52,32,-38>, a=<14,-8,11>
+p=<-4019,1982,4446>, v=<-4,47,-7>, a=<7,-6,-7>
+p=<3444,-2319,-11041>, v=<-171,-89,81>, a=<4,9,14>
+p=<2390,792,2117>, v=<0,47,114>, a=<-4,-4,-10>
+p=<5661,-1318,-1666>, v=<-87,-44,-33>, a=<-5,5,5>
+p=<2856,-1912,743>, v=<-36,59,-174>, a=<-3,0,9>
+p=<4275,5447,-5461>, v=<6,-11,31>, a=<-8,-9,8>
+p=<1263,1223,980>, v=<-98,-69,-68>, a=<0,-3,-1>
+p=<1094,963,1253>, v=<-85,-105,-75>, a=<0,5,-3>
+p=<2641,-922,2124>, v=<-113,61,-142>, a=<-13,2,-3>
+p=<600,859,-398>, v=<-26,-97,-4>, a=<-3,5,5>
+p=<-128,-1533,330>, v=<-12,73,-88>, a=<3,7,9>
+p=<1419,-1507,-528>, v=<-159,29,-15>, a=<7,13,8>
+p=<574,-1299,-1100>, v=<-17,104,113>, a=<-4,0,-4>
+p=<-440,-1923,-8>, v=<-2,131,36>, a=<5,3,-5>
+p=<-1705,-1617,-226>, v=<45,42,123>, a=<0,0,-6>
+p=<708,36,4790>, v=<1,57,-48>, a=<-1,-3,-4>
+p=<2266,9745,3707>, v=<38,-101,-78>, a=<-5,-8,-1>
+p=<7320,-629,-2164>, v=<-134,-62,18>, a=<-3,4,2>
+p=<746,6097,-2544>, v=<-78,-44,-11>, a=<3,-6,4>
+p=<1563,-7678,5873>, v=<115,-13,-57>, a=<-8,11,-5>
+p=<-8146,-3232,-5147>, v=<156,-52,155>, a=<3,7,-1>
+p=<-3966,4235,1389>, v=<7,44,22>, a=<5,-8,-3>
+p=<2171,-5151,14708>, v=<21,-21,-75>, a=<-4,8,-16>
+p=<442,-1232,2730>, v=<9,-20,3>, a=<-2,5,-8>
+p=<-273,-1960,5408>, v=<-58,89,-100>, a=<5,-1,-8>
+p=<-624,-3559,247>, v=<50,137,31>, a=<-2,0,-3>
+p=<2106,-2688,1482>, v=<-82,144,-57>, a=<0,-3,0>
+p=<-2886,1147,2678>, v=<83,-44,-157>, a=<2,0,4>
+p=<1984,472,-191>, v=<-31,-3,63>, a=<-3,-1,-4>
+p=<3604,-6710,-2540>, v=<-21,123,-32>, a=<-8,9,9>
+p=<5305,1390,781>, v=<-182,103,-15>, a=<-1,-11,-1>
+p=<-527,256,-1055>, v=<-22,-107,39>, a=<3,7,0>
+p=<7708,1660,5803>, v=<-131,-19,-103>, a=<-11,-3,-8>
+p=<-5981,-2228,-6671>, v=<68,-15,23>, a=<11,7,16>
+p=<1356,-1869,-687>, v=<39,68,25>, a=<-6,0,0>
+p=<-1052,4725,937>, v=<38,-66,54>, a=<0,-7,-6>
+p=<-1668,10101,-631>, v=<2,-229,23>, a=<4,-9,0>
+p=<-1906,-4165,4255>, v=<-33,-24,37>, a=<7,12,-13>
+p=<-2760,-2373,-2325>, v=<-46,57,40>, a=<10,2,3>
+p=<516,-6601,-1625>, v=<69,63,44>, a=<-6,12,1>
+p=<1062,-6279,-4929>, v=<6,66,17>, a=<-3,11,11>
+p=<1636,-2387,-1205>, v=<-87,72,58>, a=<2,1,-1>
+p=<3099,3807,-117>, v=<-71,-169,77>, a=<-9,-3,-7>
+p=<1009,-3185,-991>, v=<-1,39,-47>, a=<-5,13,10>
+p=<-3228,368,1954>, v=<142,32,-62>, a=<3,-5,-4>
+p=<1180,1793,-896>, v=<-20,-173,-2>, a=<-4,8,5>
+p=<-1936,7,2790>, v=<24,1,-36>, a=<8,0,-11>
+p=<-1214,-2045,3474>, v=<116,9,-132>, a=<-5,10,-5>
+p=<4619,2971,-3480>, v=<-171,-75,104>, a=<-7,-8,8>
+p=<-2088,1166,3018>, v=<112,-40,-28>, a=<0,-2,-13>
+p=<211,653,2410>, v=<21,107,-46>, a=<-3,-14,-8>
+p=<2415,1926,-1580>, v=<-75,50,34>, a=<-5,-15,5>
+p=<1538,-908,976>, v=<-54,31,26>, a=<0,0,-4>
+p=<3539,7415,1788>, v=<-18,-151,-32>, a=<-7,-7,-2>
+p=<3249,4196,-1373>, v=<-23,-25,2>, a=<-6,-8,3>
+p=<2031,-4301,1701>, v=<-41,148,-29>, a=<-2,0,-2>
+p=<2002,11678,-2475>, v=<-25,-148,85>, a=<-3,-17,0>
+p=<2350,-560,-1315>, v=<-52,64,15>, a=<-2,-3,2>
+p=<11423,-875,9878>, v=<-163,-146,-174>, a=<-13,11,-9>
+p=<1751,-5773,2469>, v=<53,156,33>, a=<-7,2,-7>
+p=<-2155,4333,-7110>, v=<51,-122,38>, a=<1,-1,12>
+p=<-5906,7123,1229>, v=<92,-84,-39>, a=<6,-9,0>
+p=<4696,-2115,113>, v=<-106,-74,-35>, a=<-3,9,2>
+p=<-1132,-4533,1322>, v=<34,36,6>, a=<0,7,-3>
+p=<1658,519,-978>, v=<-72,-26,-46>, a=<-5,-1,14>
+p=<83,-426,732>, v=<25,-35,32>, a=<-4,8,-10>
+p=<278,-1926,-1653>, v=<-52,49,79>, a=<4,10,4>
+p=<-787,-6,-183>, v=<-21,57,61>, a=<9,-7,-6>
+p=<-487,1044,612>, v=<-65,-109,32>, a=<12,5,-9>
+p=<2603,-1521,-123>, v=<-135,86,105>, a=<-5,2,-12>
+p=<-562,1044,-1188>, v=<12,-5,160>, a=<3,-8,-10>
+p=<-1715,3425,5361>, v=<-30,-42,-103>, a=<5,-4,-4>
+p=<-2803,721,-5279>, v=<-95,92,48>, a=<11,-7,7>
+p=<957,-303,-5263>, v=<-97,-107,64>, a=<4,7,6>
+p=<829,-943,-7839>, v=<-93,12,62>, a=<4,1,11>
+p=<-2883,4417,-4703>, v=<56,-40,96>, a=<2,-6,3>
+p=<2557,-6319,3889>, v=<51,147,9>, a=<-8,3,-8>
+p=<-7939,-799,-4191>, v=<82,-9,-52>, a=<10,2,11>
+p=<-7470,-439,367>, v=<120,92,9>, a=<17,-6,-2>
+p=<-2134,-94,-898>, v=<20,-115,40>, a=<6,10,0>
+p=<-478,1930,2092>, v=<20,-35,-114>, a=<0,-4,2>
+p=<1040,-1727,551>, v=<-82,28,-59>, a=<3,4,3>
+p=<-2318,-324,2069>, v=<4,63,-77>, a=<8,-4,-1>
+p=<-2249,21,-1220>, v=<73,0,18>, a=<2,0,3>
+p=<2627,-3199,-2577>, v=<17,44,113>, a=<-11,8,0>
+p=<-2732,-1796,482>, v=<-2,103,-68>, a=<10,-2,4>
+p=<441,1243,20>, v=<43,-28,83>, a=<-10,-8,-11>
+p=<1029,-1151,-764>, v=<-104,68,94>, a=<4,2,-5>
+p=<-672,-2551,97>, v=<25,153,40>, a=<3,4,-6>
+p=<1027,1714,-804>, v=<-72,-122,60>, a=<-1,-2,1>
+p=<416,1506,-50>, v=<-32,-22,16>, a=<0,-14,-1>
+p=<-1131,1623,-1103>, v=<150,-108,20>, a=<-9,-3,10>
+p=<1001,-990,-1454>, v=<-63,37,75>, a=<-2,5,6>
+p=<-418,465,403>, v=<-35,5,45>, a=<12,-8,-14>
+p=<682,-734,73>, v=<-21,120,-75>, a=<-7,-9,11>
+p=<-2343,333,-1159>, v=<140,-79,25>, a=<12,8,13>
+p=<924,421,-587>, v=<-43,3,-75>, a=<-7,-7,21>
+p=<-693,-404,293>, v=<44,24,-5>, a=<3,2,-4>
+p=<363,355,183>, v=<-58,-33,-49>, a=<4,0,5>
+p=<-5454,-1885,-2432>, v=<116,-43,149>, a=<13,12,-3>
+p=<342,-793,-941>, v=<-17,15,23>, a=<0,2,2>
+p=<-456,1139,-920>, v=<21,-22,0>, a=<0,-3,4>
+p=<-101,-4352,13169>, v=<23,75,-150>, a=<-1,2,-10>
+p=<-3122,360,-2677>, v=<83,-49,-84>, a=<0,2,8>
+p=<-7093,-2072,800>, v=<51,-24,78>, a=<7,4,-5>
+p=<6397,1082,4505>, v=<8,88,-39>, a=<-9,-6,-4>
+p=<-63,1937,-1005>, v=<22,46,106>, a=<-1,-5,-4>
+p=<-595,1367,-910>, v=<-42,-56,45>, a=<3,1,-1>
+p=<2578,-11667,-1670>, v=<-28,-25,-52>, a=<-2,17,5>
+p=<-3425,-215,4501>, v=<138,8,41>, a=<-2,0,-11>
+p=<-4625,-135,-939>, v=<27,-77,13>, a=<7,5,1>
+p=<479,1913,2117>, v=<-17,-42,-66>, a=<0,-1,0>
+p=<-3015,2181,-3524>, v=<-9,-40,-70>, a=<7,-2,12>
+p=<-2280,-5424,436>, v=<137,74,108>, a=<-4,7,-8>
+p=<6240,-669,-2024>, v=<-54,-7,-89>, a=<-10,2,10>
+p=<-3885,-84,-8054>, v=<51,-11,50>, a=<5,1,14>
+p=<-3345,6336,2956>, v=<2,-8,-69>, a=<7,-13,-2>
+p=<-3465,-1449,-779>, v=<6,-43,-22>, a=<7,6,3>
+p=<-1170,-8754,-1094>, v=<162,92,-27>, a=<-8,13,4>
+p=<6195,2541,886>, v=<-68,10,-31>, a=<-9,-6,0>
+p=<5625,3321,-2279>, v=<-142,-78,90>, a=<-3,-2,-1>
+p=<146,1150,-504>, v=<-34,-42,20>, a=<4,-8,3>
+p=<-64,-2,1992>, v=<16,-63,-110>, a=<-1,10,-9>
+p=<-1138,334,-24>, v=<99,0,-7>, a=<0,-4,1>
+p=<2156,-146,354>, v=<-104,14,-19>, a=<-11,0,-2>
+p=<2224,501,-708>, v=<-92,-21,-46>, a=<0,0,6>
+p=<664,405,960>, v=<98,33,22>, a=<-10,-4,-5>
+p=<1144,2061,-2388>, v=<-47,-36,149>, a=<0,-4,-4>
+p=<-212,-2043,4500>, v=<-78,-65,-113>, a=<7,12,-6>
+p=<1084,4569,-4644>, v=<-57,-28,-32>, a=<1,-13,18>
+p=<-824,5649,-4296>, v=<60,-48,-34>, a=<-2,-15,17>
+p=<88,-591,-3132>, v=<22,-13,30>, a=<-2,3,8>
+p=<2836,1917,-696>, v=<-30,-105,116>, a=<-7,2,-7>
+p=<-4061,279,753>, v=<73,-63,7>, a=<7,4,-3>
+p=<4439,579,-422>, v=<-46,-23,-24>, a=<-10,0,3>
+p=<-2060,11364,-3131>, v=<-39,-107,-127>, a=<6,-14,13>
+p=<6751,672,-9962>, v=<-119,64,97>, a=<-5,-5,12>
+p=<-575,7206,-6068>, v=<-33,-100,13>, a=<3,-7,10>
+p=<2197,2553,-4418>, v=<2,-78,-71>, a=<-4,0,12>
+p=<4045,243,-5342>, v=<31,9,-26>, a=<-9,-1,11>
+p=<358,122,480>, v=<-55,-68,25>, a=<4,8,-8>
+p=<-1021,-158,1908>, v=<156,12,-122>, a=<-11,0,-2>
+p=<939,283,-283>, v=<1,33,-48>, a=<-9,-7,9>
+p=<519,-438,1425>, v=<31,107,-35>, a=<-9,-10,-9>
+p=<904,-641,-388>, v=<-139,54,12>, a=<10,-1,2>
+p=<6864,2454,-491>, v=<65,22,15>, a=<-17,-6,0>
+p=<-272,1750,-3947>, v=<57,11,-9>, a=<-3,-4,8>
+p=<1168,-6842,3589>, v=<78,164,36>, a=<-7,3,-9>
+p=<-2224,4070,-347>, v=<-80,21,-105>, a=<9,-9,7>
+p=<-1872,2102,-875>, v=<41,66,-39>, a=<1,-8,4>
+p=<-5120,-3610,1701>, v=<126,63,-4>, a=<2,3,-3>
+p=<-7936,774,-2043>, v=<115,-74,47>, a=<8,3,1>
+p=<-5770,1949,-1810>, v=<144,-4,67>, a=<16,-10,3>
+p=<1032,524,-993>, v=<66,-119,54>, a=<-12,9,0>
+p=<-241,904,-2703>, v=<23,-39,74>, a=<-1,-1,7>
+p=<1659,-2535,52>, v=<73,32,-11>, a=<-16,10,1>
+p=<-469,790,-214>, v=<-55,97,-77>, a=<8,-14,9>
+p=<-13,-179,356>, v=<31,18,-57>, a=<-3,-1,4>
+p=<899,-312,-2000>, v=<-27,-45,127>, a=<-2,6,-2>
+p=<1545,581,-727>, v=<-11,38,40>, a=<-7,-7,0>
+p=<-3167,1702,-43>, v=<147,49,4>, a=<2,-14,0>
+p=<-526,106,-3919>, v=<8,-17,38>, a=<2,1,17>
+p=<1381,-388,-404>, v=<-175,24,29>, a=<7,2,2>
+p=<-144,-1008,-374>, v=<5,163,59>, a=<2,-12,-4>
+p=<-4344,-3608,1616>, v=<45,54,-4>, a=<6,4,-3>
+p=<-1647,-787,4189>, v=<-10,-53,25>, a=<4,5,-10>
+p=<3965,7621,-1235>, v=<-35,-45,34>, a=<-4,-9,0>
+p=<-6925,-515,4255>, v=<27,33,-26>, a=<9,-1,-5>
+p=<-3361,-7715,-3737>, v=<76,48,122>, a=<1,9,-1>
+p=<4829,5857,-1217>, v=<-96,-107,15>, a=<-2,-3,1>
+p=<1877,-1469,-4079>, v=<-51,41,39>, a=<0,0,4>
+p=<4584,-3664,7121>, v=<124,69,-87>, a=<-17,3,-9>
+p=<4708,-719,1014>, v=<-8,54,-82>, a=<-9,-2,3>
+p=<-4530,3249,1665>, v=<-46,22,73>, a=<12,-8,-8>
+p=<361,-798,851>, v=<-116,55,25>, a=<10,-1,-8>
+p=<-2177,1209,-355>, v=<82,-66,16>, a=<4,0,0>
+p=<784,-573,1544>, v=<-54,52,-23>, a=<1,-2,-7>
+p=<1639,-879,-436>, v=<-73,-121,68>, a=<-2,18,-5>
+p=<1297,1317,-166>, v=<-54,-15,-4>, a=<-2,-6,1>
+p=<3466,1938,-2011>, v=<-70,-78,13>, a=<-13,-3,10>
+p=<-2096,1173,-1561>, v=<11,-83,121>, a=<11,2,-4>
+p=<-548,2163,1724>, v=<-75,-119,-109>, a=<11,0,1>
+p=<469,-2427,1067>, v=<11,3,-63>, a=<-4,14,0>
+p=<919,57,3083>, v=<-33,-78,-118>, a=<-2,8,-6>
+p=<947,-909,986>, v=<-77,0,-36>, a=<1,10,-6>
+p=<609,-857,-925>, v=<-79,73,20>, a=<5,-1,7>
+p=<-4448,-1323,-14360>, v=<54,34,149>, a=<3,0,11>
+p=<1636,4332,-3557>, v=<78,-71,-68>, a=<-6,-2,8>
+p=<-2420,-12321,6739>, v=<2,56,88>, a=<3,13,-13>
+p=<1636,6477,-944>, v=<-42,34,-35>, a=<0,-10,3>
+p=<8812,2148,-5273>, v=<-26,45,96>, a=<-10,-5,2>
+p=<-587,-3195,-14945>, v=<-85,22,84>, a=<5,3,15>
+p=<6394,-3429,3346>, v=<36,88,15>, a=<-10,0,-5>
+p=<-1958,2401,204>, v=<102,-119,-34>, a=<5,-7,3>
+p=<-1090,266,1569>, v=<55,-19,-109>, a=<3,0,0>
+p=<2574,-921,907>, v=<-139,58,-86>, a=<-6,1,3>
+p=<-2718,-298,501>, v=<59,6,-57>, a=<18,2,3>
+p=<-219,-1950,998>, v=<23,94,-40>, a=<-1,6,-4>
+p=<3407,-809,1474>, v=<-116,35,-89>, a=<-17,3,-2>
+p=<-541,-1670,-661>, v=<-14,29,41>, a=<7,12,1>
+p=<-485,451,1803>, v=<-18,-25,-75>, a=<7,-1,-7>
+p=<796,1109,1586>, v=<3,-132,-82>, a=<-8,7,-4>
+p=<5,-438,2104>, v=<22,76,-59>, a=<-3,-6,-12>
+p=<2770,724,137>, v=<-138,8,74>, a=<-8,-8,-11>
+p=<1335,-935,1586>, v=<-133,59,-52>, a=<5,1,-8>
+p=<-600,-494,17>, v=<0,26,-10>, a=<4,0,1>
+p=<-73,1376,-1547>, v=<-13,42,37>, a=<2,-14,6>
+p=<-2198,1750,-1088>, v=<85,-124,10>, a=<5,2,6>
+p=<-955,2741,1118>, v=<87,-214,-96>, a=<0,-6,-1>
+p=<79,398,260>, v=<-1,11,0>, a=<-1,-8,-4>
+p=<-394,112,-873>, v=<90,55,13>, a=<-9,-11,11>
+p=<750,-251,-1390>, v=<-2,-32,72>, a=<-11,9,9>
+p=<-933,-625,-1511>, v=<25,68,77>, a=<10,-2,10>
+p=<-812,673,-1159>, v=<38,-38,153>, a=<6,-4,-8>
+p=<-2490,1276,508>, v=<17,-16,112>, a=<5,-2,-9>
+p=<730,-1902,-4252>, v=<18,-62,21>, a=<-3,9,9>
+p=<-1678,6904,3168>, v=<17,-72,-41>, a=<3,-12,-5>
+p=<-40,-432,-3034>, v=<-56,132,50>, a=<4,-8,4>
+p=<2980,-2943,13263>, v=<-88,-2,-129>, a=<0,5,-15>
+p=<8216,3432,-5165>, v=<-67,-32,-42>, a=<-10,-4,11>
+p=<-2188,11252,-4927>, v=<64,-87,-49>, a=<0,-14,11>
+p=<-2513,-3249,3089>, v=<176,-8,-100>, a=<-6,7,0>
+p=<-5055,223,-4289>, v=<2,24,-22>, a=<10,-2,10>
+p=<-3722,1370,-2274>, v=<7,35,-7>, a=<7,-5,5>
+p=<9201,8581,1004>, v=<-55,-80,114>, a=<-9,-7,-7>
+p=<-315,469,-6640>, v=<-51,-52,-30>, a=<3,2,10>
+p=<5886,-19772,1433>, v=<-70,127,63>, a=<-4,19,-5>
+p=<4716,7333,-7264>, v=<120,12,26>, a=<-12,-10,8>
+p=<2571,4213,-7108>, v=<75,-108,42>, a=<-7,0,7>
+p=<2688,7060,-946>, v=<12,39,-36>, a=<-4,-11,3>
+p=<3195,-4523,-5548>, v=<-41,116,-38>, a=<-2,0,9>
+p=<16182,20203,8375>, v=<-134,-78,-175>, a=<-14,-22,-2>
+p=<-8583,4213,3851>, v=<41,-28,-99>, a=<9,-4,0>
+p=<-29,-291,-717>, v=<-1,26,133>, a=<1,0,-11>
+p=<-1487,-747,-663>, v=<140,90,44>, a=<-2,-4,2>
+p=<-77,-1047,129>, v=<29,63,-48>, a=<-3,4,6>
+p=<1,627,-9>, v=<-62,-5,-4>, a=<10,-7,1>
+p=<-689,225,1479>, v=<28,-4,-89>, a=<5,-2,-5>
+p=<3651,9977,-1851>, v=<-74,-16,28>, a=<-1,-12,1>
+p=<-2004,-10303,2127>, v=<-9,4,-54>, a=<3,13,0>
+p=<1389,4088,-3060>, v=<104,15,-1>, a=<-7,-6,4>
+p=<11256,-2971,-2007>, v=<-129,36,52>, a=<-8,2,0>
+p=<6147,-787,12696>, v=<-98,60,-145>, a=<-3,-2,-9>
+p=<8994,6467,10551>, v=<-51,-186,110>, a=<-9,1,-19>
+p=<2832,3035,2322>, v=<107,62,41>, a=<-9,-7,-5>
+p=<-11559,7286,-5244>, v=<116,-47,-45>, a=<9,-7,9>
+p=<5991,-8704,8679>, v=<-94,-17,-2>, a=<-3,12,-11>
+p=<4718,-4023,8441>, v=<-136,19,-128>, a=<-1,7,-9>
+p=<4625,-861,-1262>, v=<-69,77,73>, a=<-5,-3,-2>
+p=<589,3578,-416>, v=<58,-10,64>, a=<-7,-12,-4>
+p=<1141,-2678,1217>, v=<-50,34,29>, a=<0,7,-7>
+p=<3211,1600,2988>, v=<-44,4,-60>, a=<-8,-6,-6>
+p=<-2056,-33,-1727>, v=<5,51,13>, a=<7,-4,5>
+p=<-3476,6358,-3757>, v=<96,49,73>, a=<1,-16,3>
+p=<2476,-4275,-99>, v=<64,40,-29>, a=<-9,6,2>
+p=<9885,2111,1265>, v=<-47,-86,-41>, a=<-17,1,0>
+p=<-10544,1150,955>, v=<132,121,-31>, a=<13,-10,0>
+p=<-717,-338,-6640>, v=<-41,57,54>, a=<4,-3,10>
+p=<-1306,3785,-502>, v=<-22,-124,-32>, a=<4,0,3>
+p=<-3941,-2105,-5090>, v=<79,-62,-12>, a=<3,8,11>
+p=<-3352,4405,-4067>, v=<108,-32,67>, a=<0,-7,4>
+p=<403,-1972,-1042>, v=<-28,84,-34>, a=<1,-1,5>
+p=<2153,884,-496>, v=<11,69,-68>, a=<-6,-7,6>
+p=<-264,-3603,2640>, v=<26,104,-76>, a=<-1,0,0>
+p=<-754,4587,1100>, v=<22,-58,4>, a=<0,-4,-2>
+p=<4321,-3078,-6425>, v=<93,125,-33>, a=<-12,-2,12>
+p=<-1419,387,-8280>, v=<41,26,92>, a=<0,-2,8>
+p=<681,4902,3760>, v=<-55,-49,0>, a=<2,-5,-6>
+p=<1451,-7348,-10450>, v=<-59,-5,118>, a=<1,12,10>
+p=<4286,2802,-7265>, v=<-122,83,-45>, a=<0,-9,14>
+p=<1337,5510,-5238>, v=<7,-83,58>, a=<-3,-6,7>
+p=<6297,1232,8216>, v=<-89,-25,-184>, a=<-7,-1,-5>
+p=<787,3206,2183>, v=<42,-63,4>, a=<-5,-4,-6>
+p=<-941,3017,-3568>, v=<8,-112,147>, a=<2,0,-1>
+p=<4027,3557,-679>, v=<-134,-104,68>, a=<-1,-2,-3>
+p=<4864,-1438,-2137>, v=<31,67,-46>, a=<-15,-1,9>
+p=<325,164,754>, v=<-74,3,-4>, a=<7,-4,-13>
+p=<610,524,-201>, v=<-75,-22,20>, a=<2,-6,0>
+p=<-215,224,699>, v=<-9,-36,-15>, a=<5,2,-10>
+p=<-495,1334,-1331>, v=<30,-136,133>, a=<3,0,0>
+p=<-390,-6,-861>, v=<25,9,130>, a=<2,-2,-8>
+p=<-595,729,-116>, v=<-4,-59,6>, a=<11,-3,1>
+p=<1360,804,-56>, v=<-139,-72,0>, a=<0,-2,1>
+p=<90,359,-591>, v=<-78,11,92>, a=<12,-9,-6>
+p=<-620,-1566,-231>, v=<48,99,23>, a=<2,10,0>
+p=<-1355,1069,-1321>, v=<94,-126,110>, a=<7,3,4>
+p=<699,-1699,-4607>, v=<5,86,93>, a=<-3,-1,9>
+p=<2056,3131,-329>, v=<-90,8,-141>, a=<0,-12,13>
+p=<-3602,1291,407>, v=<36,-44,-53>, a=<10,-1,3>
+p=<-267,2717,-1870>, v=<83,-142,82>, a=<-6,2,0>
+p=<-704,1636,3903>, v=<6,-47,-109>, a=<2,-2,-5>
+p=<-1946,1429,1626>, v=<0,22,-70>, a=<7,-7,0>
+p=<156,4594,673>, v=<33,8,-18>, a=<-2,-7,0>
+p=<3116,1597,3966>, v=<-28,-6,-31>, a=<-3,-2,-4>
+p=<10812,5334,1672>, v=<-27,-126,-64>, a=<-14,-1,1>
+p=<1414,524,2190>, v=<75,23,131>, a=<-6,-2,-10>
+p=<5336,9663,-6357>, v=<26,-91,58>, a=<-9,-9,6>
+p=<4300,-438,-12758>, v=<73,-46,22>, a=<-10,3,17>
+p=<3967,-3546,-918>, v=<-70,0,44>, a=<-2,5,-1>
+p=<6224,10440,3670>, v=<-112,78,-23>, a=<-3,-19,-4>
+p=<7334,2707,1783>, v=<-66,-55,-48>, a=<-7,-1,0>
+p=<1007,10514,-3175>, v=<-47,-19,86>, a=<1,-14,0>
+p=<-2289,2879,3134>, v=<87,43,-47>, a=<-1,-8,-3>
+p=<1279,9407,-6930>, v=<157,-194,53>, a=<-12,-6,10>
+p=<943,-8481,-1938>, v=<-80,35,-4>, a=<3,14,4>
+p=<-7969,4127,-738>, v=<50,37,-58>, a=<12,-10,5>
+p=<2019,1112,5886>, v=<-99,-85,-7>, a=<2,3,-13>
+p=<4861,6767,-4438>, v=<-137,5,34>, a=<-2,-16,8>
+p=<6427,909,3218>, v=<-56,72,10>, a=<-11,-7,-8>
+p=<1758,2446,-4960>, v=<45,-146,112>, a=<-7,4,4>
+p=<4165,-1469,2000>, v=<-128,124,-128>, a=<-1,-5,4>
+p=<1113,-1854,63>, v=<-47,6,-29>, a=<-3,13,3>
+p=<-1495,-30,2031>, v=<65,28,-84>, a=<3,-3,-5>
+p=<-1055,-998,1583>, v=<-39,148,-56>, a=<12,-10,-5>
+p=<-2071,-654,2647>, v=<135,-1,-216>, a=<-1,5,6>
+p=<769,10,2767>, v=<-51,0,-11>, a=<0,0,-19>
+p=<-1047,3450,943>, v=<20,-45,-16>, a=<5,-20,-5>
+p=<-679,-814,1511>, v=<31,-59,-94>, a=<1,13,0>
+p=<17,-1334,-273>, v=<-4,-18,-42>, a=<0,12,7>
+p=<521,802,-1201>, v=<7,27,84>, a=<-5,-9,-1>
+p=<1041,-686,-737>, v=<-68,69,106>, a=<0,-3,-7>
+p=<5465,-618,2857>, v=<-66,17,-74>, a=<-4,0,0>
+p=<4344,-1207,-15402>, v=<-134,91,75>, a=<1,-3,17>
+p=<-1375,-181,-4002>, v=<-3,-14,87>, a=<2,1,1>
+p=<15288,-9263,3256>, v=<-71,69,-26>, a=<-17,9,-3>
+p=<-6733,-6755,2914>, v=<21,120,22>, a=<8,3,-5>
+p=<88,1567,8025>, v=<17,18,-54>, a=<-1,-3,-8>
+p=<2026,1168,-2577>, v=<-34,-30,30>, a=<-1,0,2>
+p=<-104,1351,-1305>, v=<59,-36,-21>, a=<-4,-1,5>
+p=<2137,1108,-738>, v=<-52,-55,28>, a=<-2,1,0>
+p=<3730,-2807,5013>, v=<29,90,-73>, a=<-12,1,-8>
+p=<2299,-971,1341>, v=<-86,78,-49>, a=<0,-3,0>
+p=<-939,-4363,2031>, v=<35,140,-73>, a=<0,1,0>
+p=<265,2329,5083>, v=<-66,-41,-95>, a=<4,-3,-6>
+p=<-1009,-261,8765>, v=<52,-21,-38>, a=<-1,2,-19>
+p=<2393,1125,2717>, v=<-84,-56,-83>, a=<0,1,-1>
+p=<1035,1125,-3989>, v=<8,2,84>, a=<-3,-3,4>
+p=<-85,4961,7253>, v=<-39,-164,-71>, a=<3,-1,-13>
+p=<6201,-3075,7757>, v=<-191,123,-60>, a=<-2,-1,-15>
+p=<300,-160,-566>, v=<-5,-6,-76>, a=<-2,2,15>
+p=<2281,-1672,-706>, v=<-124,42,84>, a=<-5,10,-5>
+p=<-2836,323,-251>, v=<159,-3,44>, a=<6,-3,-4>
+p=<2169,-573,-706>, v=<-71,31,54>, a=<-11,1,-1>
+p=<1511,-1259,1527>, v=<-9,95,-38>, a=<-13,-1,-10>
+p=<-330,-937,-2071>, v=<-50,-18,84>, a=<10,11,8>
+p=<13,386,1457>, v=<-7,15,-108>, a=<1,-6,0>
+p=<-953,1163,1331>, v=<-28,-33,-144>, a=<13,-7,6>
+p=<-799,-1490,246>, v=<126,149,1>, a=<-9,-6,-3>
+p=<90,-930,1177>, v=<10,64,-43>, a=<-2,0,-6>
+p=<-1763,-994,1921>, v=<95,80,12>, a=<0,-3,-11>
+p=<-1155,-709,-834>, v=<73,-25,67>, a=<-1,6,-2>
+p=<1429,-405,1959>, v=<-33,79,-90>, a=<-4,-6,-1>
+p=<4418,1330,2934>, v=<-78,-60,33>, a=<-4,1,-8>
+p=<-3239,4306,-1902>, v=<57,52,93>, a=<3,-12,-2>
+p=<-2929,-5149,4949>, v=<-65,-11,-160>, a=<10,11,0>
+p=<-511,-778,-6149>, v=<-47,40,22>, a=<4,-1,11>
+p=<5162,4306,-2677>, v=<-38,-188,38>, a=<-8,3,3>
+p=<-1631,-8674,2819>, v=<130,172,-108>, a=<-5,12,0>
+p=<-1761,3091,-1250>, v=<0,-105,8>, a=<5,-1,3>
+p=<-1631,-42,-7022>, v=<-32,110,122>, a=<7,-8,11>
+p=<150,-5333,3664>, v=<-33,3,8>, a=<2,15,-11>
+p=<6923,-3578,-418>, v=<-118,165,57>, a=<-11,-2,-3>
+p=<8873,5795,-5189>, v=<-166,-128,119>, a=<-13,-7,6>
+p=<-2125,2103,-2628>, v=<41,-40,115>, a=<3,-3,-1>
+p=<-2543,858,5229>, v=<21,-7,-67>, a=<3,-1,-5>
+p=<-4668,3476,-3917>, v=<-74,-84,132>, a=<12,-1,-1>
+p=<-8357,6332,-7793>, v=<17,-63,36>, a=<13,-7,11>
+p=<3125,665,3538>, v=<-65,-76,-2>, a=<-1,3,-5>
+p=<-6384,-14838,5203>, v=<59,58,-104>, a=<6,18,-2>
+p=<-908,3810,-1753>, v=<-51,67,8>, a=<4,-9,2>
+p=<-1722,-6180,-6082>, v=<-48,-43,49>, a=<5,11,6>
+p=<-3054,1368,-4565>, v=<83,-38,-49>, a=<0,0,9>
+p=<-2373,1080,365>, v=<-31,-24,53>, a=<12,-2,-6>
+p=<-4430,2169,-614>, v=<51,53,86>, a=<13,-13,-5>
+p=<-924,-3134,591>, v=<79,-14,-49>, a=<-3,18,2>
+p=<-1874,514,-3988>, v=<-1,-26,32>, a=<10,0,18>
+p=<-145,-1747,4486>, v=<8,43,-114>, a=<0,5,-12>
+p=<653,-2032,2320>, v=<-34,108,-70>, a=<0,0,-5>
+p=<881,2243,1294>, v=<-6,-37,-26>, a=<-4,-8,-4>
+p=<-2425,-1101,-1480>, v=<88,-11,70>, a=<4,7,1>
+p=<-2919,1578,1256>, v=<194,-32,46>, a=<-4,-5,-11>
+p=<-2634,856,2320>, v=<-1,-24,-50>, a=<14,-2,-7>
+p=<144,-1759,161>, v=<26,100,-4>, a=<-6,7,-2>
+p=<1464,-673,437>, v=<-32,55,-27>, a=<-14,0,-2>
+p=<72,1133,65>, v=<-20,-37,4>, a=<2,-9,-2>
+p=<-444,-943,-577>, v=<75,19,-53>, a=<-6,9,15>
+p=<-4278,-11885,3366>, v=<-11,163,56>, a=<7,9,-8>
+p=<3984,5233,8190>, v=<0,76,-4>, a=<-6,-12,-12>
+p=<5460,-4091,8892>, v=<-41,39,-5>, a=<-6,4,-13>
+p=<150,-2147,1692>, v=<-60,-52,-27>, a=<3,6,-1>
+p=<-2874,1183,-576>, v=<61,133,-75>, a=<1,-9,5>
+p=<-1956,-1103,1656>, v=<128,104,11>, a=<-4,-4,-3>
+p=<186,-3893,4752>, v=<50,15,-38>, a=<-3,5,-5>
+p=<-591,7845,4320>, v=<-13,-93,-43>, a=<2,-10,-6>
+p=<1889,-5082,-1012>, v=<-29,148,-63>, a=<-2,1,6>
+p=<1858,3040,-2283>, v=<100,-34,74>, a=<-10,-4,0>
+p=<-3691,1862,-299>, v=<103,132,-102>, a=<1,-12,7>
+p=<-6853,2141,1592>, v=<109,-53,13>, a=<7,-1,-4>
+p=<6663,1769,9497>, v=<-55,23,-146>, a=<-10,-5,-10>
+p=<-5309,-4880,2885>, v=<105,126,4>, a=<3,1,-5>
+p=<3021,-8416,6149>, v=<-70,125,-22>, a=<-1,7,-9>
+p=<3949,1547,1981>, v=<-5,21,84>, a=<-11,-6,-12>
+p=<5093,156,1487>, v=<-76,-47,22>, a=<-9,3,-6>
+p=<6094,2899,-5455>, v=<-74,-112,127>, a=<-12,0,6>
+p=<6523,-4615,395>, v=<-131,96,-17>, a=<-9,6,0>
+p=<-2486,1820,-2023>, v=<94,-84,130>, a=<0,1,-4>
+p=<-4028,1467,2219>, v=<128,-43,-17>, a=<10,-4,-11>
+p=<-1472,531,-5062>, v=<-14,9,150>, a=<10,-4,14>
+p=<-608,-954,-1948>, v=<-43,6,110>, a=<8,5,0>
+p=<-3921,1247,5039>, v=<-33,-106,51>, a=<9,4,-12>
+p=<-9267,1214,-175>, v=<61,14,-80>, a=<13,-3,5>
+p=<2646,4481,-6313>, v=<23,-34,-64>, a=<-6,-6,15>
+p=<996,-2548,-3145>, v=<-63,-93,61>, a=<2,10,2>
+p=<-786,-6277,-373>, v=<-26,-14,-40>, a=<3,12,3>
+p=<-2898,-8323,-2122>, v=<157,150,47>, a=<-4,6,1>
+p=<4098,9167,-2617>, v=<-89,-57,113>, a=<-2,-13,-2>
+p=<-225,1808,3752>, v=<42,13,-63>, a=<-2,-4,-3>
+p=<-4219,1852,5263>, v=<73,-68,-70>, a=<6,0,-9>
+p=<-4597,-119,6667>, v=<101,33,-80>, a=<5,-2,-12>
+p=<4637,-3521,2887>, v=<-157,-93,-108>, a=<-1,16,0>
+p=<1505,-4304,538>, v=<-41,62,7>, a=<-1,7,-2>
+p=<-4737,3953,180>, v=<127,-44,-8>, a=<9,-13,0>
+p=<-2154,-1066,-4440>, v=<81,-3,179>, a=<2,5,3>
+p=<2025,-457,4380>, v=<-8,-109,-87>, a=<-8,12,-11>
+p=<870,1916,1125>, v=<-118,-2,-31>, a=<7,-8,-2>
+p=<-33,1076,4338>, v=<-9,-94,-195>, a=<1,4,-1>
+p=<3726,1664,-1143>, v=<-122,43,-22>, a=<-5,-11,7>
+p=<-3855,-142,3645>, v=<85,-14,-19>, a=<9,2,-14>
+p=<-3330,-268,-975>, v=<137,-96,36>, a=<2,10,1>
+p=<3096,4079,2280>, v=<-4,-105,-20>, a=<-13,-8,-8>
+p=<738,943,775>, v=<-36,0,-63>, a=<-7,-16,-2>
+p=<-437,-727,-595>, v=<54,123,63>, a=<-2,-8,0>
+p=<633,-157,-1665>, v=<-86,-33,170>, a=<4,10,0>
+p=<-312,-262,-110>, v=<-8,49,-13>, a=<7,-3,5>
+p=<-897,1478,-1095>, v=<67,-92,113>, a=<4,-9,0>
+p=<548,-502,880>, v=<-61,73,-101>, a=<1,-3,3>
+p=<-957,-77,-260>, v=<18,3,-20>, a=<14,2,9>
+p=<23,-1767,370>, v=<-25,128,-50>, a=<4,10,3>
+p=<9335,-1502,-1376>, v=<-94,46,109>, a=<-12,0,-4>
+p=<-89,-8910,-1472>, v=<19,162,13>, a=<-1,7,2>
+p=<1431,402,7824>, v=<-45,-30,-30>, a=<0,1,-13>
+p=<3607,-1854,-3216>, v=<-80,90,-15>, a=<-2,-2,7>
+p=<-1431,-1856,4713>, v=<-152,52,-127>, a=<10,0,0>
+p=<1418,-8072,-4870>, v=<56,30,132>, a=<-5,10,0>
+p=<-5020,-6592,-2539>, v=<21,-67,12>, a=<6,13,3>
+p=<1418,6284,-4574>, v=<-20,-16,-85>, a=<-1,-8,11>
+p=<-1357,3879,-11493>, v=<36,30,-31>, a=<0,-7,18>
+p=<4779,-2196,-6490>, v=<34,-13,-96>, a=<-9,4,15>
+p=<405,8280,-820>, v=<63,-82,135>, a=<-4,-8,-6>
+p=<-4347,2178,890>, v=<84,-42,-153>, a=<2,-1,7>
+p=<7425,936,6740>, v=<-21,11,-1>, a=<-10,-2,-10>
+p=<2030,-6060,5989>, v=<-94,68,9>, a=<2,5,-9>
+p=<-3113,1562,-3557>, v=<121,-62,20>, a=<-2,1,4>
+p=<15387,8111,-3927>, v=<-132,-11,-27>, a=<-15,-11,7>
+p=<1105,-12905,-1522>, v=<-31,139,-16>, a=<0,11,3>
+p=<-13843,4300,957>, v=<50,-22,12>, a=<17,-5,-2>
+p=<1364,970,-338>, v=<-38,-46,-67>, a=<0,1,4>
+p=<328,-9020,11539>, v=<-67,-23,-160>, a=<3,14,-8>
+p=<1441,1858,-3933>, v=<-114,-33,72>, a=<4,-1,2>
+p=<-12401,-6674,-9819>, v=<67,19,69>, a=<15,9,11>
+p=<5095,6196,567>, v=<25,-24,-16>, a=<-9,-8,0>
+p=<-4751,-4964,10125>, v=<21,27,-152>, a=<6,6,-7>
+p=<-1546,-4772,-2286>, v=<41,141,-34>, a=<1,2,8>
+p=<6784,-1538,4434>, v=<-126,-76,-129>, a=<-8,9,-2>
+p=<-1896,4454,-2356>, v=<68,-58,70>, a=<0,-7,1>
+p=<4166,296,2040>, v=<-47,-11,0>, a=<-7,0,-5>
+p=<-7306,-125,-3525>, v=<148,-33,50>, a=<11,3,7>
+p=<-4356,-8500,-3550>, v=<69,68,168>, a=<8,21,-2>
+p=<1044,-225,-1950>, v=<-95,23,39>, a=<4,-1,3>
+p=<-617,666,-1168>, v=<-14,-32,45>, a=<4,0,1>
+p=<5515,5664,-1714>, v=<-141,-83,71>, a=<-11,-17,1>
+p=<1735,-1329,-1084>, v=<50,96,52>, a=<-12,-3,0>
+p=<1101,-5305,-338>, v=<-82,-26,-62>, a=<3,14,5>
+p=<6843,1974,-4137>, v=<5,-37,-51>, a=<-16,-2,13>
+p=<-206,-91,-1046>, v=<110,-61,68>, a=<-15,12,4>
+p=<520,877,175>, v=<8,-47,-49>, a=<-9,-5,5>
+p=<520,-795,65>, v=<-112,-9,-15>, a=<11,14,1>
+p=<597,-608,-1046>, v=<-101,10,86>, a=<8,8,1>
+p=<-1702,-190,230>, v=<138,2,54>, a=<3,3,-13>
+p=<465,-1136,-1321>, v=<-29,58,87>, a=<-2,8,5>
+p=<-1152,-487,-331>, v=<94,71,39>, a=<2,-4,-2>
+p=<-1733,-1423,-1483>, v=<-61,121,34>, a=<10,-5,2>
+p=<-3583,-148,-2933>, v=<78,-8,27>, a=<5,1,7>
+p=<1292,-548,1717>, v=<-39,125,-16>, a=<-1,-8,-4>
+p=<-333,2677,842>, v=<91,-4,-33>, a=<-6,-8,0>
+p=<1542,4377,1792>, v=<-114,32,20>, a=<4,-16,-7>
+p=<2192,402,-2183>, v=<16,22,36>, a=<-8,-3,4>
+p=<1792,102,3467>, v=<32,-57,-125>, a=<-8,4,-1>
+p=<17,2502,1642>, v=<25,29,-78>, a=<-2,-10,1>
+p=<158,-2993,164>, v=<-42,8,-3>, a=<2,4,0>
+p=<4820,-3011,2756>, v=<-5,-10,36>, a=<-7,5,-6>
+p=<-3151,-4516,-1216>, v=<118,172,1>, a=<3,4,5>
+p=<-1324,1385,-1867>, v=<-46,1,54>, a=<10,-6,3>
+p=<-4012,1028,-2329>, v=<93,40,54>, a=<9,-8,5>
+p=<524,-3697,1829>, v=<31,56,32>, a=<-5,11,-11>
+p=<-7847,-3949,10230>, v=<-49,45,-93>, a=<13,3,-9>
+p=<-969,-3322,-12874>, v=<-152,-69,203>, a=<9,8,7>
+p=<-4579,2131,-1113>, v=<-57,41,69>, a=<9,-5,-2>
+p=<-1140,-6286,-9758>, v=<67,126,121>, a=<-2,2,7>
+p=<399,-8775,5271>, v=<7,16,-99>, a=<-1,11,-2>
+p=<-1390,-740,258>, v=<152,-4,-23>, a=<-6,9,1>
+p=<2276,-2742,11>, v=<-172,213,59>, a=<0,0,-8>
+p=<1522,-714,63>, v=<-107,-62,-1>, a=<-1,17,0>
+p=<-948,1236,492>, v=<-36,-86,8>, a=<16,-1,-6>
+p=<-350,-1195,895>, v=<-68,24,5>, a=<14,10,-10>
+p=<-662,1392,-106>, v=<61,-14,-30>, a=<-1,-13,6>
+p=<2744,547,1090>, v=<-82,-82,-52>, a=<-18,6,-4>
+p=<-714,508,-886>, v=<44,-79,44>, a=<2,6,4>
+p=<91,79,957>, v=<-26,53,12>, a=<3,-10,-17>
+p=<-96,1014,-1573>, v=<3,-80,140>, a=<1,-2,0>
+p=<-393,827,55>, v=<48,-63,-8>, a=<-2,-2,0>
+p=<872,-559,583>, v=<-49,57,-8>, a=<-5,-1,-8>
+p=<-30,673,231>, v=<-57,-61,-60>, a=<10,0,6>
+p=<-613,-702,1793>, v=<2,88,-70>, a=<9,-4,-16>
+p=<663,596,-253>, v=<-48,-90,26>, a=<-2,6,-1>
+p=<-394,705,481>, v=<4,30,-34>, a=<3,-10,0>
+p=<61,-1297,-1430>, v=<84,38,50>, a=<-12,8,7>
+p=<-233,1909,-163>, v=<15,-131,-33>, a=<0,0,6>
+p=<-870,348,2105>, v=<83,-42,-45>, a=<-3,3,-14>
+p=<1664,285,1755>, v=<-113,45,-35>, a=<-1,-8,-12>
+p=<-1269,1545,-415>, v=<89,-60,-30>, a=<0,-6,8>
+p=<-534,-261,1293>, v=<-1,-21,-92>, a=<5,6,0>
+p=<-135,-121,-2557>, v=<-7,44,93>, a=<2,-4,12>
+p=<1223,-415,292>, v=<-74,35,-28>, a=<-2,0,1>
+p=<824,-1430,922>, v=<-68,115,-73>, a=<1,-1,1>
+p=<-640,2303,-1594>, v=<-90,328,-227>, a=<5,-25,15>
+p=<-1065,354,-3254>, v=<-152,47,-462>, a=<10,-3,31>
+p=<2462,751,1569>, v=<346,107,226>, a=<-22,-7,-14>
+p=<-106,-2052,-2044>, v=<-16,-295,-290>, a=<4,15,15>
+p=<-2837,147,1838>, v=<-406,22,262>, a=<24,-6,-22>
+p=<2592,-1392,-608>, v=<374,-198,-87>, a=<-23,12,7>
+p=<1813,1582,-1758>, v=<259,229,-248>, a=<-18,-17,14>
+p=<-1899,1420,658>, v=<-267,200,92>, a=<16,-16,-11>
+p=<1208,-1527,-1923>, v=<172,-215,-275>, a=<-16,10,16>
+p=<2156,-2278,169>, v=<307,-326,27>, a=<-21,22,-1>
+p=<1056,-798,-2596>, v=<147,-116,-372>, a=<-9,7,28>
+p=<-1199,620,2328>, v=<-171,88,326>, a=<14,1,-26>
+p=<-2396,-657,2316>, v=<-338,-95,329>, a=<24,6,-22>
+p=<-824,587,-2484>, v=<-121,82,-353>, a=<8,-2,28>
+p=<1659,739,-2320>, v=<235,105,-333>, a=<-18,-8,23>
+p=<-2673,-573,489>, v=<-379,-75,67>, a=<25,5,0>
+p=<-1570,-2486,60>, v=<-229,-357,7>, a=<14,29,-2>
+p=<-2626,179,257>, v=<-375,24,38>, a=<23,-1,-4>
+p=<849,-331,-2900>, v=<120,-49,-417>, a=<-8,0,31>
+p=<645,1229,2673>, v=<89,177,376>, a=<-6,-14,-28>
+p=<-1480,-2064,-361>, v=<-211,-295,-55>, a=<14,21,5>
+p=<-2665,43,1552>, v=<-381,6,223>, a=<30,3,-17>
+p=<-1459,51,2649>, v=<-202,7,371>, a=<13,-3,-21>
+p=<-1482,-2729,-452>, v=<-211,-391,-64>, a=<14,24,4>
+p=<1608,2630,144>, v=<228,371,14>, a=<-16,-26,4>
+p=<1165,499,2876>, v=<163,71,411>, a=<-12,-9,-30>
+p=<2642,-695,-895>, v=<383,-101,-127>, a=<-23,1,4>
+p=<-2614,-864,-1341>, v=<-370,-122,-187>, a=<26,8,10>
+p=<-1044,729,-2321>, v=<-151,103,-328>, a=<5,-7,22>
+p=<-1018,-916,-2755>, v=<-145,-129,-388>, a=<5,8,23>
+p=<-3177,847,960>, v=<-456,120,143>, a=<30,-8,-2>
+p=<1358,1463,-2332>, v=<194,215,-332>, a=<-15,-12,23>
+p=<-1230,-3445,-695>, v=<-178,-496,-100>, a=<9,34,8>
+p=<284,229,2992>, v=<41,34,427>, a=<-4,-2,-30>
+p=<-1398,-1284,-2531>, v=<-195,-185,-358>, a=<12,18,30>
+p=<280,1690,-1795>, v=<41,241,-252>, a=<-4,-16,19>
+p=<-1556,637,2590>, v=<-215,94,374>, a=<15,-3,-25>
+p=<1970,-1629,2345>, v=<282,-237,335>, a=<-14,13,-29>
+p=<624,-2660,-1245>, v=<92,-377,-177>, a=<-6,27,12>
+p=<2472,-1297,-1889>, v=<352,-187,-272>, a=<-21,11,21>
+p=<1475,-2024,-2192>, v=<216,-292,-316>, a=<-19,18,22>
+p=<2316,-1953,720>, v=<327,-284,103>, a=<-25,21,-5>
+p=<-1493,692,-3102>, v=<-213,100,-443>, a=<14,-7,27>
+p=<1825,1169,2010>, v=<263,164,287>, a=<-18,-10,-16>
+p=<132,-416,2718>, v=<18,-59,390>, a=<-2,7,-26>
+p=<-3328,-231,203>, v=<-477,-34,36>, a=<31,4,-4>
+p=<-1458,911,-2505>, v=<-208,128,-357>, a=<16,-9,26>
+p=<-232,2726,-1244>, v=<-34,389,-177>, a=<-3,-28,9>
+p=<-2076,-2126,878>, v=<-297,-304,128>, a=<21,23,-10>
+p=<3071,-1789,-978>, v=<444,-255,-139>, a=<-32,15,6>
+p=<470,1352,2371>, v=<69,192,338>, a=<-1,-14,-19>
+p=<-366,2757,334>, v=<-51,394,48>, a=<3,-23,-2>
+p=<142,3704,-779>, v=<23,528,-111>, a=<-4,-35,6>
+p=<-2560,678,-902>, v=<-365,96,-128>, a=<26,-4,10>
+p=<-799,-1439,1718>, v=<-115,-205,245>, a=<2,16,-16>
+p=<252,-205,2964>, v=<36,-31,420>, a=<-3,2,-29>
+p=<1111,-2850,-712>, v=<159,-409,-107>, a=<-10,28,8>
+p=<-460,2649,-1121>, v=<-67,382,-159>, a=<7,-32,15>
+p=<3050,-961,419>, v=<434,-142,58>, a=<-31,13,-4>
+p=<-690,583,3314>, v=<-98,86,474>, a=<8,-6,-34>
+p=<1533,1358,-2236>, v=<218,195,-319>, a=<-15,-12,23>
+p=<2116,1539,1334>, v=<296,223,196>, a=<-23,-12,-16>
+p=<-480,-2566,1780>, v=<-70,-372,250>, a=<5,19,-14>
+p=<-157,-2633,1171>, v=<-20,-380,163>, a=<0,30,-8>
+p=<-551,2588,-222>, v=<-81,366,-28>, a=<11,-23,-1>
+p=<-2411,917,589>, v=<-341,131,85>, a=<24,-8,-6>
+p=<-889,-2793,-844>, v=<-130,-400,-122>, a=<12,24,8>
+p=<1520,-2712,-490>, v=<219,-383,-68>, a=<-12,27,6>
+p=<-1591,-1155,1957>, v=<-228,-169,282>, a=<14,15,-18>
+p=<-2439,1395,-500>, v=<-347,199,-73>, a=<28,-12,5>
+p=<-1337,172,-2489>, v=<-187,23,-355>, a=<18,3,23>
+p=<316,-2188,1642>, v=<42,-313,230>, a=<-3,21,-17>
+p=<-165,1828,-2025>, v=<-19,258,-292>, a=<1,-16,18>
+p=<-1747,1095,1978>, v=<-244,154,284>, a=<18,-12,-25>
+p=<-2666,540,-1200>, v=<-379,80,-168>, a=<25,1,8>
+p=<1683,-834,-1770>, v=<240,-119,-252>, a=<-16,5,18>
+p=<-2653,450,-388>, v=<-382,65,-56>, a=<31,3,7>
+p=<2146,-2673,-252>, v=<307,-382,-35>, a=<-25,26,-1>
+p=<-496,-2646,1797>, v=<-73,-379,258>, a=<3,24,-16>
+p=<1530,360,-3009>, v=<217,48,-423>, a=<-15,-1,30>
+p=<-640,-802,-2660>, v=<-88,-114,-376>, a=<7,7,28>
+p=<-811,1540,-2260>, v=<-116,218,-322>, a=<1,-12,22>
+p=<-2796,1328,-710>, v=<-396,191,-100>, a=<27,-13,7>
+p=<129,472,2813>, v=<24,63,404>, a=<4,-2,-26>
+p=<-1420,-2470,-1046>, v=<-201,-355,-153>, a=<21,18,6>
+p=<2451,808,-944>, v=<347,115,-138>, a=<-24,-6,11>
+p=<-40,2324,-1830>, v=<-3,330,-266>, a=<-1,-17,18>
+p=<-82,3079,1442>, v=<-10,440,210>, a=<0,-26,-10>
+p=<2698,-1471,-783>, v=<379,-209,-112>, a=<-26,16,9>
+p=<2894,-1493,-387>, v=<412,-213,-57>, a=<-28,14,-3>
+p=<1417,2516,-12>, v=<198,358,2>, a=<-17,-23,-2>
+p=<747,2897,-1186>, v=<106,417,-165>, a=<-7,-33,15>
+p=<-4,2281,-2417>, v=<-4,328,-340>, a=<6,-23,31>
+p=<1737,-1461,2393>, v=<243,-202,335>, a=<-13,18,-30>
+p=<-902,1843,-2360>, v=<-130,264,-337>, a=<11,-15,25>
+p=<-1582,20,-1857>, v=<-227,-1,-263>, a=<14,-1,23>
+p=<-1830,629,-1964>, v=<-258,85,-278>, a=<10,-8,17>
+p=<-2085,1038,-866>, v=<-292,149,-127>, a=<21,-10,8>
+p=<-1186,2355,1683>, v=<-169,335,243>, a=<11,-23,-16>
+p=<-2259,248,-2209>, v=<-324,35,-314>, a=<22,0,21>
+p=<-1283,-2116,1398>, v=<-186,-301,202>, a=<7,19,-21>
+p=<-645,-3178,1278>, v=<-90,-449,181>, a=<6,26,-15>
+p=<-1736,-2087,-1254>, v=<-249,-297,-181>, a=<17,19,14>
+p=<183,-1786,-1791>, v=<26,-249,-259>, a=<-1,19,17>
+p=<2465,-1286,-188>, v=<355,-185,-26>, a=<-24,12,4>
+p=<234,-1280,-2961>, v=<29,-180,-419>, a=<-2,13,25>
+p=<1084,1772,-2323>, v=<151,254,-331>, a=<-10,-15,23>
+p=<-33,-757,2842>, v=<-7,-110,407>, a=<1,7,-27>
+p=<-62,223,-2854>, v=<-6,30,-407>, a=<4,-2,29>
+p=<-1939,-2234,-470>, v=<-276,-318,-65>, a=<18,23,6>
+p=<-1064,-2485,1011>, v=<-154,-357,141>, a=<10,28,-5>
+p=<-2793,-281,1074>, v=<-400,-36,156>, a=<25,2,-9>
+p=<-2153,1885,362>, v=<-301,274,50>, a=<19,-19,0>
+p=<-1097,2219,-1431>, v=<-157,314,-207>, a=<11,-22,12>
+p=<1795,-2653,694>, v=<256,-382,99>, a=<-18,29,-6>
+p=<-1706,2021,-841>, v=<-238,287,-120>, a=<17,-25,10>
+p=<-163,-1743,1795>, v=<-26,-252,258>, a=<1,17,-17>
+p=<1425,1729,977>, v=<202,243,138>, a=<-13,-17,-10>
+p=<648,2109,-994>, v=<90,303,-143>, a=<-3,-19,14>
+p=<-1738,468,1971>, v=<-249,65,278>, a=<18,0,-20>
+p=<1045,1218,2731>, v=<148,175,394>, a=<-8,-11,-27>
+p=<-540,1940,-2022>, v=<-77,280,-283>, a=<5,-21,17>
+p=<-2979,1549,-239>, v=<-430,222,-34>, a=<27,-21,0>
+p=<-2598,-2175,-183>, v=<-374,-314,-26>, a=<21,19,2>
+p=<-1391,2880,-1142>, v=<-195,410,-163>, a=<9,-28,12>
+p=<-1253,-1245,2513>, v=<-182,-173,362>, a=<12,13,-22>
+p=<771,75,2400>, v=<104,11,342>, a=<-7,4,-25>
+p=<468,988,-2854>, v=<67,143,-403>, a=<1,-13,25>
+p=<-1290,2001,1041>, v=<-180,286,148>, a=<12,-22,-8>
+p=<11,-1463,2584>, v=<-4,-215,375>, a=<0,13,-30>
+p=<1672,-2459,-1046>, v=<233,-348,-149>, a=<-21,24,15>
+p=<-1973,2358,-291>, v=<-279,338,-37>, a=<21,-23,1>
+p=<327,-2775,2079>, v=<49,-396,298>, a=<-4,32,-24>
+p=<-2260,400,-2962>, v=<-327,56,-422>, a=<22,-8,28>
+p=<-431,-282,3083>, v=<-61,-39,440>, a=<1,5,-24>
+p=<-2378,1821,-1219>, v=<-331,261,-174>, a=<14,-22,18>
+p=<187,2556,-1007>, v=<26,368,-146>, a=<-2,-24,10>
+p=<1417,-2451,289>, v=<199,-350,40>, a=<-19,25,-3>
+p=<-2105,292,2336>, v=<-295,42,329>, a=<22,-1,-23>
+p=<1397,2026,1405>, v=<200,289,200>, a=<-8,-19,-11>
+p=<2364,323,-382>, v=<341,49,-58>, a=<-21,-6,4>
+p=<-256,-3019,633>, v=<-36,-430,90>, a=<2,35,-5>
+p=<3025,-164,1078>, v=<429,-21,153>, a=<-29,1,-9>
+p=<2723,-2091,-29>, v=<388,-297,-3>, a=<-29,16,-2>
+p=<197,709,2512>, v=<30,108,362>, a=<-6,-5,-25>
+p=<-1843,874,1771>, v=<-261,131,253>, a=<17,-12,-17>
+p=<2707,-769,818>, v=<382,-107,112>, a=<-26,9,-4>
+p=<164,-239,3326>, v=<20,-36,474>, a=<-5,-2,-35>
+p=<-1484,-1867,1429>, v=<-211,-271,204>, a=<12,18,-16>
+p=<-1091,-1732,-2881>, v=<-154,-248,-411>, a=<8,15,29>
+p=<2142,1579,-1231>, v=<306,223,-177>, a=<-19,-18,6>
+p=<-2977,300,945>, v=<-425,44,133>, a=<30,3,-7>
+p=<1742,1775,-36>, v=<244,253,-7>, a=<-17,-17,5>
+p=<-1594,-2674,495>, v=<-230,-382,74>, a=<13,21,-1>
+p=<-1665,2225,-1776>, v=<-240,314,-250>, a=<17,-21,17>
+p=<142,2432,-376>, v=<18,351,-52>, a=<-2,-16,2>
+p=<-950,1633,1739>, v=<-139,229,248>, a=<9,-16,-17>
+p=<-2816,-480,-893>, v=<-404,-71,-131>, a=<31,6,8>
+p=<-455,932,2810>, v=<-69,135,403>, a=<3,-13,-27>
+p=<-3730,366,-606>, v=<-532,55,-86>, a=<37,-3,4>
+p=<252,-2577,-244>, v=<36,-367,-35>, a=<-6,26,3>
+p=<801,-2233,-1237>, v=<112,-315,-174>, a=<-8,27,13>
+p=<2442,-462,1909>, v=<350,-65,270>, a=<-22,5,-12>
+p=<-2324,1403,-1040>, v=<-332,203,-139>, a=<22,-13,12>
+p=<-2533,1295,-1541>, v=<-361,183,-221>, a=<25,-11,17>
+p=<-1512,-932,1936>, v=<-216,-134,276>, a=<18,9,-18>
+p=<2274,1583,-1494>, v=<319,227,-214>, a=<-21,-17,14>
+p=<-2158,-1734,-2643>, v=<-302,-242,-377>, a=<26,15,26>
+p=<687,954,2298>, v=<94,130,329>, a=<-12,-8,-28>
+p=<-2296,571,-1404>, v=<-334,81,-198>, a=<24,-5,13>
+p=<-431,2980,489>, v=<-55,424,64>, a=<4,-33,-4>
+p=<-2237,-2695,-582>, v=<-316,-385,-83>, a=<21,32,5>
+p=<-1619,759,-2656>, v=<-225,114,-380>, a=<19,-12,26>
+p=<945,447,3126>, v=<130,61,444>, a=<-12,-9,-31>
+p=<2412,-1076,1127>, v=<344,-158,158>, a=<-28,8,-7>
+p=<77,3074,-1824>, v=<14,438,-257>, a=<0,-30,21>
+p=<1306,1552,-1954>, v=<187,222,-281>, a=<-16,-13,18>
+p=<808,2843,1357>, v=<116,408,190>, a=<-9,-28,-10>
+p=<-105,-919,2898>, v=<-15,-129,418>, a=<1,13,-28>
+p=<994,1043,-1978>, v=<140,151,-279>, a=<-9,-9,20>
+p=<3077,70,482>, v=<442,10,68>, a=<-32,-1,-6>
+p=<-2772,1,-1392>, v=<-397,-2,-201>, a=<30,2,13>
+p=<1297,-2205,120>, v=<184,-321,17>, a=<-9,20,0>
+p=<-3102,-5,-1354>, v=<-444,3,-194>, a=<30,-1,12>
+p=<-1621,-2313,374>, v=<-235,-329,52>, a=<18,20,-3>
+p=<1902,-240,2425>, v=<266,-34,348>, a=<-19,1,-25>
+p=<-1803,-1696,-543>, v=<-257,-238,-74>, a=<21,18,4>
+p=<2854,-216,1608>, v=<404,-28,229>, a=<-30,6,-13>
+p=<1502,-1352,-2578>, v=<211,-192,-364>, a=<-15,19,16>
+p=<1559,-2311,-45>, v=<220,-328,-6>, a=<-17,22,5>
+p=<-402,2270,-796>, v=<-58,325,-110>, a=<7,-21,3>
+p=<-1370,-11,-2620>, v=<-196,3,-373>, a=<13,4,31>
+p=<-953,3009,1273>, v=<-138,429,181>, a=<8,-33,-15>
+p=<1782,-1172,-2352>, v=<255,-164,-337>, a=<-20,11,27>
+p=<2237,418,2402>, v=<322,59,341>, a=<-21,-8,-24>
+p=<2252,1657,1721>, v=<320,238,247>, a=<-20,-18,-15>
+p=<-1315,-2410,1308>, v=<-189,-340,189>, a=<10,26,-18>
+p=<48,244,-2745>, v=<2,35,-388>, a=<3,-3,29>
+p=<1665,2253,-689>, v=<237,317,-98>, a=<-17,-21,5>
+p=<1117,-1998,-2158>, v=<161,-285,-308>, a=<-9,21,22>
+p=<-1209,2307,-403>, v=<-172,324,-58>, a=<11,-24,2>
+p=<-2058,1700,1773>, v=<-291,243,254>, a=<20,-17,-18>
+p=<-995,-1138,-2951>, v=<-138,-163,-418>, a=<8,13,27>
+p=<785,-983,2672>, v=<116,-146,383>, a=<-7,10,-26>
+p=<-1923,-330,-1677>, v=<-271,-41,-241>, a=<16,4,16>
+p=<1401,1896,937>, v=<197,268,131>, a=<-16,-15,-10>
+p=<-572,2692,1022>, v=<-83,384,149>, a=<1,-24,-10>
+p=<1741,1338,-1868>, v=<253,193,-269>, a=<-17,-10,17>
+p=<1566,2188,350>, v=<225,312,48>, a=<-16,-21,-4>
+p=<-1734,-1324,-1866>, v=<-244,-188,-269>, a=<17,13,17>
+p=<3149,-129,-952>, v=<449,-16,-132>, a=<-32,-1,11>
+p=<2091,-1276,-782>, v=<293,-179,-108>, a=<-21,10,11>
+p=<1814,2072,315>, v=<260,295,47>, a=<-18,-21,-6>
+p=<-1036,-1282,1829>, v=<-147,-189,265>, a=<10,14,-18>
+p=<-2434,-333,-1071>, v=<-347,-45,-155>, a=<23,2,7>
+p=<2813,315,265>, v=<397,43,35>, a=<-29,-3,-2>
+p=<704,-541,-2684>, v=<100,-81,-383>, a=<-8,2,25>
+p=<180,-1863,-2277>, v=<28,-266,-326>, a=<-2,12,22>
+p=<-537,478,-3146>, v=<-73,72,-449>, a=<1,-3,29>
+p=<-2275,1286,1169>, v=<-326,182,165>, a=<21,-16,-13>
+p=<-3153,-167,839>, v=<-452,-22,117>, a=<31,5,-8>
+p=<-2659,-1005,-62>, v=<-379,-143,-11>, a=<33,14,0>
+p=<-2857,1552,-245>, v=<-403,219,-34>, a=<26,-15,-2>
+p=<-2420,1189,-1497>, v=<-348,165,-213>, a=<22,-10,13>
+p=<-996,-2088,1463>, v=<-141,-296,209>, a=<10,21,-13>
+p=<785,-2777,-89>, v=<111,-396,-11>, a=<-10,22,2>
+p=<-3064,52,457>, v=<-439,3,58>, a=<29,0,-1>
+p=<-2003,1537,-2027>, v=<-286,222,-283>, a=<18,-14,20>
+p=<-2744,192,516>, v=<-390,27,75>, a=<28,-1,-8>
+p=<2627,428,1268>, v=<377,62,183>, a=<-26,-4,-11>
+p=<2370,516,-2130>, v=<335,71,-306>, a=<-25,-4,20>
+p=<-167,2752,-190>, v=<-23,391,-27>, a=<1,-24,0>
+p=<-2333,-1758,399>, v=<-332,-254,59>, a=<23,10,-4>
+p=<115,1289,-2001>, v=<17,186,-285>, a=<0,-12,22>
+p=<-1645,320,-2350>, v=<-235,48,-336>, a=<15,1,23>
+p=<168,539,-2987>, v=<26,80,-429>, a=<4,-6,30>
+p=<550,109,2265>, v=<77,14,323>, a=<-1,-1,-15>
+p=<2314,-1485,1355>, v=<330,-206,194>, a=<-21,21,-13>
+p=<-2350,1553,904>, v=<-337,226,132>, a=<17,-17,-9>
+p=<-1292,2795,-539>, v=<-184,402,-74>, a=<12,-30,8>
+p=<-770,-1190,-2785>, v=<-108,-172,-397>, a=<7,9,30>
+p=<-2348,-1197,1425>, v=<-336,-172,211>, a=<23,14,-13>
+p=<1914,787,1936>, v=<275,112,273>, a=<-19,-8,-16>
+p=<-20,934,-2534>, v=<-2,133,-361>, a=<0,-9,24>
+p=<-1896,-1410,1509>, v=<-269,-201,214>, a=<14,14,-11>
+p=<-3039,-1083,-1197>, v=<-436,-151,-174>, a=<30,14,12>
+p=<-703,-1842,2083>, v=<-100,-263,297>, a=<8,21,-21>
+p=<-865,2968,-1508>, v=<-121,421,-215>, a=<8,-31,19>
+p=<3111,410,1160>, v=<442,62,161>, a=<-26,-4,-15>
+p=<-783,2409,-1292>, v=<-107,344,-184>, a=<7,-24,11>
+p=<3426,56,23>, v=<492,10,-1>, a=<-31,2,0>
+p=<-3055,796,570>, v=<-440,112,73>, a=<28,-6,-8>
+p=<-407,1576,2244>, v=<-62,226,323>, a=<3,-11,-22>
+p=<-1560,2842,919>, v=<-221,405,133>, a=<14,-26,-7>
+p=<2900,635,1073>, v=<411,92,158>, a=<-26,-3,-7>
+p=<-2028,-452,2148>, v=<-286,-59,306>, a=<22,4,-20>
+p=<-2567,1085,45>, v=<-371,157,1>, a=<32,-18,-1>
+p=<-991,1405,2370>, v=<-142,203,340>, a=<9,-14,-23>
+p=<142,-1409,-2144>, v=<15,-199,-308>, a=<0,8,26>
+p=<1497,303,-2973>, v=<213,42,-427>, a=<-13,-6,33>
+p=<-1158,221,2675>, v=<-167,32,380>, a=<9,5,-25>
+p=<-147,-400,3215>, v=<-21,-51,459>, a=<-1,0,-32>
+p=<-1828,-2033,567>, v=<-263,-290,82>, a=<19,26,-4>
+p=<-1953,1811,-2055>, v=<-278,255,-294>, a=<15,-18,14>
+p=<-838,-1721,-2258>, v=<-119,-250,-324>, a=<10,16,25>
+p=<598,-1963,-2331>, v=<84,-274,-335>, a=<-5,21,24>
+p=<-210,400,-2911>, v=<-29,61,-416>, a=<4,-9,31>
+p=<-1336,-1236,2422>, v=<-192,-175,348>, a=<9,11,-27>
+p=<2593,1842,156>, v=<366,258,23>, a=<-26,-22,3>
+p=<683,-2491,2131>, v=<94,-355,301>, a=<-5,26,-19>
+p=<-1754,-1837,-1551>, v=<-249,-262,-221>, a=<15,23,13>
+p=<1971,2423,440>, v=<278,345,64>, a=<-23,-24,-1>
+p=<-398,2348,1947>, v=<-56,333,281>, a=<-2,-23,-19>
+p=<2374,-1106,-1948>, v=<339,-158,-282>, a=<-24,13,22>
+p=<-989,-1488,-1769>, v=<-148,-214,-252>, a=<9,12,12>
+p=<2259,-943,-1333>, v=<318,-135,-185>, a=<-21,9,8>
+p=<2871,-44,150>, v=<412,-7,23>, a=<-26,2,-2>
+p=<876,-1583,-1974>, v=<131,-232,-281>, a=<-12,18,14>
+p=<-597,-2656,690>, v=<-82,-383,91>, a=<5,26,-8>
+p=<3218,-115,-141>, v=<455,-18,-18>, a=<-36,0,5>
+p=<1347,-17,-2874>, v=<195,-2,-410>, a=<-16,-4,28>
+p=<2607,646,1802>, v=<375,90,259>, a=<-30,-7,-18>
+p=<2246,-82,1413>, v=<316,-6,200>, a=<-21,-5,-11>
+p=<-1515,2402,-1329>, v=<-208,341,-188>, a=<16,-22,15>
+p=<-740,-2443,839>, v=<-106,-345,118>, a=<9,27,-9>
+p=<-370,-1496,2055>, v=<-57,-212,293>, a=<5,14,-19>
+p=<-1652,-1944,-1349>, v=<-236,-281,-184>, a=<9,16,13>
+p=<-2499,2057,-233>, v=<-355,294,-32>, a=<24,-21,2>
+p=<307,-2054,1512>, v=<38,-293,216>, a=<-4,19,-16>
+p=<-2617,-1535,-1691>, v=<-371,-221,-238>, a=<26,14,19>
+p=<1419,2503,374>, v=<205,362,55>, a=<-18,-25,-3>
+p=<2882,48,1837>, v=<407,3,267>, a=<-26,-4,-22>
+p=<-563,-3347,223>, v=<-79,-476,34>, a=<7,33,-2>
+p=<-814,-2302,-208>, v=<-116,-326,-29>, a=<7,21,2>
+p=<2886,-461,892>, v=<417,-72,127>, a=<-30,4,-11>
+p=<38,-829,2517>, v=<9,-117,361>, a=<0,6,-29>
+p=<1954,768,-1801>, v=<278,111,-257>, a=<-22,-7,22>
+p=<-1138,-848,2144>, v=<-161,-121,307>, a=<14,13,-20>
+p=<-2676,69,-662>, v=<-388,11,-94>, a=<26,0,6>
+p=<-1190,-2014,1742>, v=<-170,-287,249>, a=<11,21,-20>
+p=<-865,2859,-981>, v=<-126,407,-140>, a=<8,-31,12>
+p=<3060,1455,828>, v=<437,209,118>, a=<-25,-19,-6>
+p=<1292,-1828,-1200>, v=<181,-268,-168>, a=<-13,18,9>
+p=<-2351,-1092,557>, v=<-339,-155,81>, a=<23,13,-3>
+p=<1107,-2033,693>, v=<155,-290,100>, a=<-7,21,-10>
+p=<-962,323,3456>, v=<-140,48,493>, a=<11,-4,-30>
+p=<2434,637,-1784>, v=<348,96,-252>, a=<-24,-9,18>
+p=<2157,1618,59>, v=<308,226,8>, a=<-25,-20,-2>
+p=<849,-62,-2418>, v=<121,-8,-344>, a=<-7,-3,23>
+p=<2762,1436,-1383>, v=<394,207,-197>, a=<-23,-15,11>
+p=<-3036,419,878>, v=<-432,57,124>, a=<24,1,-10>
+p=<2503,1489,-756>, v=<356,217,-109>, a=<-25,-12,4>
+p=<-1397,-2563,-133>, v=<-199,-361,-19>, a=<12,23,1>
+p=<-288,1425,-3042>, v=<-41,207,-432>, a=<1,-13,29>
+p=<24,2975,447>, v=<2,428,63>, a=<-2,-37,-4>
+p=<285,-2013,-2331>, v=<34,-287,-329>, a=<5,25,26>
+p=<-634,-2885,-1380>, v=<-90,-410,-196>, a=<4,31,16>
+p=<-2550,-1613,1326>, v=<-369,-228,189>, a=<22,15,-12>
+p=<-260,-1885,1699>, v=<-40,-269,242>, a=<7,18,-16>
+p=<-632,1319,2283>, v=<-91,186,323>, a=<4,-18,-22>
+p=<-865,-2642,-279>, v=<-126,-373,-39>, a=<3,24,0>
+p=<2223,-1977,880>, v=<317,-281,130>, a=<-23,20,-8>
+p=<42,2810,-450>, v=<10,401,-65>, a=<0,-24,0>
+p=<-950,2330,2037>, v=<-134,332,291>, a=<4,-23,-18>
+p=<1044,286,3174>, v=<151,40,451>, a=<-8,-1,-30>
+p=<-932,2492,-342>, v=<-135,352,-53>, a=<9,-25,-1>
+p=<3318,808,-839>, v=<473,112,-125>, a=<-33,-7,8>
+p=<2190,802,1373>, v=<314,108,196>, a=<-21,-10,-13>
+p=<-110,2227,2514>, v=<-13,321,357>, a=<1,-26,-22>
+p=<-762,-2542,1571>, v=<-107,-363,219>, a=<7,27,-15>
+p=<-843,1461,-2501>, v=<-121,208,-360>, a=<6,-15,25>
+p=<1037,-2192,-1862>, v=<146,-314,-266>, a=<-9,21,16>
+p=<1428,-2502,783>, v=<208,-357,117>, a=<-12,24,-1>
+p=<-1519,802,-2626>, v=<-214,115,-375>, a=<12,-10,21>
+p=<-2483,1663,1263>, v=<-349,237,180>, a=<19,-18,-17>
+p=<1246,-500,2566>, v=<175,-69,366>, a=<-15,2,-25>
+p=<-2286,-1779,-461>, v=<-327,-255,-65>, a=<22,23,2>
+p=<350,3135,1064>, v=<50,449,152>, a=<-3,-31,-6>
+p=<-506,275,-2858>, v=<-70,47,-408>, a=<6,-1,29>
+p=<2283,2049,-751>, v=<328,292,-107>, a=<-18,-23,12>
+p=<-1926,-1360,-1240>, v=<-279,-194,-175>, a=<19,15,14>
+p=<1343,457,-2363>, v=<185,63,-333>, a=<-13,-2,23>
+p=<-1206,2687,-982>, v=<-173,379,-140>, a=<8,-22,15>
+p=<2187,30,2741>, v=<312,5,391>, a=<-21,2,-25>
+p=<2627,1354,-644>, v=<375,193,-92>, a=<-23,-13,-2>
+p=<2234,1551,-629>, v=<314,221,-87>, a=<-21,-15,6>
+p=<-2224,181,-1582>, v=<-317,28,-226>, a=<19,-2,18>
+p=<-1203,943,2568>, v=<-174,137,364>, a=<12,-2,-28>
+p=<1723,2089,584>, v=<247,300,80>, a=<-17,-19,-9>
+p=<1087,-867,2921>, v=<156,-126,421>, a=<-10,7,-29>
+p=<359,-2816,1809>, v=<51,-402,255>, a=<0,28,-19>
+p=<1010,1125,-2626>, v=<144,160,-377>, a=<-13,-17,27>
+p=<-2218,1407,-767>, v=<-321,206,-110>, a=<24,-16,1>
+p=<-3075,459,556>, v=<-436,65,76>, a=<28,-5,-5>
+p=<-711,3207,1693>, v=<-97,457,242>, a=<10,-35,-20>
+p=<2313,-442,-2190>, v=<330,-64,-315>, a=<-19,2,18>
+p=<-1225,2747,-653>, v=<-177,394,-93>, a=<8,-30,5>
+p=<1874,-2001,-949>, v=<267,-285,-133>, a=<-18,21,8>
+p=<1135,-2961,-1056>, v=<159,-420,-148>, a=<-9,25,9>
+p=<-992,1847,1999>, v=<-139,262,285>, a=<7,-22,-23>
+p=<355,2681,-983>, v=<50,383,-140>, a=<-4,-27,15>
+p=<-366,-2446,1278>, v=<-52,-353,183>, a=<4,27,-12>
+p=<1878,-2548,244>, v=<268,-365,33>, a=<-18,27,0>
+p=<2552,811,567>, v=<366,110,84>, a=<-25,-8,-8>
+p=<3105,498,303>, v=<444,68,45>, a=<-31,-5,-2>
+p=<167,-2030,-2095>, v=<20,-290,-300>, a=<2,16,26>
+p=<637,2069,1692>, v=<83,294,243>, a=<-9,-20,-18>
+p=<279,-2256,1998>, v=<45,-322,285>, a=<-6,21,-14>
+p=<1300,-1475,2240>, v=<185,-210,320>, a=<-13,10,-26>
+p=<-909,1932,1771>, v=<-128,280,256>, a=<4,-20,-20>
+p=<-2564,-1688,925>, v=<-368,-238,129>, a=<27,16,-11>
+p=<-1016,-2945,738>, v=<-147,-419,106>, a=<9,33,-5>
+p=<-53,-2665,-2270>, v=<-11,-379,-324>, a=<-2,28,19>
+p=<1575,642,2511>, v=<223,94,355>, a=<-17,-1,-16>
+p=<1038,2769,151>, v=<144,397,21>, a=<-12,-27,-3>
+p=<2607,805,-1130>, v=<372,115,-161>, a=<-27,-9,11>
+p=<2070,170,2504>, v=<298,21,356>, a=<-24,-4,-26>
+p=<-2063,152,-2561>, v=<-295,24,-365>, a=<16,-4,31>
+p=<2655,-493,-835>, v=<379,-69,-115>, a=<-26,8,7>
+p=<-2780,900,-676>, v=<-397,132,-100>, a=<29,-11,6>
+p=<252,2668,1762>, v=<39,379,250>, a=<-2,-29,-17>
+p=<-2790,-731,-1001>, v=<-395,-101,-140>, a=<26,6,13>
+p=<-1229,497,-2048>, v=<-171,72,-295>, a=<12,1,23>
+p=<2491,1388,1334>, v=<356,203,191>, a=<-29,-14,-12>
+p=<2321,-1287,2441>, v=<333,-179,351>, a=<-24,14,-23>
+p=<1460,2731,-68>, v=<209,390,-5>, a=<-15,-28,7>
+p=<1398,618,2852>, v=<202,87,407>, a=<-11,-1,-32>
+p=<47,1927,2446>, v=<9,271,348>, a=<-1,-25,-19>
+p=<757,2073,-2212>, v=<113,296,-317>, a=<-6,-25,21>
+p=<-1045,2707,-1885>, v=<-145,385,-264>, a=<5,-27,18>
+p=<-1495,-818,-1857>, v=<-215,-118,-262>, a=<14,9,12>
+p=<-2627,-718,-1764>, v=<-378,-101,-252>, a=<25,9,18>
+p=<2024,960,1742>, v=<293,135,254>, a=<-27,-9,-21>
+p=<1784,2855,-138>, v=<252,406,-15>, a=<-16,-32,1>
+p=<-2160,-710,-1609>, v=<-304,-103,-223>, a=<17,6,17>
+p=<-2478,-2089,95>, v=<-353,-299,15>, a=<28,23,1>
+p=<2435,527,2073>, v=<347,75,296>, a=<-27,-4,-20>
+p=<-1352,2955,791>, v=<-193,424,117>, a=<13,-31,-6>
+p=<3003,1189,678>, v=<424,169,100>, a=<-30,-9,-10>
+p=<604,-799,2066>, v=<89,-115,292>, a=<-10,10,-17>
+p=<-2506,-1768,406>, v=<-354,-247,58>, a=<30,16,-2>
+p=<-1310,-352,-1934>, v=<-188,-48,-276>, a=<13,6,19>
+p=<1378,-2170,834>, v=<196,-312,122>, a=<-13,22,-8>
+p=<-714,2923,-799>, v=<-107,414,-115>, a=<8,-30,7>
+p=<906,232,-2566>, v=<128,32,-362>, a=<-9,2,18>
+p=<-2288,-1476,1309>, v=<-327,-210,183>, a=<22,14,-13>
+p=<1697,1613,308>, v=<240,226,45>, a=<-16,-18,-4>
+p=<2453,773,-1994>, v=<353,111,-283>, a=<-25,-6,24>
+p=<2094,-2409,33>, v=<295,-347,4>, a=<-15,25,2>
+p=<526,-1113,2073>, v=<77,-157,294>, a=<-5,12,-21>
+p=<-2442,591,-1823>, v=<-349,83,-262>, a=<24,-1,17>
+p=<-335,-2835,592>, v=<-43,-406,86>, a=<4,28,-4>
+p=<-2785,-972,229>, v=<-394,-135,36>, a=<23,11,-1>
+p=<-1100,-1480,1796>, v=<-154,-210,257>, a=<10,17,-20>
+p=<2325,1914,-452>, v=<332,272,-60>, a=<-23,-21,2>
+p=<2180,1218,2887>, v=<313,177,412>, a=<-19,-12,-29>
+p=<2374,-881,-1454>, v=<334,-132,-207>, a=<-22,13,16>
+p=<-1748,2499,-1372>, v=<-248,359,-196>, a=<17,-23,16>
+p=<1727,-1109,1790>, v=<246,-160,255>, a=<-19,13,-19>
+p=<905,1527,-2078>, v=<121,218,-303>, a=<-5,-16,19>
+p=<2420,-59,2292>, v=<347,-12,329>, a=<-24,0,-16>
+p=<2287,-1783,1206>, v=<328,-257,170>, a=<-21,20,-14>
+p=<-2664,-152,-1382>, v=<-374,-23,-198>, a=<26,1,13>
+p=<-1081,1292,-2263>, v=<-158,184,-324>, a=<5,-11,24>
+p=<2446,-545,-2289>, v=<350,-75,-328>, a=<-25,7,22>
+p=<2235,-1381,-2054>, v=<322,-198,-298>, a=<-22,16,26>
+p=<-3257,-154,-718>, v=<-466,-23,-101>, a=<29,-2,7>
+p=<1673,1690,516>, v=<244,239,70>, a=<-19,-22,-6>
+p=<1385,-2456,418>, v=<196,-350,58>, a=<-17,25,-4>
+p=<2985,-884,-799>, v=<428,-119,-111>, a=<-33,5,7>
+p=<-1513,2311,-173>, v=<-212,328,-23>, a=<15,-20,-4>
+p=<-2074,-1496,-1222>, v=<-297,-214,-176>, a=<24,18,12>
+p=<-2057,-370,-2301>, v=<-294,-52,-326>, a=<21,6,23>
+p=<-2227,-2336,-145>, v=<-320,-339,-18>, a=<22,22,-3>
+p=<2914,1632,652>, v=<414,227,94>, a=<-28,-16,-6>
+p=<-1038,-2308,1378>, v=<-152,-333,198>, a=<13,31,-15>
+p=<643,-1788,-2511>, v=<94,-255,-361>, a=<-2,21,23>
+p=<902,2772,-1464>, v=<131,400,-212>, a=<-10,-23,17>
+p=<1063,-1453,2430>, v=<156,-209,349>, a=<-10,16,-22>
+p=<-224,3075,442>, v=<-29,439,67>, a=<-1,-31,1>
+p=<-1373,-2192,-921>, v=<-196,-313,-132>, a=<13,24,8>
+p=<-3353,295,495>, v=<-481,42,66>, a=<31,-1,-10>
+p=<-1853,809,2625>, v=<-260,110,375>, a=<17,-4,-26>
+p=<78,-1196,2121>, v=<9,-171,303>, a=<2,6,-18>
+p=<3114,913,1260>, v=<443,123,184>, a=<-28,-10,-8>
+p=<2387,-357,370>, v=<341,-48,51>, a=<-29,2,-3>
+p=<-2301,-1677,-546>, v=<-328,-241,-75>, a=<22,16,3>
+p=<1126,2571,-1330>, v=<157,367,-193>, a=<-13,-25,13>
+p=<1806,345,2195>, v=<258,46,317>, a=<-20,-3,-18>
+p=<1375,2815,-293>, v=<194,400,-43>, a=<-13,-28,0>
+p=<2393,-1081,1055>, v=<342,-154,156>, a=<-23,13,-10>
+p=<-74,1914,-2448>, v=<-14,273,-350>, a=<2,-17,23>
+p=<2018,-1928,814>, v=<287,-279,114>, a=<-23,12,-10>
+p=<-89,1458,2267>, v=<-14,213,322>, a=<-1,-16,-22>
+p=<-2310,1272,-1141>, v=<-328,178,-156>, a=<23,-12,10>
+p=<1157,2183,885>, v=<162,309,120>, a=<-11,-19,-5>
+p=<-2528,2520,163>, v=<-360,364,20>, a=<25,-29,4>
+p=<1873,1210,2281>, v=<268,176,327>, a=<-22,-10,-25>
+p=<-654,-2387,-1867>, v=<-91,-341,-267>, a=<1,22,17>
+p=<1619,-1540,-1714>, v=<226,-222,-247>, a=<-20,13,17>
+p=<-2781,1254,-451>, v=<-399,186,-64>, a=<26,-13,0>
diff --git a/2017/inputs/day_21.txt b/2017/inputs/day_21.txt
new file mode 100644
index 0000000..280e26d
--- /dev/null
+++ b/2017/inputs/day_21.txt
@@ -0,0 +1,108 @@
+../.. => ..#/#../.#.
+#./.. => #../#../...
+##/.. => ###/#.#/#..
+.#/#. => ###/##./.#.
+##/#. => .../.#./..#
+##/## => ##./#.#/###
+.../.../... => ##../.#../#.#./....
+#../.../... => ..../##.#/...#/##.#
+.#./.../... => ###./####/#.../#..#
+##./.../... => ###./.##./...#/..##
+#.#/.../... => .###/.##./#.../#.##
+###/.../... => ##.#/#..#/#.#./#.##
+.#./#../... => #.#./.###/#.../#.##
+##./#../... => #.../####/#.##/....
+..#/#../... => #.##/..#./...#/...#
+#.#/#../... => #.##/####/.#.#/#.#.
+.##/#../... => #.../##../##.#/.##.
+###/#../... => ..../#.#./.###/#...
+.../.#./... => .#.#/#..#/##../#.##
+#../.#./... => ###./.###/.#.#/..#.
+.#./.#./... => ..##/.##./..##/.#.#
+##./.#./... => ..#./##../###./...#
+#.#/.#./... => ..##/.##./.###/###.
+###/.#./... => ..#./.###/###./#.##
+.#./##./... => ###./..../.#../#...
+##./##./... => .#.#/##../##.#/...#
+..#/##./... => ##.#/.##./.###/..##
+#.#/##./... => .###/..#./#.##/####
+.##/##./... => ##.#/..#./..##/###.
+###/##./... => ..../.#.#/.#../#...
+.../#.#/... => ###./.#.#/.#../#.##
+#../#.#/... => ####/#..#/..../....
+.#./#.#/... => #.../..##/#.##/#.#.
+##./#.#/... => #.#./###./##../#.#.
+#.#/#.#/... => ...#/.##./.##./.#..
+###/#.#/... => ..../.##./####/#.#.
+.../###/... => .###/.#../.###/#.##
+#../###/... => ..##/..##/.##./##..
+.#./###/... => .#.#/..#./..##/##.#
+##./###/... => ...#/#.##/#.#./##.#
+#.#/###/... => #.##/.##./...#/###.
+###/###/... => ##../...#/..##/####
+..#/.../#.. => #.##/#.../.#../#.#.
+#.#/.../#.. => .##./.##./.#.#/.##.
+.##/.../#.. => .#.#/#.##/...#/##.#
+###/.../#.. => ##../..#./...#/##..
+.##/#../#.. => ##../..##/#..#/#..#
+###/#../#.. => ##../..#./#.#./....
+..#/.#./#.. => .##./##.#/##../####
+#.#/.#./#.. => ####/...#/.#.#/..#.
+.##/.#./#.. => .#.#/..#./##.#/.#..
+###/.#./#.. => #.../#.##/..../##.#
+.##/##./#.. => #.#./#.#./#.##/#.#.
+###/##./#.. => ...#/###./.##./.#.#
+#../..#/#.. => ####/####/..../.##.
+.#./..#/#.. => #.##/...#/..#./####
+##./..#/#.. => ..#./#.../..##/####
+#.#/..#/#.. => #.../#.##/#.##/..##
+.##/..#/#.. => ####/..../##../####
+###/..#/#.. => ..../##.#/.##./####
+#../#.#/#.. => ...#/..##/###./#..#
+.#./#.#/#.. => #..#/..#./.###/##.#
+##./#.#/#.. => ###./####/#.##/..#.
+..#/#.#/#.. => ##../##.#/..##/.##.
+#.#/#.#/#.. => .#.#/.##./#.../##.#
+.##/#.#/#.. => .#.#/#..#/.##./..#.
+###/#.#/#.. => ...#/.#../.##./##.#
+#../.##/#.. => ###./##../#.#./####
+.#./.##/#.. => .#../##../#.#./.#.#
+##./.##/#.. => ##.#/.#../.#.#/####
+#.#/.##/#.. => ####/.#.#/..../....
+.##/.##/#.. => ####/##../#..#/####
+###/.##/#.. => .###/##.#/.#../#.##
+#../###/#.. => #..#/###./####/.#.#
+.#./###/#.. => ..##/##../##.#/.#.#
+##./###/#.. => #..#/.#../####/...#
+..#/###/#.. => ##../##.#/...#/#..#
+#.#/###/#.. => ..#./.##./#..#/....
+.##/###/#.. => #..#/#.../..../.#..
+###/###/#.. => ..#./#.##/.##./#...
+.#./#.#/.#. => .#.#/.##./##.#/.##.
+##./#.#/.#. => #..#/.###/.#.#/.##.
+#.#/#.#/.#. => #.../##../#.../.###
+###/#.#/.#. => ###./.###/###./....
+.#./###/.#. => .#../####/...#/##..
+##./###/.#. => ####/###./..../....
+#.#/###/.#. => ...#/.###/..../####
+###/###/.#. => ..../#.../..#./.###
+#.#/..#/##. => #.#./#.../####/#.##
+###/..#/##. => .#.#/#..#/.###/#...
+.##/#.#/##. => ..##/..#./..../##..
+###/#.#/##. => #.#./##.#/####/#..#
+#.#/.##/##. => ..../.#../#.#./##.#
+###/.##/##. => ..../..../.#../##.#
+.##/###/##. => #.#./.###/#.#./#.##
+###/###/##. => ##.#/##.#/.###/..#.
+#.#/.../#.# => #..#/.#../#.../...#
+###/.../#.# => ##../.#../##.#/..#.
+###/#../#.# => ..##/#.#./####/.#..
+#.#/.#./#.# => ...#/...#/#..#/#.#.
+###/.#./#.# => ..../####/.##./.#.#
+###/##./#.# => #..#/.#.#/..##/####
+#.#/#.#/#.# => #.#./..#./...#/.#..
+###/#.#/#.# => ...#/##.#/.###/.#..
+#.#/###/#.# => .#.#/###./.#../.##.
+###/###/#.# => ...#/.###/.#.#/###.
+###/#.#/### => #.##/.#.#/...#/.#..
+###/###/### => ..##/.#../#.#./.#..
diff --git a/2017/inputs/day_21_example.txt b/2017/inputs/day_21_example.txt
new file mode 100644
index 0000000..f6d24df
--- /dev/null
+++ b/2017/inputs/day_21_example.txt
@@ -0,0 +1,2 @@
+../.# => ##./#../...
+.#./..#/### => #..#/..../..../#..#
diff --git a/2017/inputs/day_22.txt b/2017/inputs/day_22.txt
new file mode 100644
index 0000000..1343456
--- /dev/null
+++ b/2017/inputs/day_22.txt
@@ -0,0 +1,25 @@
+.##..#.#.##...#....#..###
+####.#...###.####..#.....
+#.#.#####....######.###.#
+#.#..###.#.#####....#..#.
+####.#.#...#.##.##..#.###
+#.####..#####.#.#....#.##
+.#.####.#....###..##....#
+..##.#..##.#.#.###.##.#..
+##....#....######.###.###
+.#.##.###.###.###.#..#.#.
+#.##.#.#..#.#.....###....
+####.....#..###..##..##..
+##....#.#...####...#.#.#.
+...#.##..###..##..#......
+#....#..##.##.#..#.###..#
+...#...##.##.##...#.#.#..
+.##....#.####.#..##.#...#
+#.######......#.#...#.##.
+#.##....###...###.###....
+#..#.#.#.#.#..#.#.....#..
+...##..##.###....#.###...
+.######.#...###.###.#.#.#
+####..###.####...#..#####
+.##.#.##...##..##...#.#.#
+###...##..#..##.##..#..#.
diff --git a/2017/inputs/day_22_example.txt b/2017/inputs/day_22_example.txt
new file mode 100644
index 0000000..3105a0b
--- /dev/null
+++ b/2017/inputs/day_22_example.txt
@@ -0,0 +1,3 @@
+..#
+#..
+...
diff --git a/2017/inputs/day_23.txt b/2017/inputs/day_23.txt
new file mode 100644
index 0000000..9d29443
--- /dev/null
+++ b/2017/inputs/day_23.txt
@@ -0,0 +1,32 @@
+set b 99
+set c b
+jnz a 2
+jnz 1 5
+mul b 100
+sub b -100000
+set c b
+sub c -17000
+set f 1
+set d 2
+set e 2
+set g d
+mul g e
+sub g b
+jnz g 2
+set f 0
+sub e -1
+set g e
+sub g b
+jnz g -8
+sub d -1
+set g d
+sub g b
+jnz g -13
+jnz f 2
+sub h -1
+set g b
+sub g c
+jnz g 2
+jnz 1 3
+sub b -17
+jnz 1 -23
diff --git a/2017/inputs/day_24.txt b/2017/inputs/day_24.txt
new file mode 100644
index 0000000..1fbfe25
--- /dev/null
+++ b/2017/inputs/day_24.txt
@@ -0,0 +1,57 @@
+42/37
+28/28
+29/25
+45/8
+35/23
+49/20
+44/4
+15/33
+14/19
+31/44
+39/14
+25/17
+34/34
+38/42
+8/42
+15/28
+0/7
+49/12
+18/36
+45/45
+28/7
+30/43
+23/41
+0/35
+18/9
+3/31
+20/31
+10/40
+0/22
+1/23
+20/47
+38/36
+15/8
+34/32
+30/30
+30/44
+19/28
+46/15
+34/50
+40/20
+27/39
+3/14
+43/45
+50/42
+1/33
+6/39
+46/44
+22/35
+15/20
+43/31
+23/23
+19/27
+47/15
+43/43
+25/36
+26/38
+1/10
diff --git a/2017/inputs/day_25.txt b/2017/inputs/day_25.txt
new file mode 100644
index 0000000..892ee98
--- /dev/null
+++ b/2017/inputs/day_25.txt
@@ -0,0 +1,62 @@
+Begin in state A.
+Perform a diagnostic checksum after 12667664 steps.
+
+In state A:
+ If the current value is 0:
+ - Write the value 1.
+ - Move one slot to the right.
+ - Continue with state B.
+ If the current value is 1:
+ - Write the value 0.
+ - Move one slot to the left.
+ - Continue with state C.
+
+In state B:
+ If the current value is 0:
+ - Write the value 1.
+ - Move one slot to the left.
+ - Continue with state A.
+ If the current value is 1:
+ - Write the value 1.
+ - Move one slot to the right.
+ - Continue with state D.
+
+In state C:
+ If the current value is 0:
+ - Write the value 0.
+ - Move one slot to the left.
+ - Continue with state B.
+ If the current value is 1:
+ - Write the value 0.
+ - Move one slot to the left.
+ - Continue with state E.
+
+In state D:
+ If the current value is 0:
+ - Write the value 1.
+ - Move one slot to the right.
+ - Continue with state A.
+ If the current value is 1:
+ - Write the value 0.
+ - Move one slot to the right.
+ - Continue with state B.
+
+In state E:
+ If the current value is 0:
+ - Write the value 1.
+ - Move one slot to the left.
+ - Continue with state F.
+ If the current value is 1:
+ - Write the value 1.
+ - Move one slot to the left.
+ - Continue with state C.
+
+In state F:
+ If the current value is 0:
+ - Write the value 1.
+ - Move one slot to the right.
+ - Continue with state D.
+ If the current value is 1:
+ - Write the value 1.
+ - Move one slot to the right.
+ - Continue with state A.
diff --git a/2017/inputs/day_3.txt b/2017/inputs/day_3.txt
new file mode 100644
index 0000000..ce15bc4
--- /dev/null
+++ b/2017/inputs/day_3.txt
@@ -0,0 +1 @@
+325489
diff --git a/2017/inputs/day_4.txt b/2017/inputs/day_4.txt
new file mode 100644
index 0000000..b9f9e0e
--- /dev/null
+++ b/2017/inputs/day_4.txt
@@ -0,0 +1,512 @@
+kvvfl kvvfl olud wjqsqa olud frc
+slhm rdfm yxb rsobyt rdfm
+pib wzfr xyoakcu zoapeze rtdxt rikc jyeps wdyo hawr xyoakcu hawr
+ismtq qwoi kzt ktgzoc gnxblp dzfayil ftfx asscba ionxi dzfayil qwoi
+dzuhys kfekxe nvdhdtj hzusdy xzhehgc dhtvdnj oxwlvef
+gxg qahl aaipx tkmckn hcsuhy jsudcmy kcefhpn kiasaj tkmckn
+roan kqnztj edc zpjwb
+yzc roc qrygby rsvts nyijgwr xnpqz
+jqgj hhgtw tmychia whkm vvxoq tfbzpe ska ldjmvmo
+nyeeg omn geyen ngyee rcjt rjuxh
+qpq udci tnp fdfk kffd eyzvmg ufppf wfuodj toamfn tkze jzsb
+rrcgxyp rbufd tfjmok vpyhej hcnz ftkojm
+jnmomfc jnmomfc bkluz izn ovvm flsch bkluz
+odisl hzwv hiasrhi hez ihihsra qpbmi ltwjj iknkwxf nbdtq gbo
+gjtszl gjtszl fruo fruo
+rdapv gaik cqboix sxnizhh uxmpali jdd usqnz advrp dze
+flooz flooz qad tcrq yze bnoijff qpqu vup hyagwll
+lnazok dze foi tqwjsk hpx qcql euzpj mwfrk
+ilb fmviby ivybmf gtx xtg
+rpauuu timere gyg wcolt ireetm safi
+croe szwmq bbhd lciird vhcci pdax
+hnc ykswt qqqmei goe bri wmyai hnc qpgqc pberqf bzs
+hsnrb wdvh iezzrq iezzrq rdbmpta iezzrq kemnptg alkjnp wymmz
+ngw don ddvyds nlhkoa aaf gptumum ugtpmmu
+vmccke qbpag kvf kvf tgrfghb kvf bhpd sglgx
+obomgk bkcgo yso ttft vbw ckl wjgk
+fli qvw zhin dfpgfjb udsin nihz ovr tiewo
+tgmzmph hauzieo jmg tdbtl lvfr qpaayq qapaqy ausioeu jun piygx
+jkp guqrnx asdqmxf vmfvtqb tloqgyo ioix gajowri tmek ilc puhipb
+uycn zxqm znft ayal znacus kvcyd ekv qqfpnh
+fqghur xtbtdd ztjrylr bpuikb ziyk
+rvakn uqbl ozitpdh uqbl dsej xehj
+laxp haz jyd xnkrb ijldth woy xapl iqgg alpx gnupa ukptmmh
+dyiy dyiy ihb qcyxr
+wbwkd hdwu zvgkn hdwu wjc sakwhn zxujdo npllzp uyr uyr
+fxczpmn cininu akcxs ggslxr riyxe ojisxe
+ppbch sampq dnct afikor dnct edsqy pnzyzmc afikor
+jnvygtn hijqjxl vsd jnvygtn nqcqv zns odq gkboxrv kolnq wrvd
+mroq mroq flsbu flsbu
+fyshor xvpaunj qmktlo xoce wkiyfu ukcl srndc ugwylwm ozcwdw mtqcste kpokr
+cfh cxjvx cfh cfh uewshh
+bpspbap bpspbap fquj mxmn bwls iirhvuk dmpkyt exrn mxmn
+tvyvzk ezszod ntxr xtnr och
+knfxhy kbnyl knfxhy xhkssx lxru uprh nkxpbx oodolxr tpvyf
+nblmysu iwoffs upgof tyagwf aan vovji ajk ywzq oyfi sfulz
+aushzkm lcaeki mkuzsah ynxvte rsntd refk pcm
+mgguob gobmug dzenpty gmogbu
+yvq eepof rgnree nerger fpb stfrln ernger
+hrgkbl mzwvswk rsrsbk ieru holco pajvvn ztgsr qkyp fyeg owpcmoj
+fowda gmsqdca yugj mcrroxv mqcbojd fjnqfji qdfsc jqs
+qnc rvjfz vvxk sjd xrma ucdjvq sbw zydyt dfzww
+ocajazv cozaajv tqunkla udwf ecnnmbz lsakqg bki njnda zsdu ccfqw rxpc
+qqm qdfya qxyx qmq qfday uqnfttt
+rnbirb iapor qet iapor hxkhz dfvzig pedl ybyb
+mkgamxg xkniv meb hbzmxjn dhbj zhbxjmn hdjb
+ilteux pyutyfx mau lrr bacak
+sjjonmn dbbbgs crxyuu jztstgd ezb uiabyaa
+tra fle ufzlvf nnaw kec hiwnnlj tei wld iyt syk hjdczb
+qmd jtlud dgh dbanock fzp dsjgqru wwvo jwvxwgv xlemfij jcacd
+rpkx oxesil snazcgx fly miiyc ikmtmp oefyyn egbw
+ypfpeu wldnyd acchppb yqwcaw wldnyd turbz megci nbgxq xkc ypfpeu
+iqqv iqqv neui iqqv
+ypsxm icqyup zyetrwq nbisrv
+viommi toszx dpueq eyy cunjou ffcjc jaeez djefra pxvkj liudlig yye
+fhnacbg jghchh ghjhhc iue hwqmo
+vbjw lpn cizba ltnsfpz tzoweml irewlc uzckhpd mszal obd
+yeos utxkft hflxkfe fxczge qpgigkc ksgr vuumql vhlvv
+xzmkv xzmkv krecdi klpem jsbu nwcmik emfzxf cjmpgnj
+vtkjo pmiv zou gxo qdiyxsf hwyinjk jhkgf rjq
+dyuoc ywiyvch irfgl ywiyvch fxb fxb
+tuz onhr syu rqya abkaf bcfx mbknex juwoor zmksl
+oheg spjorx ksdy vwtq fxz phvtazk tcze lrxg
+hew lbup botaj ltr jpd
+dxgc tzinkej gnz hxvvub adsqmc dxgc asgpp rqbdcra goy pmamdua bhiacva
+xqv ygb kihxqz vyv pjcny vmyvsdv cgsi nfyx
+tqga ssshrw ndq qlbvwh huyd pxbgj qbxk dkkbf jxy chsobw pph
+hxl iwph iwph xnr otifm ljhre
+zlgvpd kapxpoc dve rklk ogh hgnp rbrmc zzkz hhmcx aklmo
+sar gfor nkf hek nkf aql shc aql
+dtcrw kfjzcjx qyhi bldson whwdayo mqtgt xhqzp ttqmg
+omspdml isze jdl nvwo qrkm wztfg ssfgyh dryj jhp unsmty
+jxt cszylng ifht ixtuna azoi xutqlv jtx tjx
+usgm azuayp fgkby ezpyq jqwl ezofj
+tnhvil nrvg moyrpqs sldx qymoff megflxh pyhqwms xmdw
+zomy zcquwnv lzx bvcna yods mjp dgsez
+blklyf xokd gpit tiysj yrwfhm tofx
+dtig vhdp omuj vhpd
+fogwxim qvdwig emdiv jvhl euwbzkg xvxb hwmqo ujdmlp epmykj
+sjxll sjxll pedvgb sjxll
+drvay gtzhgtx yrt okz nqf
+haxfazn pvkovwb pgu tgshw mxcjf pbe nwoymzc mxcjf pbe hydwy jradcr
+prjsloa ahylvj okbsj qbdcdjt pmfo pagyoeg vkmhjzt khzmjvt opfm xfrji gyjqyel
+lzypt jdbtrad ogr jdbtrad heink
+rcoucuq gdxewa rcoucuq whlw zhhm rcoucuq azaqohe mzyli rdvaf
+yuag ebcf yuag nsotg qqzuxr jfmao vyucw wmoye
+qwvk xemm hgqrr wyxkpp tojndm xlvzypw jus bgnu bgnu nklfwhs
+daqi knenmku ccm xkiuy vkexsbc kvvdagx umopitw yaocnx yoakqql mllmsp
+mrxgl gywit mfopia ncnsvw vdxek axuiot rsejua nei prndudz mnu
+egqn gaa qgen urs mix zbn rhn
+ewharq aihy udkdaob kgrdd kgrdd kugbjtj fcef llqb pduxaq wcexmm
+dwtiw nelq hppad algxgf gcc upou akm efnb mxmhrud
+yxqaa ups okbhgt iet qns tqn rnjqxgp
+npmhdm cgds ldexvr typi jyivoqk zkgq vfyxu xgfo
+dkwnmr umm dkwnmr okpjw wqx jpztebl eqsib dkwnmr
+dxbild wpbup evscivq dxbild dxbild geqp ojfbpl jshvqej
+cxdntxs csfocjd pyy tuhws teb boyloz xfw scxh pxhonky
+lteucke xrgwy hszgzu hnyrcvb
+pfgsgwg dxzh fworek qbstod
+usemcrf psczxu gcjtr brls
+hjol efxczux bqdn gvrnpey yyoqse gbam ndzyj lbwb bhzn unsezg
+bapw xifz blupk qqdk bofvqpp wnbuwyt rnwocu lzwgtt zucag pov
+xkre lqvd juf lqvd xio xyg xyg
+tzdao ztheib aymcf aorg iyawrch hetcxa iyawrch czdymc ccv
+ucgl azlppu jvxqlj pest
+dvwlw fuuy mnhmm okrp ualnqlm uyuznba fzyejk yaq crl ctprp
+odfq knox mkbcku pxucmuf lpjpol phl
+ixongh hfs ruorbd auy qyssl kykwcix aytsm rlj aytsm duq segpqhk
+izufsk wedpzh podjkor eamo vqvev ifnz podjkor xrnuqe
+twyfps bmdbgtu qye qkwjms
+wlav htym vhsnu cocphsj mdsuq vhsnu jflgmrp
+opajag itwjhfu purnnvk opajag
+hpkopqp vnj aialpt lzrkzfs nwucez nwuezc
+mcx hzcjxq zbxr dsx tpknx fva
+rlvgm xrejsvn ghawxb efyos xty wdzdgh olahbtn rga efyos vhtm nsr
+cni mbab qtgeiow ulttn rckc kmiaju jvbq emyvpew cdlxldn ulttn brhkprx
+eykpffp rapik qki fhjgdyu tome ehjuy bibjk htxd vexvag
+wrk dpxt gwkuiov gbkif ike gbkif pcd wpj toywyf qzsa aol
+yqwzh uujn ujun ujnu
+srs ralwxrz yxvvmgp sjhbhk waasid cqtxoxf whcladv jkmaq khjbsh dlavcwh
+mdvsjh xaj etvxlsy fxgiy rgjesel rlegesj ptriz ebdyhkp kugxm dxv egljser
+lhehwrs mqevb ygmv gri izop qgb ivm
+loqqam alojlwg hgen hbyw qlwpun loqqam worgnwk kope
+phozre todsknr todsknr ibj mvllsar
+wuripy ruwlfbh wukbkey qhq iishw tvtvci xawvxc vxacwx hsiwi ogq
+xryq vxwupqa zhqex aquxpwv bnvxrba dtbxki
+yvvwh zvsm vqskhp vqskhp ggqqlw bpn wbuv
+kqz tdy goqwge ygn jgd
+szjjhdk zkpoo nxexz ebicc
+wzuemcj oyd qupulju iaakzmt vzkvz
+nppahov umm wpzev wxkgfxd owgekp bhhb bbhh dgviiw kdfgxwx wryb
+bnc rhes lmbuhhy kwbefga bnc rtxnvz bnc
+ani mggxf mcoixh zdd nai hbhzl mes bdpqr
+mjn uinoty jjegvze bjgqg yhqsxbt coj obylb hddude xqi rhfbhha alood
+cbjzj drmihy tfkrhsd nuhav hihzx bvblqpl tdd szmp gjgfv box
+uumhdxd cmwgyf vepr rwqdkj exwk
+hwvr ydvw bqefu kghes gvbhp awms iqsqes khgse
+mrey jqfw fwvzhps komj dayvs fbui zmtd cofn mrey
+dsjds fdpx irjj usndok qcctsvf fgk wvg txwxcl dxs llp zyilwtq
+xmkelgk fdukc cye legkxkm wwly
+enlny eynln cccku brkz dpof mwfoxcd yftmnqh wpebvyc
+ggdn jnysl dsacffw ukj hdae cmzxku
+uqhm gcachmn kxndfrl htmfis jfnajz fiqiypr kekho kekho ndcw ckrndub dejfna
+keazuq ertql rauwl keazuq obmh rauwl ksrotm
+jppp poigqhv repfsje grjk xwkyuh pkx ayzcj hoxzv
+yhjw pcuyad icie icie icie hwcsuy wcd yihjh jnrxs
+gaug ivvx ceb xujonak hbtfkeb ttciml cctoz
+dggyyi dggyyi gqlyumf yasu fwdfa cbb nncn verhq
+rhgcw gpcyct kiuhbg kiuhbg gpcyct jlmleo nhumm
+wulxxu jyjek hclcp ogob viex wiqcupq
+tthu nxgzpid kcnj mss ukapgkp nnc bxjocv qwxs oejwsif aywqtu brahkb
+dtde bgvb smu vbbg zhlu
+lyo nwjjmep ldbok wgxhto wwuh qfgjknk wnsl
+lleyr onha hkwulbm jfg
+bybjwd uoxvbh mvj iqfpnxs bybjwd zqtszp wvc lbazjr zkzenja cev
+rbuyyr divtslq yuqmyt ajyveb smxsjb nlk tzqhq ims fewg wpjhr gqh
+kpewfd beq klilis klisli eeezut
+euqh hueq ldoo crqurv lvrwh tmaewp oodl
+bqi lzrf jyhvxfh bqi jyhvxfh nbztd lwpdn cuzi
+srjylou phavzjd wost uxkaq byh sluryoj
+ihrdk bcegkpq nygrs qbcq wyjg dvzme pgzhjl vibg kvv
+ijsx iedemek ktlz gtga tbal lbki gtga
+vmiaxn kefig kefig vngxz
+vrdmfvi qts vlvhq vlvhq dihmq
+cfz dyrz zlw qnt vok fwvahg skshbqf hbwozdc ntana jdb uflp
+rimbj bxemw sfps krtk umta vnk ewmbx nrlje ymrtqrz mxewb kjxunbt
+egnuti ozat eltl ngueti
+qtcwoxq rmaf qtcwoxq qtcwoxq
+zws gcoa pydruw qsrk lrkybdf ugr wkrxoj nyvf vitwn
+tmr hhd dojid zwrj bhsim righ keqlep flzunou
+lwoquvy acjowxk tqudk oenvioh nyavyl
+rgh dfhgyke iff cpxhuz hui koe iff hui dmukrei
+bjiumig lcbmbgh vleipx sfawua rnf
+gftfh qwb tfdroe xbno qhgofm vqfoe mux
+ljdrr gyfggai iun nju xrucbis mhrcrh fukr obvuqc whlalfe xrucbis nju
+nxjmjr egqwg arllu xqaahri lzc ivt uhsti
+sqiepba rcmts kvesv nvp
+tiksw tiksw rjni gbhvzm ctbq zuqfyvz
+ibsnm kfka aoqigwo sqouih rxz
+jmymq lxio adtmk umyu sxvzquq bporqnb heol fow
+mepa eckq rqviawv dkqoei ifmngpp jiava rtklseu
+yuycd jiufjci yuycd uowg yuycd udq izkicbr csxobh
+nwu tfsjavb rruoxbn oepcov elxf rruoxbn rruoxbn azglwth jcjm ksqiqpv
+dthfwip zqnwa zqnwa zqnwa
+gso wruece ufl crgnlxv vllsm dpyfm wpa ctxko
+wvpze seodz lpq lpq pmtp wsxs ffppx
+yfxquj phvjn rtwieq rtwieq kgxztyu vbjvkc prqqd lyzmdo ojbrt ojbrt qiqjz
+esaezr rpggiy jey kbzrhu uthus osr xxaiijd qfxlf auhzbx gkigoqw
+yfhcj uvgck cds gjhhrg cmempgj yfhcj cjb
+yxi voxvtuw unwg jqqm
+igvjr ljz rus sru gbjtjt qfeg ztu zjl
+leof ocxns hbkoysh hbkoysh leof
+hab lyxmf yhh qeks fwhfxki xmbcak okqjii nfgzyg bhtfgdj lpmjn
+mgognh tad herere lvwnzx ixwqs zphmuuc etdjz kczsf
+mtej rlolsnn zbl uykek dpkan gmz etxtgj
+mihuieo emjgbp jgks mihuieo iexrfw mjdnr bvp mcuzea xkbusvi
+jvqpj bwt jvqpj bwt gxr
+qpnd fpt tpor bibbpcg hmvguez wqc afl ckviua gpi
+dntmcg jglm sxtnu sxtnu sxtnu
+fzkbptw cbfwo ozvwov wbv gcdd izqo ovwzov lolewo xikqpw
+nkxyxzd kpn datf fki werq mwidqx oiibor zizcjph
+xvgyxym zor ijoy lvwsf fjuara idvvq rreit mqyyy ctio tzwqqhj rnpee
+maqkfpk maqkfpk xukg sfdmnlg xjopvr xjopvr irf
+liujcd vnlkouy dxkwc gto vhjvtw
+swhqhj cas aupsd swhqhj cas bvbooii jquck dtdm
+igh iqicicf ghi pcxt srcrjx gmf gyscphv
+drplj drplj wopgpnk wytag wopgpnk
+zexe ilcqoh qiefb txkuv lirfzv
+ovvpn ovvpn uqeurqx uwzn hgmucj ovvpn sjxulms
+rox silka irhsvym kutus otasof tdneav pcagds
+mkja omu tyshbfq onp trxs lxa tftbv bnpl djhnc zdqfs muo
+tjj rmmqas cbbkxs qio pikk ykyew gxlxt nhsyl ykyew
+frcprg njrz oaxcmhc qben pedm ecvtga nzxwpb ior gaklot dpem
+zyt kncau spoe qlchg sqys wkpbng yflju qlchg vkve bzadbpa
+qtq pkaicl qtq mfkfqvr dnleiq brrjxsx uoyxh pkaicl yvmlug
+firwy imtlp ywl qfa dqrbazz ztzb pcsbwhn zesmlag
+ivey ivey mtvc mtvc
+lhize acwf moa cdeoazd voktshy qmvqq jvmuvk ljfmq tsanygc
+xreiqkc aawrovl pofcsg xreiqkc xreiqkc
+cjbzvn ozds iniqu sdoz gqmki bablvll krs vjzcbn
+izsod htkeqz entxn qtns prpcwu omfnmoy
+kwfb tctzda aztctd tadtcz gyt wunbcub ydiwdin xxk
+epnl ijcp giq ltfk zjcabve zfksmz epnl giq xxxbsom
+ulyukpa mdjsbn dydko uhkdt qms aaaj hustlwu
+zlsbu ohx jcwovf egf zlvpqgx qhejm wrywdmw
+uhxqrzr mmu kjxcalj unuohiq rri yzngnb ikvlxry mfiym qbksdx
+khqciz som yklmm jceb khqciz jspy jceb
+ncwggv njvi nqox krtsn lnm
+bgtqme xaxcoq qbtgme obqual vorfk baoqul lgrb
+jli tsbb nlxjc pkwzmz dlxrj hmho gzguko ilj iyaasm
+wlmw grkumg dynwtyo emxhhqr huluk slpqu uhqcmd absmr ufirmwr
+pbs pcammxv dplfr tzvmav nccyy blvyq ffhnz bccutq
+hgge ghge vxmvz hqxgjdg zab guo gheg
+ylj bucoyoq udndc wpgyrbx ueh udndc gxdsdh hdoz wwgqlg
+cjdeh gttyqe kdkm ltzd lfeozse quvjq mnwhokm kdv oojxm nxt
+mfkzus knqxt saxkqww njx zumsfk sbmcyad cpt agvbuv
+tukn vyco yobvsn bzgnn klrnzy kea thzk pxpwq ryfff nxzm
+ylbm lxlz lybm lzxl
+wgtxoij zad slgsi cvnxfg iomswwl vmx
+hkm yinhnkj kmh kwkw kayknck chur styjif yknakck
+rtfwhkq rtfwhkq zsf zsf
+sldq zlntr ueegiw kajivqc ozcbm ceft snvugom pdyc elppeed nnqrp prwwf
+lhk xjonc muc tudag tsafx mmivb dvrjbp qgrew
+hnzer fbgqp aazta aazta lxaz lmgv aazta
+victgxu victgxu mlpd ummrnbx cazjgnw isxcyp efy zfa cyusj
+gyojxo onzq gyojxo uxufp awi ilhl wefwfxr gcjlt tmliynw uxufp pdcnxah
+wjwachn xkuhfbp oky oky ybaeqkr rbuix yreoaw wepmye brvon aasb
+kiidorw vxtxiqx wtqvbrv efdth isel qbom vcssyc vxtxiqx wtqvbrv riafzsw mqzsj
+eurpjd vkhdamt tmfx czeoot hiz ykz lmixzq tfur jhzr
+ipuftpj qbll sqkkdw fwncmiv bri oeeh lehd ioh wag
+suima nanngc imrmc krq atxdo woy atxdo akev qlr aezco qlr
+cfc efwbzck ozkmcxv moczkvx ccf
+bnekky iakrk sask uwgnjp iyi rynev bdnas ldh kass
+sicmw vvjbvv cap nsumc xgvrlm wsoo uoqdu psykckm
+ugg mtr wnzhmmh tjxc ehwnji lwhu mdsckk yvmk enubrqo
+grb oxmxz ohu ytetedv ssx apzlppg fdkamm sxofc jdt ynmu wyejok
+umoep rbyqm eqfk twqnog cptbbi dragna ngqs ffb cexxnc rbyqm
+utizi ormkel wvwur bdx ecelqbv xiccama aag glfvmj
+znb rsuqoa uxo svc
+obs lbifa cffi catpd
+qkxwian ajlzjz wewduzp bbyv qmt fsr qgiu epinp ghmf
+hatg bfgmb aght ghat
+kuq inp dun cknbun wmwsu drlmmg kyxc bdl
+bddybth swdbf jhi fva qpobio bjwm wjaztp jywi
+mgckz vhveu zkemhp zdf xtiqqew mlx wazgd
+umbjq pya lvvxf jeavij rhrxvew bwjqgpr piz
+xaycpwo vjcuc qksc yuixhni sfbfb dydyaq gdfvb tggg xidphvf bpjdrl goskxym
+agxfoip gguif wvo agxfoip ntkbaw fbyggy ooft zxih
+nzvsu ffwq uxvfbl qrql olhmhom qhdltg ymwz krtndtx olhmhom nfsv krtndtx
+qdp jqk ustz xjripzv mnk grnodk pjwdsj uug zqxjqj
+mufrcox zunisfs ocvcge acamm xua vor bsde kxr vor kxr orccxx
+ncycbp anvcxay bmm wndmeaw oso knmk mmb wamenwd kmkv ppdd
+motdcn xzagzwu vuzt utffrn yuqxzrh uvzt ujttq
+tauoqy coiy ybesz tauoqy wpmr trquyne ahxbj jzhems dsdy
+aczq ypw pgmzz srfn quatjgf
+cih ypapk bfxvr euvhkk gugru auhqui
+vyf pssgfvy dnhvbfl xpacme dnhvbfl mzdv iynq hcqu
+lbzvbu hhxiq hdfyiiz iyzihfd xhqih uzdqyxr
+iapbdll vdr cprmrkk vdr dfjqse mlry flpqk vdr
+grrfkq xcpxd grrfkq dxc bjpr prvwh swoc swoc
+bopo chvwuhf qhd ieesl xey ieesl fnjcbe
+kic fyq hsucnu agwyl pzzmd hqksh psw
+mxf uau iti lcoz lpg zbu ocre wqlocmh mxf nidqj lcoz
+bypmix ptzxgmf xmtzgpf hrvzzq
+lbfw zwusma lbfw tuyyy
+lrf uej unswvh obgsb npbl zajr kenea uej qnyjcu wzufim qpzkgya
+qcrxj llyu kligt hlm ehwtbx dda lgsvhdt xewfcv uikn
+nfzjx izqdbq mfbxs imiuc yqxb xlmvix izqdbq eflqfq wku omgtuu izqdbq
+lasdwg hiy btzt eefd eyoep icn nnmhg otml rek luixac nyzgn
+vekteds utsuxdx utsuxdx vekteds
+feyov qrij zbebwg ijrq seplram wttkwm zewbgb kzuhuh
+dmkgtv wohgqo ddtqmv zatahx mym hqowog tkmvdg
+vhha wjrmuyx kqh vyyrj xzchbi ejsdq orlxg vyyrj dlrc
+yetngqn zdtuqox hkarjei fqpsgh eaqwbg zsssog ghb gddqqzr hbg
+obldb zsrhz zxp uxphnev mwnbc pfjft fms xwslk vjm fxy
+nfij dbfykv ttq gyjgac igxuyqi gtiioqx ilhdex dbfykv uyp bdiwya gqf
+pffzruz vogfosh dcs wje
+pohhf fhpoh oon yyz
+xxuam afwm qxl lnt syyr bwxhhf sozauq shlhfmz kwnn milav ochq
+wefcqrt gejw cwerqtf fttf gjew
+jfsvnmr osca epwtle pgfif sxom
+exlfzmq nakp rgdnx rrcvth vhrrct aajjdrt ryyg dsozd jdqlqj pakn iruv
+rmcvo txszcs xxhyxz hbsozk wshkocf rmcvo rcbnt
+kitz yjgney yvkymef nauj hmllsgl kyhm kqr pzsu rcf pzsu qpte
+cdinpx bfur mkj naz ihkheyr nohhoe
+ylris xeqcgup wap bbfih tgfoj
+ina gnlnm zyeqhij cudfuf ipufae bvkdzni aat teqsg cudfuf bjokrbl teqsg
+aedx edax dnfwq qndwf
+rdngdy jde wvgkhto bdvngf mdup eskuvg ezli opibo mppoc mdup zrasc
+qcnc iaw grjfsxe gnf gnf
+zbjm snznt zelswrk gkhlnx dqxqn qqxnd dmro
+zisecvx ztezof uzbq otnrtj qsjzkwm ewvcp rlir bfghlq tgapdr qxmr
+ipnqj opjf vabyoe wkwnd
+wyf mfqxnrf apm snarf jqu aaghx pwecbv lvghayg
+acncv jmmbwlg oiphlm ifuo cvt
+pvmb egansnd zmh gcuzzci rrxpslv ubith
+uoleptg xbouzn xbmg cfh cpn wpqi xbouzn xtxis sxzpns
+rilybri kurbpq vfmjpck tjyogho hfyxad svfofx lfbbhxj khaerfs iqr
+seaebgz wlmtkre qguv qguv wlmtkre
+sgo edkxya zdqgwtt gxu nibuu rairqoq mzxli dci qsv
+tsol mdhzqr rmaqnru ggvcq arbwkn hlkcnj ljkcuof
+mmliphp ocup puoc eijjv
+gmajqpb ijki ijki kvz
+pmqss unhlpcj dlkll nuhlcjp expe tlurzmv nsy vlumtzr tgseozl
+gkvaoni hsba hsba viuedv phyoclp fdq phyoclp febld nqfs
+rxvdtw abn pntv qrqfzz slsvv abn lrxix mnu npot
+ghlfjp woy xwkbmv bkahpkj jve cncvk jvdype fwgvoju yrkwjp gwfvln mvkv
+kmluh mie bby fwer chsinb ojglqr nqk mie
+yzmiu igkgca ybnsqja jpfejtp yjddy xsosxfi ingx qwuhb emrkwpx idqjmmm
+btrllw mphm dkvo ewdl dchcul yah btrllw kmqi mtvgk wtb
+hxsgard yuikc lykt tdee adprp gpougod klnzk mzsmlb
+hdn znblw ifoblur bwzln dbv
+smofpbs vjuyiro llk lfzesga tybu tybu
+gffnpug xaup iqiyz fjkpnkz drrk fwyxw lwzfskz gslwpmv vjxylva tbkyo nib
+evydmb nhwuiiu fkerq nkgbuyy uclrs ydjgglh xhotwbm riirgzt
+bsub eavbt uvd dpzwyt rhn khrbptt xszckc djnfxju axofhat powmso nvdffrv
+xtuykl fjz mbikc xpnx hmey fjz fjz
+rkls nwdcsyx rkls rkls
+tygml untequ ybdfumz nqffbq uipc sove hfnqj
+ytecew vven koqn royynd qsn ksl qsn sdw
+hknlw qwho whoq oqwh
+lzmmtqu qvhyeo cnofuj utpwkjz gnirz yhhu aodbnd
+zsr axw kwtzcv tydzo kwtzcv lkxsm
+rbjtqe nihifd gvdxd bpxzy rxteky vgcgllv vbbua anygiup rqo
+dpd wblfwp wblfwp wblfwp ygahc tqjbaq
+gsw gsw pacgj xmrcz zmxhmch xmrcz
+pdq rhe xqmq lgpkhg fyffrot ovnqh wle
+tbjavke ypzzrj jizx gdxoh icjsat otfh fmygumv
+snch nxlgjgp jeyn sxoqfj jtage jtage iuice
+rtb coefuj grwg grwg rtb krhqnma vfhgbr
+vhegtl btorwxg szcev kbvkx itsk nlzpbed
+hiukrf ilzkm yllhh xsgwkdp zyy kjbv
+rfcg tdorci zcj wzftlv rfcg rfcg
+lgbc lzizat vsno pau nvv vsno bbr lzizat qhtb gwp
+sfwnio tcugjk bsfsz ykyfwg ibkap fsrvy mygk kzunawx zyhyh
+mpavlh qps bylh lttjkz rqabgk vewb bwev tlzkjt gzrbxga ktmso prpkj
+gpf ims ynh ffrs vpa iemp gofh cgbauje
+secys qks mcnfhwh drog kqs pajy zoltkw lfihnb myb ioxptu
+ytq nrta ouk ajqblf yuwwcd zdy blyoxbw dakk nvgi bzrhzaa
+nkoych sufiia xkdvw crtldee zycl qblab egqhr qblab
+nllno muxaf vds qjnitmw zkpj wskyhft kmqct xamuzpw qcai cdjtbt kaxv
+qzdytpe osr fuw osr qzdytpe whperd rydwdcl knoa
+zkdznhd peh duoygr zamrgl irnvj otpe pltpq jdkecg
+byzgw rece iigdug ehif tpgje
+ccnn foqdran gbctca tefdjxh ntcr rjciii xip xlss crl wvvhzqm twyohf
+dqyii milqqc qjgkojp qjgkojp ryde
+tdkyj tbrcud tsba vqtmb cjwxnf
+hqhmq wemvrce nagig pwnw nagig epg nagig vlsi
+tqgvw luoplw hccti npjm rytdruq cylrsun rytdruq vjsbjl rytdruq ppti
+itgt tuwc itgt rvp itgt tigns eipl ksmru
+pdw wdhtkn nbdbpn wff zhuuipg rvemv qxr
+qgkwdq cjilayh ymeks mrpuzai dwgs stfstgz ucvqhb yout oiq
+vpxik ypfr qytimvu qms oxbmw ppyfx
+fwwidn gdhd pyuexk snsz iwndfw
+lfcb sllxjna lfcb hpzahfg mmvgaa svny jhuzd
+unyg gicmzd fwc spkciy toyq wjupckd vzzx iuqgka ytqycb pxsufj
+goj tnrcml eyizngj txa xrkiw zvu igduz
+wek xrrlkna clyof rrlnxak
+cjm rmyuku vjom gtf
+buk cfae awstd dywgqp hxo wcxvf laihqw xdqfes wdbh qceh uzlwj
+sudguo dxwplto rlebdh bkamu dxwplto
+crwkyxm yuz kjtdhom crwkyxm
+trhc sduorxr aizfryh rsudxor gbyc
+pczkyl bptp qnn nxmpwsx udrg hhlb rubtrmx twzodlp xygnht
+jmqct cden yfajtkz fevcw sxonbxz sxonbxz qkzkm hhngr fbv
+sdsnm mwvicr wypfi cty ndbowr woiz mrauwzd qlno mwvicr
+vteyo fng lvr lxytn txpj milg
+wjx ahtmgo cgwcaj kaxae fhlvlqf
+ezj eetqhzu upwda iiefwlk vyvby
+imalvy yeghqe jwcu mvrod cwju
+bxnmsa yhfu npsdar tsbri hfuy sirbt oofxmy
+fkndt elbjtn vepqtxt elvpf fpelv bzkgag qttexpv prblwb
+rmq iqs yvprnyy iezqrzm wlqsrr
+yviovq lekxghj oey qwhzj lxknxw qiyovv ksnt jptz
+tyrg cifxt hugqf tyrg ffuiv jmax qyw fozfosq ffuiv
+nmg rsl jpzazd qbtlf yxqtsj czwmdfd bamge lbjdof uqy jssc
+cbx boozjip pwgvzlq rjz kxy kxy hszacok fvsq jhnir cnsba gafz
+sbcuxb wfur nnnfqjj fdwg huhe sbcuxb
+icwk qelbxs uevp qped zsnhh wpuok wddxsln ftnzupr ruxol cgxjb jbhh
+izcp htykj xxmndoq amnspe htykj
+vverol oixwlny vqd tvfzu henc gnyrwr
+ytxio etytsx choynep zqapo hfjit
+lkvgr oyzfa taiqr jok djatvy ckif tmdw oyzfa zroy
+jlgpyp kkqysg oqjki hjohoug hbhta muilz zft
+sumfyu wftcu bwwdcy lezimwa qwvxv zwh mqyv bmfot aii torcol rnt
+tpdj xrw ccsbnh fhptv fwkxjfm dmqaokd bjci
+zxi vmf vmf dpyg
+sfzxysw lcms bkojtv bkojtv
+opywo qll ipkitr mtwp tudrr svhyp huz bxsdpn xomfy
+gkod luo qrosbp orbd rpsjzyd rlh gdok tze
+nusiuq nusiuq zeys ahufexc
+veno jntg avtmtdn qojxru zegdcql odfcetz pgehau
+uqun vigjm ykac ozlelj danmji bibugox
+rpuozh ajwru rbvuevv uhzsq
+iawoe tyb aewio ymf byt inijv ctu fcys micsgzl pbby alt
+gktyxp ris mqpfm bkqsfl nrg idbbcxg jhcf
+qibt invvv qibt luitx rnm eby hrfbmwl wnap sgkzvb qlwc hrfbmwl
+jwkv qecsjbw lycgldd wjvk tjcp dycldgl pzrvr zrlcf kji
+nzsrmiq nmhse ilivrk kqv
+besmyzi imkgpt iekbjax abxeijk uvzs wwv
+jdocl uki ltswp tjkljc ymce iuepze qygqxzs tei lkry
+hhyfy gvzd mqksxlq czn afe mesnag eep frwgekg mqksxlq phpy
+ehg connnza ekt ddgokw
+mpbsoms uzhzl xevww ztt uzhzl
+lftybr firc awsud dsxdkk ltf ipjv dtx lcymth
+vkcpb gxtxq yioeq fexj xxgqt
+srvca fslnnvf nfmkpvt egw wemumq jie vznf dzsjw cukf kcvyir
+yxjkl lyjkx jyxlk kgc xtz
+tpoe xzov csp leleoqo noyre tdhf cyib sjgtdx raehdw nmcxp
+qvt uhznqe bpvos vtq ddlebtd tqv
+xlw utsxs gpia rvlvnts elkxr dddihy tnrslvv ibf wlx bxg
+cwqnnrt rkkqyf dye yde fzl pthanj
+boc rqjenpp xjqte jteqx pvoofc pidqe ruoucy gvnro ognrv
+qhalb gnazwc fhl iuti
+clnbjfo nnfs nnfs heymvr oarew oarew nxu
+lwtrotg hiaxwj ymzbly nvhzjhj zlsaheg nvhzjhj ymzbly
+rrvi tsjp tsjp tsjp killji
+rpx hiclj cmwq ibhj nfd
+pvwymn iebkd xmpw vuhhkap ksw zigzy mzzyyxy rmuh iwwhea cglfq
+rlwelgy sffml jin qsdzro xlsty mgqzuu etxjuo emzd jgnoyq tkjuy vfvb
+tkctdj hhkuc viskmy obw
+zvjkuj akeky ikj jqd hfhzbwe bkc
+btev nrdo hcyiuph stf qharfg vpmel mpfz nvs ytgbbc
+ieepn ndueuw svmdr tcvumw mceyrn mrjwhyl tbdj mgrgvz
+uxrs ckyi xpmqm czzrkl cjp
+nlliwd wrqkrkz yjmng nlliwd zirde hcjjn wco ysf mgl
+dxti lcahe ommare izlwf ramsfb nzgfvo ijvm fwymrdu bndq
+isxy jpvuzu tdduyhw dixp cfa fkzbteg ytoi kepk ysf yqcpi
+qmeprfj soqo ncgeor cqsuuj grzy wogxy vyblnbg slvtry vdols kka
+ltykfp gtzl olrp gxend vapee deq
+emywfbn dbfiut rkt wvwe dbfiut bwffhea yuzcxv gogpicp wvwe
+vqvmrp ofbk dlfabd jwllzxk obx vqpwjj umvng tqwis fstxy fstxy
+miha zgvyux rmraszo xwf
+kjaagk btm kjaagk wkewjrg kjaagk
+lbmli aizs omrdr gzktnx asiz ptanzpa xlo ljre ckyb wob
+svz dlk rijagg avxmg fkzwhk uro gegm
+dzplum temdw jqnm tvxcww bmg tftttpp deuw comxey xfimzjx caluczi nqn
+uwvhxa ztkd nlsdyt vihl julkwwv uzch dwakhs
+wkhuihh ycrc cxff vzcfhpp uegfd gaok kcnvz lhzogq lwa tyrypvu
+idp zmrrzp zmrrzp nktp xsnx rjsxn
+eybrnib ivgntl vaxsbpi eybrnib
+nzvnq xvbfa pbhwwh ylju runvsj imlx vztesn
+nfdohd nfdohd gtevnky pivjyct ihvd fzcsrq lko fmqk
+kwpkks ecikxu bcxswlt qvrxm sbcqmh
+kdjrmj piuh kdjrmj vnaf gyedkg vptxgm xezssxx zsg qjzpo zsg
+oqo sley aqx qmpqb fgmylbj egd zivj kepxizv kuakyn lunbnd
+hmcf hmcf xlhgc hmcf cdlm buofnx
+onjcj yluonz kzmk phqo phqo phqo
+ohaafy efl bnkkjww wwjnyoj dxeaig ywnjjwo slk hrbebw ohlyju elf
+msohiqz aunk njki bfktdgi htmyrj mgx
+numlzrl rmnlulz glb ltt fhbajz gqxpu
+gko hco oai ryq xwy sdqosft spjkiu cxfhg ycwpglh noy rah
+btzpjem brpk vqr atxu rhlh rqv jmg fvyus
+phmxxgj ejx xje qtk hsb kqt npwj gqt
+hujyjp nwmsd ant zipuya lrkahww uwqal vzlo qmbo twkjkse ufivi
+zfbnyz fwvh xrnrw usn zin daq iwjzj
+yykyg iwypfy hehqnl cjvk cevdrec
+gui muuto wsta glqmx gfo rdmbv mxwz gffzt eejpw gion
+lpng nduid iqbpu nduid knrqd
+xwxn oefpckv gjaua ugaaj gjuaa
+qxk aeql trqdmqc crzlinj crzlinj trqdmqc rijcne ewyf
+rfv qmbe fvr bmeq
+upqyfw lowzq wpen upqyfw gfskbil sljuzh wpen
+bdcara qyhx rtaez qyq gbyr
+evzls qxtxq clzd svbgqi zxlzgss vtrre fko eebo qjyl
+zaapeo kpwhz tygknau nyd pch trp xqe
+ypzcafg rnqmbh qtteg sncu ssojhhm zonfym thir xmgheb wqj gpjg ssojhhm
+wvcwyn xrf muozyya lasdp xpjgu kpqv zkiihiv ifje cbdlavg xbied hfnaa
+qqqb rettz rycukl ihpkhh
+dnxzxqv znb znb fbxj azxtezb xvxa
+peqkd xlzqkov esgnw ucku hrwpfxd xtd vnig vlmfp ajte qswr kqoj
+dpwy oavzkk dwyp ehij upqxgii pydw
+amfc hfv xmqa nqvn cal rqmcq oej amqx cla ntxj
+hqhhe qkbhwli wmhlcq xaczs peywuo
+vcr xfv xfv kymo qpszwzo xfv
+nmrbur tswo xbo ljlrzo bmhpgc pev zovkznz lok wbbhtkk
+tojj lxqgr rhjavrm ndsdup gdbjwaq cqpnl wfaxivl rfry ryfr udspnd
+beffod sknlph amb feobdf
+mldgn jxovw yuawcvz kzgzwht rxqhzev fsdnvu vluuo eycoh cugf qjugo
+tlnd qcxj ker fdir cgkpo nrqhyq raef uqadf iahy rxx
+mhvisju lhmdbs tcxied xeidtc ujry cditex gvqpqm
+cgc jazrp crgnna uvuokl uvuokl uoiwl sknmc sknmc
+rvbu czwpdit vmlihg spz lfaxxev zslfuto oog dvoksub
diff --git a/2017/inputs/day_5.txt b/2017/inputs/day_5.txt
new file mode 100644
index 0000000..3b5dd14
--- /dev/null
+++ b/2017/inputs/day_5.txt
@@ -0,0 +1,1070 @@
+2
+2
+-1
+1
+-1
+1
+1
+-5
+-5
+-1
+0
+-8
+-2
+-11
+-4
+-5
+-10
+-4
+-9
+-9
+1
+1
+-11
+-8
+-19
+-14
+-6
+-2
+-1
+-11
+-23
+-8
+-7
+-9
+-26
+-1
+-8
+-11
+-34
+0
+-22
+-17
+-41
+-12
+-43
+-33
+-15
+0
+2
+-41
+-41
+-26
+-48
+-52
+-47
+-30
+-38
+-20
+-4
+-21
+-17
+-19
+-55
+-32
+-12
+-55
+1
+-34
+-8
+-15
+-59
+-56
+-16
+-23
+-43
+-5
+-41
+-56
+-32
+-67
+-14
+0
+-28
+-32
+-7
+-54
+-19
+-9
+-24
+-63
+-2
+-60
+-5
+-78
+-11
+-84
+-50
+-36
+-72
+-14
+-30
+-4
+-62
+-6
+-1
+-69
+-17
+-33
+-32
+-45
+-71
+-87
+-71
+-60
+-19
+-80
+-11
+-106
+-45
+-27
+-23
+-51
+-77
+-67
+-103
+-17
+-98
+-109
+-91
+-125
+-68
+-39
+-34
+-96
+-49
+-64
+-38
+-105
+-31
+-100
+-89
+-108
+-69
+-36
+-94
+-38
+-124
+-123
+-79
+-92
+-42
+-14
+-87
+-68
+-17
+-36
+-21
+-54
+-98
+-79
+-142
+-25
+-60
+-112
+-99
+-64
+-15
+-78
+-37
+-64
+-15
+-129
+-32
+-102
+-74
+-112
+1
+-146
+-151
+-147
+-153
+-4
+-181
+-22
+-176
+-4
+-57
+-151
+-86
+-121
+-38
+-137
+-160
+-156
+-72
+-73
+-149
+-64
+-182
+-117
+-146
+-180
+-195
+-27
+-194
+-191
+-108
+-153
+-40
+-149
+-100
+-120
+-207
+-83
+-94
+-73
+-200
+-95
+-155
+-94
+-76
+-9
+-149
+-70
+-125
+-49
+-146
+-223
+-68
+-139
+-26
+-132
+-142
+-165
+-2
+-45
+-154
+-129
+-130
+-185
+-60
+-34
+-173
+-91
+-37
+-40
+-153
+-189
+-236
+-95
+-128
+-46
+-14
+-53
+-245
+-67
+-9
+-208
+-244
+-198
+-74
+-62
+-104
+-51
+-251
+-48
+-50
+-115
+-76
+-79
+-32
+-82
+-65
+-185
+-124
+-32
+-189
+-124
+-174
+1
+-273
+-223
+-275
+-238
+-200
+-184
+-229
+-195
+-152
+-63
+-150
+-73
+-44
+-54
+-187
+-49
+-250
+-192
+-290
+-282
+-266
+-214
+-117
+-199
+-83
+-104
+-251
+-176
+-262
+-296
+-39
+-259
+-87
+-132
+-166
+-67
+-194
+1
+-294
+-8
+-3
+-264
+-217
+-228
+-233
+-241
+-294
+-210
+-72
+-307
+-259
+-33
+-101
+-103
+-235
+-100
+-110
+-253
+-292
+-134
+-269
+-52
+-265
+-15
+-29
+-272
+-126
+-210
+-151
+-308
+-40
+-40
+-112
+-268
+-185
+-346
+-237
+-287
+-34
+-302
+-41
+-25
+-191
+-29
+-170
+-95
+-315
+-278
+-160
+-220
+-99
+-126
+-224
+-33
+-350
+-76
+-138
+-340
+-284
+-268
+-128
+-238
+-197
+-93
+-110
+-120
+-190
+-140
+-64
+-217
+-296
+-103
+-363
+-199
+-254
+-233
+-190
+-282
+-136
+-174
+-309
+-61
+-206
+-18
+-105
+-111
+-163
+-287
+-188
+-145
+-294
+-251
+-398
+-265
+-273
+-50
+-250
+-376
+-5
+-357
+-6
+-8
+-198
+-20
+-82
+-158
+-122
+-196
+-97
+-183
+-48
+-428
+-36
+-88
+-424
+-35
+-380
+-109
+-209
+-323
+-394
+-102
+-276
+-153
+-229
+-320
+-391
+-7
+-328
+-127
+-430
+-102
+-372
+-447
+-222
+-401
+-184
+-183
+-49
+-239
+-413
+-101
+-187
+-289
+-12
+-418
+-248
+-279
+-318
+-134
+-443
+-272
+-456
+-143
+-3
+-209
+-276
+-414
+-189
+-302
+-238
+-241
+-106
+-332
+-375
+-400
+-476
+-9
+-95
+-412
+-52
+-127
+-442
+-278
+-25
+-446
+-411
+-39
+-55
+-80
+-234
+-361
+-223
+-384
+-283
+-47
+-164
+-18
+-38
+-87
+-393
+-93
+-380
+-493
+-73
+-150
+-241
+-378
+-211
+-516
+-349
+-520
+-38
+-397
+-406
+-16
+-461
+-276
+-448
+-316
+-376
+-156
+-369
+-216
+-431
+-309
+-400
+-135
+-523
+-40
+-508
+-87
+-25
+-151
+-355
+-141
+-3
+-495
+-153
+-438
+-343
+-161
+-66
+-455
+-70
+-248
+-278
+-548
+-300
+-337
+-290
+-551
+-200
+-68
+-540
+-476
+-395
+-245
+-318
+-424
+-112
+-556
+-541
+-94
+-148
+-542
+-100
+-120
+-199
+-569
+-471
+-298
+-16
+-453
+-469
+-50
+-500
+-84
+-435
+-579
+-287
+-522
+-77
+-83
+-347
+-437
+-171
+-231
+-139
+-350
+-357
+-221
+-214
+-224
+-148
+-125
+-385
+-255
+-38
+-320
+-254
+-517
+-532
+-80
+-286
+-58
+-97
+-390
+-309
+-548
+-319
+-323
+-238
+-297
+-12
+-312
+-517
+-434
+-466
+-103
+-621
+-448
+-503
+-72
+-601
+-287
+-61
+-577
+-87
+-143
+-33
+-482
+-275
+-529
+-340
+-279
+-130
+-512
+-63
+-109
+-528
+-22
+-549
+-317
+-375
+-377
+-385
+-23
+-191
+-138
+-509
+-40
+-565
+-559
+-14
+-547
+-28
+-159
+-153
+-585
+-508
+-582
+-431
+-580
+-637
+-561
+-513
+-243
+-420
+-298
+-485
+-132
+-613
+-157
+-521
+-596
+-61
+-420
+-498
+-577
+-563
+-354
+-662
+-264
+-273
+-111
+-597
+-466
+-389
+-345
+-306
+-102
+-57
+-596
+-1
+-45
+-12
+-619
+-47
+-43
+0
+-323
+-9
+-319
+-529
+-402
+-238
+-191
+-487
+-315
+-65
+-386
+-110
+-605
+-363
+-461
+-6
+-95
+-95
+2
+-596
+-454
+-618
+-83
+-481
+-283
+-386
+-247
+-417
+-707
+-564
+-603
+-17
+-712
+-140
+-336
+-567
+-443
+-36
+-476
+-251
+-735
+-589
+-198
+-197
+-476
+-49
+-736
+-422
+-383
+-569
+-732
+-1
+-104
+-261
+-352
+-453
+-273
+-344
+-66
+-307
+-698
+-158
+-238
+-280
+-207
+-624
+-491
+-765
+-506
+-146
+-616
+-711
+-650
+-655
+-393
+-19
+-315
+-311
+-572
+-675
+-533
+-156
+-373
+-744
+-142
+-582
+-491
+-796
+-777
+-125
+-483
+-426
+-510
+-560
+-700
+-778
+-407
+-440
+-409
+-238
+-738
+-477
+-147
+-152
+-317
+-110
+-323
+-788
+-601
+-202
+-517
+-487
+-726
+-300
+-1
+-554
+-448
+-15
+-191
+-531
+-568
+-466
+-527
+-132
+-254
+-290
+-8
+-400
+-655
+-788
+-376
+-249
+-662
+-315
+-378
+-41
+-793
+-163
+-29
+-327
+-839
+-133
+-124
+-129
+-673
+-32
+-605
+-393
+-664
+-374
+-135
+-366
+-717
+-93
+-601
+-763
+-788
+-494
+-802
+-282
+-443
+-491
+-461
+-197
+-83
+-96
+-162
+-97
+-161
+-232
+-144
+-472
+-118
+-429
+-387
+-724
+-789
+-636
+-298
+-484
+-720
+-526
+-382
+-102
+-449
+-846
+-525
+-547
+-696
+-524
+-272
+-843
+-286
+-247
+-838
+-447
+-489
+-797
+-483
+-386
+-775
+-340
+-772
+-158
+-293
+-256
+-432
+-812
+-273
+-93
+-487
+-264
+-594
+-330
+-712
+-798
+-131
+-591
+-539
+-677
+-455
+-470
+-108
+-573
+-57
+-845
+-383
+-273
+-890
+-747
+-913
+-648
+-625
+-650
+-544
+-137
+-490
+-434
+-734
+-182
+-355
+-859
+-835
+-141
+-536
+-874
+-102
+-940
+-359
+-83
+-800
+-894
+-712
+-470
+-687
+-578
+-435
+-935
+-400
+-780
+-814
+-458
+-892
+-481
+-371
+-761
+-348
+-388
+-891
+-764
+-297
+-536
+-695
+-314
+-336
+-978
+-379
+-462
+-597
+-533
+-561
+-9
+-474
+-292
+-560
+-420
+-828
+-721
+-769
+-874
+-157
+-495
+-771
+-899
+-571
+-98
+-282
+-233
+-203
+-982
+-416
+-142
+-993
+-540
+-979
+-851
+-506
+-238
+-292
+-184
+-695
+-195
+-632
+-575
+-962
+-76
+-546
+-705
+-13
+-271
+-222
+-124
+-380
+2
+-1003
+-251
+-525
+-228
+-644
+-159
+-624
+-477
+-912
+-712
+-343
+-263
+-88
+-745
+-85
+-374
+-675
+-804
+-610
+-854
+-511
+-612
+-964
+-731
+-358
+-495
+-946
+-466
+-364
+-1053
+-57
+-101
+-829
+-155
+-600
diff --git a/2017/inputs/day_6.txt b/2017/inputs/day_6.txt
new file mode 100644
index 0000000..b16e11b
--- /dev/null
+++ b/2017/inputs/day_6.txt
@@ -0,0 +1 @@
+4 10 4 1 8 4 9 14 5 1 14 15 0 15 3 5
diff --git a/2017/inputs/day_7.txt b/2017/inputs/day_7.txt
new file mode 100644
index 0000000..faa4be1
--- /dev/null
+++ b/2017/inputs/day_7.txt
@@ -0,0 +1,1091 @@
+yjmbbu (75)
+zdhvqrl (40) -> fpbsu, fwpfjjd, viqhfi
+dywqvqh (9)
+gewgn (31)
+xfekjt (67)
+zezowe (31)
+wgqkdcr (79)
+ljhwzvv (258)
+vustse (1584) -> ffnabs, qinmi, qhafxnl
+idfwjgx (112) -> buoakk, itwbpot
+lxesg (71)
+qkbnq (99)
+jppgd (27)
+ztghd (125) -> bcibchp, aaheijb
+qcrpdy (29)
+fwidkbp (152) -> mnkwo, ehjooz, jvccsp, cyrrjtx, imynb, chnkkj, agywjrs
+nymhem (52)
+cazid (93)
+olspit (121) -> bqtas, fhuiyrl
+ayteb (92)
+hjucki (58)
+wrqtk (305)
+jfjemon (217) -> bjhickt, uacjhqx
+mcmqliy (925) -> coopirx, ekohgo, ioywk
+rsancy (70) -> aeuub, vchuc, heacb
+zjwpbzs (23) -> jysaup, pgubexv, lckuoqf, eeguu
+qflouyn (90)
+nswximo (65478) -> ibjvonk, sdhtguj, dxyifeb
+rymkqd (102) -> vgqeyx, zezowe
+wlujpl (92) -> sjwhig, wymfopy, ylfsnz
+imcczga (95)
+xehdglb (52)
+twubx (46) -> goimlra, vlimzz, xaoncma, gfzbp, spdhhoe, fhmauag, cyapi
+yjhes (72)
+ymcuygn (81)
+yatbsip (19) -> bkdtinl, nzqcq, tkmed, ysbrui
+yipoeia (58)
+chophr (27)
+tdwtlf (305) -> epuaii, idfwjgx, nwikpdm
+emzrj (119) -> aimav, dtscjna
+vbxmpc (7)
+nrpxx (21)
+wgexpa (103) -> paxzd, vgdwm
+vnrmx (359) -> knzppj, gkkgkp, ttwfig, vcixs
+knltna (677) -> zbhtee, ztzwh
+ojvlwm (52)
+bgflw (27)
+lsdrwz (73)
+hswzo (40)
+spwgm (351) -> mizab, cyzkk
+jlnyr (16)
+nwikpdm (36) -> ihwaeuw, wwkeej
+qbmtmcs (34)
+djirpp (19)
+pkfhp (59)
+qfypnb (76)
+jzequar (272) -> mtcrswx, wkcyd
+tttle (71) -> xlskkfi, ayteb
+zbhtee (48)
+iriun (9)
+dwezv (73)
+tojyt (58) -> dwezv, nbngkou, wnjtb, rarkunn
+bsorz (27)
+qvkotfd (337)
+azxjd (268) -> exeub, lryzkx, nqvxs
+wpxxh (998) -> wrqtk, yosnw, vyxfljc
+gwournc (85)
+aghdlll (88)
+lejgcu (19)
+lxlbt (363) -> oiosol, mpchqe, bsorz, jbpjt
+nbeagw (94)
+vbbgeo (19)
+lqfyzo (21) -> tggkm, zdbqs
+vqclii (331) -> dmkbnot, omdpc
+lhmnd (216) -> onnylx, khaupo
+wwkeej (60)
+laczal (99)
+xrbjn (20)
+qvteg (64)
+ogbsm (92) -> xpzhy, mhsjkm
+ymckwqo (41)
+ghsjtj (271) -> hhmwlo, faixe
+sjrxs (259) -> mnijdlk, hygfoe
+hdvel (197) -> upuxd, dtstgj
+lckuoqf (78)
+yppydul (91)
+frirj (6)
+duftj (42)
+dnmvzeg (64)
+cpazlc (19)
+krxyaak (198) -> maqgick, xbnmvd
+oyczfgb (395) -> rxcnn, ktpte, qybmgto
+oxiuaz (12)
+wfphcf (6)
+ihtnbb (87)
+omsroa (45)
+lybkeg (6022) -> oyczfgb, jzequar, yrcgsnx, ujulj
+agywjrs (184) -> anpnrdt, hgdbaol, hcjmsd, kzbvrxk
+tiujei (34)
+lwencl (28) -> ieusgd, mthhq, fsuzqyz, miwoup, isrtfc
+wekya (34)
+bkdtinl (1167) -> ojsjuts, euoclfs, xbkeua, mykrcq, jjsvfy, aazxafl
+qinmi (1896) -> qshbt, ruozmjk
+yfmxvay (46)
+kgpwo (52)
+fgjjwep (14)
+odvtiti (76)
+ienye (19)
+tcvabyz (99)
+ycclns (7)
+njogewi (30)
+bfchbs (87) -> jykbb, qnbfk
+dlbzng (99)
+xnmvtem (51)
+ccciux (94)
+xwlmsqy (25)
+wekkbw (17)
+yipzce (21)
+hcjmsd (10)
+upvhfmn (68) -> fvlfq, ivmndi, ussmw, ccciux
+hacwv (50)
+redqvw (269)
+dtpexjq (52)
+kmlwj (84)
+mluykm (19)
+ucbbun (114) -> hrqzqqh, ccuarv
+kymhbse (155) -> tznudmk, hnlgkv
+xomnhw (185)
+nsmoh (65) -> ceuygh, acpfsnb, vgubuy, apkwi, yoeau, pdosfg, lfpzff
+zvepqr (51)
+wnotwt (99)
+lcrwbqi (27)
+hdlqvlg (27)
+iphgmyt (160) -> woolxv, ewyzqg
+ujulj (50) -> cazid, npmwcx, yeooycn, dmeee
+zjaklmn (52)
+bjrpalu (53) -> rhodopg, tcospq, cvrcvgp
+azdei (48)
+snzfrer (149) -> bhsbd, tgdzl
+zsxizw (18)
+fwpfjjd (89)
+fndxl (36)
+uzrnud (14)
+igyxt (41)
+vxdkej (135) -> diomq, qokscr
+gjuekv (5)
+uzufet (143) -> fgjjwep, uzrnud
+vzuqbye (87) -> eviqjr, cgxsmq, egmfbdq
+zirocl (29)
+jonshpm (99)
+zmlth (154) -> zhxhkgf, cokzlht
+bujroda (51)
+bdvtvcu (74) -> tvcod, ouamzwh
+jdrdxu (36)
+troyu (29)
+nrczsn (86)
+aihow (92)
+gaihmf (84)
+ehjooz (124) -> hgwsl, mefxonk
+omydd (6)
+raevpsw (64)
+aylmbfh (188) -> ddspu, thdwfw, kxnkbs, rziezq, jfjemon
+diomq (65)
+jjyjrtr (87) -> fjduphn, yjvgwdl
+zsiziaa (38)
+lyptirp (8)
+lctdjj (56)
+pbtks (85)
+jxhrar (227) -> barnhza, iqovqp
+neqfzm (13)
+dhwauy (48)
+qvjqfi (80)
+ivstcsm (72)
+aabrjf (72)
+jvccsp (86) -> gukuqw, hpmbkwb
+ddspu (113) -> yjmbbu, dzbrgb
+zgevpxx (48)
+qrrey (588) -> bhvmgw, wgexpa, xiotwdk
+ncodn (62)
+rbcqgqv (75) -> imcczga, xzurwza
+fpxtub (11)
+ldfopw (30)
+ewyzqg (49)
+iuhlc (6)
+oqphsw (2722) -> iueejt, ekdqf, btbxk, jdshuob
+eysrnaa (71)
+ojsjuts (176) -> njxyw, dzasw, rpzaqc
+ozyexx (83)
+nnldikq (316) -> upwlxnb, vbxmpc, dgwcz
+tfmtk (69)
+hwctdr (76)
+rothisa (66)
+qnbfk (91)
+qcgxvx (99)
+igyiie (237) -> knirl, trbzi, auxvur, rvhxik
+cverrt (52)
+orrutjs (93)
+ffloi (25) -> kflize, icgwppo
+phrxnli (21)
+eopxpo (41)
+vlfouc (62)
+fdnom (87)
+wuxhvnx (86) -> ikfpktb, zcvipz
+flefy (38)
+yoeau (206) -> rfwgtb, drmyco
+ozatmpe (34)
+ydbri (66)
+tufds (42)
+pprhx (57) -> xitzb, zqyua, dtpexjq, zyradhz
+zhxhkgf (29)
+qwzmv (52)
+paxzd (53)
+cyzkk (60)
+gyjxkl (37)
+pzpjw (54)
+svayf (89)
+xxxqpkx (7)
+imihjj (69) -> yygqky, qlkslp
+tkpvf (47)
+tljdqy (81) -> sxllorg, yatfpqx, zbznuyf, kymhbse, rfmeug, tetmzw
+iphzyj (260) -> omsroa, mxupea
+xiotwdk (177) -> jlnyr, nsqqw
+eyyzy (274) -> opuaau, qolnvo, jxhrar
+baewpe (55) -> svkdyq, hitoud, zvnxfa, emfctr, facrq, vykqcnj, bckuyxm
+barnhza (20)
+oafnfo (51)
+pjcttzo (50)
+aooni (205) -> xrvbzya, gvjrx
+scchi (48)
+zcgrnt (73)
+pmsdv (93) -> pyypotx, marzlxh, zvepqr
+kngbqid (89)
+iwhqlr (949) -> ztkgsyt, ffloi, hzgig
+vyxfljc (92) -> pyrlph, wdsiq, eysrnaa
+hddzn (69)
+cxvqvjz (136) -> kfrti, nslettz
+tcospq (96) -> aabrjf, dllgpye
+mnmwzz (142)
+xfblj (40)
+vfwegiu (46)
+iphncut (138) -> wslsg, qhnaxuy
+algqhtz (37) -> qeojk, sybpano
+dmoxr (73)
+tozktyo (29)
+npjxq (46)
+uvfyo (675) -> lxlbt, gnjvf, nfsuzef, spwgm
+ollhxuy (821) -> vefzbc, faecnr, geldsqv, xneoi, cxvqvjz, jgkvfa, xtwdx
+ksvfdcc (72)
+avycyh (180) -> hwosyg, alqim
+nsqqw (16)
+nsfsj (99)
+tpphe (64887) -> yatbsip, syzlt, uttujj
+miwoup (40) -> gyjpoco, apgjv, eknui
+iljwgzf (92)
+bfuywyg (82)
+aaqdb (44)
+fgbyre (11)
+kywfqzv (41) -> lajidkr, gyjxkl, wfhyr, evhsybt
+aiovxpk (95) -> yoxvx, pbtks
+hrovawq (50)
+ajenoz (48)
+aeuub (53)
+gxjvj (163) -> yiusa, nrczsn
+ippzix (9)
+ttllx (73)
+rorqy (43)
+dqash (96)
+lwvnbzs (24)
+ckheb (34)
+rgfndsx (18) -> qkbnq, welll, bkextqn, wnotwt
+rsazi (62)
+rpfmi (52)
+uxslfay (72)
+aemgsa (40)
+jfmnsqg (85)
+ggnsa (114) -> xhmfmo, azdei
+lndaa (175) -> qvjqfi, iyuuh
+kjdoubx (128) -> eopxpo, igyxt
+dzasw (47)
+emfctr (9120) -> qzckx, fsaoa, bjrpalu, mdneq, tdwtlf, hswrbpz, knltna
+srqntb (137) -> raevpsw, qvteg
+wweusm (66)
+hawsl (13)
+cupsjm (146) -> baiaa, pcqyagx
+ppqlc (42)
+tadnt (47) -> ufefj, rwxggm, rorqy
+rvhxik (11)
+vijkx (32)
+lqcar (71)
+dhkahb (49)
+ftuemb (19)
+ewdqb (50)
+npmwcx (93)
+wwezydn (97)
+fuvru (98)
+cdpwklz (83)
+dtscjna (46)
+exuusj (7)
+ouamzwh (88)
+ggvbqrp (145) -> opohwq, yrmgc, gewgn
+ekdqf (467) -> ugvqayz, ysgsry, ogbsm
+torxqh (90) -> dzwol, lepja
+hpmbkwb (69)
+ripqyzr (48)
+eiklbh (32)
+omdlwm (168) -> ihtnbb, hjjkx, bomho
+lbwzat (74) -> iivncbz, dmoxr
+pyypotx (51)
+bjabd (7)
+auzbdlz (95)
+sxfilp (72) -> livlj, lgenxz
+kxvlprg (60)
+rfmeug (121) -> apygt, viwns, chtlcwq, wekkbw
+xajjyba (164)
+kzltfq (94288) -> vnrmx, lrihy, arqoys, nsmoh
+mbhld (73)
+rwxggm (43)
+vapwxei (61)
+ufefj (43)
+oajawn (34)
+dgnjf (335) -> yxseri, nscbsob
+xaoncma (296) -> yipzce, nrpxx, rrfbngi
+kqlsniq (95) -> qwsxpnc, mqmbcl, gtbbuvb
+jrvbacq (49)
+oavluo (21)
+qpldch (54)
+ieusgd (295)
+tifgptk (100) -> ddldgex, ggvbqrp, focqhgt, cncak, ksvpnt, weuwc
+lhradm (583) -> vusxa, lbwzat, ucbbun
+apgjv (85)
+cbibo (99)
+jxhngrl (48)
+qwsxpnc (96)
+ysbrui (1293) -> iqggu, upvhfmn, kpqyb, wdeuy
+ekvall (209) -> jxhngrl, aplvqql, drwfop
+mkwfj (35)
+pjiqvd (87)
+pgubexv (78)
+vbhnmr (2850) -> iftfc, kunzpa, qrrey, tljdqy
+sjwhig (93)
+zyradhz (52)
+wcexum (116) -> eiklbh, vijkx
+cdcye (53) -> izppmg, rxvyqsp
+bdinafh (10)
+rziezq (145) -> taiho, pkfhp
+nslettz (10)
+svhbd (109) -> xcvxle, fqzsq, jopjvd
+limljj (68)
+kauphp (231) -> dyxsmz, yzxzo
+caryo (7)
+nahovfk (109) -> flefy, cfztpc
+qolnvo (267)
+cmqwplb (9)
+cfhuce (71) -> cecsr, josdslh
+zwnvqu (88)
+mhjtjp (91)
+apkwi (222) -> rxragg, zsxizw
+ioywk (16) -> ozyexx, eikmns, ktjav
+yrmgc (31)
+kqzemkv (96)
+rxvyqsp (60)
+hnlgkv (17)
+raryuo (73)
+bomho (87)
+rixnft (85) -> cpndnx, fpxtub
+zoewj (193) -> ohbuhy, ymckwqo
+hnyqq (34)
+tkmed (1959) -> tuqmup, jwgchxu, sjforw, zmsosb, tqikxkp
+wlpyulp (10)
+pixjzh (158) -> fgjwz, lsknlg, hlcghe, txhfuoh, hdvel
+likvlm (62)
+xhmfmo (48)
+rgrxpe (69)
+weuwc (84) -> xtwdau, muncur
+uevcwul (92)
+kpxqlr (155) -> nbbyqsa, ilkqp
+fqzsq (98) -> tiujei, yhubw
+ubovv (6)
+knirl (11)
+lzvniiz (60)
+cwtdf (29)
+qeojk (99)
+ycxzfkf (131) -> bgflw, chophr
+thjulip (20)
+vgdwm (53)
+myhch (25)
+bovno (175)
+uqlso (48)
+rhnkdt (59) -> rsazi, ncodn, pwizhzr, likvlm
+acpfsnb (204) -> nmlcne, vfsttaj
+wzfkk (99)
+oqlpz (81)
+nscbsob (24)
+mzmfygf (171) -> jxyoypa, ippzix
+rvrlma (211)
+pfphng (90)
+mdiqsgg (12)
+jtzkva (274) -> flomey, ukvvt
+tvwxmur (64) -> yodoqn, ksvfdcc, ivstcsm, pvgzz
+aplvqql (48)
+qybmgto (9)
+mtcrswx (75)
+aphpzub (29)
+vchsdif (105) -> ofisj, zwnvqu
+dllgpye (72)
+lfzahrm (79)
+oiosol (27)
+geldsqv (80) -> ienye, eeppf, ftuemb, vbbgeo
+vlbba (81) -> ewdqb, vfzby, pjcttzo, abddskq
+nfsuzef (75) -> dlbzng, cbibo, wzfkk, jonshpm
+lryzkx (71)
+mhndszl (190) -> tbrfk, xprzeeb
+jbepak (66)
+nmlcne (27)
+gfffvbp (8)
+bqtas (93)
+fhmauag (221) -> vantwg, kzwqzqf, vfwegiu
+misyfn (82) -> uixlx, oupzsh, bovno
+jtauf (13) -> xskehl, bmfhjm, srhirm, kjfmqkt, qzxaqvy
+eerktn (85) -> npjxq, kasfuwe, ljbss, theau
+ktaet (58)
+eeppf (19)
+vgqeyx (31)
+qhnaxuy (31)
+xrvbzya (35)
+nzqcq (66) -> vewgrvp, vfngjd, sjrxs, hvjtn, ecokyy, gcaxntb, omdlwm
+sybpano (99)
+ebsniof (39)
+urzul (9)
+srmiagk (292) -> dvdgowj, vqpeg, gjuekv
+uexdnv (82)
+pgspysb (40)
+wymfopy (93)
+nqhdt (164) -> mkwfj, gjwaqu, sxmbcwp
+twzpqip (41)
+bniti (66)
+yfjenp (295) -> qxfce, zsiziaa
+meoeea (60) -> laczal, tcvabyz
+heacb (53)
+focqhgt (238)
+dtstgj (36)
+kkmqko (7)
+vcjjo (98)
+nnnkeh (445) -> gzzpja, bhuyfk, xnukvni, tttle, snzfrer
+baesyhf (1013) -> tznkwk, hcjxz
+hygfoe (85)
+wtxbqe (87)
+vwzglf (58)
+hswrbpz (254) -> flcqsb, sbguah, cdcye
+axtqrx (29)
+auxvur (11)
+iqggu (444)
+kceusl (42)
+jykbb (91)
+nxzkuj (75)
+xzurwza (95)
+rrflox (52)
+kfmzbvk (10)
+mnkwo (212) -> jyskb, wfphcf
+dfvhic (82) -> fhmazv, hwctdr
+gfzbp (197) -> ymcuygn, mxzbcqn
+tlednk (39)
+lgenxz (54)
+emwbbut (9)
+exoft (17)
+woolxv (49)
+auxqbbc (87)
+wvocz (67)
+hvjtn (325) -> cverrt, kfxoi
+aunhcg (613) -> kjdoubx, ggnsa, acknlp
+absdwf (39)
+wajnxjj (40) -> imjzf, wwezydn
+hgdbaol (10)
+cfztpc (38)
+chlxm (46)
+ljbss (46)
+gauumxf (230) -> tkiraal, lyptirp
+nhlittn (22)
+gcaxntb (405) -> mdiqsgg, oxiuaz
+lfxew (66)
+bamxg (66)
+wdsiq (71)
+mykrcq (98) -> zcgrnt, raryuo, okrdziq
+erpvue (91)
+kmwbbz (93)
+vsgaam (7)
+hokyk (66)
+pjzpmq (38)
+iqovqp (20)
+mmcychg (65)
+guncf (259) -> proshun, wxjka
+jatnl (216) -> oavluo, phrxnli
+nhkvp (100) -> rgrxpe, nscav, illjvf
+hcjxz (31)
+mqrroj (243) -> jtjcj, dnmvzeg
+lvksghj (18)
+mhsjkm (84)
+popplum (89)
+vusxa (30) -> ieadjz, mzmtuw
+dmkbnot (26)
+httit (18)
+tbrfk (19)
+ztzwh (48)
+imjzf (97)
+rypdxr (105) -> qyoqb, lejgcu, djirpp
+qzckx (35) -> qzzkvf, pmsdv, gauumxf
+xbnmvd (76)
+ouymke (47)
+rajtef (365) -> iriun, ezaypy
+itngcua (65)
+orxoo (66)
+tcdwurt (18)
+auqoj (99)
+sqnvvbg (36)
+rxragg (18)
+kpqyb (258) -> sqkcdf, iqxwh, vnhvilk
+proshun (47)
+uscufoy (15)
+tpipb (61)
+owhjmt (155) -> vsruoi, ifxcrug
+bkvle (9)
+yosnw (32) -> ilymgq, yppydul, yamclb
+iynywq (66)
+nxpexoq (92)
+eviqjr (25)
+trbzi (11)
+rfvomn (95)
+ohbuhy (41)
+vkpltts (73)
+ktpte (9)
+bbgwzg (79)
+bgcigo (8) -> bruzfkf, lxcbjgy, vlmcmcu
+ecokyy (357) -> iaphzk, httit, vztnh, owmni
+jwgchxu (32) -> rfvomn, auzbdlz
+xlskkfi (92)
+uxjasn (36)
+dcumfo (73)
+wpnqet (87)
+ilqol (88)
+bhsbd (53)
+flcqsb (115) -> meypo, aphpzub
+yvqtyi (85)
+oyvhouc (37) -> cdpgoi, bbgwzg, xoziel, lfzahrm
+bjhickt (23)
+hmvwl (32) -> nswximo, tpphe, baewpe, hghnmib, kzltfq
+oiijtm (20)
+ylfsnz (93)
+imynb (146) -> absdwf, cikaze
+yygqky (82)
+yuswp (68)
+izppmg (60)
+itwbpot (22)
+hwosyg (42)
+mkrzp (211) -> laxsl, zirocl
+vqpeg (5)
+gddkqw (244) -> vhtyadn, lvksghj
+bhuyfk (79) -> aghdlll, ilqol
+yrfqaga (103) -> jqinti, zjaklmn
+bnfopv (118) -> cjmxed, zlzers, qrlggma
+welll (99)
+ehuzoq (77)
+nqyok (77)
+rrfbngi (21)
+yoezrpw (38)
+rpzaqc (47)
+qxlucvg (84)
+tehyhc (13)
+gqrfok (231) -> kfhnhm, aituccf, qrkhol
+zvnxfa (10022) -> aylmbfh, lwencl, pixjzh
+gzzpja (255)
+ofrwmq (205) -> iigvpqy, wweusm
+qanbo (50)
+obslyn (13)
+hwovhvw (915) -> qdhrchr, nahovfk, xomnhw, ycxzfkf
+smlfbc (1615) -> wnjwnr, pprhx, aiovxpk
+xbkeua (157) -> pgspysb, aemgsa, xfblj, hswzo
+btklib (51)
+owmni (18)
+qzzkvf (108) -> aobitc, tsrogy
+umtrod (22)
+vxajmkg (71)
+jmlmzpz (62)
+plurwe (228)
+jyskb (6)
+xnuoujm (16)
+nakmo (10)
+uzhlers (50)
+umlkxqv (20) -> ecimj, wudjf, jfmnsqg
+ziqwzzy (204) -> uscufoy, fooyrq
+ymrogz (272) -> ebsniof, tlednk
+lpuass (28)
+qrkhol (9)
+hpkpw (38)
+gtzcxq (73)
+gvjrx (35)
+ieadjz (95)
+tcukgv (66)
+ifxcrug (55)
+thxtoc (178) -> trtgn, fdnom
+puwvse (414)
+pvppi (246) -> qlwxeb, nuqyqh
+vcixs (260) -> noipcz, frohei
+cichyqw (71)
+ugvqayz (126) -> xfekjt, wvocz
+hrqzqqh (53)
+qedst (18)
+wnjtb (73)
+kjfmqkt (138) -> pzpjw, qpldch
+ussmw (94)
+sxmbcwp (35)
+dqdfv (73)
+ptyxo (13)
+upuxd (36)
+fppcif (209) -> uxslfay, yjhes
+kxykfr (82) -> twzpqip, qymwy
+yodoqn (72)
+mnzbkuh (28) -> jtouvtb, wdvwub
+omdpc (26)
+ccrftvw (62)
+bmfhjm (222) -> lyvyhkm, sbyxyf, kblshw
+fwgqj (1924) -> zmcgfdp, vzuqbye, rypdxr
+rlbom (79)
+livlj (54)
+ybvgki (8)
+zcvipz (97)
+xyohoxa (928) -> qkkzzlm, lmuyfcw, avycyh
+dchts (99) -> lctdjj, oevyknd
+ksfok (217) -> gfffvbp, ybvgki
+hoomyh (88) -> aaqdb, ljfqvk
+qijarlh (58)
+tznudmk (17)
+cyrrjtx (124) -> oqbdf, xwlmsqy, ulztj, rjsnth
+nuqyqh (52)
+oblsboq (85)
+imnhql (94)
+hxswghs (126) -> dwwsu, hdlqvlg, jppgd
+ulztj (25)
+hgwsl (50)
+ksvpnt (96) -> fqlezvk, lqcar
+mjpzp (10)
+fsaoa (89) -> dbwmq, uzufet, arwmalf, gobrf
+iftfc (159) -> thxtoc, jtzkva, tvwxmur
+zjpsm (83)
+vwfhi (9)
+opuaau (75) -> dqash, kqzemkv
+mxupea (45)
+dmkyzy (15) -> ttllx, horqcc, dcumfo
+sxllorg (69) -> kxvlprg, lzvniiz
+txhfuoh (219) -> lwdqnj, myhch
+chtlcwq (17)
+hlcbqu (104) -> ccrftvw, jmlmzpz
+ivmndi (94)
+lficpr (62)
+ortqc (99)
+dvzlq (33)
+acknlp (56) -> aozoac, ehuzoq
+jqxnf (60)
+hfftu (52)
+ihzvygq (94) -> kmwbbz, orrutjs
+rarkunn (73)
+hitoud (5511) -> vcktg, rqbjbio, xtyzy, ssdgbnh
+sdhtguj (58) -> uklsrym, mcmqliy, nnnkeh, clinrg, fwidkbp, hzmhm, xyohoxa
+hrlkgen (99)
+vuyzhsh (61)
+nzzfer (85) -> qcgxvx, ortqc, auqoj, ilfzi
+tuqmup (222)
+zbznuyf (137) -> ptyxo, qwtzc, neqfzm, hawsl
+qwtzc (13)
+vykqcnj (71) -> jitzj, nkhadt, tcsbho, fhxpkd, fwgqj, smlfbc
+mjzksjz (7)
+yfdtz (36)
+faixe (56)
+tejnuve (209) -> jgmisxl, dhkahb
+opohwq (31)
+lsknlg (95) -> vwzglf, hjucki, yrkvb
+fhmazv (76)
+egmfbdq (25)
+rxcnn (9)
+tboizos (250)
+glwhd (122) -> ceoav, troyu
+ykehxw (19)
+bruzfkf (91)
+rjjlus (87)
+ocnna (18)
+qshbt (73)
+raakduh (85) -> fuvru, vcjjo
+wudjf (85)
+ihwaeuw (60)
+kfxoi (52)
+oewzluz (39)
+coopirx (251) -> exuusj, rvimq
+cokzlht (29)
+uacjhqx (23)
+tznkwk (31)
+mthhq (111) -> uevcwul, nxpexoq
+uixlx (7) -> kmlwj, gaihmf
+nqvxs (71)
+ktjav (83)
+eknui (85)
+fhuiyrl (93)
+fktsu (65)
+vugnug (65)
+ilymgq (91)
+clinrg (1033) -> rsancy, jrqorlo, lvklj
+bkextqn (99)
+ekohgo (251) -> xxxqpkx, wkphn
+alkneau (34)
+mnijdlk (85)
+dyxsmz (38)
+mefxonk (50)
+lajidkr (37)
+uiuokpq (89)
+oupzsh (43) -> bzmade, bamxg
+cijptz (18)
+khibjj (89)
+yamclb (91)
+okrdziq (73)
+sbyxyf (8)
+zknziw (18)
+fobzai (75)
+rjsnth (25)
+iaphzk (18)
+lufgosn (10)
+rzkcu (34)
+xlhfyw (471) -> yuswp, limljj
+tcsbho (1842) -> mnmwzz, mnzbkuh, zpidc, cpqti
+docln (85)
+neeqb (7)
+tvcod (88)
+uklsrym (40) -> bbhniy, gddkqw, lhmnd, ihzvygq, nhkeb, wuxhvnx
+qkkzzlm (76) -> imnhql, nbeagw
+qywkuqu (20)
+fvgbg (191) -> iwkntdi, jdrdxu, sqnvvbg, yfdtz
+qlkslp (82)
+iqxwh (62)
+mdneq (623) -> uzhlers, qanbo, tedplb
+msmgk (173) -> fygmpjn, exoft
+euoclfs (241) -> pjzpmq, hpkpw
+vlimzz (19) -> yvqtyi, gwournc, docln, oblsboq
+zoqni (189) -> chlxm, yfmxvay
+oignan (206) -> hdaqxlh, fgbyre
+zpidc (40) -> bujroda, btklib
+aazxafl (215) -> xnmvtem, oafnfo
+yhubw (34)
+xneoi (138) -> vwfhi, cmqwplb
+vefzbc (138) -> dywqvqh, emwbbut
+ruozmjk (73)
+jrwfehi (75) -> kcnim, bdvtvcu, tfsoxgb, tboizos
+iivncbz (73)
+ccuarv (53)
+lrihy (185) -> vchsdif, bgcigo, raakduh, vlbba, igyiie, zoqni
+vewgrvp (73) -> dntphko, svayf, uiuokpq, popplum
+iigvpqy (66)
+fjduphn (91)
+uttujj (11755) -> glwhd, sxfilp, wcexum
+tluap (6)
+exeub (71)
+dzwol (61)
+ilfzi (99)
+cdpgoi (79)
+hxckb (71)
+yoxvx (85)
+theau (46)
+vwnjh (233) -> jqxnf, qfpwln
+jbpjt (27)
+zmsosb (14) -> rrflox, ovluts, rpfmi, ojvlwm
+yoivja (59)
+towlhi (36)
+zcrjb (253) -> qhohy, uwaiki
+josdslh (59)
+xoziel (79)
+fsuzqyz (169) -> duftj, ppqlc, kceusl
+chwjiub (96)
+fpbsu (89)
+qyoqb (19)
+dfeomzr (38)
+kfhnhm (9)
+oevyknd (56)
+buoakk (22)
+wduqgix (77)
+qokscr (65)
+oqbdf (25)
+jjsvfy (199) -> yoivja, gdnsat
+ssdgbnh (887) -> qtsjbq, plurwe, mhndszl, hlcbqu, pgskth, oignan
+lrsedv (213) -> eaqjcju, cekpxgj
+iwkntdi (36)
+qfgzmtz (73)
+rfwgtb (26)
+alcvj (7)
+bvdxf (30)
+ofisj (88)
+mpchqe (27)
+pwizhzr (62)
+wkcyd (75)
+mxzbcqn (81)
+npzdqeg (227) -> tufds, msxhvo, pcsucog
+illjvf (69)
+iyuuh (80)
+fygmpjn (17)
+dvdgowj (5)
+hlcghe (91) -> khibjj, kngbqid
+zvurtb (77)
+ouspx (46)
+dbvxai (76)
+facrq (13496) -> fkbla, ffvprc, yrfqaga, msmgk, hxswghs
+xbcgipi (66)
+wfhyr (37)
+ziyata (221) -> oqlpz, jjtrisl
+muncur (77)
+vlvss (183) -> odvtiti, fazqw
+kvdkwy (96)
+ddldgex (84) -> nqyok, wduqgix
+trtgn (87)
+jitzj (65) -> fvgbg, nbfqgr, zjwpbzs, lndaa, vlvss, gxjvj, zcrjb
+hkhoyje (95) -> frirj, iuhlc
+gtbbuvb (96)
+tfsoxgb (250)
+rohvy (95)
+qhohy (41)
+goimlra (227) -> orxoo, lfxew
+hubbqbi (95)
+vchuc (53)
+svkdyq (9559) -> akmgfo, lhradm, jtauf, aunhcg
+fazqw (76)
+flomey (39)
+apygt (17)
+wjptb (43)
+srhirm (147) -> bicsjoc, dvzlq, olykwbi
+wdeuy (254) -> hubbqbi, rohvy
+yeooycn (93)
+qoyzgsp (28)
+sqkcdf (62)
+rgbvlc (49)
+qinzaf (813) -> aooni, zoewj, ogzrdrk, umlkxqv
+kflize (84)
+isrtfc (201) -> vmutyru, ouymke
+nkhadt (292) -> fppcif, vwnjh, oyvhouc, ekvall, guncf, npzdqeg
+nbbyqsa (40)
+ikfpktb (97)
+maqgick (76)
+xtwdx (156)
+sbyzsq (10)
+vgubuy (74) -> iljwgzf, aihow
+taiho (59)
+cpndnx (11)
+vhtyadn (18)
+aaheijb (54)
+rykadr (19)
+onnylx (32)
+gukuqw (69)
+fooyrq (15)
+zqyua (52)
+vsruoi (55)
+ikmvhid (2745) -> hwovhvw, arsuc, yzrdupu
+vztnh (18)
+khaupo (32)
+cpqti (142)
+qtsjbq (126) -> wekya, rzkcu, alkneau
+pcsucog (42)
+lepja (61)
+ibjvonk (10277) -> xlhfyw, svhbd, misyfn
+rqbjbio (29) -> mqrroj, hjeysaa, wlujpl, vooac, rrggg, yfjenp
+ceuygh (90) -> aqxsjq, qxlucvg
+qzxaqvy (78) -> fwskxtt, jlgvplm
+fwskxtt (84)
+yrkvb (58)
+thdwfw (219) -> umtrod, nhlittn
+zpkbe (73) -> cwtdf, tozktyo, qcrpdy, axtqrx
+hjjkx (87)
+jxyoypa (9)
+ilkqp (40)
+akwvj (238) -> jatnl, iphgmyt, meoeea, gqrfok, ljhwzvv
+lkcddrg (2238) -> lqfyzo, rixnft, hkhoyje
+xprzeeb (19)
+rhodopg (94) -> qfgzmtz, dqdfv
+ttwfig (340) -> rykadr, ykehxw
+kueyf (85) -> ulbbc, nzzfer, azxjd
+zmcgfdp (136) -> tehyhc, obslyn
+ffnabs (20) -> guehoas, nnldikq, ofrwmq, lrsedv, qvkotfd, shfdaba
+arwmalf (143) -> vsgaam, bjabd, ycclns, kkmqko
+gyjpoco (85)
+drmyco (26)
+arqoys (1859) -> urzul, bkvle
+nscav (69)
+tsrogy (69)
+qhafxnl (1337) -> xbcskih, kpxqlr, algqhtz
+yiusa (86)
+zdbqs (43)
+xzppxad (58) -> ltxkw, ollhxuy, qinzaf, wpxxh
+dxyifeb (1862) -> twubx, lkcddrg, uwqgz, uvfyo
+zlzers (49)
+gkkgkp (358) -> wlpyulp, nakmo
+abddskq (50)
+tggkm (43)
+dgwcz (7)
+bhvmgw (29) -> qflouyn, pfphng
+guehoas (283) -> qedst, cijptz, zknziw
+marzlxh (51)
+mizab (60)
+jgkvfa (120) -> ocnna, tcdwurt
+jopjvd (80) -> dnouufu, wjptb
+lwdqnj (25)
+xpzhy (84)
+noipcz (59)
+bbhniy (20) -> itngcua, mmcychg, vugnug, fktsu
+jtjcj (64)
+tgdzl (53)
+gobrf (25) -> gtzcxq, lsdrwz
+arsuc (65) -> rbcqgqv, huwsoc, bnfopv, srqntb, vxdkej, owhjmt
+ogzrdrk (101) -> vztbn, wtxbqe
+oxbkwyr (91)
+yatfpqx (109) -> xrbjn, qywkuqu, thjulip, oiijtm
+jlgvplm (84)
+bcibchp (54)
+glgnecl (16)
+tqikxkp (222)
+bhcal (7)
+vmutyru (47)
+kzwqzqf (46)
+evhsybt (37)
+gdnsat (59)
+cikaze (39)
+jrqorlo (229)
+ovluts (52)
+nbfqgr (169) -> cdpwklz, zjpsm
+nbngkou (73)
+wslsg (31)
+aobitc (69)
+htgxu (24)
+wjolzt (46)
+hzgig (95) -> jrvbacq, rgbvlc
+ulbbc (217) -> bniti, jbepak, iynywq, xbcgipi
+wkphn (7)
+fkbla (207)
+jqinti (52)
+yhiogu (256) -> neusnw, tkpvf
+ebjsluk (39)
+shfdaba (76) -> wpnqet, rjjlus, pjiqvd
+anpnrdt (10)
+jdshuob (491) -> kywfqzv, zpkbe, cfhuce, mzmfygf
+vooac (341) -> lufgosn, sbyzsq, mjpzp
+frohei (59)
+baiaa (15)
+pyrlph (71)
+cgxsmq (25)
+ukvvt (39)
+gaujsyk (26) -> ktaet, yipoeia, qijarlh
+gnjvf (375) -> ajenoz, ripqyzr
+hghnmib (47802) -> vbhnmr, vustse, lybkeg, ikmvhid, oqphsw, xzppxad, gvkcsad
+yrcgsnx (270) -> qfypnb, dbvxai
+kwqrbav (34)
+wdvwub (57)
+viqhfi (89)
+akmgfo (243) -> zhvji, iphncut, oyxbblb, gaujsyk, ybftt
+faecnr (80) -> dfeomzr, yoezrpw
+xskehl (228) -> ubovv, omydd, tluap
+pdosfg (21) -> rlbom, lbjwlov, wgqkdcr
+tkiraal (8)
+aimav (46)
+ecimj (85)
+eikmns (83)
+fqlezvk (71)
+qrlggma (49)
+ztkgsyt (29) -> bfuywyg, uexdnv
+tedplb (50)
+cvrcvgp (86) -> zvurtb, dkcix
+bckuyxm (11306) -> eyyzy, jrwfehi, baesyhf
+ffvprc (65) -> vxajmkg, cichyqw
+jjtrisl (81)
+vantwg (46)
+vlmcmcu (91)
+qdhrchr (89) -> dhwauy, uqlso
+ceoav (29)
+bhrbod (50) -> oxbkwyr, erpvue, zhrnwk, mhjtjp
+yxseri (24)
+kzbvrxk (10)
+kcnim (76) -> zjoxibi, auxqbbc
+ltxkw (30) -> eerktn, nqhdt, jjyjrtr, bfchbs, redqvw, mkrzp, nymguj
+rrggg (371)
+uwqgz (1923) -> torxqh, zmlth, lnctft
+dbwmq (117) -> bmecxwd, lcrwbqi
+kasfuwe (46)
+btbxk (755) -> xajjyba, kxykfr, rymkqd
+njxyw (47)
+fvlfq (94)
+zhvji (162) -> cpazlc, mluykm
+aozoac (77)
+chnkkj (86) -> tfmtk, hddzn
+dkcix (77)
+lxcbjgy (91)
+mofks (30)
+yzrdupu (719) -> wajnxjj, dfvhic, dmkyzy, ziqwzzy
+wxjka (47)
+xitzb (52)
+rvimq (7)
+qddsx (30)
+lvklj (97) -> ydbri, tcukgv
+sjforw (208) -> alcvj, neeqb
+yjvgwdl (91)
+fhxpkd (261) -> kauphp, zdhvqrl, rhnkdt, nhkvp, tejnuve, olspit, srmiagk
+eaqjcju (62)
+ybftt (122) -> oewzluz, ebjsluk
+jgmisxl (49)
+hdaqxlh (11)
+cjmxed (49)
+aqxsjq (84)
+cekpxgj (62)
+tetmzw (121) -> ozatmpe, qbmtmcs
+mqmbcl (96)
+xtyzy (155) -> yhiogu, iphzyj, pvppi, tojyt, krxyaak, ymrogz
+drwfop (48)
+pgskth (86) -> hxckb, lxesg
+pvgzz (72)
+kunzpa (687) -> tadnt, cupsjm, hoomyh
+nhkeb (252) -> caryo, bhcal, mjzksjz, ufitse
+cncak (182) -> qoyzgsp, lpuass
+aituccf (9)
+qfpwln (60)
+laxsl (29)
+yzxzo (38)
+lnctft (116) -> zgevpxx, scchi
+lyvyhkm (8)
+vcktg (1556) -> ztghd, imihjj, ksfok
+dzbrgb (75)
+xbcskih (85) -> fobzai, nxzkuj
+jtouvtb (57)
+ufitse (7)
+upwlxnb (7)
+jysaup (78)
+ysgsry (228) -> glgnecl, xnuoujm
+horqcc (73)
+vfsttaj (27)
+gvkcsad (5412) -> ghsjtj, dgnjf, ziyata, rajtef, kqlsniq, vqclii
+lbjwlov (79)
+vnhvilk (62)
+dntphko (89)
+syzlt (6183) -> tifgptk, iwhqlr, akwvj, kueyf
+hzmhm (1087) -> rvrlma, dchts, emzrj
+neusnw (47)
+vfzby (50)
+cecsr (59)
+uwaiki (41)
+msxhvo (42)
+fgjwz (113) -> qwzmv, xehdglb, kgpwo
+lmuyfcw (164) -> hrovawq, hacwv
+zjoxibi (87)
+viwns (17)
+olykwbi (33)
+meypo (29)
+sbguah (49) -> vlfouc, lficpr
+oyxbblb (92) -> towlhi, fndxl, uxjasn
+bzmade (66)
+lfpzff (238) -> bdinafh, kfmzbvk
+epuaii (88) -> ckheb, kwqrbav
+dwwsu (27)
+xnukvni (207) -> htgxu, lwvnbzs
+zhrnwk (91)
+vfngjd (325) -> hfftu, nymhem
+vztbn (87)
+kxnkbs (19) -> tpipb, vuyzhsh, vapwxei, wbxdta
+bmecxwd (27)
+nymguj (123) -> vkpltts, mbhld
+qlwxeb (52)
+kfrti (10)
+xcvxle (106) -> qddsx, bvdxf
+wbesqn (99)
+kblshw (8)
+qymwy (41)
+ezaypy (9)
+dnouufu (43)
+cyapi (227) -> rothisa, hokyk
+itbsk (30)
+alqim (42)
+hjeysaa (251) -> mofks, itbsk, njogewi, ldfopw
+ljfqvk (44)
+iueejt (5) -> rgfndsx, bhrbod, puwvse
+knzppj (81) -> hrlkgen, nsfsj, wbesqn
+wnjwnr (197) -> hnyqq, oajawn
+xtwdau (77)
+dmeee (93)
+qxfce (38)
+pcqyagx (15)
+bicsjoc (33)
+eeguu (78)
+wbxdta (61)
+gjwaqu (35)
+mzmtuw (95)
+huwsoc (173) -> ouspx, wjolzt
+spdhhoe (167) -> chwjiub, kvdkwy
+hhmwlo (56)
+icgwppo (84)
diff --git a/2017/inputs/day_8.txt b/2017/inputs/day_8.txt
new file mode 100644
index 0000000..7b63126
--- /dev/null
+++ b/2017/inputs/day_8.txt
@@ -0,0 +1,1000 @@
+ev dec -705 if cag != 2
+b dec -195 if ty >= -8
+red dec -404 if v > -7
+d inc -971 if k >= -9
+k inc 303 if k > -8
+cag inc 539 if ev > 697
+ev inc -11 if d <= -963
+alf inc -634 if xoc < -2
+eb dec 927 if b <= 201
+e dec 67 if eb >= -930
+he dec -29 if qby < 8
+cox inc 193 if b >= 188
+red dec 340 if alf >= -7
+k dec 8 if red > 57
+eb inc -606 if e <= -75
+xoc inc 337 if red == 64
+xoc inc 186 if mk == 0
+cox inc 840 if npo >= -5
+s inc -449 if anb != -3
+eb inc -233 if npo < 2
+npo inc -808 if mk <= 9
+eb dec 139 if eb > -1161
+ty inc -929 if ty > -7
+mk inc 789 if d > -977
+red dec 915 if k < 299
+anb inc 852 if mk == 789
+red dec 242 if swy == -6
+e inc -29 if cag < 546
+alf dec -219 if cag > 535
+red dec -298 if ty < -921
+tm dec 175 if obo <= 2
+alf dec 553 if eb != -1298
+alf inc -870 if s != -449
+v dec 744 if cox < 1036
+d dec -720 if he > 24
+ty inc -201 if k <= 301
+xoc inc 956 if v > -744
+s dec 539 if e >= -100
+mk dec -37 if anb != 852
+mk dec 833 if tm < -167
+ev dec -410 if ev < 686
+s dec 77 if cag != 539
+anb inc 917 if swy >= -2
+obo dec -5 if s >= -997
+qby inc -231 if tm == -175
+ev dec 378 if tm <= -167
+b dec -106 if s < -985
+s dec 301 if e < -89
+npo inc 232 if b == 301
+red dec -960 if mqk < -9
+he inc -789 if k == 300
+npo dec 826 if cox < 1033
+e inc 101 if k > 291
+v inc -898 if he > 27
+alf inc 141 if anb > 1767
+red inc -613 if e < -2
+tm inc -151 if cag >= 530
+k inc -346 if b != 305
+he dec 967 if cag <= 546
+ev dec -931 if cag < 543
+swy dec 309 if qby < -228
+d inc 437 if cox > 1030
+ty dec 586 if ev <= 1249
+alf dec 299 if e <= -2
+d inc 977 if xoc == 523
+d inc 594 if s <= -1282
+ev inc 21 if swy < -306
+qby dec -722 if cag < 543
+k inc -381 if ev < 1259
+alf inc 847 if anb > 1764
+k inc 126 if s <= -1292
+eb inc -109 if mqk > -4
+obo dec 900 if swy < -300
+obo dec 364 if mk <= -35
+swy inc -211 if eb >= -1416
+ty dec -680 if mqk <= 1
+ty dec -235 if cox > 1024
+cag dec -261 if red <= -559
+obo dec -897 if mqk == 0
+tm inc -981 if mk < -49
+ty inc -805 if eb >= -1402
+mk inc 278 if red < -552
+ev inc 63 if v > -1645
+swy dec -388 if xoc <= 530
+mqk inc 187 if obo != -357
+s inc 416 if b < 309
+qby inc 399 if mqk >= 185
+red inc -680 if mqk != 188
+he inc -981 if eb >= -1407
+d inc 225 if tm >= -327
+he dec 158 if d <= 1991
+d dec 74 if qby == 890
+k dec -930 if anb <= 1770
+s dec -546 if mqk == 179
+ty dec 733 if k >= 874
+ev dec 581 if obo == -362
+cox dec -922 if obo == -362
+obo dec 922 if e == 5
+d inc -948 if tm == -326
+cag inc 161 if mk <= 241
+eb inc -580 if e != -1
+anb inc -632 if qby != 889
+red dec -285 if mk <= 239
+qby inc 550 if eb >= -1997
+e dec 930 if k > 869
+eb inc 604 if swy > -138
+obo inc 383 if he != -1100
+s dec -89 if eb <= -1377
+qby dec -821 if ty < -1532
+ty inc 940 if qby >= 2257
+alf inc -421 if swy != -123
+qby inc 787 if b != 293
+alf inc -80 if b < 301
+b dec 205 if eb <= -1378
+qby dec 870 if obo != -892
+d inc 183 if swy == -132
+s dec -81 if mqk != 187
+swy inc 976 if d >= 1138
+red dec 281 if anb == 1138
+xoc inc 681 if d < 1141
+v dec 14 if obo > -902
+he dec -525 if xoc <= 530
+v inc -866 if red >= -955
+cag inc -835 if mk != 240
+qby inc -549 if s <= -781
+eb dec 584 if mk >= 229
+qby dec -711 if obo >= -904
+ev inc -400 if anb <= 1144
+k inc 82 if swy >= 840
+e dec -415 if mk != 229
+red dec -923 if anb > 1128
+v dec 602 if b != 86
+ty dec -699 if ev > 346
+xoc dec 549 if k > 968
+k inc 317 if qby < 2343
+npo dec 919 if d >= 1137
+e inc 421 if e > -519
+eb dec -104 if ev <= 351
+b inc 368 if qby != 2342
+mk dec -987 if ev == 357
+eb dec -509 if alf <= 236
+obo dec -380 if v != -3127
+npo dec -790 if b < 455
+xoc inc 405 if k < 1287
+obo dec -56 if b < 465
+swy dec 194 if k != 1281
+red inc -562 if tm <= -326
+swy dec 75 if e <= -86
+obo dec -4 if ev == 350
+e inc 533 if xoc < 931
+cox inc -584 if d < 1146
+swy inc 506 if eb >= -1354
+obo dec 458 if k >= 1279
+swy inc 447 if e > 447
+qby dec 847 if cox <= 1377
+xoc inc 225 if xoc < 931
+obo dec 301 if b > 462
+cag inc -740 if e > 438
+tm dec -83 if e <= 447
+tm dec -151 if cag <= -866
+npo inc 26 if s < -784
+v inc 12 if cox != 1368
+eb inc -399 if ev > 340
+eb dec 780 if d == 1143
+e dec 87 if tm == -91
+k dec -13 if anb <= 1139
+v dec 829 if swy >= 567
+k dec -229 if ev < 351
+qby inc 972 if xoc == 1143
+s inc 609 if s >= -789
+mk dec -931 if ev > 346
+mqk inc -605 if cag > -880
+v inc 302 if anb <= 1139
+mk dec 342 if v > -3647
+xoc inc -905 if k <= 1523
+qby inc -412 if qby == 1493
+v dec -548 if d > 1142
+xoc inc 311 if obo >= -771
+npo inc -955 if xoc < 551
+swy inc -885 if mk > 821
+ty dec 91 if ty >= 100
+s dec -840 if npo <= -1492
+qby inc 158 if ev > 342
+ev inc 227 if cag >= -878
+alf dec 612 if tm <= -92
+ev inc 395 if he <= -572
+s inc 570 if swy > -311
+s inc 283 if alf > -382
+xoc inc 297 if tm >= -94
+v dec 100 if d != 1153
+cag inc 928 if ty <= 19
+tm inc 829 if obo > -765
+alf inc -94 if ty >= 8
+ty inc -224 if cox <= 1367
+obo dec -352 if d > 1137
+mqk inc 223 if ev <= 580
+cag inc 55 if eb >= -2541
+red dec 969 if alf > -474
+alf inc -564 if e != 447
+qby inc -97 if obo < -400
+red dec -530 if cag > 107
+ev inc -579 if he > -574
+tm dec -788 if eb <= -2528
+alf inc -217 if v > -3191
+tm inc 635 if cox >= 1362
+tm inc -217 if mqk < -189
+cag dec -547 if v != -3191
+red dec -241 if alf > -1045
+red inc -492 if b <= 473
+he inc 46 if b > 454
+xoc inc 86 if ty > 8
+d dec -755 if qby < 1140
+mk inc -347 if obo <= -405
+v dec 870 if npo >= -1497
+npo inc 216 if red != -1287
+anb inc -574 if obo > -414
+ev inc -364 if eb == -2534
+anb dec -825 if npo < -1277
+k dec 587 if cox < 1372
+anb inc -888 if obo > -401
+swy dec -435 if npo != -1283
+e dec 551 if e != 444
+swy dec 772 if alf == -1036
+tm dec -339 if e == 444
+swy dec 259 if mk == 470
+xoc inc -224 if ev >= -359
+ty inc 265 if red >= -1279
+obo dec 449 if mqk > -202
+d inc 891 if e >= 438
+cag dec 606 if b >= 461
+mk inc -894 if v != -4064
+cag dec -128 if d != 2034
+eb dec 723 if eb <= -2528
+swy inc -12 if s < 1525
+s inc -569 if d == 2032
+npo inc 326 if alf >= -1038
+cox dec -213 if anb == 1379
+obo dec -222 if d > 2026
+ev dec 809 if anb == 1393
+s inc -637 if alf != -1037
+s dec -892 if xoc == 942
+eb inc -248 if cag != -491
+b dec 499 if qby != 1142
+b dec 543 if d <= 2033
+mk inc 345 if mk < -411
+ty dec -284 if npo != -960
+d dec -327 if eb < -3498
+cag inc -743 if mqk > -196
+cag dec 708 if ev > -374
+eb inc 935 if swy == 113
+d dec -908 if swy == 113
+npo inc -753 if swy == 113
+cag dec -227 if alf > -1045
+red dec -658 if v <= -4061
+cox inc -66 if anb < 1397
+cag dec -209 if b > 463
+cox inc -245 if alf != -1037
+alf dec -212 if s >= 2402
+d inc 590 if d >= 3273
+xoc inc -325 if xoc > 935
+red inc 935 if he >= -519
+tm dec 332 if ev >= -366
+cag inc 583 if xoc <= 615
+e inc -892 if e >= 439
+npo inc -628 if obo > -629
+red inc -819 if tm <= 1958
+qby dec -960 if ev > -372
+red dec -781 if tm < 1959
+cox inc -831 if xoc < 621
+b inc -830 if ty >= 559
+anb inc 654 if cag < -1507
+cag dec 995 if red >= -659
+npo inc 356 if b < -361
+tm dec 286 if qby > 2093
+mk dec 369 if ty <= 569
+mk dec -971 if qby != 2112
+swy inc 137 if xoc > 617
+alf dec -743 if npo > -1355
+alf inc 39 if ty < 569
+tm dec -42 if s <= 2413
+anb inc -685 if alf != -48
+ty dec 660 if anb <= 1360
+npo dec 313 if ev < -359
+cag inc -611 if obo >= -646
+tm inc 728 if v <= -4067
+swy inc -4 if cag != -3124
+npo inc 359 if xoc >= 613
+obo inc 694 if b != -358
+obo dec 439 if e >= -452
+npo dec -160 if xoc <= 626
+red inc -659 if e <= -439
+b inc -445 if obo == -382
+red dec 543 if k > 931
+s dec 274 if qby != 2093
+cag dec -338 if k <= 934
+alf dec -211 if alf == -45
+v dec -451 if tm == 1706
+obo dec -465 if v > -3606
+k inc 415 if qby > 2100
+anb dec 220 if swy == 109
+alf inc -3 if cox < 477
+d dec 164 if s > 2131
+qby dec -974 if alf >= -40
+cag dec 891 if anb < 1146
+d dec -337 if qby > 2100
+cag dec -628 if d != 3442
+k dec -648 if alf == -46
+red dec -329 if k == 1996
+e inc -891 if alf <= -38
+cox inc -626 if ty >= -99
+mqk inc -349 if mqk >= -204
+alf inc 388 if qby > 2092
+mk inc -430 if d > 3443
+eb dec 338 if alf < 352
+mk inc -215 if cox == -147
+e dec 171 if b >= -819
+alf dec -205 if d != 3433
+d inc -490 if qby == 2102
+e inc 612 if he > -528
+anb inc -811 if mqk > -543
+he inc 685 if cox >= -154
+red dec -748 if anb <= 1129
+ty dec -872 if ty >= -97
+b inc -920 if eb == -2908
+s inc -701 if mqk >= -548
+tm inc 136 if alf > 545
+he dec -100 if e != -898
+qby inc 552 if anb >= 1132
+xoc inc 700 if xoc == 617
+xoc dec 827 if obo != -385
+anb inc 738 if d != 2956
+eb inc 476 if mqk == -544
+s dec -100 if ev == -366
+obo inc -602 if e == -898
+tm inc -80 if xoc == 490
+eb inc 160 if eb == -2432
+he inc 229 if he == 159
+tm inc 453 if b > -1739
+obo dec 786 if qby < 2655
+swy inc -120 if qby != 2651
+ev dec -382 if obo != -1770
+qby dec 41 if eb < -2265
+cox inc -991 if obo > -1765
+cag inc -713 if obo > -1773
+he inc -958 if red <= -1522
+ty inc -426 if mqk != -551
+k inc 902 if ty == 349
+npo dec -550 if eb < -2274
+swy inc -30 if d < 2954
+anb dec 990 if npo < -1139
+ty dec 301 if red >= -1529
+ev inc -687 if ty > 347
+ty dec 261 if he <= -802
+b dec -313 if ev < -1043
+alf dec 231 if k != 2889
+npo inc 956 if qby >= 2618
+cag inc -39 if npo <= -1135
+he dec 117 if qby > 2605
+v inc -574 if cag > -4421
+npo inc -179 if mk <= 538
+v inc -737 if he < -910
+npo inc 722 if swy < -37
+mk inc 200 if alf != 313
+npo dec -604 if mqk == -544
+ev dec -794 if ev > -1048
+eb inc -384 if npo == 3
+he dec -10 if qby != 2614
+e dec -317 if e > -906
+e inc -662 if d >= 2946
+s inc 941 if npo != 0
+xoc inc 765 if e <= -1235
+b inc 434 if ty > 354
+e inc 513 if anb > 880
+cox inc 146 if mk > 734
+mk inc -31 if alf == 316
+qby inc 887 if mqk == -547
+obo dec -87 if mqk != -536
+he inc -230 if tm != 2217
+e dec -469 if alf < 326
+alf inc 608 if d != 2950
+mqk dec -78 if v < -4355
+b inc -865 if ty < 356
+s dec 57 if npo < 7
+npo dec -100 if cag > -4428
+cag inc -217 if red > -1522
+b dec 338 if k == 2898
+npo inc -324 if k <= 2906
+mk dec -763 if obo >= -1687
+e inc 760 if d > 2945
+e dec 984 if v == -4350
+obo inc 651 if he <= -1126
+red dec -380 if d >= 2950
+b inc 11 if k > 2888
+v dec -406 if red <= -1142
+anb dec -900 if e <= 501
+ty inc -2 if mk != 1471
+tm dec -655 if qby > 2619
+k inc 142 if mqk < -540
+ev inc -346 if xoc != 1265
+xoc dec -284 if k >= 3032
+d inc -908 if k == 3040
+e inc 36 if swy == -41
+xoc dec 372 if alf != 930
+s dec -327 if xoc != 1159
+e inc 56 if ty < 343
+v inc -445 if npo == -221
+xoc dec 265 if s >= 2746
+k dec 604 if swy >= -42
+alf inc 918 if eb > -2662
+mk inc -227 if cox != -150
+cox dec -693 if qby <= 2614
+d inc 88 if k != 2434
+tm dec -278 if k > 2428
+v dec 384 if red <= -1145
+npo inc 854 if ev != -1390
+he inc 69 if xoc >= 893
+d inc 587 if eb <= -2650
+b dec 873 if anb == 1785
+tm dec -557 if mk != 1230
+k dec -335 if k <= 2437
+d inc -215 if cag != -4424
+obo dec -754 if red == -1140
+d inc 369 if v != -4766
+tm dec -12 if red >= -1155
+anb dec -836 if xoc <= 892
+s inc -170 if cag <= -4422
+k dec -717 if mk != 1234
+npo inc -790 if k >= 2764
+obo dec -87 if red <= -1157
+v dec -894 if ev >= -1401
+cag inc -440 if swy >= -49
+e inc 31 if d > 3091
+v dec -581 if he != -1057
+anb dec 760 if k <= 2775
+swy dec 513 if v != -3295
+s inc 840 if mk > 1242
+npo dec -359 if mqk > -549
+red dec -958 if ev >= -1403
+ty dec -246 if qby != 2617
+k inc -28 if cox <= 544
+npo inc -881 if cox > 545
+ty dec -733 if ev < -1391
+e dec 750 if cag <= -4863
+cox dec -44 if alf < 1843
+mk inc 751 if ev < -1390
+he inc -968 if mk > 1980
+d dec -431 if npo != 202
+v inc 406 if xoc != 902
+tm inc 635 if mk <= 1991
+npo dec 401 if anb <= 1022
+v dec 940 if obo >= -1034
+npo dec 572 if qby < 2619
+swy inc 934 if anb != 1021
+eb inc 499 if swy == 893
+mqk inc 17 if s < 2568
+mqk dec -704 if alf != 1836
+ty inc -301 if mqk != 162
+npo dec 29 if cox >= 579
+alf inc -677 if npo > -409
+mk dec -399 if npo == -399
+cox dec 639 if e == -213
+ev inc 602 if qby < 2617
+ev dec -238 if eb != -2149
+mqk inc 26 if k > 2734
+anb dec -153 if v > -4238
+b inc -331 if cox != 584
+mk dec 411 if s > 2574
+xoc dec -631 if xoc == 902
+mqk dec 795 if d != 3083
+swy dec -911 if anb > 1184
+anb dec 368 if e >= -217
+b dec 463 if qby != 2612
+qby dec -127 if v <= -4226
+alf inc -848 if npo != -409
+obo dec -499 if s >= 2571
+swy dec 165 if v < -4225
+alf dec 71 if mqk == -609
+b dec -717 if d != 3090
+cag inc 721 if tm <= 3694
+xoc inc 304 if ty > 1033
+swy inc 728 if d < 3096
+tm inc -690 if eb >= -2163
+qby inc 979 if ty == 1025
+s dec -175 if swy >= 1449
+s dec 639 if he > -2038
+mqk dec 615 if red <= -189
+he dec 481 if cox >= 578
+anb inc -329 if xoc <= 1532
+anb inc 350 if red != -192
+obo inc 720 if s != 2108
+ev dec -316 if s > 2111
+mqk inc 322 if alf == 246
+d dec -723 if cox > 580
+b inc -301 if alf >= 254
+cox dec 847 if xoc > 1528
+v dec -298 if cox <= -254
+eb dec -842 if cag != -4874
+he inc 483 if eb != -1324
+b inc -160 if npo >= -400
+tm dec 885 if obo == 187
+anb inc -505 if tm <= 2129
+red dec 387 if e < -212
+e dec 761 if npo <= -397
+he dec 303 if tm == 2128
+s dec 308 if b < -3718
+mqk dec -207 if he > -2041
+ev inc -655 if xoc != 1533
+s inc -601 if d > 3809
+ev dec 666 if cox < -256
+ty inc 384 if he != -2041
+v inc -560 if ty >= 1403
+ty inc 446 if obo != 194
+obo inc -570 if cag != -4868
+obo inc 21 if k == 2743
+cox dec -183 if mk != 1973
+s inc -780 if eb <= -1306
+b inc -173 if tm != 2131
+b inc 489 if v > -4488
+swy inc 337 if s < 431
+ty inc 36 if alf >= 240
+xoc inc -941 if s < 427
+xoc dec -533 if xoc <= 600
+eb dec 269 if swy == 1795
+eb inc -718 if swy < 1796
+xoc dec 319 if eb <= -2039
+ev dec 855 if npo < -390
+v inc 208 if d >= 3805
+d inc -846 if tm == 2122
+red inc -636 if mk <= 1977
+d dec 695 if ev == -1764
+e dec -864 if cox == -268
+v dec -913 if d == 2270
+alf inc -364 if cox > -270
+he dec -211 if cag != -4862
+b dec 624 if b != -3887
+v dec -953 if b < -4514
+ty dec 631 if b < -4518
+e dec -496 if obo <= -367
+d dec -911 if cag >= -4872
+mk inc -549 if xoc >= 1117
+alf dec -586 if e <= -971
+cag dec -919 if k == 2743
+qby inc -803 if cag <= -3943
+k dec 18 if k > 2734
+ty dec 537 if qby > 2909
+swy dec 973 if tm >= 2122
+d dec -502 if qby == 2916
+ty inc 50 if he >= -1816
+cag dec 344 if e > -985
+cag inc -967 if anb < 311
+ev inc 193 if npo != -393
+ev inc -934 if cag >= -5265
+ev dec 416 if d == 3683
+ty inc -963 if d < 3688
+s dec -904 if s <= 424
+b dec 52 if b >= -4524
+alf inc -427 if obo <= -363
+red dec -686 if cox > -268
+b dec 551 if mqk == -695
+xoc dec -670 if v > -2428
+anb inc 310 if ty >= 401
+ev dec 768 if red < -519
+tm dec -391 if k == 2725
+b inc -624 if xoc < 1797
+s inc -962 if ty != 391
+xoc inc -482 if mqk > -703
+alf inc -110 if v < -2418
+mqk inc -812 if s < 1329
+cag dec -584 if red >= -529
+qby dec -503 if npo >= -405
+npo dec -592 if npo <= -396
+anb inc -611 if anb < 313
+anb inc -537 if red < -538
+eb inc 781 if cag < -4664
+xoc dec -241 if he >= -1821
+k inc -974 if swy >= 816
+eb dec -649 if ev > -3690
+he dec 258 if b > -5750
+cag inc -618 if tm >= 2513
+b inc -132 if npo == 190
+cox inc -187 if mk > 1427
+tm dec 244 if npo <= 198
+cag inc -21 if alf != 350
+npo inc -332 if ev >= -3696
+obo inc -144 if ev < -3698
+npo inc 652 if k >= 1744
+anb inc 682 if b > -5739
+mk dec -585 if eb > -607
+ty dec -395 if red <= -521
+d dec -118 if cox < -260
+obo dec 97 if d < 3797
+mk inc 561 if s != 1327
+mqk inc 341 if xoc < 1558
+eb dec 136 if xoc >= 1546
+eb dec -144 if b == -5744
+b dec 416 if xoc < 1560
+e inc -688 if red <= -520
+cag inc -846 if cox <= -264
+e inc 858 if mk >= 2009
+d inc 120 if mqk < -1165
+eb inc 275 if anb < -304
+d dec 426 if e <= -801
+obo inc -175 if alf == 358
+b inc 411 if v > -2433
+anb dec -285 if qby != 3420
+e inc -899 if cox != -257
+ty inc 764 if xoc >= 1552
+eb inc 157 if tm == 2273
+alf dec 416 if xoc <= 1562
+mqk inc -251 if d <= 3498
+s inc -405 if e != -1698
+he dec 280 if v < -2419
+mqk dec 783 if e == -1705
+s dec -530 if mk > 2013
+cox dec 601 if qby >= 3421
+alf dec -214 if cox <= -253
+cox inc -280 if v < -2418
+obo inc -617 if k > 1749
+tm dec 400 if v >= -2427
+obo inc -810 if swy == 820
+cag inc 245 if red < -524
+k inc 939 if obo < -1973
+xoc inc -867 if d != 3499
+ev inc 930 if ev >= -3690
+npo inc 490 if npo == 513
+obo dec -127 if tm <= 1874
+v inc -937 if cox < -539
+cox inc 806 if eb < -315
+tm inc 868 if b == -5749
+d inc 370 if cox != 264
+mk dec 735 if d >= 3488
+v dec 651 if tm >= 2736
+d dec 751 if d == 3495
+eb inc 73 if eb == -320
+anb inc 946 if mqk >= -2202
+k inc -879 if tm != 2731
+cag dec 329 if cag >= -5075
+v dec 110 if npo <= 998
+cox inc -324 if v != -4012
+s dec -43 if xoc <= 688
+xoc inc 154 if ty <= 1552
+npo dec 126 if e == -1705
+mqk inc 631 if qby < 3428
+obo dec 875 if k < 882
+eb inc -159 if d >= 2737
+ty inc 158 if mk < 1266
+cox inc -726 if cox != -65
+red inc 699 if he <= -2352
+anb dec 348 if he == -2353
+mqk dec -25 if cox <= -792
+he inc -72 if ty == 1550
+tm dec -396 if obo >= -2712
+mqk inc -730 if alf >= 153
+ty inc 950 if b <= -5741
+qby inc 711 if b <= -5747
+he inc 990 if ty == 2500
+eb inc 691 if cag <= -5394
+v dec 315 if v >= -4001
+cag inc 831 if k == 872
+cag dec -285 if s != 974
+tm inc 500 if k >= 865
+ty inc -407 if ev >= -2761
+ev dec -960 if v >= -4019
+anb dec 698 if cox < -781
+swy dec 265 if cox <= -783
+e dec -962 if anb < 237
+he dec -152 if swy != 555
+npo dec -416 if alf < 159
+red dec 450 if qby > 4127
+cag inc 253 if s <= 964
+cox dec -969 if tm <= 3634
+e dec 442 if qby < 4135
+mk dec 890 if qby > 4128
+cag dec -934 if ty != 2085
+cox dec 905 if k != 876
+red inc 595 if k <= 862
+b inc 105 if npo > 1286
+obo dec 502 if mk == 394
+ty dec 533 if obo != -2718
+ev inc -6 if mk < 386
+npo inc -144 if d < 2746
+e inc -232 if ev >= -1813
+alf inc -78 if ty > 1553
+eb inc -637 if ev != -1796
+tm dec 132 if e != -1425
+swy inc 667 if alf == 78
+red dec -166 if mk <= 387
+swy dec -173 if v >= -4014
+qby inc 788 if qby > 4121
+ty dec 172 if qby <= 4919
+red dec 447 if tm == 3501
+obo dec 366 if alf == 78
+he dec -842 if mqk != -2305
+xoc inc -10 if d >= 2736
+ev inc 517 if cox != -726
+mqk dec 865 if npo != 1151
+obo inc 29 if red <= -552
+qby inc -337 if b == -5644
+cag dec -970 if mqk != -3172
+e dec 343 if xoc != 827
+d dec -890 if v == -4017
+v dec 793 if anb > 220
+cox dec -442 if he == -599
+eb dec -759 if anb > 225
+obo dec 45 if k == 872
+obo dec -534 if e > -1764
+cag inc 344 if npo >= 1149
+eb inc -458 if e <= -1764
+obo dec 55 if mqk > -3167
+s dec -487 if v > -4813
+xoc dec -51 if d >= 2744
+ty dec 568 if ty >= 1387
+cag inc -698 if cox <= -276
+cag dec 162 if mqk > -3170
+k inc 563 if qby > 4579
+alf inc -784 if tm >= 3498
+mqk dec 520 if obo > -2624
+npo inc -780 if qby > 4576
+alf dec 152 if he >= -602
+v inc -614 if eb <= 415
+he dec 659 if k < 1445
+ev inc -49 if d >= 2740
+e dec 302 if v >= -5424
+ty dec -877 if alf < -867
+qby inc 368 if swy != 1394
+anb inc 732 if swy < 1396
+mk inc 61 if ev > -1344
+b inc -66 if cox == -280
+npo inc 11 if swy <= 1397
+swy inc 292 if alf >= -852
+red inc -606 if mqk == -3684
+e dec -460 if cox > -272
+s dec -469 if cag > -2898
+tm dec -717 if obo > -2618
+xoc dec -796 if cag != -2893
+ev inc -145 if tm < 4222
+e dec 892 if red == -1167
+red inc -403 if red == -1164
+tm dec 519 if npo != 389
+cag dec -107 if cag <= -2900
+ev inc -385 if d > 2743
+qby inc -444 if alf <= -857
+ev inc -201 if swy != 1398
+npo dec -851 if s >= 1922
+s inc 975 if s <= 1923
+alf inc -906 if v != -5413
+obo dec 870 if ty >= 815
+obo inc -26 if anb == 959
+e dec -65 if e <= -2951
+ty dec -835 if anb == 958
+anb dec -49 if swy > 1394
+mk inc -253 if mqk <= -3680
+e dec -862 if b != -5708
+qby dec -293 if s == 2896
+s inc -845 if cox != -271
+xoc inc 509 if npo >= 387
+obo dec -758 if mqk >= -3675
+v inc 370 if b < -5703
+cox dec -986 if red >= -1172
+b inc -682 if d >= 2739
+k dec 568 if v >= -5055
+mk inc 451 if alf == -1764
+ty inc -56 if mk <= 645
+eb dec 173 if s <= 2051
+s inc 836 if ty != 764
+alf dec 345 if cag <= -2887
+cox dec 206 if k != 867
+eb inc 44 if s > 2053
+d dec -294 if cag <= -2891
+he dec 904 if swy >= 1386
+ty dec 499 if swy < 1399
+e dec 891 if tm > 3698
+b dec -732 if v < -5057
+qby inc 722 if red != -1168
+e inc -609 if npo != 379
+b inc 741 if e < -3525
+b inc -833 if tm >= 3701
+red inc 282 if ev > -2072
+obo dec 441 if b < -5647
+xoc dec -612 if anb != 1005
+s dec 67 if mk > 647
+cox dec -341 if red > -879
+v inc 316 if qby <= 5519
+mk inc -251 if ty == 271
+ty dec 587 if b <= -5658
+anb dec 204 if d < 3044
+he dec -358 if qby < 5521
+s dec -594 if obo < -3946
+xoc dec -802 if d > 3029
+alf dec -536 if alf <= -2105
+tm dec 209 if cox <= 711
+s inc -142 if anb > 809
+s inc -571 if mqk >= -3676
+npo inc 607 if alf == -1563
+swy inc -438 if swy >= 1388
+b inc 325 if xoc != 3092
+k dec 338 if s <= 2650
+cag dec -748 if he == -1804
+npo inc -186 if npo <= 382
+cag inc -920 if tm != 3483
+swy dec 288 if mk >= 652
+ty dec 362 if mqk != -3685
+alf inc 291 if anb == 811
+mqk inc 203 if red == -890
+swy inc 712 if eb >= 231
+ty dec 327 if v > -5052
+npo inc -453 if mqk == -3684
+cox inc 747 if mqk < -3685
+qby dec 844 if cox >= 698
+cag inc 785 if swy != 1659
+red dec -820 if xoc > 3086
+anb inc -2 if cox < 709
+cox inc 91 if cag <= -2280
+cox inc 988 if mk <= 643
+ev inc 895 if ty != -433
+red dec -411 if npo == -259
+npo dec 831 if npo > -261
+k dec 799 if mk == 643
+qby inc 373 if v != -5054
+e inc 949 if swy > 1668
+qby inc 278 if d > 3037
+eb inc -839 if obo != -3946
+mk dec 758 if anb <= 800
+npo inc -662 if s != 2642
+e inc -807 if e < -2575
+cag inc 755 if swy <= 1669
+e dec -532 if swy > 1662
+alf dec -4 if eb <= -596
+swy dec -552 if ev <= -1170
+d dec -857 if cox != 1700
+anb dec -31 if anb > 798
+eb dec -482 if npo < -1759
+ty inc 820 if d == 3897
+xoc inc -846 if v >= -5054
+alf dec 312 if d != 3895
+obo dec -531 if npo >= -1752
+b dec 722 if ev > -1177
+d inc 912 if ev == -1173
+e inc -497 if cag <= -1514
+b dec 551 if eb <= -599
+mqk dec -130 if alf >= -1576
+obo dec 426 if s >= 2649
+mqk inc 672 if cox >= 1698
+red inc -879 if alf <= -1568
+he dec -503 if cox != 1687
+tm dec 117 if ev != -1173
+he dec 237 if mk < 645
+qby inc 189 if eb != -601
+k inc 820 if k < -279
+mqk inc -594 if obo <= -3421
+k dec 375 if v > -5041
+cag dec 298 if d != 4807
+b inc 985 if ev != -1163
+tm inc -697 if cox >= 1687
+v dec -940 if swy >= 2212
+k inc -260 if d >= 4806
+ty dec 73 if k < -526
+swy inc -530 if s <= 2654
+mqk dec 636 if swy >= 1686
+d inc 32 if qby <= 5516
+v inc -809 if v <= -4103
+e dec 380 if k != -540
+ev inc -651 if b == -5939
+qby inc 352 if alf >= -1576
+v inc -256 if obo > -3416
+mqk dec 28 if red <= -527
+alf inc 395 if npo > -1762
+ev dec 317 if d < 4837
+cag inc 74 if red >= -528
+mk dec -575 if anb == 833
+cag dec 744 if obo == -3421
+mk dec -455 if qby == 5868
+k inc 350 if cag <= -2266
+d inc 730 if npo <= -1749
+ty dec 180 if mk != 1673
+xoc inc 364 if cox == 1694
+anb inc 937 if cox == 1694
+s dec 459 if tm >= 2785
+cox inc -594 if cag != -2271
+cox dec 874 if cox > 1102
+xoc dec 289 if alf > -1178
+e inc -178 if obo < -3413
+red dec -965 if obo >= -3416
+npo dec -47 if ty == -497
+alf inc -264 if npo < -1697
+v inc -518 if alf == -1429
+red dec -264 if swy == 1697
+k inc 540 if obo > -3415
+ev dec 208 if tm != 2799
+npo dec -967 if tm >= 2788
+xoc inc 106 if swy == 1691
+eb dec -276 if s >= 2185
+b inc -151 if mqk == -4812
+he dec 120 if he <= -1534
+e inc -236 if cox >= 1091
+tm dec -25 if alf == -1436
+xoc inc 618 if s == 2186
+b dec 269 if qby != 5876
+cag inc -911 if cag != -2267
+mqk inc -68 if he == -1658
+alf inc -267 if ev > -2035
+cag dec -228 if npo < -733
+k inc -527 if cag > -2043
+qby inc 341 if red == -533
+xoc dec 539 if mqk >= -4879
+d dec 884 if ev == -2032
+mk dec -837 if ty == -497
+tm inc -879 if k == -707
+k dec -32 if tm > 1907
+e dec 771 if ev > -2026
+qby inc -732 if s <= 2192
+ev dec 629 if swy < 1700
+obo dec -799 if e > -4138
+e dec -954 if k >= -683
+ev inc 177 if eb == -329
+d inc -151 if cag < -2032
+b dec 967 if alf > -1711
+e dec 836 if b == -7326
+he dec -543 if eb > -337
+d inc 478 if alf == -1705
+mqk dec 251 if xoc < 3047
+v inc 235 if anb == 1770
+xoc inc 94 if mqk > -5134
+swy dec -106 if s > 2176
+cox inc 591 if xoc != 3138
+eb dec -594 if eb == -329
+he inc -389 if qby == 5469
+swy dec 680 if ty != -487
+alf inc 713 if ev < -2483
+mqk dec 533 if b != -7332
+mk dec -282 if tm <= 1920
+d dec -878 if tm >= 1913
+ev inc -821 if b > -7327
+s dec -229 if qby > 5475
+tm dec -671 if swy > 1115
+mk dec 703 if eb > 262
+cag inc 96 if v == -4682
+alf inc -771 if mqk != -5672
+eb inc 140 if b > -7322
+swy inc -493 if eb != 270
+he inc 826 if eb == 273
+v inc 82 if s <= 2408
+anb inc -898 if tm <= 2585
+mk dec 735 if red <= -531
+obo inc -704 if eb >= 262
+cag dec -145 if tm == 2585
+k dec -952 if swy > 620
+mqk inc 818 if eb == 265
+he inc 229 if b > -7325
+v dec -717 if npo != -746
+npo inc -329 if d == 5890
+xoc inc 820 if v > -3957
+ev inc -751 if alf != -1768
+he inc -105 if npo == -1066
+tm inc -86 if swy <= 627
+npo inc 83 if qby < 5486
+npo inc 829 if mk != 1347
+swy dec -554 if tm >= 2504
+anb inc 836 if red <= -524
+npo dec -878 if b > -7328
+cag inc -276 if alf != -1763
+red inc 215 if qby >= 5469
+eb inc -509 if d >= 5884
+xoc dec -707 if he >= -1119
+s dec 42 if cag > -1801
+s dec 63 if obo >= -4125
+mk dec 358 if cag <= -1793
+eb inc 95 if cag <= -1793
+eb dec -637 if b >= -7323
+ty inc -617 if xoc != 3854
+mqk dec 510 if ty < -1112
+he inc -285 if tm != 2499
+ev inc -547 if qby < 5487
+mk dec -915 if npo < 730
+eb inc -953 if e > -4036
+obo dec 412 if he >= -1108
+npo inc -925 if d < 5888
+ev inc 930 if cag < -1792
+v inc 658 if npo <= 726
+ev inc 892 if mk <= 1918
+ev inc 756 if b == -7326
+qby inc -574 if s > 2307
+npo inc -638 if red >= -326
+tm dec 248 if mk < 1913
+cox inc 865 if s < 2317
+cox dec -950 if d <= 5893
+mk dec -632 if he <= -1108
+v inc 176 if d <= 5893
+mk inc -805 if ty != -1120
+ev dec 973 if npo < 89
+swy dec -601 if s < 2308
+e dec -146 if cox < 3509
+mqk inc 321 if cag > -1803
+xoc inc -534 if alf >= -1764
+d dec 747 if ev >= -3004
+npo inc -826 if obo != -4120
+xoc inc -343 if ev < -2994
+b dec 415 if anb <= 1708
+b dec 323 if xoc > 2976
+b inc 697 if ty <= -1118
diff --git a/2017/inputs/day_9.txt b/2017/inputs/day_9.txt
new file mode 100644
index 0000000..eb4d605
--- /dev/null
+++ b/2017/inputs/day_9.txt
@@ -0,0 +1 @@
+{{{{{<!!!>!>'!!!>!!!!!!!>u!!!!!>},<'>,<!>e{o!!!>!'>}},{{{<!!u<>},<!!!!!>!'!!a}!!!>,<!>!!!!!i!!,e!>,<i{o!>},<!!>}},{{},{{<e},!>},<!{"!!'e'>},<auu<oa{!!!>!i>},{<a!!,'<!>>,{<a}!!!>a>}}},{{{{<!!'!>,u!!,}!!!>!!"'!!!>,i!!e>},<!!}<!>},<!!!!'i!!!>ii{!>},<!>,<!!"!>">}},{<!!ua<!>},<{!!!>!>},<!<e''!!!>ou!!!!!>!"!!!!!!!>!!>,{<!>},<u!!a!>,<!><"ui!!,u'!>,<!!!>!!o!!a>}},{{<"!!<<!>,<!>},<o{<e!!!>!!"<!>},<o>}}}}},{{{{{{{{{<!>!>,<,>},{<!>,<,}!>},<!a"!!!>},<,!!!>,<!!!>!!!>'>}},{{<{}!!e!!!!>},{<e!!!><!!!!'!>,<ea!!u'i,e{!i>,<""a!!!>},<o>}},{<!>,<!u<!!!!au!!!>!eia'!>},<!>,<!<>,{}}},{<,oo>,{{<!>},<ei,{<oeo,!!'a!!!>!>},<''>,{<{e!!!>!!!>}>}},{{}}}},{{<i!!'}u!>>}}},{{{{<!>,<oe}'u<!>,<e"e!a>}},{{}},{{{{<!!!!!>o!!!>!!"o!!!>>}},{<'>}},{<e>}}},{{<!>,<!!o<<!>i>}},{}}},{{{<a!>!>},<!!!!{!a,!!!>{!"i!}oie>},{<e!!!!!>,<,">}}},{{{},{{{{{{<{uu{'!!>},{<>,<!aeoae>}},{{{<!!!>,<!<<!>,<!!!!i<!!!ue!>,<ui}o!!e>}},<!>,<!!e"i!!'{"'>}},{}}},<'i!!ueiu,!>},<!>},<!>!!<"}!!!>,<!>},<>}}}},{{{{<,!>},<',!!',ei!>!>},<!}!!!>i!!}ee,>,{{}}},{{{<'a'!!e!"i!>o!!!>!!!>!!!>{!!!>,<,>},<ei!<!!<!{e{ua>},{<!!!>,<{!!!!!>!!,!!!>>,{<,!!>}},{<!>,<!>!>}e!>},<!!!>}{'!!!>o>}},{}},{{{<!!!uu!!!!!!!i<>,{<,}"!>!!!>}o!>,<>}}},{{{{{<!>,<u!oo!>,<!!}a<>},{<!!!'!>o>}},<o!>,<!<!>,<<ii>}},{},{{<<!>,<>},{<i!>"o!!aue,>,<i!>},<!>},<<!!e!!i>}}},{<!>},<!!{"!>,<!o!}!>},<o,o'!>!!a,e!!!!!>,<>,{<u"!!!>!>},<!!>}}}},{{{{{<!>},<!!!>!>,<o>,{<!!!!!>!!!!o!>},<!>u!>,<!!!>i!o!>!e<!!!>''!>!>i>,{{<,u'!>i"o!!"}>}}}}},{<!!!!'}{>}},{<!>"}{!>},<!>},<i<!!!>,<i<>,<"!>,<"u>},{{}}},{{{{{<!!'e!!!!!>>,<!!a{o!>u,,o}"{>},{<!>,<<,!!!>,!>o!,!>,<!!!!'>}}},{{{<uo!!!>!>},<!>,<e>,{}},{<!!'a",!}!!!>!!i>,{{},{<!!!!!e!!"e!>},<'{<!!!>},<o!!u!!!!!>{{!>,<>}}}},{{<,<!,!!">},{{{}},<!"o<o!!}!>},<!>,<{!!!!!>"o!!<,e!o!!!!!>},<!>},<>},{<i!>},<>}},{{<'!>!>!>,<>},<"io!!!''!!!>!!o!!o!!!>,<<i<i!!!>!>,<>}},{}},{{{<'i!!!'}!!!>!>!!u!!!u!>oo!>},<>},{<!!,i!>,<!!a!>!>,<u!>},<ae>}}}},{{<{i!!iu!,!!'!!!!{"!!!>>,{<!a'>}},{{<",!>a{a!!{i!>,<!>},<}u!>,<!>!!oii>},{{<'u!!"!!!>}a!!e!aa!>,<i!!!>!!!>,<<>},<!>},<"}"!!!>i!>,<>}},{{<!!u!a',"{>,{<'}"!!!o!>},<!!'!!<a,,"!!,uo>}},{<e!>,<e{!!,}<!!<!!eu<<uui>,{<{!>,<"!>,<,!!,!!,e!!{{a,!!!!!>},<<a>}}}},{{<}!>'!!{,<!}!!"!!e!!u"e,!!i>,<!!!>e!>,<!>},<!!!!!>>},{{{{{{<!!""!!!a!u>}}},{}},{{<eio>}}}}}}},{{{{},<!!'<!!!>},<u!>!!!!i}e!!},!>,<{!>,<!!!>>},{<'!'''!>o"},!!e{!"o!>,<u!!!>{!>u>,{}}},{{{<!>,<u"o"{!!!>!>!!o!!}iou>}},{{{},<io<!!'"!>,<!>,<!!!>a<>},{<!>,<a!>},<<o!!!>{i!!o>,<!ao!>,<!!"!!u{!!{!!!!<!!e<!!a}{u}{!!!!a>}}}}},{{{{<!!!><!>},<!>},<a!"!>,<,!!!!!!,!!!>,<a!!e>}},{{<!!o<!u!!ee{>},{<!!!><<o<"e>,{<!>},<{!,!!u!!!!!!!!!>},<!!!>,!!!>i!!{<!>,<!!>}}},{<!!!!!>o!>'<!{<{!!{!!>,{<"!>!>!>},<!!!><'{o{e!>,<,a}!!i>}}},{{},{},{<!!!!a!>},<!!!}!>,<!!!>e!!!!!!!!e}!!!!a!!'}">}},{{{{<!>},<i!!!>!>},<uu<o{io>},<e<!!!>!!!>i}!>,<<>},{},{{{},{<i"!!a!!i!!!!}!>},<!}{<!'o!uu,>}},{<u!!eo!!{eo!>,<'!!!>{!!>}}},{{},{<!!!>'""!o!>,<>,<i<!>!!!>ue!!!>i{'!u<<!!!>,!,>},{{<e>}}},{{{},<!>,<!!!>,i}},!>,<!!e!!>},{{<!!!!}e!!i!'"!iu!>},<!!{!!u>},<u!>>}}},{{<"}<!!!>},<ou!o}!>,<>,<!!!>'!!!'u!!!!!u!!}>},{{<!!!>!>},<}>},<!!<!"!,'u!!!>!!,a','>},{{<u>,{}}}}},{{{{{{}}},{{{{{<aa,,!>!>,<>}},{{<oo>}}},{<}!>,<,{i!!}!>},<!!!>>},{{{{<a!!!>,<!'<!>"!!!>u<i!>},<a}'}!<ie>,{<!>,<o!!!!!>i"a}!!}a!>i<!>},<!!!>!!a!!!>>}}},{{},{}},{{{{<!>,<"u<!!}ui!!e<!a}u!>},<!!",>}},{}},{{{<">,<!>},<!!!>!!u>},{<!>,<{>,{{<"ie!}!>a!e>,{}}}},{<}i''ua{!>},<>}},{{},{<!>},<!>!>},<o},!!!>!>},<<!>,<u{,!>},<,a,>}}}}},{{},{{<,"u{>},{}}}}},{{<,!!i!!i!!!!"a"!!!>!>,<>,<e,a,}!>,<<!!!<>}},{<!!!!!>!!ou>,<<!>},<}u!!!!!>{!!,!>,<i!>,<>}},{{{<a!>{!>},<!>">},<a!o!!!>!i"!><!>,<"i}!>!>!>a>}}},{{{{<a>,<!!!>!>e!!>},{<!!a!!>},{{{},{<i>}},{}}},{{{<!>},<>,<"'<<!,">}},{{<e!!""!e!>"iaa,a>}}},{{{}},{{}},{}}},{{{},{<!i>}},{{}},{{{{<<!>},<{a!!!>!!!>}ua!!!!!>a>},{<ea!!{i!!,!!a"}!!}{u'!>ae!!!>'>}},{<>}},{{<!>},<!',!<<,!>,<>,<{,"ea>}},{<u,o!!u>,{{},<}!!{!>},<i!!!"<!!}!>},<ieo!>!>,<{!>},<!{!<!>,<!!u>}}}},{{<!!"',u"}u!>,<>}},{{{<u!>,<!a!!o>},{<!>},<!>{!>'!!u!!!!'!>,<!!<!>,<!!!>},<},!!!!'>}},{},{{{{<<ou!!e!>},<i>},{<}{!>},<!>,<!>"''!!!>a<!!!>o!!!>ue>,<!<,'!>,<<!>,<o}!!!>,<!!!>}o!!ea}>}},{{<!>eo,a!>!>},<<a!'!>},<"!u!{i!!!!e!>,<,!!u>},<{}>}}}}}},{{{}}}},{{{<,au'!>},<oo!>,<!i},}"!>},<>,<i!!!!!>},<{!!!>!>!!o'"!>!,"}!">}},{{<!!'ia!!o{e}'!>!>!!!>",!!!!!!!!!!!<!>},<>,{<!!""}!'<"{!!!>>}},{{{}}},{{<!!!>i!!!>!>},<!!!!!>!>e!!!>,<!>},<!!}eei<i!!!!uu>},{}}},{{<>},{{<!i<!!a}u!!!>"!>,<'!!!>,!>},<<!>},<ui!>,<>},<<!>o<"!!!!e}}!!!!}!!!>!!">},{{<,<!!!>e>,<!e!i!>i{<!}!>},<}!!!>>},{{<"e""!}u"!!!>!>,<!!">},{<!!!>!>},<oo!!!>'!!e!!!>!>,<!!!>,<{iau!>},<eo'>,<!>{u{e!!"}u!!<!'o>}},{}}}},{{{{{<!o!>},<>,{<o{ee!>}"!!!>},<!!o!>!!!!!>!!!>},<!>!>,<oa>}}}},{{{{<{i!!uu',",u>},<a!>,<"!!,i,!!a!>!!o!>,<!a!!e,!>},<>},<,o<!!!>!!!>o!>o>},{},{<'u!>,<!!!!>,{<i!!!>!>},<!!i!!""{!!e}u!>},<i}!!'e!!!>{'>}}}},{{{<e!>},<,!>>,{<""a'oa<!a}!!!>!>,<>,{<!>},<>}}},{<ou!!!>,!!!>,<>}},{{{<e{!!{!!!>!!!>a!!!o!!!>!!'e!>,<}o{!>},<!!">,<,'>},<!!!,!}i!>oa!>,<i"<!!<',!o>},{<i!>},<>}},{}},{{{{<,{!!o!>i>}},{<oe!>,<,"o!>},<a>}},{<i'!',!>,'>,<o<a!>},<<!>},<!!!>"!!!!o<a>},{}}}},{{{{{<a!iaou>},<!!!!!!!>ua,!>o"}e!>},<e,>},{{<,!!!>!!!><o!>,<!>,<<!>},<!>{a{i!>},<u>}}},{{{<>,{<!>,<u'i!o!>},<>}},{{}}},{{{<>}},{{<'!>,<!>},<",!!o}}{!>},<oo!!!>>},{{{{<'}!!!>,{a>},{}},{<!!!>o'!u"!!!>,<!!!!!>!a!!!>>}},{{<'!!!>,<'"}>}},{}},{{<!!!>e,o<uao>,{<<">}},{},{{{},{{<{e!!!>{!!!>},<"!"!!!>!>},<>},{<o'!!!>{>}}},{{{<'!>},<,!!e>}}}}}},{{<aioa!>{{!>,<",!>,<!!o!!a>,{{<}!>,<<!!!!!>!>},<,'{,}!>{uiu,!!i">},<!!!>u>}},{{<!!!>!!!!!!!!!>ae}'"!ua<i,!!!>,<oe!!!>>},<}!>},<!!!>}}ui!}u>},{{},{}}}},{{},{<!!!>,<!!!>o!!!!o'!!!!!>{u!>,<!>},<'i,!!}<!!,>}}},{{{<u'a,!!!>i>}},{{{{{<!!!>}e,""!{!!!!""!>!!!>ea>}}},<!!!!",'!!!>,<!!!>!!!>!<!!!>,<}>},{{<'!!!'!>ee!>,<>,<!!}!'>},<""!!!>},<i!o<!>,<eie!!",!>e>}},{<!!!>},<i!!!>'"!!!>!!<!>},<a!!,!>},<>}}},{{{{{<!>},<u!>,<!>,<!!{'!>},<!>},<<<>}},{<a!!!!!!!>!>},<<!o<"u<a'">,<!!!>,<'<!>},<!!!e!>},<!!!>oe,!!<>}},{{{{<u''!a",<io!>,<!>'a!!!>,<!!{"!!u'>},{<'!>},<!>,<!!a!>!>},<a!a!!,>}}},{{<!>},<oa>,{{{<!>},<!!o,>}},<i}u!>},<a!>},<<<!}!!!>!"e<!!!>!>},<}i>}}},{<{>,{<!>},<!>,<}{a!>,<u!>},<e!o>,{<!{e!!!>!>,<e!,!!o',>}}}},{{<'!<<i,a!!!!!o>},{{<<"}'!>},<<ao>},{<!!o!<!!!>>}},{{{},{{<!aoa{!>,<i!!e!{!!!!e!'ao!!!>,<}!>!!!>e!!{>}}},{},{{<i!>,<!>},<!>},<!>iaeo>},{{{{<!!u}!!!!,!!!!"uo!>,<<'o!>,<!>},<'i!!!>},<">},{<ii>}},<,>},{{<!>},<!>},<>,{<u>}},{<!>},<!!!!!!'"!!!>!>},<{!!!>i!>ao!>i>}},{{}}},{<i!!'!!!>e<{o"!!!!!>'>,{}}}}},{{{{<ou!{"!>},<!>},<>},<!!!>iauiui!>},<>},{<!!}e}e'!>,<!!!>>}}}}},{{{},{<!!!>}eoei!!!>u!>},<ie!!!>">,{{{<e!o!>},<}!>},<!>!!ie!,!!!i!oi!!!>},<!!!>>}}}}},{{<}!!e!iieu!!'>},{{<!>,<!!!!!>>,<}o!!!>>}},{{<!>!!u!!!>>}}},{{<!>},<<!>},<},,!!!<'u,!!o!!i<u{">,{<!>,<}!>,<!>!>,<!!!!!>!!!>!!!!}u"}i>}},{{{{<{e!>,<e{'i!oiu>},{{{{<>},{<"e!>},<ie">}}},<uu'<{<!>,<,}!!!>!!!!!>,<!!'o!!u'{>}}},{},{{},{<!!,'}!>!!!!!!!>,o!<!!!>'!>,<>,<o}!>!>,<{!!e!!,!>!!e!>,<!>i!!<{>},{}}}},{{{}},{{{<!!eu!!{o!!!>!>!!!!!!"!!!!>}},{},{<!!!>!!!!!>'oaii!!!>e!>,<!!!!!!!!!>!!!>o!>},<!!!>a>,<!!!>'!!i}u'{e!'!>e!>'!}!!>}},{{<!!!>!>},<o!!!}!!!>}'!!!>>,{}}}}}},{{{{{},{{<}u!!!!i<e!!a,i>}}}},{{<!!<}{<<u}u!>{ioe!!>,<''!!'e}!>>},{<u}eai>}},{{<'!,o>},{{}}},{{}}},{{{{{},<!!<u!!{o!}!!!>"<!>,<!,>},{{{},{}},{{<i,!>!>,<"<!}'!>,<!{>},{<!!!>}a!>ae!!!>o!!u!!"e!!<'o{>,<u<!{!>},<{>}},{{{<{}eeoua!!!>},<!!o"'{{>}},{<u!!!>!!}!!!!!>!u>},{{{<!!!>!>,<'a!>}!>!!<,u"!>!,{e<>},{{<!!eu!e!aa"'o'"!>u"'<!>>,<!>},<!!>}}},{<,eo'}o!'{>,<ia,!>i!!a"!!!>!>},<}!a!!!>!!!!!>,<ee>}}}}},{{{<!>u!!o'!!}!!!!!>!!!>>},<e<!>},<u!!>},{{<,!>!i!!<!>,<!>},<!>!>,<!!!!ao{<ae,,!>},<>,<<"e!>!>!>,<u!!!!u!!!!!>,o!>,<o!!!!!>},<a>},{{}}},{}}},{{{{},{},{<"!"<"!,!!!!!>eau!>,<,>}}}},{{{{{{}},<o<i!!!>,!>,<a,!!!>!!!>!!!>!<<<>},{<a{ue>,{<a!>!>"i!o,!!{!>},<a!!!!>}},{<"ia,i>,<'!>ioi!>},<>}},{{{<>},<!!<,e'au!!!!'>},{},{{<i',e!<!>,<'u,>}}}},{{{<o'i'!!<{!>,<a!!o!!e!!,!u!!o>},<,!>,<<o!>,i!>>},{{{<},}!!",!>!!!><>}}},{{},{{{<!!!'',u'a!<a!!!>},<ou!!!>!!a>},{{},{}}},<}a!!!,'a',!>u>},{{<!u!!!>ia{!!o!!!>},<!>,<!!<!>},<!!!>"!>,<!!!!}i>},{<!>,<!>!!,!>,!>>,{<}i>}},{{},{{<''!!e<!>},<a!!!>e{!e>}}}}}},{{{{{<"u!>!!!!>,<a!!o!>},<}!>},<!>i!}'>}}},{{{{{{<,,!eaa!u!!oie!<,!!!>!>},<!>,<!>{u{!!i>},{<"<i,!a"!!eo>,{}}},{{},{<!!!!e!>},<'!!!!,!!!>!!",>}}},{}}}},{{{<i{}'>},{<{!!!>,,!!e!>,<!!!!!>a"!u!!!!e!>,<{!!!!!',<>}},{{<!!u!!,!<}}<,<>},{<"!,!>},<{a!>},<}}>}},{{<<!!!>}!!"!>,<}!!i""'!!!>{>,<!!!>},<!>,<{!u!!'<io!o{>},{{{{{}},{<!!}!>!'u>,{<'u!!!>,<!eo<!>,<!!!>{>}}},{{<a{o!!!>"!!!>'}e!>,<}>},<!>,<}{!!!>!!!!"!"!>!!!!,}<<>}}}}}}},{{{},{{{{<,!!!>,!>},<!>,<!>},<>}}},{<!>},<>}},{}},{},{},{{},{{<u!>},<ieo!{!!<'"!u<!!!>!!!>,>,{}},{},{{{<o>},<,>},{<<i!a{{{<<!!!>!!!!o>,{<!!{<a!!!>u!>},<,!!!!oo!!!>!!u"!>}!>,<>}},{}}},{}}}},{{{{{{<<!!!!!>i!>!oi}oeuu>},{{<,{!>!>!!!>!!!>},<!!!>!!!>!!!>!!,'!},o!}>}}},{{<!>a!!iu{!e>},{{{<{!!{!!o!,!!!>>},{<!>},<!>},<"oi!"!!!>!>},<>}},{<!>},<i!!i}>},{<ue'!!a"uu{!>,<!>},<uuaa{!"!!!>>,<ee>}},{{},{{{},{}},{{<a!!!>!!!!!!{!"{e}e!!,!>ae!!'},!>},<!!!!o!>},<>}}}}},{{<!!!>},<>},{<u!!!>!><,!!!>},<!!!!<>}}},{{<{<e!<,!>},<'i!"{!>},<!>,<!>,<ie}>,<{,!{},!>e!!!!!!!>!","ua!}!!<'!!u'>},{{{{<!!!>!>,<!!e'u"'<"!"',,i!!i}<a>},<aoie}!>},<'}o,<>},{<'!a!!{"u!e!><i!!'!!"o!>,<>}},{<!>!!i!{{o!!!!!>,<!{!!i<e!!{">,<e!o'u,!!!!uu!!!}!>},<,!!}>},{{{{<!!!>,i""{!!!>},<!a,>,{}},{{<!}!!!>,o!>}"!!o,!!>},{<!>},<"u}!>"!ae!{!<>}},{{<oao}}a"i{!!!>,<o{>},{<o!!!><a!!!>u>}}},{{},{}}},{<!>!!!><",{}!>ee!>,<!'!!!eu!!!><!!>}}}}},{{{<e}!>},<!!!>!!o!!!!{{!!!>!>"a!>!!!!!!>},<!>!!!!!>!!!>e>},{{<!!a!!!>}!!{ie,!!<!>!!<e!}eo!>},<,}>,<!!!!}!>i!>,<,!!"!>},<}!>o!"oo'o!>},<>},{{<{{!!!>ua'ei'!!<>},{}}}}},{{{{{{}}}}},{{},{{<!>iu'!>>}},{{<!!ouo,!>},<i!ii!>},<o!!!>,<>},{}}},{{{{{<}<!!!>},<"}<oa!!''!>'!oe!>,<!>,<iu>},<{o<<a>}},{<!,<!!!>},<>,<>}},{{}},{{{{<!ua""<o{<!!!>!>},<'i<"!",>}},{<a{!!!>,!!i!",!>,<!!i{>},{{<a!>"{aia<!!!>!!!>,<u'!!u,>}}},{{<i!>},<!{!!!!!>},<,,!!}'!!!!ae"!>,<"i!>,<o}>,{{{<,!{o<!>},<!!a}}i>,<!!'!>!oi!!!>!u<'"e!!,{i>}},{<uu{!e!!!>}}a!,o!!a!{a>}}},{}},{{{<{!>,<!!}i!>,<}{!!!>!!!>,<i"!>,<oi"}'>},{<o!>,<!!!!!!!>,!>},<!<!"!!<!>!!!>e,>,{<!>},<!!<o!!'<}i!>!>,<u!>,<!>},<!>,<!>,<!a!>,>,{}}}},{{},<aee}}u!!<}!>i!>,<>},{{{{{},{<!!!>!!"'{!!,'}>}},{{},{<!!!<>}}},{{<'a"!>e!>},<',>},<io,,a!!!>!>,<i!e!!,!>,<,,eu!!!>!!u!>,<>},{{{{<,!}<!!!!{!>,<{!!!><ia}e!>},<{}e>}},{<!!!!!!{a,>}},{{{{<i,e!!{!!!>"o{uu!>},<>},<!>},<!>!!!'!!i!>!"a!!}!>,<"'!'!>>},<{!!!>,<!!!>a!!!!{""!>"!!"'u!!!!!><!!!>>}}}},{{<!!}!>,<!>},<'!!"!"<!!,<!!!!!>!>>},<!>{}!>!>},<}}"ao!!!!ua!!{!><">},{{<!!!!!!ou<!!'u!>!>},<!>,<{!>!><>}}}}}}},{{{{<'}u!>,<{!!,}!>},<'!"'{!>},<!>>}}},{{{<{a!!!>u!>!>!!!>ae}!>!>},<{!!ua>},{{}}},{{<,!!!>},<!>!!!>>},{<}!!!uu{,!!!!i!>},<{!!!>},<ie<!a"e>}},{{<ou{!>!!!>a!!}!!>},{{{{}},{<!,u'!!!>,<u!>,<ui,}u!!!'!!!>{a!>a>,<,,"!!a!!>}},{<!!!>!>},<o!!{!>oa!!{!!!>a}a!!{>},{{<!>},<a>,{<!!o!>,<!"}!!'!!a",!a!>,<i!!!>o!!e!>,>}},{<,!>},<"{}}}"<!>},<!!e!!!e!!!>,<!!!>,<<!>},<>,{}},{<!!iao!>},<}!!!ea{!!!>,<'uui>,<i"!!!>!>,<u!a"ea!!!>,<>}}}}}},{{{{{{{}},{<,!>},<a{!>},<eoei<<o>,<>}},{},{<i!!!>!>!!!>ii!>!'<!!!>"},},!!>}},{{{{{<,,!i,,ae{!!!,!>!!!>},<!,!!o!!}!!!>}>,{{<}!!!>!!!>'!!!>"!{{!>!!!>>}}},{<!!a!>,<{oia}ueue!!!>eai>}},{{<!>},<!}!!!>!!!!!!ei!io}!!!>!!ue>},{<}!!!>!>i}!!!>,<!>u!>,<!a!!!>!>,<"o!>,<!>,<a!>},<!>,<>}}},{{<!>eo,o!'!!!>'<!!e>}}},{{{{{<!e!>!>,<!!<!!!>!!!!!>}>}},<!>!>'}}!!!>!>!>,<!>!u>},{<!o!!!{>,<!>},<'''!>},<">}},{<<,iiu!'iu!><>,{<,!!{e!!!>o!ai'!!'!!!!{a!>>}},{{<a},!>},<!!!!!><,i{!>"}>},<'<ui<!!a!!''!aa!!!!!>!!!>u'ao!!<!'>}},{{{<!u<e!>,<'{"a'!>,<!>},<!!!>>,<!i'>},{}},{{<'!,e!>},<!!>},{},{{{<<euu!>,<!!,!e!>,<!!!!},!>},<a}!!!!!>a{>},{{<!<ee!>},<o<{i!!}!!!>'!u!>,<>},<}!!!!eai!!!>,<e!>!>!!!!!>>}},{<!!!!!u!!!>!!a{oo,i>}}},{{{}},{},{<!!!>,<{'a!!'a!!!>{<!<e!>},<!!'!io>}}},{{{<i!!,!!e!!aee!!!!!>},,!!'>},{{},<e"o!!u{!>,<{!>},<,>}},{<",!>,<'!>,<!!!>!!u!!{'{!>},<}!!{!oa!!!!e'!>>,{<!>,<!>},<!>,<uie!!,!>,<{!>!!!!!!!>>}},{{<>},{{<!>,<!!a!}!!o'!>!>,<>}}}}},{{{{{{<>}},<u{!>},<e'!>,<,!>},<>},{{},<>},{{<',!,ioe!>u>,{<!>}o!>},<}>}},{{<{a'e,i!>"u>},{{{<!>},<!!!>,i,eo!!!!!>},<eo!>>},{}}}}}}},{},{{},{{{{{},{<a!!a!!!>,<e{>}}},{{<>},{{{<!>},<>}},<<ea,},!!!>!>!!"{,uei!>},<}>}},{<!!',eu'"a}!>o'}!<!>!a!!o!eu>}},{<>,<!!!>>},{<!,!!o!!!>,!,u!!}'!{ee!!i!>,<!!!>!!!>!>>}}}},{{<uo!!">},{<!!u!a!!">,<!!!>!!,}o{>},{<iuoa{!}u',{!!,}'!>,<>,<!!!>!!a!>!!!>u!>,<!>},<!>,<!'!>,<!!!!!><!!!>},<!!<>}}},{{{<!!!>},<!e>,{}},{}},{}},{{{{<,e!!,!>,<!>},<,!!!>a!,!!'ie!>,<o!>},<>},{{<e!!'i!>},<!!!>,!e!!!>!!!e"}uu!>},<u!i'>},{{},{{{<o!><!!o<"!'!!!>,<!>},<!!!>!!!>e'u!!!>o!!u!>},<}>},{}}}},{{{<!i<!i>,<{'!!i!>,<>},{{}}},{}}},{{<>,<,<e!!!>,>},<{>}},{<!!!>,<e!>,<<!!,!<!!,ou>,<!!!>o'!!!!!!!>"a!!eeu!o,!>},<o<>},{{<!>},<!!,!!,o,>},{}}},{{<!>,<'o>},{{<aeei{o}i>},{}}}},{{{{},<>},{<{!>},<!!!!!!<!!'e!>'e>,{{}}}},{{{{{{<!>,<e!{!>,<i!u!!!!<!>,<!!!>>},{}},{<oo">}},{{},<',i!!"<>}},{{{<!>,<!!,u,u'}i<!>},<!!!>!!!>{!>},<!i>},{}},{{<!oe!>}'iou!{u!!!!!!}!<!>u<a>,{<{!!'oa}!!!>!!!!,ii!>,<oa!!i!!a>}},{{{<{a}o}!,!!!!!>,<'}{>}},{{{<!>!!i"eeeuo!>},<<aa!{!!!>!!!!!>!>,<>},<{!!'>},<!>,<<<a!!,{'!!<>}},{{<'!>ao!{u!!!>"!i{}i'u,},>,{<!!!>!!iuee!!!>'!!!>,<>}},<!!!>!>},<!o!>,<e!!!!"!>,'e'a<!!}>}},{{{<eou!>o}i!>!!u}>}}}}},{{{<!!}u!>o!>,<u!!u"u!!a",a!>,<>,{}},<}}"!>,<o!>,<!}'!>>}},{{<>,<!>!>'!!!>!>!>,<!!!ai!,>},{<}}!!!><!>!!!>!!!>},<!><!>!!{!{!!}o!}>,<}i!!"!!!>,<,,!!!!!>>},{{<!!!>'!!}!!!>!!!!!>>}}}}},{{{}},{{{{<!'i!>,<ae>}},<!aa!,">}}}},{{{<!!a,"!iu!!e!"'{>},{{{{<uu'i<!!!><!>!>}uieo!!!>!>,<"o>},<}!>}!>,<>}},{{<!!!>'<!>,<!>},<ua{!>},<i!i!}!!i>},{}}},{{<!!u}!!!><a{!u!>"o!!!>!!!>",e">,<{}i!!!>!!!,!!u!!,"}!>,<!>,<i>},{<!!'o!!!!{>},{{{{<!!!>a!}e!!e"!>},<!><!o>},{{<"a""!>},<!!!!,!>}!>},<}'!!u!!!!!>!>},<>}}},{{},<}>},{{<ioo!!u}!>},<<{"!!!!ui!!{>},<"!iui!!!>!!!>'"!!!!,!!o''!>},<}u!!!>{>}},{{},{<a!!oi>}}}}},{{<"o!>},<,!}!!!>"<ao'>,{<e!>,<eu>}},{{},{{<<}!!o!{!i<!!!>,<!!!>,!>},<o"!!!>!>},<!>,<>},{<!!"u!>,<!!oa"'!!!!>}},{<!>},<o!><<<,>,{{{<!!!>{!!'u!>,<!!{o}"!>},<!>,<>}},<!!!>!!>}}},{}},{{<!!!>},<,!>ei'!e!!!>},<u,u!!!>'aui>,{}}},{{{{{<!>,<"oia!!e!!!>!!{!!u!>,<>,<!!>},{<!'!i!!!>o!o{>}},{<',!!{",<>,{<o!!<}'ii!!!>!>},<''!!!>>}},{{}}},{{{},{<!!!>{{!!!!!!a,e!'<!>,<!!!>!!!>u"i!,i!e>},{{<{<}>},{<!>,<!>{>}}},{{},{<i!!},u}'!<>,<!><o!>>},{}},{{{<a!!!!!>{!>,<o>,{<!!!>!>},<!!'a!>ii!!!>u!!oa}}"">}},{<!ai!ua!!<!!!>,<<e}a!>>}},{<u!ea"ue,!!<!<,>,{{<!}"a!>>}}},{<oa!!!>,<{!>},<e!,!>!!!!<u!!i}!>>,{{<,{{"!>},<<!>,<!>u!>!>},<}'{!!!ao>},{<!!!>},<>}}}}}},{{{{<{o'oi!>,<o!>},<ue!>},<ao>},{<!>,<a!!ia!,i}{!>,<!!!>>}}},{{{<!!o!>,<o!>},<!>},<,,{!>},<i!>u!>,<i}>,<e!!!>,<!>,<'!><a<e!>,<!>},<e,",!{!!!>,<i>},{{<!>,<"!>},<!!}!!!!!!!>!!aa!!o'!>},<!>},<>,{{}}}}},{{{<<ea!!!!}!o!!,!!,!!!>!>i!>,<"''!>!!}>,{<,,!!!!!>},<"!>!!!!!>,<o>}}}},{{<!>},<u{!a<"!!>,{<}!>,<}'e!!"<!>},<>}},{{<a!!'}{!>},<{!!!>!!!>,oa"!>,<}''!!!>,<!!}u>}},{<!!'!!'a!>},<!!!>!!!!>,{<!!!>},<{a"u}!>},<!!,!>,<i>}}},{}},{{{}},{{<"!>},<!!,uii"a!>},<a!>>},<aa!>>},{{<!!'>},{<!>!>,<e!!a''!>"!!!>o>}}},{{{<!>},<u'<'!>,<o'"!>,<,"a!>,<!!a!{!>,<!!>},{{{}}}},{{},{{{{<}}}!!!!!>,<!iiue!!"!!>},{}},{<!>!!!!!><!!!!!>!a!!!>!!,<!>},<<aa'!!<u!>,<!">},{{},<>}},{{<e!!!>a<{!!!!'}!>oi!!<!!!!!}>,{{{{<!>}}a"!!,"!!!>!>,<e!!i!!!!!>a'!!e>,{<>,{<{ue!!!!!>!!}!!!>o>,{<!>,<!>}!>!<!>!>},<!!!!!oa!!!>!>},<!>},<}<'>}}}}},<!!"u>},{}}},{<>},{<ii}!!!>}i>}},{{},{<}!>,<!>},<<">,<!>{>},{{{<'>},<>}}},{{{<!{ia!>,<a!!<'!!!",<!}e>}},{},{{{<'u}>}},{<}i!>},<}<!!o}'a,}!>!}!>i<>}}}},{{{{<>},{<!i!!"!!!>},<"!!e}u!!!>},<'!!>,{{<o!>,<!!a"!!<!>,<'!>,<,}!!!!!{!>a!!!!ea>}}},{{<!>,<<!>},<{ao}>},<>}},{{{{<uo!>,<>},{<}<!!>}},{<,u!>},<!>,<}i>}},{{<a!>,<,!!!>o!>!>},<"{oa>,{{<o!>,<!!!>,!{!>},<"}i!!!o!!!>>}}},{<,o!!!i!a{<!>,<!!!!"!,!!!>>}}}},{{<e!!ai!e,!>>,<i{,e}e!>!>},<!!'!!a<>}},{{{<i!>},<!>,<!>},<!!o>,{<"!!!>!>,<>}}},{{},{<!>},<<i>,<<!>,<oi!!!!!>!a!>,<!'"!>,<!>},<"!!!>{>}}},{{<eao!>},<a{a<e"!>!>},<>},{{{{<!!!>!'!!!!!>e!>},<!!",>},<!o<!!!!!>,!!'!!!!,i!>o!!!!!>{!'"u}>}},{{},{{{{<i!<!!,!!!!!>!!!>>}},<!!!>!{}a!!!!!>},<i",>},{},{<>,<{!><o!o!!!!!!!>i"uo}o!!"!!{>}}}}}}},{{{{<,e!!}">},<!>},<e!>,<u!!!>,<'!>},<<!!u!>!!>},{{},{}}},{{<<!>,<{<!!!u>},{{<!,!,>},{<<!>},<}a!!{!><>,{<e!>!>},<,oai!>!>},<!{>}}},{{<"u!>,<<!>},<i!>,<i'<!>!!e!{!>},<!!i,>}}},{{<}!!<!>},<i!!!!<<!!!>,<!>,<!!i!!!!!>!>},<!!!>},<ao,!>},<>},{<i!!!>"a'!!}!!{"{>,{{<!!u!!"!>,<'>},{<!!""u!e!!!!u!>,<io!>,<"u!>,<{'">}}}}},{{<!>!!<oe!>!!!>'!!,<!!<!!!>}!>>,{{{}},<!!!>,!!!>!>"ii>}},{{{<'u!!!>!!!>,<>},<u>}}}}},{{{{<i!!!{,!"!!o"i}!>,<!!!{{>}},{{{}},{{{<ao!>,<!}'!}"e,o!!!!>},<!>!>,<a{e,a<!!!>",'oe<>},{<ae,!!oue}>,{<','a!!!>a!!<!iu!a!!u!!!i>,{<}!!,!>},<!!!>,a>}}},{{<}>}}},{{{},{<i!!o!!!>"!>!!ou!}i!!oo!>},<'!!!!!>>}}}},{<!>!!u}!>,!>i!!!!!!,"!!,!>},<u!!,'>,{<}a'ua!>o!>},<!}!>},<!!u>}}},{<!>,<!!!!!>},<!!e!o!>'!!"!>,<>,{<eu,e!uiioe{>}}},{{{}}}}}},{{{<>,{}},{<o!>},<'>}},{},{{{{{{}},{{<!>},<!!,'ii!>,<!!o,!>},<"!!i'"u}a!"e>}}},<!,<i>},{<!"!e"''!>,<iau!>!>},<i'>,{{}}},{{},<!!!>,<ea!>,<!a!'}<!!!>,<!!!>!>},<!!!!!!!,>}},{{{{<e<e>},{<>}},<!'au!>!!!!!>!>,<'!!',ea'!!o!}}!!}>},{{<!!!>a{!!,!!""oue{o"!>!!}>,{}},{}}},{{{},<a"!><a!!u!>!>,<u{!>!!">},{{{<!!o!>},<ao,o!!!>,<,i<i>}}}}}}}},{{{{{<"e}uu!!,!!i!!!>!>},<"!>>,{<}<!>!!!>!>,<i!!{!!",a<!>},<!>},<!o!>o>}}},{{{{<iuu>,{{{<,>},<!>},<e!>,<}!!!><o!>},<o!!!!}>},<{a>}}},{{<!!!>ie}i<!"a{!!i>}}},{<!>u!e,e!!!!!>e"e!!!!!>ue{{!!"!>},<u>},{{{<,!a!>!,!>},<,,e!!,!,<ui>},{{<auei!!!>{!!!!!!>},<!!!>'}!>,<a!!!>e'"o!>!>"{ou}}!!}>}}}},{{{<!>,<!!'u!u!>!!!>!>,<!!,!!!>i!>,<o"!>,<}>,{}},{<>}},{{{<a'o<!>,<i!'ia!!e!!!"!!!>u'!o>},{<}!!e!!!>>}}},{{<e!>!>},<>}}},{{{},{{{{<!!!!a!!!!!!<u>}}},<'!'<!au!!!>a!<'{e,,!!{a'!!}>}},{<,>,<!!!>!!>}}},{{{{},{<>},{{<!!!>},<"!}{!!'{!!!}e"o!>,<}!>!}ou,!!<>}}},{{<<}!>},<>},{{<!>!>,<!!!>o,""eu!!'u!!i>}}},{{<!>},<iu!>,<e>,<!>},<',o,,{a!!!!o<!<e!>,<>},{{<'!>,<o!>,<!>,<>},{}}}},{{{{}},{{<}!!e!!}!}}!!!>{{>}}},{{},{{{{{{<!>"iu!<!!,i!!!>>},{<u'>,{}}},{},{}},{{<o<}u'e!>,<!!u{a!>,<eaoa>}},{<!>},<{i!>},<o>,{<,!eo!!}>}}},{{{{<!!!!!!!!!><!!!>>},<!!!!!!e{}!>,<!>,<{!,e{}aoo!!{{}>},{<!>},<u!>},<!!!<'>}},{{{},{}}}},{<!!ue!>},<!!""}{!!!>,,{a!{{!!"!!!>,<e>,{<ou,,"}!!!>!!!>!!!""!>,<o,e!}"!!!>a>}}}},{<e!!!>!>},<!>},<u>,<u'!>},<"a"!!!>,!!!>>}},{{{},<eoeo'<eiaa!!,,>},{<!!,!!!>{!!!'!>},<{!>,<ou!}!!!>,'!!!!o>},{{<o!!aa!>!!!>!>,<"!'!!!>!!!!{"a!!!>io<!>},<!>},<>}}},{{{<o"!!!>!!!>},<e!>},<o!!a>,{<ieoie!>,<u!!a!>">}},{{<!!!>!!a!>,<a!!!,!>},<!>},<u!>u">}},{{{}},{<io!!i!>,<!!e{aa!>},<>,{{<!>},<!!!!ui!!,!>!!!!{o}}!>},<>},{{}}}}}},{{{<"!!!>!>,<!>},<,a!'}!!}!>},<u"}!!,>}}}}},{{{<a'"<>},{{<!>u!>{!!i>},{{<!>{!!!>},<o!o!!"!>},<e}i!!!>o>},{<aei<e{",!!>}}},{{{<!!!!!>!o!!!>!>!>},<u{<!!}i!!!>,<!!!!<"'ei>}},{<{e!>"!>,!a!!!>,<!!!{!!!>!!!>{<!>,<!!!>,<>}}}},{{{{{<}u>},<i"!<u}!!u,!>,<>},{<!!!>!>},<}{!!"oeu>}},{{<,"'u}!>!<{'o>,<{!!}!>,!!!!!!,!>,,"!>,<!eu!>},<!>},<<>},{<!>},<'!!!>!>!>},<}<!"!><oua!<'ou>}},{{{<>},<>}}},{{{{<ai!>,<}''!>},<o!"i!>>},{<{!>u!eu{!!!>}'e>}},{<,{!e!!}!!!>,<,i>}},{<!!"i{{>},{}}},{{{{<ui>},{}},{{{}},{{<<!>,<{!!a<!>},<!!!!"a!!!>},<e'!!>}}},{{<u!>},<i!">},{{<e,!}!aea!"!'!!ea>,{<a!>},<!>,<o!>},<!>,<!>>}},{}}}},{},{{{{},{<"!!e!!"!>},<"}!><{}"!>>,{{<!o!!!>uo!!,o!!!!io!!!>'>}}},{{{<a>}},{<e,,!>,,!!i<!}!!{!!!!!>!>e!>},<u>}}},{}},{{<!!!!!!">},{{{},{<uo<!>""!>,<!!}"!>!!!>i!>>}}},{{{<!>,<e!>o!!!>o!>{,'u}!!u',!>},<}>}},{}}}},{{{}},{{{<<!>!!!>,<!>>},<{i"<uu{a!!a!}!>},<!>},<!!!}}>},{{<oaa!>!>},<'>},<!!!!aie>},{<e!>,<u,}<!>},<{iu}'!>}!!<'i>,<oea!>},<!><!u}<a"!>{>}},{<>,{}}}}},{{{},{{{<e}e<u>},{{<a"!>!!!>!!!>'>,<{,'!>!!}!>u<}!!,!!i!!!ei}>},<a!"!!!>>}}}},{{<'!!!>!!o!>,<}',!>o<o!>},<!!i>,{<!>,!>},<>}},{<{!!,!!{<ouu>}},{{{{{<o!{!}!i!io!>!!!!e!!!>!>!>!!!>!>'>}},{}},{<!!!>>,<!!!u!>""!,!>},<i}!>},<ou!>!>{,!>'o>},{}},{{<ua>,{<!!!!!>a,!}!>,<!>iaa>}},{<>}},{{{}}}}},{{{{{<!!!>!>},<{e>},{<!>,<!>,,<i}!!!!!uu,!!!>>,{<!i">}}},{{<!,!u>},{{<!>},<"uoa<au!!!>a!!,}>}}},{<!!aa}!>,<!>,<au!!!<o>}},{{{<!>!,!!u!!!>'<!>,<,!>!!>},{<!!e!>uo!!'ai{a!>>,{}},{{<o{!><i{!!!>!!!>!>>}}},{{{{<!>!>},<a!}!a!!!!>}},<!>},<,<'o!!!!,uiu>},{<!!e}{"u!!!i!>},<!!a!>!!!!!}'>},{}}},{{<!!'!!!>,!""!!!>,'!>},<{o!!}!o<>,{<"o!!"!!uu>}},{},{{}}},{{},{{{<!>},<{!!!!,!>,<>,{}},{{<oie!!i!eo!!!>{!>},<<<>}},{{}}},{{<!>},<!>!!ae!>,<>},<!>,<!{!>!>!>},<'i!!>},{<i}!!!a!>u!<'>}},{{{<!!aee!!!>!>,<!!!>u"}!!"!!i!>!e,i!!{,>},<e'oa{!!e!!}'a!!!!!>>},{{}}},{{{<a!!e!>{,i"i!!!>}!!"!!!!!>},<uu!>},<">}},{<!>!>},<!"a}ee"!>,<{!>,<,oe!!!>!>!>,<!>>}}}},{{{{{<!>,<{!!o>,{<{,!>e}!e!>,<>}},{},{<!>},<<!>,!>u,!>,<!!!!!>ae'>,{<!>},<'!!o!>},<!!e}o}!!!>!>,<e!>},<'i{!!o>}}},{{{<"!!{}"!!,,!>},<i<"e}>,{<>,{}}}},{{<u'<!!'!>},<!!!>>}},{{<!>e!!!>},<!>,<!!!>i!>!>},<ae,{u!iu!!!>u}!!e>},{<!!!>a'i!!au!{u!>},<!>},<o},u>}}}}},{{{{{<!!!ee"!>},<!>,<a!>},<a!>a!>},<}<!!"!!!>>}},{{<!!!u{<",ao!!u,!>,<'!!!>},<!!!>u>},{<ueea}!!!>{!!!!!!!!!!!>!>},<!!>,{<!!!!!>o'>}}}}},{{{<'!!!>!>o{""<i"}!"!>},<!!e!!!>!>},<{>},{<!>!!u!>},<!!,'u!>},<!>"u!>"!}!>{a!!!>},<}>},{{<!>},<e!!!>}"i{>,{}},{{{<a'!>,<,o!!!>,<e'}>}},{<!!u'!!<,e{e!><i!!!>a<>}},{<o{!!'!!!>!!{}!!<{}!>!>,<!!}>}}},{{{}}},{<!>o"u!{u"{!>,<'!!!!!>!>!>},<>,<!,a<{!!!>!!,i!>!>},<e<<!>a>}},{{<,>,{}},{{<!!o"!!!>>},{{{}},<ea">}}}},{{},{{<!!eeou{!!!>ai!>,u!!!>,<!}'!>,<!<{>,{<!!!'!<e>}}},{},{{{{<u!!!>u!>,<!!'!>,<}a!!,!>},<i!>,<>},{}},{<i{!>,<!!!>{!>!>},<!>},<{a>,<oi!i{!>o!>!!{e!>,<}!!!>>}},{},{{{<>}},{{{<!!!'!,!>e!>o<e!>i!>,<>}},{}}}}},{{{{{{{{},<!>},<o!>,<!!'eo!!!>},<!!i!"!>,<!!!>!>ie"ae>},{<!!{au!{!!!i!}a!!!>,<o!u}}!!!>!!!>,<!!!>>}},<ui!!!"","'}!>,<,!!!>e!!,!>,<!>},<!!e!!!>,<!!!!i>},{{<!>!!}"e}{!oe!'}!>!>a,>},{<!{!!u!>},<>}},{<!!!,!>,<o!!!>'''!{!!!>'!!!!!>"!>},<!!>}},{<o!>,<o"i'!>!eo>,{{{<u!!!>,,!!!>!>!>,<!>,<>},<!}!!!>e!a}ao!i!>aau,!!!!!>e>},{<!ee!o,}!!!!!>>,{<!!">}}}}},{},{{},{<!!'a!{!!!>!!{,!>!!u}!!!>,<>}}}}}},{{{},{{{}}},{}},{{{{<uu!i{}!>,<'!i>},<{aa!>,<<e!>},<<!>a!>>},{{<<a<ue!>},<o!!!!!>},<{!!eea!>,<>},{}},{<!>},<"eo!!!!o,a!!"u!!>}},{{{<}}!>,<!!o!>},<e>},{<!!!!ao!>,<!!!!!!!!!>!>!'e<<<!!!,o,!!!>!>,<>}},{<}},'!>e!!!>!!!>!a}<!>,<!!!>e}!>},<!!!>>},{<,e>,{<!>,<eu}!!!!'e"!!"!i!!!>o!!i!>"!>>,{<'}o!!u<!!!>!>},<<a<!>},<!!i<{!>,<u>}}}},{{{{{{<!>!>},<"io>}},{<'!e{!>!>},<!>,<!>,<ii}>}}},<u!!"!!!!!>,<i'e!>},<'i!!!>i{>},{{{{<!>,<a<"<{>},<u!'!>},<!!!!}{!>!!!>!>},<o>}}}},{{{{},{{},<a!!!>!o!>},<i!!!>,<'"e<}!!>}},{{}}},{{<{,!!!,!!!>},<"!>!!!>},<!!!>"'"'!!!>!!!>!>,<>}},{{},{<!!>}}}}}},{{{{<aao!!!>,<'{u"u>},{<!>},<{!>},<i!>ii!>},<!>"a<i!!>}}},{{{{{}},{<"i!!{>,{{{<!><!>},<a,,!{!!!i,!!',,'ae>}},<euio!iu!!!>!!""!>a!>},<"oa>}},{{},{<!!'}!>,<<},!!u,,!!!>!!!!,!!!{',{!<!!o!!!>>,<e{!!>},{{<<!>},<}"">,<a'<!!ouo!>,">},{}}}},{{{<{{!!"!>},<""{!o!>},<!>,<!!!>!>i!!!>!>,<}>},{<!!,"!!!}uu>,{<i!!u<!>},<uo!>,<!!ia!>,<>}}},<!!<!!a<!!!>i<!!!!!a!!ouo!!!!!!!>e>},{<o!{o}o!!!>,!>},<aa!',!!>,{<!!"!!!>},<!>i{>}}},{{<!>!}!>a'>,{{<"a}'eo!!!>,!!!>,<{",!>!>>}}},{},{<!!i!>!!}>,{}}},{{{{{},{{}}},{{}},{{{{<!>>},<}ao!!,'!!u!>,<'}{!!!>o!>},<<!!"a>},{{<e!!i!!}'!!!!!!!>},<!!!!!!i{eiu!>},<!!!>!i!>},<<!>!!!!!>!>,<>}},{{{{},{}},{<!!uo!>,<"!!e!!!!!>,'!!}>}},{<!!}!!!>!>,<>}}},{<!!e"!uuu>},{{<,>},{{},{{}}}}}}},{{},{{<,{e!>},<!,!!ue>}}},{{{{<{!>},<>,{<}"!>!>,<!}"!>,<!!!!a!>},<ea!!!!{>}}},{<!!'o!!!>u<>,{<!i!{>}}},{{<'oa!>},<>},<iio!>!>,<!<!>,<!ie!!{"<}<!!!!!>!>},<!>>}},{{<!>,o!!oe!!{!>,<"e!!!>!>>}}}},{{{},<!>},<}!!a!!!>e!!,!!!>,!!!>!>},<<o!!i!>},<>},{<!i!!!>!>},<!!!!!!!>,<<!!"!!!!a!!!!!><u!>,<>,{{<'''>}}},{{{<!>o'!>i{!>},<!>},<a">},{{<!!e>},{{<>},{{{<"<!!iia!>,<a<a!>},<!i,!>!!!!o!>},<!!!>,<u">},{<}!!,!>ii<!>,<o}io>}}}}},{{<!'"!<"!!!>,<!>!>},<!}!!a!!"!e<u"oi!>,<>,<!!!>,!i!>},<'i>},{<<o!!'oiue!!!>!eiu}!>,<!>},<!>},<>}}},{{}},{{<!>},<!!!!!>>},{<!>,"!!!!!>!i!!!>!>!><{ae!!!>o!>},<>}}}},{{{<!!!!!>}!!!>u"o''"!ai!>,<!!!!>,{{<!!!>!!!!,!>},<{!>,<!>{<eo{,!!o!>},<'i!<'>},{<!!!>>}}},<!>,<!!!>i>},{{<!!!!!{,iu!a{!>!!!>"!>},<a!>a>}}}},{{{{{<!!!>,<!!!!"<"!!<!a!>,<'!>,<<u!>,<">},<!>,<!!!>},<!>,<e!!!>!!o!!o!!!!o!!!!>},{{<'u!>a!>,<>},<!!!>!i<o!a!!!><}aouu'<,>},{{{<!!!>"!!!>,}ea!!}!>!><!!'"!!<{>,<e!!!>!>!a<!!o!!!>i}!!}>},{{{<!>},<!">}},{<,!!!!!!!><>}},{{<!!!>},<'e>,<i!>,!i,!!!>ea>},{{<,>,<!!!>o!u,i!>u!!!!u!!!!!!!>},<}{!!>}},{{<}!>,,>}}}},{<i}}iu}{!>},<!>{<u!!!!!!o'>,<}<!!<<<,!>,<!<!!"u!>,<u>}}},{{{<!>},<!>},<!!'!>,<!!o!!oa!}!>!>!!!!"{>}},{}},{{{<<!>e!ooa!!!>},<<!!!>",!>},<!u{!!!!<e!!<>},{<}}u{!!"!>},<"!!o!!!><!<!!!>,<e!!!>u!!a!!!>},<>}},{{},<a!>'{"!>},<}!>,<!!!>"e>},{{<!>},<>,{<oe!!!>!!u>}},{<!!!!!>},<!>,<!>!!i!>,<!>}},!!!!e",>},{{<}!!!>!>},<!!a'oi<>,{{<"ou!!{{!>,<''euu>}}},{{<i<<o>},{}}}}}},{{{{<uu!!!>,<!>,<e!{,!>,<!!!!!>'!!>}},{{<o,>,{<{}oe}!o!>!!!!>}},{{}},{{<<o'!<!>,<{{,!!!>},<'e!!!!!!,!!!>!!!!!!!!>}}}},{{},{{}},{{<ai!>},<}!>,}<!!"e<!>,<!o>}}},{{{<<}o!!!>!}!}>},<"i"ei<}!!!!ae,!>,<!u!!i!>!!u>},{{{<!!!>"{o!!!>!!!>ii!!!!!}!!"!!u!!!>,<!!!>e!!<>},{<uu!>'ou!'""!"i!!!>,>}},<!o!>,<<!!!!<e!>},<"!>,<>}},{{}}}}},{{{{{},<'e!!'>},{{<!!,!>!e,!>},<,'!>},<!!!!!>!!!>},<,!!a,ie!!o!>},<!u>,{<a}"!a!>!!!!!>!>},<eao!>!!oi>}},{<!a!}!>o!!!>e!>,<!!!>,<!!!>,!!a"!!,{a,>}}},{{<!!!>a!!!!!>!!!>>},{{{<!!!>}!ueae!>!>{o!!!!!>!!"!!!>!>!ua>}},<!!!>}>}},{{{{<'u,!e!{"!!{!!{"''"a}{u!}>},<!!!oo'!>,<!!!>},<!!!!!!!>},<!!!>},<!>},<o!}!!!}>}},{{{<i!>,<!!!>ui!!!>!>}i<e>},{{{<!>,<!!e!>},<"!,'!!!!aa'!!!!,>}},{<u!!"!!!>!>},<!!!>{!!!!">}}},{{<'u!!{!}{>,<!e!>,<}e}!>},<>}},{<ea!!'!>!>,<o}<!!!!!!",e!!!'}>,{<>}}},{{<{!>},<o!!!>,<,>},{{{},{<u,e!!!>},<{u!>,<'au>}},{{<{a!o,!!{<!!!>{"!>!!!>!>},<'{'<>}}}},{}},{{{{<!>{!>,<<'ei!,!!!>iu!>e!!!>!!>}},<!>,<!>},<!!o'}}u!!!>,<!>!!!>},<eu>},{{<i<"{!"}!!!<o>},{<ao!!!i!!}!!!>!>!<oae<>}},{{{},{},{<}"!>,!!}'!>},<i!!!o}!!oo!!!>!!!>i!!>,{<<!!<e<!!!!!!eo!>},<!!o!a!!!>ei!!!>!>,<!!','<u>}}},{}}}}},{{{<}>},{<!!!>eu>,{<ui<!'!!{!!!>!!!>},<o!!!>o"u!!>,<}!!!>i!!!!!!!>!>},<!<uo<''!!,ii>}},{{},{<'e'!>!>},<!!!a!>!!i!!!>!!!!<!>"{<}>}}},{{<!>,<{i>,{{<a'!eu!>"!!!>>}}},{{<!>,<o!!!>,<o<!e}"!!!>!!!>"!},,e>}},{{{{<!>,<>},{<!!a!>,<u!!<,!!o"!'{>}},<!>!>,<o"<!!!,!><<!>u>},{},{{{<e!>,<o!>,<,!>,<!>,<>},{}},{}}}},{{{{<>},{<uo>,{{{<!!!>o!>},<}e}a"{e!!!>,<!>,<u<"!!"!>},<>}}}}}},{{{<,!{>}},{<o>}},{}}}},{{{{},{{<<!!{!!!>!!!!!!!>!>},<!>},<!!a!!!>},<,!!!>'!!!!!>,!!!>''">,{{},{<{}{'!>>}}}},{}},{{{}},{{{<>}},{<a"{!>},<>}}},{},{{{{},{<!!!>>}}},{{{<!"!>},<!!<<{!>,<!!a>},<{aoi'!!>}}}},{{{{{},{<'!>}!!!>,<!!!>i!o!!!>i!!!>},<"!>,!>!!{!>,<o>,<i<!>,<!!}",>},{<i!>},<a!>!!e>,{<<!}{!>},<!!!>!!!>!>,<!>},<!!!!!>!>!!>}}},{{<!!{"!!!{!!u!!!>'!!!>!!e!!!,'>}}},{{{}},{{{<!>},<>},<}e!'i>},{{{<!>ue!!!>},<{uu!!!>}!!{'>,{{<!!!>!e!>,<ooa}ou{!>''!}",!a'>}}},{{<i!!!<}u!!,}u!!!>"!!!>},<}{!!}>},{<!!'o,!>},<o}}',!>},<<!>},<!!,a"!>,<!"!>,<a>}}},{{<i{}o!!>,{<}i!!!>!>,<!!!>!!,!!!>{>,<!>},<!>,<!<!!'!!!"}!!!>e!>,<u<>}}}}},{<!!!u,!>!>,<u>,<e{!!!>u{eu!>},<!!<<!>,<u>}},{{{<!!}!>},<'!!'ii,"!!uu!>!'e>}}},{{{{<!a<'!>,<,>},<>},{<!!,}>}}}},{{<aoo,'!>!!,!>},<!i!!u>,{}},{{}}}},{{{<{!!'e!!!>!>},<!!!>"o!!,!>},<ooi!!!><>},{{<!!!!!>},<ee!!!>,<'!!!>a{!!,e!!!!!>a!>,!<!i!>,<>}}},{{{<ua}!>o>,{<!>,<!>'a{!!!>,<!>>}},{{{<,oiu{!!!!!!!>},<eo>},{<<e>}}}},{<!>},<""!!!>!>,<,ooe!!{!!!>},<!>,<>}},{{<i!!!><>},{},{{{<!!e{!>,<!!o!!!>,<e<!}!!"!!!>!>},<,>},{<!>},<!!oo}!a!!!>!!<'u>}},{{<e>},<>}}},{{<!}{a<!'}"a!>,<a!!o'i>,<!!!>},<!!!>i"!!!!{!!!!}ao!>},<}!!'i!!!!!!>},{{<!>},<!!,!>a!"!!u!!"a!!e>},<o,e!>,<!>,<}!!e!>},<!!'a,ii!o!>},<!!ai">},{{<o"!!!>!!!>}}!!!!!>i!>},<!>},<">,<!!!!!!!><{!!u!!,a'o{!>,<!">},{{<<a<>,<{>},{{{<!>o!>!>e}i">},{{<!!!!!>!>,<<!>},<!{a<a<!!>},{<!!'ue"e{ua>,<!>'!!}o!!!>!!!>a!>,<<!!!>!!!!!!{!>>}}},<{<a"!!"}o'io>},{<ue!>},<}e'e{>}},{{<'!>,<o!!!>},<!>!!!>oi'!!!>},<'o<>},{{{<!>!>!!!>!>},<!!!>},<u,!>,<!o}>},{}},{<!!!!}!u{!o!!ieea",u!!!!!>!!!>!><!!"">}},{<!>},<<}!!aa"!>},<"!>}a{!>},<!!!!!>!uo>}}}}}}},{{{{<{!}>},{{}},{}},{},{{<,!>"!!!>!>,<!!oo!!!>},<}i!'u'!!!>!>!>},<{a>,{<a!!!>!!!>!>,<!!!'!>!a",!>},<!!o!>},<a!!!!}}{>}},{<{u!>{,!>!!<!i>,<e<!>o!i!!!>!!!!"uo"!>,<u'"!>},<,!i>}}},{{{<<iee!!a"!>},<!>,<,>,<,!!!!!>}o!>,<oo!>!>,<"io!>},<}!',"!o>},{<}!!{'{!!!!<{!ai!!!>"!<ou!!a!{<!!">},{<!>},<!>,<i!e!!!>a!>,<!!o!>!>},<!>},<!!!>aa>,{<u"{<!>},<}!!o'"i!!u<}a>}}},{{{{{<>},{<<}uoa,'!e!!e!!!>!{o!!!i>}}},{<ai!!!>eou!!!>!a!!!ei}!{u!!!a!!!<!!ei>,<aue}!!!!}!>,<a{o!>,<!!!!>}},{{<!!o!!ieu!>,<!u',aeaia!!}">},{{{},{<!!'"<}i>}}}}}},{{},{{{{<'!!e!i!>u!><e,!">},{<!<<!>!!uu"!>},<!!u<iia!!}!">,{}}},{{}}},{{<a!!a<!>,<'!>,<!>,<,',!>,<>,{{{<!!!!!!!>e}"!!i<>}},<e!}'!>},<!>!>},<!!a!!'i>}},{<"!a',"a>}}},{{{<<,!>},<!>,<!o<!>},<<!!!>u>},{{{}},{<!!!!e<!!!!!>o!>,<o{!>!>,<>,<>},{}},{{},{<"!>,<!i>,{<>}}}},{{{<{!"!>i"!!<i"{}>}},{<>,<oi,i'>}},{{{<{!!!>oe!'!!!!!>!>!>},<!>,!!!e{a>}},{{<"!>,<!>u!!,!>a{<!!'a,>,{<i"!>},<u!>,<,,'!,!o!>},<!!!!i>}},<i!>},<io<!!a!!,!!!>}!"'"o!!o!>}>},{<!>'ue!!!>,<'ia}{!>},<!>,<{o<u!>,<>}},{{{{{<>}},<!o!!!>},<!!!>!>},<!!{ae!!e!!!!!!!!!!!>i>},{{},{{<o!>},<}{o!>,<!!!!!>!!!>,<!>!!!>!>,<u>}}},{{{<!>,a"!!i!>},<!!"!!"!!u}ue!!"o!!e>},{}},{<!>,<!!!>!!!>{ue!e,!>,<o<o{!>,<!>,<!!!>,<>}}},{{<!>},<i}!!<<!!e!>>}}}}},{{{<,>,<{!>},<{!,{,>},{<<e"}u}}!!!>!>!!!>a!>},<!>,<oea'u!!!>>,<i!>,o<!>!!"!>a!!!>,<!'!>!!!>>},{<{o{uuo<,o!!!>!!!>!!!>}>,{}}}},{{},{{{},{}},{{<i{ie"!o'{!!!>},<!a}!!!>},<>},<!!,e<e!>},<!>},<!!!>a!!e!>i>}},{{{{{{{{{<!>u!!!>!!!>!ui'{!>},<>}},{}},{}}},{<o!!!>>},{}},{{{{}},{{{<}ue<!!!!!>i!>},<!!a}a<!>,<!>,<>}},{{<!!{!>i!!!>},<a<!!!>!>},<!>},<u}{ao!!!!>},<o!>,<o!!!>!!!>i!!!><!>oe}!o>},{{{<!>!>,<!>ee!!!a!>!!!>>}}}},{{<a!!!>!!<<!!!!u!!e>,{}}},{{{<!>},<eu!>i!!'!>!!!!!>!>,<">},{{<'!!!!!>u!>,<ue"{,i!a}"{!!!>!!o!>,<>}},{{},{}}},{{{{},{{{<!>,<!'>}}},{<!i!>,<oe}!!o''<!>},<>}},{{{<ee!>!!>}},{<a{>,<!>!!{!>,<>}},{{{}},{{{{<!!a>},<>},<{!!!>,<o>},{{<{<<>},<!!!"!>,<!!!!!>!!e!!!>!>!!>}}},{{<!!,u{!!}"uie!!}!>,<o>},{{{<}!!!>!>,<!>},<a>}},{<!!!>!>,<<ea{"!>}aua}!>},<}!!!>!!!o'>,{<'",}"}>}}}}}},{{{<e!>},<!>>},{{<!>!>"'!!!<}!io!!!!u!!!>!><i!a!!!!!>>}}},{}},{{}}}},{{{<>},{{<!!!!!}!!i!><!!!>>}},{{<!!!!!>'>}}},{{{<{!!!><!!!>e!>!!!>e"!,}u>},{<!>}>,<!!!>'!"ae<a>},{{<i!>,<"!>},<!!!!!>},<ae!>>},{}}},{{{{<>}},{<o<!!!>e>,{{<oa!>,<"!}'u!>,<o'!>!"",!!!>>},{<!!a!>,<!!}!>},<!>},<!!!!!>,<u!>,<e<!!<a!{a!,!!!>!!!>>}}},{{<}'{!!a!!!>!!o!>!{!>},<!!!!!!""'>},{<{!!!>{>}}},{},{{{{{}},{{{<!!{"eu>},{}},{<!!'ia!}a''!>}>,{{<<},!>,<,ea!oi!!'a!!!"!!!>!>,<!!!>u>},<>}}}},{{<>}},{{{{<!>,<{!e!>,<au<,}>},{<!>!>},<"<e!>!"o',ua'"!>},<!!!{>}},{<!"!>},<!!}!!"e!!!>{{!!'u!e!>,<"!>,<>}},{{{<o!!!>!!"!"o!>!>,<!!!>>},<,a<!>},<!>,<!!o{ioo!"!>>},{{}},{{{<}'!!!!!>},<}{>}}}}}},{{<}e{!!ieia"a!>!eeu!!i!>>,{<!!!!!>"i>}},{{<'<,!'!!!>!>},<e>,<a!>>},{{<!!u<a'!!!><"!ou>,<!!!>!,!!>}}},{{<}u!o>},<!>!>,<ui>}}},{{<uu!i!<u!<u!!!>{!!!ii!!!>>},{<!!,,!<!{!>},<!!!>>,<<i!"}!!!>"oi}"o'!>!'!>!u>},{{<<i!!a!>!!"o!!i!!,e}{!!"i!!!><>},{}}}}},{{{{{},<a"!!!>!>'>}},{{<'>},{<,!!eie!>},<!!!>},<o!!!>!!!>'"!!!!<!>>,<o!>ou<>},{{<a!i!!io,>}}},{{{{<!!!>!>},<!!'!!,"!!!>!}"}!>},<}!!u>,<<a!!!>"!>,<"!!"o!>},<>},{{}}}}}},{{{<u!!!>"!>!!!>oi{!!!!<a!>},<i{!>!>"<}>},{{<}!!ee!>!!!!ea!!!!!!!><,!>>},<i!!!>,<u<i}"!!!>,iii{a}a!o>}},{<!>,<!>},<!!,}!!<!!!>'!!!>'!!!>},<!!!a>,{<!<}!>,<!!!>,!{{<o!>,<a!!!>!{u!>,<}!!!!!!,>}},{<o>}},{{{<!e!!!!!>,<,}a!!o!e}!!<i,a!!!!!>!>>}},{{<'!>},<!!<i!>!>a!><!>,<!!!>'>}}},{{{{<}!>,<!>},<>}},{<}!!!>!!!>!!e!>,<ooia!<>}},{{<}"i,i{!>,<<,}!>}!<!!}!!!!,{!!>},<<ii}!!!>!i>},{}}}},{{{<i,,a"!!oie!>,<u>}}}},{{{<>},{<!ua}>}}},{{},{},{{{},{<'!ou{>}},<!!!>!>!>},<{!>,<oeu>}}},{{<!!!!o!>!!"!!!>!>,<!"!>!!!>!>,<{u!!!>},<!!!>"!!>}},{{{<!>!},<!!{<>},<!>},<o}e!>,<}>},{{{},{{<aio{<!{!!u!>'{a,o!!ii">}},{<ei!>},<},!'<!!o'!!<!!{!>,<a!{>,{{}}}},{},{{<!!!>!>},<,!!!>}!>}!!ou!}ia'i>,<!e!!!!!!i!>},<!!!>!>!>},<!>,<!!!>},<e'!!'u!!!a{>},<u'i}!!!!}!>e">}},{<{!!auo!>,<e!>},<<i!!i!>,<'!!!>ie}"u>}}},{{<>,{{}}},{{{{<!!<a!!<,!!a!!!!!!e<>},<!>>},{<a}!!!>!>},<{!>},<u!>},<,!>},<'>}},{},{<"!!!!i!!{"o!!a}!o!!!>!>'>}}},{{<ou<!>,<>,{<!>,<!!,{'a,'!!,!>,<!!u!>,<!>!<<!>,<">}},{<<'>}}}}}}
diff --git a/2017/src/bin/day_1.rs b/2017/src/bin/day_1.rs
new file mode 100644
index 0000000..5d0e431
--- /dev/null
+++ b/2017/src/bin/day_1.rs
@@ -0,0 +1,24 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let number_chars = args.input[0].chars().collect::<Vec<_>>();
+
+ let mut sum = 0;
+
+ for i in 0..number_chars.len() {
+ let next = if args.part == 1 {
+ (i + 1)
+ } else {
+ (i + number_chars.len() / 2)
+ } % number_chars.len();
+ if (number_chars[i] == number_chars[next]) {
+ let parsed: i32 = number_chars[i].to_string().parse().unwrap();
+ sum += parsed;
+ }
+ }
+
+ println!("Sum is {}", sum);
+}
diff --git a/2017/src/bin/day_10.rs b/2017/src/bin/day_10.rs
new file mode 100644
index 0000000..faec18a
--- /dev/null
+++ b/2017/src/bin/day_10.rs
@@ -0,0 +1,63 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let lengths: Vec<usize> = if args.part == 1 {
+ args.input[0].split(",").map(|x| x.parse().unwrap()).collect()
+ } else {
+ let suffix: [usize; 5] = [17, 31, 73, 47, 23];
+ args.input[0].as_bytes()
+ .iter().map(|&x| x as usize)
+ .chain(suffix.iter().cloned())
+ .collect()
+ };
+
+ let mut position = 0;
+ let mut list: Vec<u32> = (0..256).collect();
+
+ if args.part == 1 {
+ hash_round(&mut list, &lengths, &mut position, 0);
+ } else {
+ for i in 0..64 {
+ let skip = lengths.len() * i;
+ hash_round(&mut list, &lengths, &mut position, skip);
+ }
+ }
+
+
+ if args.part == 1 {
+ let answer = list[0]*list[1];
+ println!("{}", answer);
+ } else {
+ let mut current_char = 0;
+ for (i, l) in list.iter().enumerate() {
+ current_char = current_char ^ l;
+ if i % 16 == 15 {
+ print!("{:02x}", current_char);
+ current_char = 0;
+ }
+ }
+ println!("");
+ }
+}
+
+fn hash_round(list: &mut Vec<u32>, lengths: &Vec<usize>, position: &mut usize, skip: usize) {
+ for (inner_skip, &length) in lengths.iter().enumerate() {
+ reverse(list, *position, length);
+ *position = (*position + length + skip + inner_skip) % list.len();
+ }
+}
+
+fn reverse(list: &mut Vec<u32>, position: usize, length: usize) {
+ let mut a = position;
+ let mut b = position + length - 1;
+ let len = list.len();
+ while a < b {
+ list.swap(a%len, b%len);
+
+ a += 1;
+ b -= 1;
+ }
+}
diff --git a/2017/src/bin/day_11.rs b/2017/src/bin/day_11.rs
new file mode 100644
index 0000000..ffb0833
--- /dev/null
+++ b/2017/src/bin/day_11.rs
@@ -0,0 +1,57 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let directions: Vec<&str> = args.input[0].split(",").collect();
+
+ let mut x = 0.0;
+ let mut y = 0.0;
+
+ let mut max_away = 0.0;
+
+ for dir in directions {
+ y += match dir {
+ "ne" => 0.5,
+ "n" => 1.0,
+ "nw" => 0.5,
+ "se" => -0.5,
+ "s" => -1.0,
+ "sw" => -0.5,
+ _ => panic!("Unexpected direction {}", dir)
+ };
+
+ x += match dir {
+ "ne" => -0.5,
+ "n" => 0.0,
+ "nw" => 0.5,
+ "se" => -0.5,
+ "s" => 0.0,
+ "sw" => 0.5,
+ _ => panic!("Unexpected direction {}", dir)
+ };
+
+ let current_distance = tile_distance(x, y);
+ if current_distance > max_away {
+ max_away = current_distance;
+ }
+ }
+
+ if args.part == 1 {
+ println!("Child process is {} away", tile_distance(x, y));
+ } else {
+ println!("At most, child process was {} away", max_away);
+ }
+
+}
+
+fn tile_distance(x: f32, y: f32) -> f32 {
+ let tiles_x = x.abs()*2.0;
+ let tiles_y = if y.abs() < tiles_x {
+ 0.0
+ } else {
+ y.abs() - tiles_x
+ };
+ tiles_x + tiles_y
+}
diff --git a/2017/src/bin/day_12.rs b/2017/src/bin/day_12.rs
new file mode 100644
index 0000000..39f05e9
--- /dev/null
+++ b/2017/src/bin/day_12.rs
@@ -0,0 +1,52 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::cmp;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let mut groups: Vec<Vec<i32>> = vec!(vec!(0)); //0 in the first group
+
+ for line in args.input {
+ let mut words_iter = line.split_whitespace();
+ let current: i32 = words_iter.next().unwrap().parse().unwrap();
+ if find_group(&groups, current).is_none() {
+ groups.push(vec!(current));
+ }
+ words_iter.next().unwrap(); //<->
+ for other_str in words_iter {
+ let other: i32 = other_str.trim_right_matches(",").parse().unwrap();
+
+ match (find_group(&groups, current), find_group(&groups, other)) {
+ (Some(current_group), Some(other_group)) if current_group != other_group => {
+ merge_groups(&mut groups, current_group, other_group);
+ },
+ (Some(_), Some(_)) => {
+ },
+ (Some(current_group), None) => {
+ groups[current_group].push(other);
+ },
+ (None, _) => panic!("Current group not found!")
+ };
+ }
+ }
+
+ if args.part == 1 {
+ println!("First group has {} members", groups[0].len());
+ } else {
+ println!("Total of {} groups", groups.len());
+ }
+}
+
+fn find_group(groups: &Vec<Vec<i32>>, x: i32) -> Option<usize> {
+ groups.iter().position(|group| group.contains(&x))
+}
+
+fn merge_groups(groups: &mut Vec<Vec<i32>>, a: usize, b: usize) {
+ let src = cmp::max(a, b);
+ let dest = cmp::min(a, b);
+
+ let mut from = groups.swap_remove(src);
+ groups[dest].append(&mut from)
+}
diff --git a/2017/src/bin/day_13.rs b/2017/src/bin/day_13.rs
new file mode 100644
index 0000000..e85b541
--- /dev/null
+++ b/2017/src/bin/day_13.rs
@@ -0,0 +1,46 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::collections::HashMap;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let input: HashMap<u32, u32> = args.input.iter().map(|line| {
+ let mut split_line = line.split(": ");
+ (split_line.next().unwrap().parse().unwrap(), split_line.next().unwrap().parse().unwrap())
+ }).collect();
+
+ if args.part == 1 {
+ let severity = calculate_severity(&input, 0, &args);
+ println!("Severity: {}", severity);
+ } else {
+ let optimal_delay = (0u32..).find(|&delay| calculate_severity(&input, delay, &args) == 0).unwrap();
+ println!("Wait {} picoseconds", optimal_delay);
+ }
+}
+
+fn calculate_severity(input: &HashMap<u32, u32>, delay: u32, args: &AdventArgs) -> u32 {
+ let mut severity = 0;
+ let max_depth = input.keys().max().cloned().unwrap();
+
+ for depth in 0..max_depth+1 {
+ severity += match input.get(&depth) {
+ Some(range) => {
+ let position = (depth + delay) % (2*range-2);
+
+ if position == 0 {
+ if args.part == 1 {
+ range * depth
+ } else {
+ range * depth + 1
+ }
+ } else {
+ 0
+ }
+ },
+ None => 0
+ };
+ }
+ severity
+}
diff --git a/2017/src/bin/day_14.rs b/2017/src/bin/day_14.rs
new file mode 100644
index 0000000..778a57f
--- /dev/null
+++ b/2017/src/bin/day_14.rs
@@ -0,0 +1,52 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+ let input = args.input[0].clone();
+
+ let mut used = 0;
+ let mut grid: Vec<Vec<bool>> = vec!(vec!(false; 128); 128);
+ for i in 0..128 {
+ let to_hash = format!("{}-{}", input, i);
+ let hash = knot_hash(&to_hash);
+ for (x1,c) in hash.chars().enumerate() {
+ let parsed = u32::from_str_radix(&c.to_string(), 16).unwrap();
+ used += parsed.count_ones();
+ for (x2,b) in format!("{:04b}",parsed).chars().enumerate() {
+ grid[i][4*x1+x2] = b == '1';
+ }
+ }
+ }
+
+ if args.part == 1 {
+ println!("{} is used", used);
+ } else {
+ let mut group_count = 0;
+ for start_y in 0..128 {
+ for start_x in 0..128 {
+ if grid[start_y][start_x] {
+ group_count += 1;
+ clear_group(&mut grid, Point{
+ x: start_x as i32,
+ y: start_y as i32
+ });
+ }
+ }
+ }
+ println!("{} groups", group_count);
+
+ }
+}
+
+fn clear_group(grid: &mut Vec<Vec<bool>>, point: Point) {
+ if point.x >= 0 && point.x < 128 && point.y >= 0 && point.y < 128 {
+ if grid[point.y as usize][point.x as usize] {
+ grid[point.y as usize][point.x as usize] = false;
+ clear_group(grid, point.up());
+ clear_group(grid, point.down());
+ clear_group(grid, point.left());
+ clear_group(grid, point.right());
+ }
+ }
+}
diff --git a/2017/src/bin/day_15.rs b/2017/src/bin/day_15.rs
new file mode 100644
index 0000000..29b63ad
--- /dev/null
+++ b/2017/src/bin/day_15.rs
@@ -0,0 +1,40 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let mut a: u64 = 591;
+ let mut b: u64 = 393;
+
+ let mut matches: u64 = 0;
+
+ let comparisons = if args.part == 1 {
+ 40_000_000
+ } else {
+ 5_000_000
+ };
+
+ for _ in 0..comparisons {
+ a = (a * 16807) % 2147483647;
+ b = (b * 48271) % 2147483647;
+
+ while args.part != 1 && a % 4 != 0 {
+ a = (a * 16807) % 2147483647;
+ }
+ while args.part != 1 && b % 8 != 0 {
+ b = (b * 48271) % 2147483647;
+ }
+
+ if lower_16_match(a, b) {
+ matches += 1;
+ }
+ }
+
+ println!("There were {} matches", matches);
+}
+
+fn lower_16_match(a: u64, b: u64) -> bool {
+ let mask = 65535; //2^16-1, ie 16 ones
+ (a & mask) == (b & mask)
+}
diff --git a/2017/src/bin/day_16.rs b/2017/src/bin/day_16.rs
new file mode 100644
index 0000000..9676714
--- /dev/null
+++ b/2017/src/bin/day_16.rs
@@ -0,0 +1,87 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let spin_re = Regex::new(r"s(\d+)").unwrap();
+ let exchange_re = Regex::new(r"x(\d+)/(\d+)").unwrap();
+ let partner_re = Regex::new(r"p(\w)/(\w)").unwrap();
+ let input: Vec<Instruction> = args.input[0]
+ .split(',')
+ .map(|instruction| {
+ if let Some(caps) = spin_re.captures(instruction) {
+ let spin_amount: usize = caps[1].parse().unwrap();
+ Instruction::Spin(spin_amount)
+ } else if let Some(caps) = exchange_re.captures(instruction) {
+ let position_a: usize = caps[1].parse().unwrap();
+ let position_b: usize = caps[2].parse().unwrap();
+ Instruction::Exchange(position_a, position_b)
+ } else if let Some(caps) = partner_re.captures(instruction) {
+ let program_a = caps[1].chars().next().unwrap();
+ let program_b = caps[2].chars().next().unwrap();
+ Instruction::Partner(program_a, program_b)
+ } else {
+ panic!("Unhandled instruction: {}", instruction)
+ }
+ })
+ .collect();
+
+ let mut states = vec!("abcdefghijklmnop".chars().collect());
+ if args.part == 1 {
+ let answer = run(&input, &states.last().unwrap());
+ println!("{}", answer.iter().collect::<String>());
+ } else {
+ let repetitions = 1_000_000_000;
+ let mut cycle_found = false;
+ let mut cycle_start = 0;
+ while !cycle_found {
+ let next = run(&input, &states.last().unwrap());
+ if let Some(i) = states.iter().position(|&ref x| *x == next) {
+ cycle_found = true;
+ cycle_start = i;
+ } else {
+ states.push(next);
+ }
+ }
+ println!("Cycle found after pushing {} states", states.len());
+ println!("Cycle starts at {} states", cycle_start);
+
+ let solution_index = (repetitions - cycle_start) % (states.len() - cycle_start);
+ println!("{}", states[solution_index].iter().collect::<String>());
+
+ }
+}
+
+enum Instruction {
+ Spin(usize),
+ Exchange(usize, usize),
+ Partner(char, char)
+}
+
+fn run(instructions: &[Instruction], start: &Vec<char>) -> Vec<char> {
+ let mut programs = start.clone();
+ for instruction in instructions {
+ match instruction {
+ &Instruction::Exchange(a, b) => {
+ programs.swap(a, b);
+ },
+ &Instruction::Spin(spin_amount) => {
+ for _ in 0..spin_amount {
+ //this may be slow, but will suffice for right now
+ let end = programs.pop().unwrap();
+ programs.insert(0, end);
+ }
+ },
+ &Instruction::Partner(program_a, program_b) => {
+ let position_a: usize = programs.iter().position(|&x| x == program_a).unwrap();
+ let position_b: usize = programs.iter().position(|&x| x == program_b).unwrap();
+ programs.swap(position_a, position_b);
+ }
+ }
+ }
+ programs
+}
diff --git a/2017/src/bin/day_17.rs b/2017/src/bin/day_17.rs
new file mode 100644
index 0000000..09d6fdc
--- /dev/null
+++ b/2017/src/bin/day_17.rs
@@ -0,0 +1,47 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+ let step_size: usize = args.input[0].parse().unwrap();
+
+ let inserts = if args.part == 1 {
+ 2017
+ } else {
+ 50_000_000
+ };
+
+ let mut buffer = Vec::with_capacity(inserts + 1);
+ buffer.push(0);
+ let mut position = 0;
+
+ for i in 0..inserts as u32 {
+ let to_insert = i+1;
+ // the +1 is because they want it to insert AFTER the element
+ // that adding position ends on
+ position = ((position + step_size) % buffer.len()) + 1;
+ if args.part == 2 && position != 1 {
+ // for big vectors, push is MUCH more efficient than
+ // insert (O(C) vs O(n)). In part 2, we want the element
+ // after 0, which will always be index 1. It only needs to
+ // be inserted into the right place if it's actually going
+ // to be in position 1.
+ //
+ // If I wasn't meshing the solution with part 1, there
+ // probably wouldn't even be a vector, just tracking the
+ // length and index 1.
+ buffer.push(to_insert);
+ } else {
+ buffer.insert(position, to_insert);
+ }
+ }
+
+ let answer_position = if args.part == 1 {
+ (position+1)%buffer.len()
+ } else {
+ 1
+ };
+
+ let answer = buffer[answer_position];
+ println!("{}", answer);
+}
diff --git a/2017/src/bin/day_18.rs b/2017/src/bin/day_18.rs
new file mode 100644
index 0000000..f763f1f
--- /dev/null
+++ b/2017/src/bin/day_18.rs
@@ -0,0 +1,207 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::str::FromStr;
+use std::collections::HashMap;
+use std::sync::mpsc::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let instructions: Vec<Instruction> = args.input.iter()
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ let (sender0, receiver0) = channel();
+ let (sender1, receiver1) = channel();
+
+ let mut program0 = Program::new(0, instructions.clone(), sender0, receiver1, args.part == 1);
+
+ if args.part == 1 {
+ program0.run();
+ let mut answer = 0;
+ while let Ok(x) = receiver0.try_recv() {
+ answer = x;
+ }
+
+ println!("Last sent value: {}", answer);
+ } else {
+ let mut program1 = Program::new(1, instructions.clone(), sender1, receiver0, args.part == 1);
+
+ while !(program0.terminated && program1.terminated) && (program0.run() || program1.run()) {
+ }
+
+
+ println!("Program 0 sent {} messages", program0.sent_count);
+ println!("Program 1 sent {} messages", program1.sent_count);
+ }
+
+
+}
+
+struct Program {
+ instructions: Vec<Instruction>,
+ registers: HashMap<char, i64>,
+ pc: i64,
+ terminated: bool,
+ sender: Sender<i64>,
+ sent_count: u64,
+ receiver: Receiver<i64>,
+ part1: bool
+}
+
+impl Program {
+ fn new(process_id: i64, instructions: Vec<Instruction>, sender: Sender<i64>, receiver: Receiver<i64>, part1: bool) -> Program {
+ let mut reg = HashMap::new();
+ if !part1 {
+ reg.insert('p', process_id);
+ }
+ Program {
+ instructions: instructions,
+ registers: reg,
+ pc: 0,
+ terminated: false,
+ sender: sender,
+ sent_count: 0,
+ receiver: receiver,
+ part1: part1
+ }
+ }
+ fn run(&mut self) -> bool {
+ use Instruction::*;
+
+ let mut blocked = false;
+ let mut did_something = false;
+
+ while !blocked && !self.terminated {
+ if self.pc < 0 || self.pc as usize >= self.instructions.len() {
+ self.terminated = true;
+ }
+ else {
+ let ins = self.instructions[self.pc as usize].clone();
+
+ match ins {
+ Snd(x) => {
+ self.sent_count += 1;
+ self.sender.send(self.get(x)).ok();
+ },
+ Set(x, y) => {
+ let y_val = self.get(y);
+ self.set(x, y_val);
+ },
+ Add(x, y) => {
+ let x_val = self.get(x);
+ let y_val = self.get(y);
+ self.set(x, x_val + y_val);
+ },
+ Mul(x, y) => {
+ let x_val = self.get(x);
+ let y_val = self.get(y);
+ self.set(x, x_val * y_val);
+ },
+ Mod(x, y) => {
+ let x_val = self.get(x);
+ let y_val = self.get(y);
+ self.set(x, x_val % y_val);
+ },
+ Rcv(x) => {
+ if self.part1 {
+ blocked = self.get(x) != 0;
+ } else {
+ match self.receiver.try_recv() {
+ Ok(y) => {
+ self.set(x, y);
+ },
+ Err(_) => {
+ blocked = true;
+ return did_something;
+ }
+ }
+ }
+ },
+ Jgz(x, y) => {
+ if self.get(x) > 0 {
+ self.pc = self.pc + self.get(y) - 1;
+ }
+ },
+ }
+ self.pc += 1;
+ did_something = true;
+ }
+ }
+ true
+ }
+
+ fn get(&self, register: Data) -> i64 {
+ use Data::*;
+ match register {
+ Register(c) => self.registers.get(&c).cloned().unwrap_or(0),
+ Literal(i) => i
+ }
+ }
+
+ fn set(&mut self, register: Data, value: i64) {
+ use Data::*;
+ match register {
+ Register(c) => {
+ self.registers.insert(c, value);
+ },
+ _ => {}
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+enum Instruction {
+ Snd(Data),
+ Set(Data, Data),
+ Add(Data, Data),
+ Mul(Data, Data),
+ Mod(Data, Data),
+ Rcv(Data),
+ Jgz(Data, Data)
+}
+
+impl FromStr for Instruction {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ use Instruction::*;
+
+ let mut str_iter = s.split_whitespace();
+ let ins = str_iter.next();
+ let x = str_iter.next().map(|x| x.parse::<Data>());
+ let y = str_iter.next().map(|x| x.parse::<Data>());
+
+ match (ins, x, y) {
+ (Some("snd"), Some(Ok(x)), _) => Ok(Snd(x)),
+ (Some("set"), Some(Ok(x)), Some(Ok(y))) => Ok(Set(x, y)),
+ (Some("add"), Some(Ok(x)), Some(Ok(y))) => Ok(Add(x, y)),
+ (Some("mul"), Some(Ok(x)), Some(Ok(y))) => Ok(Mul(x, y)),
+ (Some("mod"), Some(Ok(x)), Some(Ok(y))) => Ok(Mod(x, y)),
+ (Some("rcv"), Some(Ok(x)), _) => Ok(Rcv(x)),
+ (Some("jgz"), Some(Ok(x)), Some(Ok(y))) => Ok(Jgz(x, y)),
+ (_, _, _) => Err(format!("Unknown instruction {}", s))
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy)]
+enum Data {
+ Literal(i64),
+ Register(char)
+}
+
+impl FromStr for Data {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ use Data::*;
+
+ match (s.parse(), s.chars().next()) {
+ (Ok(num), _) => Ok(Literal(num)),
+ (Err(_), Some(c)) => Ok(Register(c)),
+ (_, _) => Err(format!("Invalid data {}", s))
+ }
+ }
+}
diff --git a/2017/src/bin/day_19.rs b/2017/src/bin/day_19.rs
new file mode 100644
index 0000000..b333c98
--- /dev/null
+++ b/2017/src/bin/day_19.rs
@@ -0,0 +1,78 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ use Direction::*;
+
+ let args = AdventArgs::init();
+
+ let input: Vec<Vec<char>> = args.input.iter().map(|line| line.chars().collect()).collect();
+
+ let mut position = Point {
+ x: input[0].iter().position(|&c| c == '|').unwrap() as i32,
+ y: 0
+ };
+
+ let mut direction = Down;
+ let mut path_ended = false;
+ let mut tokens = Vec::new();
+
+ // moving onto the map counts as one, but because of how I'm
+ // counting there's also an off the map step that I shouldn't be
+ // counting at the end. They cancel out.
+ let mut steps_moved = 0;
+
+ while !path_ended {
+ position = position.shift(&direction);
+ steps_moved += 1;
+
+ match char_at(&input, &position) {
+ '|' | '-' => {
+ //continue as is
+ },
+ ' ' => {
+ path_ended = true;
+ },
+ '+' => {
+ let left_option = char_at(&input, &position.shift(&direction.rotate_left()));
+ let right_option = char_at(&input, &position.shift(&direction.rotate_right()));
+ match (left_option, right_option) {
+ (' ', ' ') => {
+ path_ended = true;
+ },
+ (_, ' ') => {
+ direction = direction.rotate_left();
+ },
+ (' ', _) => {
+ direction = direction.rotate_right();
+ },
+ _ => {
+ panic!("Don't know where to go from {:?}", position);
+ }
+ }
+ },
+ token => {
+ tokens.push(token);
+ }
+ }
+
+ }
+
+ if args.part == 1 {
+ println!("{}", tokens.iter().collect::<String>());
+ } else {
+ println!("{}", steps_moved);
+ }
+}
+
+fn char_at(input: &Vec<Vec<char>>, position: &Point) -> char {
+ if position.y < 0 ||
+ position.x < 0 ||
+ position.y as usize >= input.len() ||
+ position.x as usize >= input[position.y as usize].len() {
+ ' '
+ } else {
+ input[position.y as usize][position.x as usize]
+ }
+
+}
diff --git a/2017/src/bin/day_2.rs b/2017/src/bin/day_2.rs
new file mode 100644
index 0000000..307029a
--- /dev/null
+++ b/2017/src/bin/day_2.rs
@@ -0,0 +1,26 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+ let sum = args.input.iter().map(|line| {
+ let splitline = parse_space_separated_ints(line).unwrap();
+
+ if args.part == 1 {
+ let max = splitline.iter().max().unwrap();
+ let min = splitline.iter().min().unwrap();
+ max-min
+ } else {
+ for i in 0..splitline.len() {
+ for j in 0..splitline.len() {
+ if i != j && splitline[i] % splitline[j] == 0 {
+ return splitline[i] / splitline[j];
+ }
+ }
+ }
+ panic!("Didn't find a dividing one! {:?}", splitline)
+ }
+ }).sum::<i32>();
+
+ println!("Checksum is {}", sum);
+}
diff --git a/2017/src/bin/day_20.rs b/2017/src/bin/day_20.rs
new file mode 100644
index 0000000..f528675
--- /dev/null
+++ b/2017/src/bin/day_20.rs
@@ -0,0 +1,89 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+#[macro_use]
+extern crate lazy_static;
+
+use std::str::FromStr;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let mut particles: Vec<Particle> = args.input.iter()
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ // I took eventually to be after a largish number. Seemed to work
+ // out, but I'm sure there is a more mathematical way to work it
+ // out.
+ for _ in 0..1000 {
+ particles = particles.iter().map(|p| p.step()).collect();
+ if args.part == 2 {
+ let before_collisions = particles.clone();
+ particles.retain(|p| {
+ before_collisions.iter().filter(|p2| p2.position == p.position).count() == 1
+ });
+ }
+ }
+
+ if args.part == 1 {
+ let (closest, _) = particles.iter().enumerate().min_by_key(|&(_, p)| p.position.manhattan_distance()).unwrap();
+ println!("Closest to 0: {}", closest);
+ } else {
+ let remaining = particles.iter().count();
+ println!("Remaining: {}", remaining);
+ }
+
+}
+
+#[derive(Debug, Clone)]
+struct Particle {
+ position: Point3d,
+ velocity: Point3d,
+ acceleration: Point3d
+}
+
+
+impl Particle {
+ fn step(&self) -> Particle {
+ let v = self.velocity + self.acceleration;
+ Particle {
+ position: self.position + v,
+ velocity: v,
+ acceleration: self.acceleration
+ }
+ }
+}
+
+impl FromStr for Particle {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ lazy_static!{
+ static ref RE: Regex = Regex::new(r"p=<(-?\d+),(-?\d+),(-?\d+)>, v=<(-?\d+),(-?\d+),(-?\d+)>, a=<(-?\d+),(-?\d+),(-?\d+)>").unwrap();
+ };
+
+ let caps = RE.captures(s).unwrap();
+ Ok(Particle {
+ position: Point3d {
+ x: caps[1].parse().unwrap(),
+ y: caps[2].parse().unwrap(),
+ z: caps[3].parse().unwrap()
+ },
+ velocity: Point3d {
+ x: caps[4].parse().unwrap(),
+ y: caps[5].parse().unwrap(),
+ z: caps[6].parse().unwrap()
+ },
+ acceleration: Point3d {
+ x: caps[7].parse().unwrap(),
+ y: caps[8].parse().unwrap(),
+ z: caps[9].parse().unwrap()
+ }
+ })
+ }
+}
+
diff --git a/2017/src/bin/day_21.rs b/2017/src/bin/day_21.rs
new file mode 100644
index 0000000..7f7ac79
--- /dev/null
+++ b/2017/src/bin/day_21.rs
@@ -0,0 +1,200 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let (t2, t3) = parse_transforms(&args.input);
+
+ let mut picture = vec!(
+ vec!(false, true, false),
+ vec!(false, false, true),
+ vec!(true, true, true)
+ );
+
+ let iterations = if args.part == 1 {
+ 5
+ } else {
+ 18
+ };
+ for _ in 0..iterations {
+ picture = expand(&picture, &t2, &t3);
+ }
+
+ let ones: usize = picture.iter().map(
+ |row| row.iter().filter(|&&x| x).count()
+ ).sum();
+ println!("{} ones", ones);
+}
+
+fn print(picture: &Vec<Vec<bool>>) {
+ for row in picture {
+ for &c in row {
+ print!("{}", if c {"#"} else {"."});
+ }
+ println!();
+ }
+ println!();
+}
+
+fn expand(picture: &Vec<Vec<bool>>, t2: &Vec<Transform2>, t3: &Vec<Transform3>) -> Vec<Vec<bool>> {
+ let size = picture.len();
+ let div = if size % 2 == 0 { 2 } else { 3 };
+ let segments = size / div;
+ let new_size = size + segments;
+
+ let mut result = vec!(vec!(false; new_size); new_size);
+
+ for i in 0..segments {
+ let y = i*div;
+ let v = i*(div+1);
+ for j in 0..segments {
+ let x = j*div;
+ let u = j*(div+1);
+ if div == 2 {
+ let init = [
+ [picture[y][x], picture[y][x+1]],
+ [picture[y+1][x], picture[y+1][x+1]]
+ ];
+ let pattern = t2.iter().find(|p| p.matches(&init)).expect(&format!("No pattern matches {:?}", init));
+ let to = pattern.to;
+
+ for a in 0..div+1 {
+ for b in 0..div+1 {
+ result[v+a][u+b] = to[a][b];
+ }
+ }
+ } else {
+ let init = [
+ [picture[y][x], picture[y][x+1], picture[y][x+2]],
+ [picture[y+1][x], picture[y+1][x+1], picture[y+1][x+2]],
+ [picture[y+2][x], picture[y+2][x+1], picture[y+2][x+2]]
+ ];
+ let pattern = t3.iter().find(|p| p.matches(&init)).expect(&format!("No pattern matches {:?}", init));
+ let to = pattern.to;
+
+ for a in 0..div+1 {
+ for b in 0..div+1 {
+ result[v+a][u+b] = to[a][b];
+ }
+ }
+ }
+ }
+ }
+
+ result
+}
+
+fn parse_transforms(input: &Vec<String>) -> (Vec<Transform2>, Vec<Transform3>) {
+ let t2_re = Regex::new(r"^(.)(.)/(.)(.) => (.)(.)(.)/(.)(.)(.)/(.)(.)(.)$").unwrap();
+ let t3_re = Regex::new(r"^(.)(.)(.)/(.)(.)(.)/(.)(.)(.) => (.)(.)(.)(.)/(.)(.)(.)(.)/(.)(.)(.)(.)/(.)(.)(.)(.)$").unwrap();
+
+ let mut t2 = Vec::new();
+ let mut t3 = Vec::new();
+ for line in input {
+ if let Some(t2_caps) = t2_re.captures(line) {
+ t2.push(Transform2 {
+ from: [
+ [&t2_caps[1] == "#", &t2_caps[2] == "#"],
+ [&t2_caps[3] == "#", &t2_caps[4] == "#"]
+ ],
+ to: [
+ [&t2_caps[5] == "#", &t2_caps[6] == "#", &t2_caps[7] == "#"],
+ [&t2_caps[8] == "#", &t2_caps[9] == "#", &t2_caps[10] == "#"],
+ [&t2_caps[11] == "#", &t2_caps[12] == "#", &t2_caps[13] == "#"]
+ ]
+ });
+ } else if let Some(t3_caps) = t3_re.captures(line) {
+ t3.push(Transform3 {
+ from: [
+ [&t3_caps[1] == "#", &t3_caps[2] == "#", &t3_caps[3] == "#"],
+ [&t3_caps[4] == "#", &t3_caps[5] == "#", &t3_caps[6] == "#"],
+ [&t3_caps[7] == "#", &t3_caps[8] == "#", &t3_caps[9] == "#"]
+ ],
+ to: [
+ [&t3_caps[10] == "#", &t3_caps[11] == "#", &t3_caps[12] == "#", &t3_caps[13] == "#"],
+ [&t3_caps[14] == "#", &t3_caps[15] == "#", &t3_caps[16] == "#", &t3_caps[17] == "#"],
+ [&t3_caps[18] == "#", &t3_caps[19] == "#", &t3_caps[20] == "#", &t3_caps[21] == "#"],
+ [&t3_caps[22] == "#", &t3_caps[23] == "#", &t3_caps[24] == "#", &t3_caps[25] == "#"]
+ ]
+ });
+ }
+ }
+
+ (t2, t3)
+}
+
+#[derive(Debug)]
+struct Transform2 {
+ from: [[bool; 2]; 2],
+ to: [[bool; 3]; 3]
+}
+
+impl Transform2 {
+ fn rotate(from: &[[bool;2];2]) -> [[bool;2];2] {
+ [
+ [from[1][0],from[0][0]],
+ [from[1][1],from[0][1]]
+ ]
+ }
+
+ fn flip(from: &[[bool;2];2]) -> [[bool;2];2] {
+ [
+ [from[0][1],from[0][0]],
+ [from[1][1],from[1][0]]
+ ]
+ }
+
+ fn matches(&self, other: &[[bool; 2]; 2]) -> bool {
+ let mut any_match = false;
+ let mut spinning_other = other.clone();
+ for _ in 0..4 {
+ any_match = any_match ||
+ self.from == spinning_other ||
+ self.from == Transform2::flip(&spinning_other);
+
+ spinning_other = Transform2::rotate(&spinning_other);
+ }
+ any_match
+ }
+}
+
+#[derive(Debug)]
+struct Transform3 {
+ from: [[bool; 3]; 3],
+ to: [[bool; 4]; 4]
+}
+
+impl Transform3 {
+ fn rotate(from: &[[bool;3];3]) -> [[bool;3];3] {
+ [
+ [from[2][0],from[1][0],from[0][0]],
+ [from[2][1],from[1][1],from[0][1]],
+ [from[2][2],from[1][2],from[0][2]]
+ ]
+ }
+
+ fn flip(from: &[[bool;3];3]) -> [[bool;3];3] {
+ [
+ [from[0][2],from[0][1],from[0][0]],
+ [from[1][2],from[1][1],from[1][0]],
+ [from[2][2],from[2][1],from[2][0]]
+ ]
+ }
+
+ fn matches(&self, other: &[[bool; 3]; 3]) -> bool {
+ let mut any_match = false;
+ let mut spinning_other = other.clone();
+ for _ in 0..4 {
+ any_match = any_match ||
+ self.from == spinning_other ||
+ self.from == Transform3::flip(&spinning_other);
+
+ spinning_other = Transform3::rotate(&spinning_other);
+ }
+ any_match
+ }
+}
diff --git a/2017/src/bin/day_22.rs b/2017/src/bin/day_22.rs
new file mode 100644
index 0000000..917ed63
--- /dev/null
+++ b/2017/src/bin/day_22.rs
@@ -0,0 +1,73 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::collections::HashSet;
+
+fn main() {
+ let args = AdventArgs::init();
+ let input_width = args.input[0].len();
+ let input_height = args.input.len();
+
+ let mut position = Point {
+ x: (input_width / 2) as i32,
+ y: (input_height / 2) as i32,
+ };
+ let mut direction = Direction::Up;
+
+ let mut weakened: HashSet<Point> = HashSet::new();
+ let mut infected: HashSet<Point> = HashSet::new();
+ let mut flagged: HashSet<Point> = HashSet::new();
+
+ for (y, line) in args.input.iter().enumerate() {
+ for (x, c) in line.chars().enumerate() {
+ if c == '#' {
+ infected.insert(Point {
+ x: x as i32,
+ y: y as i32
+ });
+ }
+ }
+ }
+
+ let mut infections_caused = 0;
+
+ let bursts = if args.part == 1 {
+ 10_000
+ } else {
+ 10_000_000
+ };
+
+ for _ in 0..bursts {
+ if args.part == 1 {
+ if infected.contains(&position) {
+ direction = direction.rotate_right();
+ infected.remove(&position);
+ } else {
+ direction = direction.rotate_left();
+ infected.insert(position);
+ infections_caused += 1;
+ }
+ }
+ else {
+ if weakened.contains(&position) {
+ infected.insert(position);
+ weakened.remove(&position);
+ infections_caused += 1;
+ } else if infected.contains(&position) {
+ direction = direction.rotate_right();
+ flagged.insert(position);
+ infected.remove(&position);
+ } else if flagged.contains(&position) {
+ direction = direction.rotate_right().rotate_right();
+ flagged.remove(&position);
+ } else {
+ direction = direction.rotate_left();
+ weakened.insert(position);
+ }
+ }
+ position = position.shift(&direction);
+ }
+
+ println!("Infections caused {}", infections_caused);
+
+}
diff --git a/2017/src/bin/day_23.rs b/2017/src/bin/day_23.rs
new file mode 100644
index 0000000..d199af0
--- /dev/null
+++ b/2017/src/bin/day_23.rs
@@ -0,0 +1,168 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::str::FromStr;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ if args.part == 1 {
+ let instructions: Vec<Instruction> = args.input.iter()
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ let mut program = Program::new(instructions.clone(), args.part == 1);
+ let mul_called = program.run();
+ println!("Mult called {} times", mul_called);
+ } else {
+ println!("Result is {}", run_as_rust());
+ }
+
+}
+
+fn to_register(c: char) -> usize {
+ (c as u32 - 'a' as u32) as usize
+}
+
+struct Program {
+ instructions: Vec<Instruction>,
+ registers: [i64; 8],
+ pc: i64
+}
+
+impl Program {
+ fn new(instructions: Vec<Instruction>, part1: bool) -> Program {
+ let mut reg = [0; 8];
+ if part1 == false {
+ reg[0] = 1;
+ }
+ Program {
+ instructions: instructions,
+ registers: reg,
+ pc: 0
+ }
+ }
+ fn run(&mut self) -> u32 {
+ use Instruction::*;
+
+ let mut mul_called = 0;
+
+ while self.pc >= 0 && (self.pc as usize) < self.instructions.len() {
+ let ins = self.instructions[self.pc as usize].clone();
+
+ match ins {
+ Set(x, y) => {
+ let y_val = self.get(y);
+ self.set(x, y_val);
+ },
+ Sub(x, y) => {
+ let x_val = self.get(x);
+ let y_val = self.get(y);
+ self.set(x, x_val - y_val);
+ },
+ Mul(x, y) => {
+ let x_val = self.get(x);
+ let y_val = self.get(y);
+ self.set(x, x_val * y_val);
+ mul_called += 1;
+ },
+ Jnz(x, y) => {
+ if self.get(x) != 0 {
+ self.pc = self.pc + self.get(y) - 1;
+ }
+ },
+ }
+ self.pc += 1;
+ }
+
+ mul_called
+ }
+
+ fn get(&self, register: Data) -> i64 {
+ use Data::*;
+ match register {
+ Register(c) => self.registers[c],
+ Literal(i) => i
+ }
+ }
+
+ fn set(&mut self, register: Data, value: i64) {
+ use Data::*;
+ match register {
+ Register(c) => {
+ self.registers[c] = value;
+ },
+ _ => {}
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+enum Instruction {
+ Set(Data, Data),
+ Sub(Data, Data),
+ Mul(Data, Data),
+ Jnz(Data, Data)
+}
+
+impl FromStr for Instruction {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ use Instruction::*;
+
+ let mut str_iter = s.split_whitespace();
+ let ins = str_iter.next();
+ let x = str_iter.next().map(|x| x.parse::<Data>());
+ let y = str_iter.next().map(|x| x.parse::<Data>());
+
+ match (ins, x, y) {
+ (Some("set"), Some(Ok(x)), Some(Ok(y))) => Ok(Set(x, y)),
+ (Some("sub"), Some(Ok(x)), Some(Ok(y))) => Ok(Sub(x, y)),
+ (Some("mul"), Some(Ok(x)), Some(Ok(y))) => Ok(Mul(x, y)),
+ (Some("jnz"), Some(Ok(x)), Some(Ok(y))) => Ok(Jnz(x, y)),
+ (_, _, _) => Err(format!("Unknown instruction {}", s))
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy)]
+enum Data {
+ Literal(i64),
+ Register(usize)
+}
+
+impl FromStr for Data {
+ type Err = String;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ use Data::*;
+
+ match (s.parse(), s.chars().next()) {
+ (Ok(num), _) => Ok(Literal(num)),
+ (Err(_), Some(c)) => Ok(Register(to_register(c))),
+ (_, _) => Err(format!("Invalid data {}", s))
+ }
+ }
+}
+
+
+fn run_as_rust() -> i64 {
+ let mut h: i64 = 0;
+ let mut b: i64 = 99 * 100 + 100000;
+ let c: i64 = b + 17000;
+
+ while b <= c {
+ let f = (2..b).any(|d| {
+ b % d == 0
+ });
+
+ if f {
+ h += 1;
+ }
+
+ b += 17;
+ }
+
+ h
+}
diff --git a/2017/src/bin/day_24.rs b/2017/src/bin/day_24.rs
new file mode 100644
index 0000000..eb7fddd
--- /dev/null
+++ b/2017/src/bin/day_24.rs
@@ -0,0 +1,60 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+ let components: Vec<Component> = args.input.iter()
+ .map(|line| {
+ let mut split = line.split('/');
+ Component {
+ a: split.next().unwrap().parse().unwrap(),
+ b: split.next().unwrap().parse().unwrap()
+ }
+ })
+ .collect();
+
+ if args.part == 1 {
+ let strongest = build_strongest(0, components);
+ println!("{}", strongest);
+ } else {
+ let (strongest, longest) = build_longest(0, components);
+ println!("length: {}, strength: {}", longest, strongest);
+ }
+}
+
+fn build_strongest(start: u32, components: Vec<Component>) -> u32 {
+ components.iter().enumerate()
+ .filter(|&(_, c)| c.a == start || c.b == start)
+ .map(|(i, c)| {
+ let end = if c.a == start { c.b } else { c.a };
+ let mut subset = components.clone();
+ subset.remove(i);
+ c.strength() + build_strongest(end, subset)
+ }).max().unwrap_or(0)
+}
+
+fn build_longest(start: u32, components: Vec<Component>) -> (u32, u32) {
+ components.iter().enumerate()
+ .filter(|&(_, c)| c.a == start || c.b == start)
+ .map(|(i, c)| {
+ let end = if c.a == start { c.b } else { c.a };
+ let mut subset = components.clone();
+ subset.remove(i);
+ let (s, l) = build_longest(end, subset);
+ (c.strength() + s, 1 + l)
+ }).max_by(|&(s1, l1), &(s2, l2)| {
+ l1.cmp(&l2).then(s1.cmp(&s2))
+ }).unwrap_or((0, 0))
+}
+
+#[derive(Debug, Clone)]
+struct Component {
+ a: u32,
+ b: u32
+}
+
+impl Component {
+ fn strength(&self) -> u32 {
+ self.a + self.b
+ }
+}
diff --git a/2017/src/bin/day_25.rs b/2017/src/bin/day_25.rs
new file mode 100644
index 0000000..8d7b0da
--- /dev/null
+++ b/2017/src/bin/day_25.rs
@@ -0,0 +1,125 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+use std::slice::Iter;
+use std::collections::HashSet;
+
+fn main() {
+ let args = AdventArgs::init();
+ let program = parse(&args.input);
+
+ let mut position: i32 = 0;
+ let mut state = program.state(program.start).expect("Started out of program bounds");
+ let mut tape = HashSet::new();
+
+ for _ in 0..program.iterations {
+ let instruction = if tape.contains(&position) {
+ &state.if1
+ } else {
+ &state.if0
+ };
+ if instruction.write {
+ tape.insert(position);
+ } else {
+ tape.remove(&position);
+ }
+ position += instruction.offset;
+ state = program.state(instruction.next).expect("Redirected to unknown state");
+ }
+
+ println!("{}", tape.len());
+}
+
+fn parse(input: &Vec<String>) -> Program {
+ let state_re = Regex::new(r"state (\w)").unwrap();
+ let iterations_re = Regex::new(r"(\d+) steps").unwrap();
+ let write_re = Regex::new(r"Write the value (\d)").unwrap();
+ let move_re = Regex::new(r"Move one slot to the (\w+)").unwrap();
+
+ let mut lines = input.iter();
+ let start = parse_char(&mut lines, &state_re);
+ let iterations = parse_number(&mut lines, &iterations_re);
+
+ let mut states = Vec::new();
+ while let Some(heading) = lines.next() {
+ states.push(State {
+ id: state_re.captures(heading).unwrap()[1].chars().next().unwrap(),
+ if0: parse_instruction(&mut lines, &write_re, &move_re, &state_re),
+ if1: parse_instruction(&mut lines, &write_re, &move_re, &state_re)
+ });
+ }
+
+ Program {
+ start: start,
+ iterations: iterations,
+ states: states
+ }
+}
+
+fn parse_char(lines: &mut Iter<String>, re: &Regex) -> char {
+ re.captures(
+ lines.next().unwrap()
+ ).unwrap()[1].chars().next().unwrap()
+}
+
+fn parse_number(lines: &mut Iter<String>, re: &Regex) -> u32 {
+ re.captures(
+ lines.next().unwrap()
+ ).unwrap()[1].parse().unwrap()
+}
+fn parse_direction(lines: &mut Iter<String>, re: &Regex) -> i32 {
+ if re.captures(
+ lines.next().unwrap()
+ ).unwrap()[1] == *"left" {
+ -1
+ } else {
+ 1
+ }
+}
+
+fn parse_bool(lines: &mut Iter<String>, re: &Regex) -> bool {
+ re.captures(
+ lines.next().unwrap()
+ ).unwrap()[1] == *"1"
+}
+
+fn parse_instruction(lines: &mut Iter<String>, write_re: &Regex, offset_re: &Regex, next_re: &Regex) -> Instruction {
+ lines.next();
+ Instruction {
+ write: parse_bool(lines, &write_re),
+ offset: parse_direction(lines, &offset_re),
+ next: parse_char(lines, &next_re)
+ }
+}
+
+#[derive(Debug)]
+struct Program {
+ start: char,
+ iterations: u32,
+ states: Vec<State>
+}
+
+impl Program {
+ fn state(&self, i: char) -> Option<&State> {
+ self.states.iter().find(|s| s.id == i)
+ }
+}
+
+#[derive(Debug)]
+struct State {
+ id: char,
+ if0: Instruction,
+ if1: Instruction
+}
+
+#[derive(Debug)]
+struct Instruction {
+ write: bool,
+ offset: i32,
+ next: char
+}
+
+
diff --git a/2017/src/bin/day_3.rs b/2017/src/bin/day_3.rs
new file mode 100644
index 0000000..69ded88
--- /dev/null
+++ b/2017/src/bin/day_3.rs
@@ -0,0 +1,62 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+use std::collections::HashMap;
+
+fn main() {
+ use Direction::*;
+
+ let args = AdventArgs::init();
+ let input = args.one_number_input().unwrap();
+
+ let mut memory: HashMap<Point, i32> = HashMap::new();
+ let mut last_allocated = 1;
+
+ let mut current = Point {
+ x: 0,
+ y: 0
+ };
+ memory.insert(current, last_allocated);
+
+ let mut steps_per_direction = 1;
+ let mut steps_to_next_turn = 1;
+ let mut turns_to_spiral_increase = 2;
+
+ let mut current_index = 1;
+ let mut current_direction = Right;
+
+ while (args.part == 1 && current_index != input) || (args.part == 2 && last_allocated < input) {
+ current = current.shift(&current_direction);
+ current_index += 1;
+
+ steps_to_next_turn -= 1;
+ if steps_to_next_turn == 0 {
+ current_direction = current_direction.rotate_left();
+ turns_to_spiral_increase -= 1;
+ if turns_to_spiral_increase == 0 {
+ steps_per_direction += 1;
+ turns_to_spiral_increase = 2;
+ }
+
+ steps_to_next_turn = steps_per_direction;
+ }
+
+ if args.part == 2 {
+ last_allocated = memory.get(&current.left()).cloned().unwrap_or(0) +
+ memory.get(&current.right()).cloned().unwrap_or(0) +
+ memory.get(&current.up()).cloned().unwrap_or(0) +
+ memory.get(&current.down()).cloned().unwrap_or(0) +
+ memory.get(&current.up().left()).cloned().unwrap_or(0) +
+ memory.get(&current.up().right()).cloned().unwrap_or(0) +
+ memory.get(&current.down().left()).cloned().unwrap_or(0) +
+ memory.get(&current.down().right()).cloned().unwrap_or(0);
+
+ memory.insert(current, last_allocated);
+ }
+ }
+
+ println!("{:?}", current);
+ println!("Distance: {}", current.x.abs() + current.y.abs());
+ println!("Last Allocated Value: {}", last_allocated);
+
+}
diff --git a/2017/src/bin/day_4.rs b/2017/src/bin/day_4.rs
new file mode 100644
index 0000000..a9a098a
--- /dev/null
+++ b/2017/src/bin/day_4.rs
@@ -0,0 +1,37 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let valid_count = args.input.iter()
+ .map(|line| {
+ let words = line.split_whitespace().map(|x| x.to_string()).collect::<Vec<String>>();
+ if args.part == 1 {
+ let mut deduped_words = words.clone();
+ deduped_words.sort();
+ deduped_words.dedup();
+ words.len() == deduped_words.len()
+ } else {
+ !words.iter().enumerate().any(|(i, word1)| {
+ words.iter().enumerate().any(|(j, word2)| {
+ i != j && is_anagram(word1, word2)
+ })
+ })
+ }
+ })
+ .filter(|&valid| valid)
+ .count();
+
+ println!("Valid count: {}", valid_count);
+}
+
+fn is_anagram(word1: &str, word2: &str) -> bool {
+ let mut chars1 = word1.chars().collect::<Vec<_>>();
+ chars1.sort();
+ let mut chars2 = word2.chars().collect::<Vec<_>>();
+ chars2.sort();
+
+ chars1.len() == chars2.len() &&
+ chars1.iter().zip(chars2.iter()).all(|(c1, c2)| c1 == c2)
+}
diff --git a/2017/src/bin/day_5.rs b/2017/src/bin/day_5.rs
new file mode 100644
index 0000000..49bdbd1
--- /dev/null
+++ b/2017/src/bin/day_5.rs
@@ -0,0 +1,25 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let mut jumps: Vec<i32> = args.input.iter().map(|line| line.parse().unwrap()).collect();
+ let mut steps_taken = 0;
+ let mut current_position: i32 = 0;
+
+ while current_position >= 0 && (current_position as usize) < jumps.len() {
+ let previous_position = current_position;
+ current_position += jumps[current_position as usize];
+
+ if args.part == 1 || jumps[previous_position as usize] < 3 {
+ jumps[previous_position as usize] += 1;
+ } else {
+ jumps[previous_position as usize] -= 1;
+ }
+
+ steps_taken += 1;
+ }
+
+ println!("Escaped in {} jumps", steps_taken);
+}
diff --git a/2017/src/bin/day_6.rs b/2017/src/bin/day_6.rs
new file mode 100644
index 0000000..be9a515
--- /dev/null
+++ b/2017/src/bin/day_6.rs
@@ -0,0 +1,61 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let init_layout = parse_space_separated_ints(&args.input[0]).unwrap();
+
+ let mut layouts = vec!(init_layout);
+ let mut balances = 0;
+ let mut cycle_found = false;
+ let mut cycle_size = 0;
+
+ while !cycle_found {
+ balances += 1;
+ let new_layout = find_next_layout(&layouts);
+
+ if let Some(index) = layouts.iter().position(|x| *x == new_layout) {
+ cycle_found = true;
+ cycle_size = layouts.len() - index;
+ };
+
+ layouts.push(new_layout);
+ }
+
+ if args.part == 1 {
+ println!("Did {} rebalances", balances);
+ } else {
+ println!("Cycle was {} long", cycle_size);
+ }
+}
+
+fn find_next_layout(layouts: &Vec<Vec<i32>>) -> Vec<i32> {
+ let previous_layout = layouts.last().unwrap();
+ rebalance(&previous_layout)
+}
+
+fn rebalance(layout: &Vec<i32>) -> Vec<i32> {
+ let biggest_container = layout.iter()
+ .enumerate()
+ .max_by(|&(ai, &asize), &(bi, &bsize)| {
+ asize.cmp(&bsize).then(bi.cmp(&ai))
+ })
+ .map(|(i, _)| i)
+ .unwrap();
+
+
+ let mut new_layout = layout.clone();
+ let mut to_redistribute = new_layout[biggest_container];
+ new_layout[biggest_container] = 0;
+ let mut target = (biggest_container + 1) % layout.len();
+
+ while to_redistribute > 0 {
+ new_layout[target] += 1;
+ to_redistribute -= 1;
+ target = (target + 1) % layout.len();
+ }
+
+ new_layout
+}
+
diff --git a/2017/src/bin/day_7.rs b/2017/src/bin/day_7.rs
new file mode 100644
index 0000000..3c3b185
--- /dev/null
+++ b/2017/src/bin/day_7.rs
@@ -0,0 +1,62 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let names_re = Regex::new(r"[a-z]+").unwrap();
+ let weight_re = Regex::new(r"\d+").unwrap();
+
+ let tree: Vec<(String, Vec<String>, i32)> = args.input.iter()
+ .map(|line| {
+ let mut matches = names_re.find_iter(line);
+ let base = matches.next().unwrap().as_str().to_string();
+ let leaves = matches.map(|m| m.as_str().to_string()).collect();
+ let weight = weight_re.find(line).unwrap().as_str().parse().unwrap();
+ (base, leaves, weight)
+ }).collect();
+
+ let mut possible_roots: Vec<String> = tree.iter().map(|&(ref id, _, _)| id.clone()).collect();
+ for &(_, ref leaves, _) in &tree {
+ for leaf in leaves {
+ let index = possible_roots.iter().position(|x| x == leaf).unwrap();
+ possible_roots.remove(index);
+ }
+ }
+ let root = &possible_roots[0];
+
+ if args.part == 1 {
+ println!("{:?}", root);
+ } else {
+ find_unweighted_plate(&root, &tree);
+ }
+}
+
+fn find_unweighted_plate(root: &String, tree: &Vec<(String, Vec<String>, i32)>) -> i32 {
+ let root_node = find_node(&root, &tree);
+ let &(_, ref leaves, ref weight) = root_node;
+ let leaf_weights: Vec<i32> = leaves.iter().map(|leaf| {
+ find_unweighted_plate(&leaf, &tree)
+ }).collect();
+
+ if let Some(base_leaf_weight) = leaf_weights.first() {
+ if let Some(different_leaf_weight) = leaf_weights.iter().find(|&w| w != base_leaf_weight) {
+ println!("Unbalanced plate is off by {}", (different_leaf_weight-base_leaf_weight).abs());
+ println!("Towers on plate: {:?} weigh {:?}", leaves, leaf_weights);
+ // This still needs some manual work to get to the puzzle
+ // output. Take the first unbalanced plate, figure out
+ // which is the unbalanced tower visually, find its
+ // individual weight in the file, and add/subtract as
+ // necessary.
+ }
+ }
+
+ leaf_weights.iter().sum::<i32>() + weight
+}
+
+fn find_node<'a>(name: &String, tree: &'a Vec<(String, Vec<String>, i32)>) -> &'a (String, Vec<String>, i32) {
+ tree.iter().find(|&&(ref id, _, _)| id == name).unwrap()
+}
diff --git a/2017/src/bin/day_8.rs b/2017/src/bin/day_8.rs
new file mode 100644
index 0000000..0359747
--- /dev/null
+++ b/2017/src/bin/day_8.rs
@@ -0,0 +1,99 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+extern crate regex;
+use regex::Regex;
+
+#[macro_use]
+extern crate lazy_static;
+
+use std::str::FromStr;
+use std::collections::HashMap;
+use std::cmp;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let instructions: Vec<Instruction> = args.input.iter()
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ let mut memory: HashMap<String, i32> = HashMap::new();
+ let mut max_mem_ever = 0;
+
+ for instruction in instructions {
+ if instruction.is_true(&memory) {
+ instruction.execute(&mut memory);
+ max_mem_ever = cmp::max(max_mem_ever, memory.values().max().cloned().unwrap_or(0));
+ }
+ }
+
+ let max_mem = memory.values().max().cloned().unwrap_or(0);
+
+ if args.part == 1 {
+ println!("Highest value in memory is {}", max_mem);
+ } else {
+ println!("Highest value in memory ever is {}", max_mem_ever);
+ }
+}
+
+
+struct Instruction {
+ target_register: String,
+ action: String,
+ value: i32,
+ condition_register: String,
+ condition: String,
+ condition_value: i32
+}
+
+#[derive(Debug)]
+struct InstructionParseError {
+ reason: String
+}
+
+impl FromStr for Instruction {
+ type Err = InstructionParseError;
+ fn from_str(s: &str) -> Result<Self, InstructionParseError> {
+ lazy_static!{
+ static ref INSTRUCTION_RE: Regex = Regex::new(r"^(\w+) (inc|dec) (-?\d+) if (\w+) (<|>|<=|>=|==|!=) (-?\d+)").unwrap();
+ }
+ match INSTRUCTION_RE.captures(s) {
+ Some(caps) => Ok(Instruction{
+ target_register: caps[1].to_string(),
+ action: caps[2].to_string(),
+ value: caps[3].parse().unwrap(),
+ condition_register: caps[4].to_string(),
+ condition: caps[5].to_string(),
+ condition_value: caps[6].parse().unwrap()
+ }),
+ None => Err(InstructionParseError {
+ reason: format!("{} did not match regex", s)
+ })
+ }
+ }
+}
+
+impl Instruction {
+ fn is_true(&self, memory: &HashMap<String, i32>) -> bool {
+ let mem = memory.get(&self.condition_register).cloned().unwrap_or(0);
+ match self.condition.as_ref() {
+ "<" => mem < self.condition_value,
+ ">" => mem > self.condition_value,
+ "<=" => mem <= self.condition_value,
+ ">=" => mem >= self.condition_value,
+ "==" => mem == self.condition_value,
+ "!=" => mem != self.condition_value,
+ _ => panic!("Unknown condition: {}", self.condition)
+ }
+ }
+
+ fn execute(&self, memory: &mut HashMap<String, i32>) {
+ let modifier = if self.action == "inc" {
+ self.value
+ } else {
+ -self.value
+ };
+ *memory.entry(self.target_register.clone()).or_insert(0) += modifier;
+ }
+}
diff --git a/2017/src/bin/day_9.rs b/2017/src/bin/day_9.rs
new file mode 100644
index 0000000..e0ca0c0
--- /dev/null
+++ b/2017/src/bin/day_9.rs
@@ -0,0 +1,42 @@
+extern crate advent_of_code_2017;
+use advent_of_code_2017::*;
+
+fn main() {
+ let args = AdventArgs::init();
+
+ let mut cancelled = false;
+ let mut in_garbage = false;
+
+ let mut depth = 0;
+ let mut total_score = 0;
+ let mut total_garbage = 0;
+
+ for c in args.input[0].chars() {
+ if cancelled {
+ cancelled = false;
+ } else if c == '!' {
+ cancelled = true;
+ } else if in_garbage {
+ if c == '>' {
+ in_garbage = false;
+ } else {
+ total_garbage += 1;
+ }
+ } else {
+ if c == '<' {
+ in_garbage = true;
+ } else if c == '{' {
+ depth += 1;
+ total_score += depth;
+ } else if c == '}' {
+ depth -= 1;
+ }
+ }
+ }
+
+ if args.part == 1 {
+ println!("Total score is {}", total_score);
+ } else {
+ println!("Total garbage is {}", total_garbage);
+ }
+}
diff --git a/2017/src/lib.rs b/2017/src/lib.rs
new file mode 100644
index 0000000..53d7d20
--- /dev/null
+++ b/2017/src/lib.rs
@@ -0,0 +1,225 @@
+extern crate structopt;
+#[macro_use]
+extern crate structopt_derive;
+use structopt::StructOpt;
+
+use std::path::PathBuf;
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+use std::process;
+
+#[derive(StructOpt, Debug)]
+#[structopt(name = "AOC2017", about = "An Advent of Code CLI arguments object.")]
+struct AdventCli {
+ #[structopt(help = "Which part of the puzzle you are solving")]
+ part: u32,
+
+ #[structopt(help = "Input file", parse(from_os_str))]
+ input: PathBuf
+}
+
+pub struct AdventArgs {
+ pub part: u32,
+ pub input: Vec<String>
+}
+
+impl AdventArgs {
+ pub fn init() -> AdventArgs {
+ let opt = AdventCli::from_args();
+ let input = match AdventArgs::read_file(&opt.input) {
+ Ok(input) => input,
+ Err(error) => {
+ // Typically I would think of exiting the program like
+ // this to be bad form, but in this case I'm matching the
+ // interface of StructOpt: if the input parameters were
+ // invalid, just quit now with a nice message.
+ eprintln!("Error reading file: {}", error);
+ process::exit(1);
+ }
+ };
+ AdventArgs {
+ part: opt.part,
+ input: input
+ }
+ }
+
+ fn read_file(file: &PathBuf) -> Result<Vec<String>, std::io::Error> {
+ let file = File::open(file)?;
+ let file_reader = BufReader::new(file);
+ file_reader.lines()
+ .collect::<Result<Vec<_>, _>>()
+ .map(AdventArgs::preprocess_file_lines)
+ }
+
+ fn preprocess_file_lines(lines: Vec<String>) -> Vec<String> {
+ lines.iter()
+ .filter(|line| line.len() > 0)
+ .map(|line| line.trim_right().to_string())
+ .collect()
+ }
+
+ pub fn one_number_input(&self) -> Result<i32, std::num::ParseIntError> {
+ self.input[0].parse()
+ }
+ pub fn number_per_line_input(&self) -> Result<Vec<i32>, std::num::ParseIntError> {
+ self.input.iter().map(|line| line.parse()).collect()
+ }
+}
+
+pub fn parse_space_separated_ints(line: &String) -> Result<Vec<i32>, std::num::ParseIntError> {
+ line.split_whitespace()
+ .map(|x| x.parse::<i32>())
+ .collect()
+}
+
+
+#[derive(Hash, Eq, PartialEq, Debug, Clone, Copy)]
+pub struct Point {
+ pub x: i32,
+ pub y: i32
+}
+
+impl Point {
+ pub fn up(&self) -> Point {
+ Point {
+ y: self.y-1,
+ ..*self
+ }
+ }
+
+ pub fn down(&self) -> Point {
+ Point {
+ y: self.y+1,
+ ..*self
+ }
+ }
+
+ pub fn left(&self) -> Point {
+ Point {
+ x: self.x-1,
+ ..*self
+ }
+ }
+
+ pub fn right(&self) -> Point {
+ Point {
+ x: self.x+1,
+ ..*self
+ }
+ }
+
+ pub fn shift(&self, dir: &Direction) -> Point {
+ use Direction::*;
+
+ match *dir {
+ Right => self.right(),
+ Left => self.left(),
+ Up => self.up(),
+ Down => self.down()
+ }
+ }
+}
+
+#[derive(Debug)]
+pub enum Direction {
+ Left,
+ Up,
+ Down,
+ Right
+}
+
+impl Direction {
+ pub fn rotate_left(&self) -> Direction {
+ use Direction::*;
+ match *self {
+ Right => Up,
+ Up => Left,
+ Left => Down,
+ Down => Right
+ }
+ }
+
+ pub fn rotate_right(&self) -> Direction {
+ use Direction::*;
+ match *self {
+ Right => Down,
+ Up => Right,
+ Left => Up,
+ Down => Left
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct Point3d {
+ pub x: i32,
+ pub y: i32,
+ pub z: i32
+}
+
+impl std::ops::Add for Point3d {
+ type Output = Point3d;
+
+ fn add(self, other: Point3d) -> Point3d {
+ Point3d {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ z: self.z + other.z
+ }
+ }
+
+}
+
+impl Point3d {
+ pub fn manhattan_distance(&self) -> i32 {
+ self.x.abs() + self.y.abs() + self.z.abs()
+ }
+}
+
+pub fn knot_hash(input: &String) -> String {
+ let suffix: [usize; 5] = [17, 31, 73, 47, 23];
+ let lengths: Vec<usize> = input.as_bytes()
+ .iter().map(|&x| x as usize)
+ .chain(suffix.iter().cloned())
+ .collect();
+
+ let mut position = 0;
+ let mut list: Vec<u32> = (0..256).collect();
+
+ for i in 0..64 {
+ let skip = lengths.len() * i;
+ knot_hash_round(&mut list, &lengths, &mut position, skip);
+ }
+
+ let mut current_char = 0;
+ let mut result = String::new();
+ for (i, l) in list.iter().enumerate() {
+ current_char = current_char ^ l;
+ if i % 16 == 15 {
+ result.push_str(&format!("{:02x}", current_char));
+ current_char = 0;
+ }
+ }
+ result
+}
+
+fn knot_hash_round(list: &mut Vec<u32>, lengths: &Vec<usize>, position: &mut usize, skip: usize) {
+ for (inner_skip, &length) in lengths.iter().enumerate() {
+ knot_hash_reverse_segment(list, *position, length);
+ *position = (*position + length + skip + inner_skip) % list.len();
+ }
+}
+
+fn knot_hash_reverse_segment(list: &mut Vec<u32>, position: usize, length: usize) {
+ let mut a = position;
+ let mut b = position + length - 1;
+ let len = list.len();
+ while a < b {
+ list.swap(a%len, b%len);
+
+ a += 1;
+ b -= 1;
+ }
+}
+
diff --git a/2018/Cargo.toml b/2018/Cargo.toml
new file mode 100644
index 0000000..b1342d1
--- /dev/null
+++ b/2018/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "advent_of_code_2018"
+version = "0.1.0"
+authors = ["Justin Worthe <justin@worthe-it.co.za>"]
+
+[dependencies]
+im-rc = "12.2.0"
+arrayvec = "0.4.9"
+
+[profile.release]
+debug = true
diff --git a/2018/inputs/1.txt b/2018/inputs/1.txt
new file mode 100644
index 0000000..079567f
--- /dev/null
+++ b/2018/inputs/1.txt
@@ -0,0 +1,968 @@
++11
++9
++15
+-17
++8
++16
++5
++13
++8
+-6
++12
+-17
+-16
++13
++16
+-15
+-5
++11
++19
++5
+-8
++20
++18
++15
+-4
+-12
++8
++2
++15
++12
+-13
+-4
+-1
+-14
+-15
+-6
+-9
+-13
++18
++13
++6
+-8
+-3
+-19
++8
++17
++8
++5
+-11
++15
+-7
++9
+-18
+-9
++17
+-14
+-19
++4
+-6
++4
++1
+-12
++4
+-1
+-9
++4
++19
++20
++11
++8
++19
+-13
++17
++6
++8
+-11
++5
++9
+-15
++17
+-12
++6
+-19
+-2
++17
+-18
++7
+-5
++19
++15
++5
+-6
++2
++5
++18
++11
++2
++5
+-14
++17
++17
++1
++17
+-9
+-1
++5
+-11
++5
+-17
++2
++14
++16
+-3
++17
++18
++1
+-16
++19
+-11
+-10
++3
++8
++17
++19
+-18
++6
+-1
+-2
++14
+-2
++12
++11
++1
+-19
+-1
++18
++13
+-6
+-10
+-13
++12
+-11
++19
++14
++17
+-2
+-18
+-4
++11
+-12
+-2
+-21
++7
+-1
+-5
+-13
+-18
+-18
+-7
++9
++12
++6
+-12
++20
+-19
++6
+-19
++3
+-16
++20
+-17
+-8
++4
++8
+-21
++18
+-6
+-13
++2
++5
+-14
+-16
+-19
+-17
++4
+-15
+-11
+-3
++6
++13
++18
+-16
+-16
+-15
+-15
+-2
++1
+-3
++13
++25
++1
++14
+-8
+-8
+-19
++7
++11
++20
++5
+-9
++8
++19
+-9
++3
++1
++1
+-12
++18
++15
+-5
++11
+-1
++18
+-2
+-18
+-14
+-1
+-16
++12
++12
+-20
++10
++25
+-13
+-17
+-20
+-13
++11
+-40
+-19
++5
+-21
+-9
+-15
+-6
++3
++13
+-5
+-2
++33
++3
+-7
++42
++32
+-13
++2
++37
+-1
+-20
++30
++3
++8
++10
++11
+-5
+-26
++35
++16
+-12
++9
++16
++18
+-13
+-15
++19
++6
++18
++16
++11
++16
+-2
+-10
++1
+-2
++17
++7
+-1
++17
++6
++15
++7
+-5
+-6
++9
+-4
+-17
+-14
+-1
+-21
+-2
++15
++3
++8
+-18
+-17
+-14
++6
+-17
++20
++13
++14
+-1
+-1
++3
+-11
++19
++19
++7
+-18
+-9
++11
+-12
++11
++4
++2
++8
+-2
++6
+-20
++5
++6
+-13
+-8
++6
++11
++8
++2
++7
++11
+-7
++18
++11
++15
+-16
+-18
++6
++10
++6
++15
++13
++4
++4
++14
++14
+-47
++17
+-7
+-20
+-1
++19
++16
+-23
+-13
+-17
++13
+-8
++6
+-20
++4
++15
++4
++19
++19
+-7
+-24
+-17
+-19
+-2
++19
+-13
++8
+-4
+-19
+-9
++29
++21
+-29
++2
++15
++22
++1
++21
+-13
+-14
++12
+-57
+-5
+-49
+-10
+-19
+-19
+-6
++7
++21
+-12
+-13
+-13
++4
+-15
++9
++21
+-7
++19
++32
++31
+-27
+-21
++25
+-101
++69
+-75
++26
+-22
+-45
+-30
++5
+-40
+-15
+-880
+-60727
++14
+-13
+-18
++7
++2
+-5
++6
++14
++5
++5
+-18
+-15
+-9
++7
+-10
++19
++4
++7
++6
++3
++21
++2
++5
+-19
++15
+-11
+-19
+-7
+-1
+-16
++4
+-12
+-15
++3
++5
+-6
+-14
++11
+-16
+-7
+-15
++8
++12
+-2
+-9
+-12
+-17
++19
+-5
+-19
++16
+-10
+-13
+-14
+-1
+-10
+-18
+-6
+-11
++8
+-11
++4
++14
++9
++8
+-18
+-9
++8
+-19
+-5
+-14
++13
++19
++13
++16
++19
+-4
+-4
++3
++19
+-4
+-7
+-15
++6
+-9
+-15
++12
+-14
++6
+-17
++9
++13
+-4
+-20
++17
+-9
+-12
++16
++6
+-9
++19
++10
++11
++17
+-19
+-1
++12
++12
++1
+-6
+-1
++4
+-12
++11
+-14
++19
+-3
+-9
+-6
+-23
+-2
+-13
++18
+-2
++10
++2
++8
+-9
+-20
+-17
+-21
+-14
++11
+-5
+-15
++2
+-9
++4
+-7
+-12
++9
+-1
+-11
++1
+-10
++11
+-17
+-10
+-17
+-3
+-10
++11
++15
+-19
+-14
++1
++2
++18
++17
++3
++17
+-18
+-15
++2
+-3
+-14
++9
++9
++6
+-18
++13
+-21
+-18
++12
++7
++13
+-11
++20
++12
++1
++15
+-14
++4
++11
++18
+-2
+-7
+-12
+-11
++5
++10
++6
++8
++18
++6
+-13
++19
+-5
+-3
++14
+-3
+-20
+-3
+-3
++16
+-15
+-12
++8
+-24
+-16
+-13
+-3
++13
++6
+-12
+-31
++7
+-18
++17
+-13
++1
+-15
++16
++4
+-1
+-17
+-1
++16
+-4
++13
++8
++3
++33
++8
+-6
++20
+-4
++2
++13
+-29
+-17
+-22
+-24
+-5
++2
+-12
+-1
++2
+-15
++2
+-11
++6
++1
+-2
++5
++4
+-22
++5
++19
+-13
+-7
++16
++6
++2
+-22
++19
++9
++8
+-9
+-12
+-18
+-13
++1
++5
+-9
++10
+-11
+-10
++16
+-15
+-2
+-16
++1
+-15
+-17
+-3
++6
++11
++4
++11
+-16
+-3
++6
+-1
++13
++18
++6
+-2
+-6
+-4
+-5
++20
++19
+-8
++1
+-13
++16
++1
++10
+-25
+-19
+-4
++9
+-8
++17
++6
+-19
+-2
++5
++12
++7
+-21
+-12
++3
+-7
+-11
+-3
+-18
++2
++12
++20
+-23
+-19
+-17
++9
+-19
++1
+-14
+-5
+-4
+-9
++17
++4
++3
++15
+-13
++1
+-12
+-17
++8
++8
+-20
+-17
++15
+-16
++10
++7
++2
+-10
+-2
++8
++19
+-6
+-17
+-8
++9
++17
++25
+-5
+-18
++4
++18
++9
++18
+-14
+-2
++11
++14
+-17
+-15
++38
++12
+-2
++14
++4
++21
++16
++12
++15
++23
+-1
++6
++9
+-24
+-6
+-13
+-3
++33
+-13
++62
++81
++11
+-5
+-27
++9
+-7
++20
+-19
+-4
++27
++28
+-29
++82
++11
+-10
++8
+-22
++42
++34
+-24
+-15
++19
+-66
+-70
+-34
+-18
+-548
++408
+-1249
+-60542
++6
+-17
+-4
++6
+-7
++3
++14
++2
++15
+-6
+-5
++19
+-17
+-10
++6
+-11
++2
+-4
++10
+-5
+-11
+-13
+-12
+-14
+-10
+-9
++17
++9
++15
++1
+-10
+-10
++14
++16
+-17
+-15
++7
+-6
+-16
+-10
++15
+-2
+-7
+-3
+-5
+-14
+-8
+-9
++16
++7
++17
+-22
++12
+-16
++18
++5
++15
++10
++20
++11
+-5
++12
+-16
++8
+-16
++13
++14
+-5
+-12
+-9
+-16
+-5
++16
+-18
++21
+-9
+-13
+-8
+-10
++14
++18
+-17
+-16
++8
+-15
++2
+-4
++3
+-21
++17
+-16
++18
++18
+-3
+-21
++1
+-19
+-3
+-2
+-4
+-5
+-20
+-19
++6
+-19
++3
+-12
++124236
diff --git a/2018/inputs/10.txt b/2018/inputs/10.txt
new file mode 100644
index 0000000..3c77538
--- /dev/null
+++ b/2018/inputs/10.txt
@@ -0,0 +1,369 @@
+position=<-30052, -9918> velocity=< 3, 1>
+position=< 20349, -50260> velocity=<-2, 5>
+position=< 40505, -40169> velocity=<-4, 4>
+position=< 30444, 50599> velocity=<-3, -5>
+position=< 40549, -50259> velocity=<-4, 5>
+position=< 30454, -30087> velocity=<-3, 3>
+position=< 50623, 20347> velocity=<-5, -2>
+position=< 30439, -50262> velocity=<-3, 5>
+position=< 50623, 40516> velocity=<-5, -4>
+position=<-40143, -30090> velocity=< 4, 3>
+position=< 50594, 50602> velocity=<-5, -5>
+position=< -9884, -30087> velocity=< 1, 3>
+position=<-19958, -40168> velocity=< 2, 4>
+position=< 20357, 40513> velocity=<-2, -4>
+position=<-50240, 30431> velocity=< 5, -3>
+position=< 20351, 40516> velocity=<-2, -4>
+position=<-50257, -20005> velocity=< 5, 2>
+position=<-30073, 10253> velocity=< 3, -1>
+position=<-50265, 50597> velocity=< 5, -5>
+position=<-40154, 50601> velocity=< 4, -5>
+position=<-19987, -40168> velocity=< 2, 4>
+position=<-19987, -30087> velocity=< 2, 3>
+position=<-50257, 30425> velocity=< 5, -3>
+position=< 40558, 30425> velocity=<-4, -3>
+position=<-19990, 10256> velocity=< 2, -1>
+position=<-19979, 30425> velocity=< 2, -3>
+position=<-19976, -50254> velocity=< 2, 5>
+position=< 30446, -40172> velocity=<-3, 4>
+position=<-40157, 40515> velocity=< 4, -4>
+position=<-40143, 20342> velocity=< 4, -2>
+position=< 30467, -50255> velocity=<-3, 5>
+position=<-30040, 50606> velocity=< 3, -5>
+position=<-30037, 50605> velocity=< 3, -5>
+position=< 20382, -30086> velocity=<-2, 3>
+position=< 50594, 10262> velocity=<-5, -1>
+position=< 20342, 40515> velocity=<-2, -4>
+position=<-19963, -50258> velocity=< 2, 5>
+position=<-40135, 50599> velocity=< 4, -5>
+position=< 40558, 10262> velocity=<-4, -1>
+position=< 20366, -40177> velocity=<-2, 4>
+position=< -9888, -9919> velocity=< 1, 1>
+position=<-19998, 40511> velocity=< 2, -4>
+position=< 50608, 40516> velocity=<-5, -4>
+position=< 10263, 40520> velocity=<-1, -4>
+position=< 40521, -40171> velocity=<-4, 4>
+position=< 30427, -20005> velocity=<-3, 2>
+position=< 20333, -9916> velocity=<-2, 1>
+position=< -9909, -9913> velocity=< 1, 1>
+position=< 50628, 40511> velocity=<-5, -4>
+position=< 50610, 30430> velocity=<-5, -3>
+position=<-50248, 30433> velocity=< 5, -3>
+position=< 50612, 50599> velocity=<-5, -5>
+position=<-50253, -40170> velocity=< 5, 4>
+position=< -9880, 40513> velocity=< 1, -4>
+position=< 20362, 10256> velocity=<-2, -1>
+position=< -9877, -30087> velocity=< 1, 3>
+position=<-40182, -30082> velocity=< 4, 3>
+position=<-50240, -20003> velocity=< 5, 2>
+position=<-40138, 10255> velocity=< 4, -1>
+position=<-50221, 20348> velocity=< 5, -2>
+position=< -9896, -9917> velocity=< 1, 1>
+position=<-50209, 40516> velocity=< 5, -4>
+position=< 20352, 50602> velocity=<-2, -5>
+position=< 50607, -19998> velocity=<-5, 2>
+position=<-19995, -30087> velocity=< 2, 3>
+position=<-20003, 40517> velocity=< 2, -4>
+position=<-50219, 30431> velocity=< 5, -3>
+position=< 40521, -20001> velocity=<-4, 2>
+position=<-30036, 20339> velocity=< 3, -2>
+position=< 50624, 10257> velocity=<-5, -1>
+position=<-50224, 40517> velocity=< 5, -4>
+position=< -9907, 20344> velocity=< 1, -2>
+position=< 40534, -40169> velocity=<-4, 4>
+position=<-30065, -20003> velocity=< 3, 2>
+position=< -9922, 20339> velocity=< 1, -2>
+position=<-30052, 50602> velocity=< 3, -5>
+position=< 10276, -50263> velocity=<-1, 5>
+position=< 50594, 10258> velocity=<-5, -1>
+position=< -9876, 10258> velocity=< 1, -1>
+position=<-20001, -30091> velocity=< 2, 3>
+position=<-50253, 50602> velocity=< 5, -5>
+position=<-40159, -20002> velocity=< 4, 2>
+position=<-50224, -30091> velocity=< 5, 3>
+position=<-20001, 40511> velocity=< 2, -4>
+position=< 20357, -40173> velocity=<-2, 4>
+position=< 50615, 10255> velocity=<-5, -1>
+position=< -9877, -50254> velocity=< 1, 5>
+position=< 30440, 40516> velocity=<-3, -4>
+position=< 30427, 50605> velocity=<-3, -5>
+position=< 30419, -30090> velocity=<-3, 3>
+position=< 20376, -20001> velocity=<-2, 2>
+position=< 10255, 20344> velocity=<-1, -2>
+position=< 30419, 20344> velocity=<-3, -2>
+position=< 50595, -40169> velocity=<-5, 4>
+position=<-30081, 40513> velocity=< 3, -4>
+position=<-40143, -30090> velocity=< 4, 3>
+position=< 40553, 20344> velocity=<-4, -2>
+position=< 40529, -40170> velocity=<-4, 4>
+position=< 30427, -50262> velocity=<-3, 5>
+position=<-50240, -19996> velocity=< 5, 2>
+position=<-50245, -30090> velocity=< 5, 3>
+position=< 30448, -30087> velocity=<-3, 3>
+position=< -9875, -40171> velocity=< 1, 4>
+position=< -9900, 50599> velocity=< 1, -5>
+position=<-19954, -40168> velocity=< 2, 4>
+position=< 40526, 40518> velocity=<-4, -4>
+position=<-20011, 30428> velocity=< 2, -3>
+position=< 10283, 10257> velocity=<-1, -1>
+position=<-40175, 40520> velocity=< 4, -4>
+position=< 50636, -9915> velocity=<-5, 1>
+position=< -9904, 10255> velocity=< 1, -1>
+position=< 30435, 40520> velocity=<-3, -4>
+position=< 30424, -50254> velocity=<-3, 5>
+position=< 20393, 50602> velocity=<-2, -5>
+position=<-50261, -30083> velocity=< 5, 3>
+position=<-30065, 10254> velocity=< 3, -1>
+position=<-30052, -40177> velocity=< 3, 4>
+position=< 50625, -50263> velocity=<-5, 5>
+position=<-40142, -20001> velocity=< 4, 2>
+position=< 20338, -19996> velocity=<-2, 2>
+position=< 50599, 50604> velocity=<-5, -5>
+position=< 40534, -40176> velocity=<-4, 4>
+position=<-50235, 20339> velocity=< 5, -2>
+position=<-30068, -9918> velocity=< 3, 1>
+position=<-40173, 20339> velocity=< 4, -2>
+position=<-30054, -9915> velocity=< 3, 1>
+position=< 10255, 20348> velocity=<-1, -2>
+position=<-40162, 40520> velocity=< 4, -4>
+position=<-40158, -9918> velocity=< 4, 1>
+position=< 40508, 20348> velocity=<-4, -2>
+position=< 10307, -40177> velocity=<-1, 4>
+position=< 40545, -50261> velocity=<-4, 5>
+position=<-30073, -40172> velocity=< 3, 4>
+position=<-50209, -9918> velocity=< 5, 1>
+position=< -9913, 40515> velocity=< 1, -4>
+position=< -9873, -50262> velocity=< 1, 5>
+position=< -9877, 10261> velocity=< 1, -1>
+position=<-50245, -30084> velocity=< 5, 3>
+position=< 30440, 50606> velocity=<-3, -5>
+position=<-40167, 40514> velocity=< 4, -4>
+position=<-30076, -50255> velocity=< 3, 5>
+position=< -9891, -19996> velocity=< 1, 2>
+position=< -9877, 20340> velocity=< 1, -2>
+position=< 20365, -9911> velocity=<-2, 1>
+position=<-50256, 10253> velocity=< 5, -1>
+position=< -9909, -19996> velocity=< 1, 2>
+position=< 30479, -9919> velocity=<-3, 1>
+position=<-30065, 10257> velocity=< 3, -1>
+position=< 50652, -9919> velocity=<-5, 1>
+position=< 20338, -9914> velocity=<-2, 1>
+position=<-30062, 20339> velocity=< 3, -2>
+position=< 20360, 10259> velocity=<-2, -1>
+position=< 40537, 50604> velocity=<-4, -5>
+position=<-50221, 50603> velocity=< 5, -5>
+position=< 40505, -30090> velocity=<-4, 3>
+position=< -9890, 20339> velocity=< 1, -2>
+position=<-30097, -50261> velocity=< 3, 5>
+position=<-19995, -30086> velocity=< 2, 3>
+position=< 20341, 10255> velocity=<-2, -1>
+position=<-19977, -20005> velocity=< 2, 2>
+position=<-30053, -50259> velocity=< 3, 5>
+position=<-30065, -40173> velocity=< 3, 4>
+position=< 50617, 50601> velocity=<-5, -5>
+position=< 50631, -40171> velocity=<-5, 4>
+position=< -9925, -9915> velocity=< 1, 1>
+position=<-40150, 10262> velocity=< 4, -1>
+position=< 40526, 40516> velocity=<-4, -4>
+position=<-30055, -9915> velocity=< 3, 1>
+position=<-50264, 30432> velocity=< 5, -3>
+position=< 10287, -20003> velocity=<-1, 2>
+position=< 40534, 20348> velocity=<-4, -2>
+position=<-19960, -19998> velocity=< 2, 2>
+position=< 30464, -40173> velocity=<-3, 4>
+position=<-50220, -50259> velocity=< 5, 5>
+position=< 40537, -9919> velocity=<-4, 1>
+position=< 20357, 20346> velocity=<-2, -2>
+position=< 40510, 50598> velocity=<-4, -5>
+position=< 50607, -40172> velocity=<-5, 4>
+position=< 40537, -19996> velocity=<-4, 2>
+position=< 50636, 10261> velocity=<-5, -1>
+position=< -9896, 30425> velocity=< 1, -3>
+position=< -9917, 10255> velocity=< 1, -1>
+position=<-50248, 50606> velocity=< 5, -5>
+position=<-50237, -9919> velocity=< 5, 1>
+position=<-30073, -20005> velocity=< 3, 2>
+position=< 40529, 50606> velocity=<-4, -5>
+position=< 50650, -30082> velocity=<-5, 3>
+position=<-30093, 10258> velocity=< 3, -1>
+position=< 30456, -40177> velocity=<-3, 4>
+position=< 40521, -40170> velocity=<-4, 4>
+position=< 30468, 10257> velocity=<-3, -1>
+position=< 10276, -50261> velocity=<-1, 5>
+position=< 30421, -9919> velocity=<-3, 1>
+position=< -9877, 20346> velocity=< 1, -2>
+position=< 10258, -40177> velocity=<-1, 4>
+position=<-50264, 40516> velocity=< 5, -4>
+position=< -9883, -40173> velocity=< 1, 4>
+position=<-40127, -50256> velocity=< 4, 5>
+position=< -9885, 20343> velocity=< 1, -2>
+position=< 20382, -9914> velocity=<-2, 1>
+position=<-30076, -19998> velocity=< 3, 2>
+position=<-30073, 50601> velocity=< 3, -5>
+position=< -9893, 20345> velocity=< 1, -2>
+position=< -9904, 10258> velocity=< 1, -1>
+position=< 20393, -40171> velocity=<-2, 4>
+position=<-19984, 50603> velocity=< 2, -5>
+position=< -9889, 20343> velocity=< 1, -2>
+position=<-19982, 40512> velocity=< 2, -4>
+position=<-20009, -40168> velocity=< 2, 4>
+position=<-30069, -19997> velocity=< 3, 2>
+position=<-19987, -30085> velocity=< 2, 3>
+position=< 10252, 10259> velocity=<-1, -1>
+position=< -9917, 30428> velocity=< 1, -3>
+position=< 10287, 20342> velocity=<-1, -2>
+position=<-50245, -20000> velocity=< 5, 2>
+position=<-40165, -40177> velocity=< 4, 4>
+position=<-40135, -50262> velocity=< 4, 5>
+position=<-19984, -30085> velocity=< 2, 3>
+position=< 30428, -30091> velocity=<-3, 3>
+position=<-30089, 30431> velocity=< 3, -3>
+position=< 30467, 20344> velocity=<-3, -2>
+position=<-19987, 40520> velocity=< 2, -4>
+position=<-30037, 40512> velocity=< 3, -4>
+position=< 40557, -50255> velocity=<-4, 5>
+position=< 40550, 10254> velocity=<-4, -1>
+position=<-40159, 10258> velocity=< 4, -1>
+position=< 40539, 20343> velocity=<-4, -2>
+position=< 30440, 50605> velocity=<-3, -5>
+position=< 30453, 30434> velocity=<-3, -3>
+position=< 40550, -30088> velocity=<-4, 3>
+position=<-40151, 10256> velocity=< 4, -1>
+position=< 10276, 40514> velocity=<-1, -4>
+position=< 10280, 20348> velocity=<-1, -2>
+position=<-20009, -30091> velocity=< 2, 3>
+position=< 30467, 50601> velocity=<-3, -5>
+position=< 30439, -20000> velocity=<-3, 2>
+position=< 10276, -20005> velocity=<-1, 2>
+position=< 40562, -30082> velocity=<-4, 3>
+position=<-19986, -20004> velocity=< 2, 2>
+position=< 20333, 10259> velocity=<-2, -1>
+position=<-50224, -9911> velocity=< 5, 1>
+position=< -9872, -9919> velocity=< 1, 1>
+position=< 10295, -30085> velocity=<-1, 3>
+position=<-19990, 30429> velocity=< 2, -3>
+position=< 10295, -30084> velocity=<-1, 3>
+position=< 30429, 40515> velocity=<-3, -4>
+position=< 20365, -30086> velocity=<-2, 3>
+position=< 50618, 10258> velocity=<-5, -1>
+position=<-20010, -9910> velocity=< 2, 1>
+position=< 20373, -40169> velocity=<-2, 4>
+position=< 10307, -50261> velocity=<-1, 5>
+position=< 20381, 10256> velocity=<-2, -1>
+position=< 40513, 40517> velocity=<-4, -4>
+position=< -9865, 20345> velocity=< 1, -2>
+position=< -9909, 20347> velocity=< 1, -2>
+position=< 10284, 20348> velocity=<-1, -2>
+position=<-30073, 20342> velocity=< 3, -2>
+position=<-30078, 30425> velocity=< 3, -3>
+position=< -9899, 20342> velocity=< 1, -2>
+position=< 20333, 30429> velocity=<-2, -3>
+position=< 10306, 10253> velocity=<-1, -1>
+position=<-50261, 10260> velocity=< 5, -1>
+position=< 30459, -9912> velocity=<-3, 1>
+position=< 10292, -40176> velocity=<-1, 4>
+position=< 20389, -30083> velocity=<-2, 3>
+position=<-40166, 20340> velocity=< 4, -2>
+position=< -9901, 20345> velocity=< 1, -2>
+position=< 40557, -20004> velocity=<-4, 2>
+position=<-40158, -30090> velocity=< 4, 3>
+position=<-50209, 10255> velocity=< 5, -1>
+position=<-50265, -40172> velocity=< 5, 4>
+position=<-50245, 50605> velocity=< 5, -5>
+position=< 30443, -40177> velocity=<-3, 4>
+position=< -9916, 20339> velocity=< 1, -2>
+position=< 50640, 50601> velocity=<-5, -5>
+position=<-19971, -20005> velocity=< 2, 2>
+position=< 40522, -9914> velocity=<-4, 1>
+position=< 50607, -19999> velocity=<-5, 2>
+position=<-50243, 40515> velocity=< 5, -4>
+position=<-50240, 10260> velocity=< 5, -1>
+position=< 40561, -19998> velocity=<-4, 2>
+position=<-50211, -50254> velocity=< 5, 5>
+position=<-40143, 30431> velocity=< 4, -3>
+position=< 30430, -50259> velocity=<-3, 5>
+position=< 30479, -20002> velocity=<-3, 2>
+position=<-30092, 20344> velocity=< 3, -2>
+position=<-30092, -40168> velocity=< 3, 4>
+position=< 50601, 10257> velocity=<-5, -1>
+position=< 20373, 40515> velocity=<-2, -4>
+position=< 30479, -19997> velocity=<-3, 2>
+position=<-40175, 50605> velocity=< 4, -5>
+position=< -9880, -40173> velocity=< 1, 4>
+position=< 20349, -50255> velocity=<-2, 5>
+position=< 20362, -9914> velocity=<-2, 1>
+position=<-30089, 50601> velocity=< 3, -5>
+position=< 30467, 10253> velocity=<-3, -1>
+position=< 40565, 30429> velocity=<-4, -3>
+position=<-40142, 10257> velocity=< 4, -1>
+position=< 50609, -50263> velocity=<-5, 5>
+position=< -9881, -40173> velocity=< 1, 4>
+position=< 50639, 40515> velocity=<-5, -4>
+position=<-50269, -40170> velocity=< 5, 4>
+position=< 40553, -9910> velocity=<-4, 1>
+position=< 30455, 30434> velocity=<-3, -3>
+position=< 20362, 10258> velocity=<-2, -1>
+position=< 40505, 50603> velocity=<-4, -5>
+position=<-19990, 10260> velocity=< 2, -1>
+position=< 30447, -19998> velocity=<-3, 2>
+position=<-40150, -30087> velocity=< 4, 3>
+position=< -9907, -40172> velocity=< 1, 4>
+position=<-30044, 20348> velocity=< 3, -2>
+position=<-40178, -9913> velocity=< 4, 1>
+position=<-50261, 30428> velocity=< 5, -3>
+position=<-40151, 20348> velocity=< 4, -2>
+position=<-50224, 30432> velocity=< 5, -3>
+position=< 50652, -50263> velocity=<-5, 5>
+position=<-19952, 50606> velocity=< 2, -5>
+position=< 30431, 40511> velocity=<-3, -4>
+position=< 30459, -30088> velocity=<-3, 3>
+position=< 50651, 20347> velocity=<-5, -2>
+position=< 10292, -30082> velocity=<-1, 3>
+position=< 20366, 10257> velocity=<-2, -1>
+position=<-19987, -9913> velocity=< 2, 1>
+position=< -9865, -40170> velocity=< 1, 4>
+position=< -9889, 50597> velocity=< 1, -5>
+position=<-30065, -50262> velocity=< 3, 5>
+position=< -9921, 20347> velocity=< 1, -2>
+position=<-30084, 10253> velocity=< 3, -1>
+position=< 10248, -20005> velocity=<-1, 2>
+position=< 20345, -9915> velocity=<-2, 1>
+position=< -9882, -9915> velocity=< 1, 1>
+position=<-30065, 50602> velocity=< 3, -5>
+position=< 40565, 50599> velocity=<-4, -5>
+position=< 20349, -50261> velocity=<-2, 5>
+position=<-19960, -19998> velocity=< 2, 2>
+position=< 10255, -50258> velocity=<-1, 5>
+position=< -9901, -50255> velocity=< 1, 5>
+position=<-50219, -9916> velocity=< 5, 1>
+position=< 40524, -30086> velocity=<-4, 3>
+position=< 40550, 50600> velocity=<-4, -5>
+position=<-50233, -30091> velocity=< 5, 3>
+position=< 30440, -50257> velocity=<-3, 5>
+position=< -9920, 50605> velocity=< 1, -5>
+position=< 40507, 20339> velocity=<-4, -2>
+position=< 10264, 30426> velocity=<-1, -3>
+position=< 40556, 20341> velocity=<-4, -2>
+position=< -9875, -9913> velocity=< 1, 1>
+position=<-30068, -50254> velocity=< 3, 5>
+position=< -9889, 30425> velocity=< 1, -3>
+position=<-20011, -40172> velocity=< 2, 4>
+position=<-50269, 10259> velocity=< 5, -1>
+position=<-40132, 30432> velocity=< 4, -3>
+position=< 40553, -9913> velocity=<-4, 1>
+position=<-30073, 10256> velocity=< 3, -1>
+position=<-30092, 20340> velocity=< 3, -2>
+position=< 40542, 50606> velocity=<-4, -5>
+position=<-50224, 20347> velocity=< 5, -2>
+position=<-40143, 50606> velocity=< 4, -5>
+position=<-19971, -20000> velocity=< 2, 2>
+position=< 40553, 20340> velocity=<-4, -2>
+position=<-30081, -20001> velocity=< 3, 2>
+position=<-30037, -40172> velocity=< 3, 4>
+position=< -9865, 30428> velocity=< 1, -3>
+position=< 30479, 20340> velocity=<-3, -2>
+position=< 30429, 20343> velocity=<-3, -2>
+position=<-19971, -40172> velocity=< 2, 4>
+position=< 30431, 50601> velocity=<-3, -5>
+position=<-19982, 10256> velocity=< 2, -1>
+position=< 20344, 20343> velocity=<-2, -2>
diff --git a/2018/inputs/12.txt b/2018/inputs/12.txt
new file mode 100644
index 0000000..6d801ae
--- /dev/null
+++ b/2018/inputs/12.txt
@@ -0,0 +1,34 @@
+initial state: ###..#...####.#..###.....####.######.....##.#####.##.##..###....#....##...##...##.#..###..#.#...#..#
+
+.###. => .
+..#.. => .
+.#### => .
+.##.. => #
+#.#.# => .
+..#.# => #
+#.##. => #
+#...# => #
+..... => .
+##..# => #
+.#.#. => .
+..##. => #
+##.#. => .
+###.. => .
+.#... => #
+..### => .
+#..## => .
+...#. => .
+###.# => #
+.##.# => .
+.#.## => .
+....# => .
+##### => .
+#.#.. => #
+...## => #
+#.... => .
+#.### => #
+##... => #
+.#..# => .
+####. => .
+#..#. => #
+##.## => #
diff --git a/2018/inputs/13.txt b/2018/inputs/13.txt
new file mode 100644
index 0000000..a2195f8
--- /dev/null
+++ b/2018/inputs/13.txt
@@ -0,0 +1,150 @@
+ /----------------------------------------------------\ /----------------------------\
+ /-------->-------\ | /----+----------+----------------------------+----------\
+ | /+-----+-----------------------------------------------+----+----------+-\ /---+-------\ |
+ | /-------++-----+-----------------------------------------------+----+----------+-+---\ | | | |
+ /--+-------+-------++-----+-----------------------------------------------+---\| | | | | | | |
+ /----------+--+-----\ | || | /----------------------------------+---++----------+-+---+----\ | | | |
+ | | | /---+-+-------++-----+------------+--------------->------------------+---++----------+-+\ | | | | | |
+ | /-----+--+-+---+-+-------++-----+------------+----------------------------------+---++---\ | || | | | | | |
+ | | | | | | | || | | /-------------------+---++---+--\ | || | | | | | |
+ /+----+-----+--+-+---+-+-------++-----+------------+\ | | || | | | || | | | | | |
+ || | /---+--+-+---+-+-------++-----+------------++-------------+-------------------+---++---+--+-\ | || | | | | | |
+ || | | | | | | | || /-+---------\ || | | || | | | | || | | | | | |
+ || | | | | | | | || | | | || | | || | | | | || | | | | | |
+ || | | | | | | ^ || | | | || | /-----+---++---+--+-+-+-++--+----+-------------+---+--\ | |
+ || | | | | | | | ||/--+-+---------+--++-------------+------->-----+-----+\ || | | | | || | | | | | | |
+ || | | | | | | | ||| | | | || /-------+-------------+-----++--++---+--+-+-+-++--+----+-------------+---+\ | | |
+ || | | | | | | | ||| |/+---------+--++-----+-------+-------------+-----++--++---+--+-+-+-++--+----+-------------+---++\| | |
+ || \-+---+--+-+---+-+-------+++--+++---------+--++-----+-------+-------------+-----++--++---/ | | | || |/---+-------------+---++++----+--+\
+ || | | | | | | ||| ||| | || | | | || || | | | || || | \---++++----/ ||
+ || | | \-+---+-+-------+/| ||| | || | | | |v || | | | || || | |||| ||
+ || | | | | | | |/-+++-----\ | || | | | || || | | | || || | |||| ||
+ || | | | | | | || ||| | | || | | | || || /----+-+-+-++--++---+-----------------++++-------++--\
+ || | /+----+---+-+-------+-++-+++-----+---+--++-\ | | | || || | | | | || || | |||| || |
+ || /--+--++----+---+-+--\ | || ||| | | || | | | /------+-----++--++-+----+-+-+-++--++---+-----------------++++--\ || |
+ || | | || | | | | | || ||| | | || | | | | /-+-----++-\|| | | | | || || | |||| | || |
+ || | | ||/---+---+-+--+----+-++-+++-----+---+--++-+---+--->---+-\ | | | || |||/+----+-+-+-++--++---+-----------------++++--+----++--+\
+ || | | ||| | | | | | || ||| | | || | | | | | | \-----++-+++++----+-+-+-++--++---+-----------------+++/ | || ||
+ || | | ||| | | | | | || ||| | | || | /+-------+-+----+----+-------++\||||| | | | || || | ||| | || ||
+ || | | ||| | | | | /+-++-+++-----+---+--++-+--++-------+-+\ /+----+-------++++++++----+-+-+-++--++---+-----------------+++-\ | || ||
+ || | | ||| /-+---+-+--+---++-++-+++-----+---+--++-+--++-------+-++--++----+------\|||||||| | | | || || | ||| | | || ||
+ || | | ||| | | | | | || || ||| | | || | || | || || | ||||||||| |/+-+-++--++---+-----------------+++-+-+\ || ||
+ || | | ||| | | | | | || || ||| | | || | || \-++--++----+------+++++++++----/|| | || /++---+------------\ ||| | || || ||
+ || | | ||| | | | | | || || ||| | | || | || /++--++----+---\ ||||||||| || | || ||| | | ||| | || || ||
+ || | | ||| | | | | | || || ||| | | || | || ||| || | | ||||||||| || | || ||\---+------------+----+++-+-++---+/ ||
+ || | | ||| | | | | | || || ||| |/--+--++-+--++-------\||| || | | ||||||||| || | || || | | ||| | || | ||
+ || | | /+++-+-+---+-+--+---++-++-+++-----++--+--++-+--++-------++++--++----+---+--+++++++++----\|| | || || | | ||| | || | ||
+ || | | |||| | | | | | || || ||\-----++--+--++-+--++-------++++--++----+---+--++++++/|| ||| | || || | | ||| | || | ||
+ || | | |||| | |/--+-+--+---++-++-++------++--+--++\| || /----++++--++----+---+--++++++-++----+++-+-++-++----+------\ | ||| | || | ||
+ || | | |||| | || | | | || || || || | |||| || | |||| || | | |||||| || ||| | || || | | | ||| | || | ||
+ || | | |||| | || | | | || || || /++--+--++++--++--+----++++--++----+---+--++++++-++----+++-+-++-++----+------+-----+----+++-+-++---+---++\
+ || | | |||| | || | | | || || || /---+++--+--++++--++--+----++++--++----+---+--++++++-++----+++-+-++-++\ | | /+----+++-+-++---+--\|||
+ || | | |||| | || | | | || || || | ||| | \+++--++--+----++++--++----+---+--++++++-++----+++-+-++-+++---/ | || ||| | || | ||||
+ || | | |||| | || | | | || || \+-+---+++--/ ||| || | |||| || | | |||||| || ||| | || ||| | || ||| | || | ||||
+ || | | |||| | || | | | || || |/+---+++------+++--++--+----++++--++\ | | |||||| || ||| | || ||| | || ||| | || | ||||
+ || | | |||| | || | | | || || ||| ||| ||| || | ||||/-+++---+---+--++++++-++----+++-+-++-+++----------+----++----+++-+\|| | ||||
+ || | | |||| \-++--+-+--+---++-++--+++---+++------+++--++--+----+++++-+++---+---+--/||||| || ||| | || ||| | || ||| |||| | ||||
+ || | | |||| || | | | || || ||| ||| ||| || | ||||| ||| | | ||||| || ||| | || ||| | || ||| |||| | ||||
+ || | | |||| || | | | || || ||| ||| /----+++--++--+----+++++-+++---+---+---+++++-++----+++-+-++-+++----------+----++---\||| |||| | ||||
+ || | /+-++++---++--+-+--+---++-++--+++---+++-+----+++--++--+----+++++-+++\ | | ||||| || ||| | || ||| | ||/--++++-++++\ | ||||
+ || |/++-++++---++--+-+--+--\|| || ||| ||\-+----+++--++--+----/\+++-++++--+---/ ||||| || ||| | || ||| | ||| |||| ||||| | ||||
+ || |||| |||| || | | | ||| || ||| || | ||| || | ||| |||| | ||||| || /-+++-+-++-+++---\ | ||| |||| ||||| | ||||
+ |\---++++-++++---++--/ | | ||| || ||| || | ||| || \------+++-++++--+-------+++++-++--+-+++-+-++-+++---+------/ ||| |||| ||||| | ||||
+ | |||| |||| || | | ||| || ||| || | ||| || ||| |||| | ||||| || | ||| | || ||| | ||| |||| ||||| | ||||
+ | |||| |||| || \--+--+++-++--+++---++--+----+++--++---------+++-++++--+-------+++++-++--+-+++-+-++-+/| | ||| |||| ||||| | ||||
+ | ||||/++++---++-------+--+++-++--+++---++--+----+++--++---------+++\|||| | ||||| || | |||/+-++-+-+---+-----------+++--++++-+++++--+\ ||||
+ | ||||||||\<--++-------+--+++-++--+++---++--+----+++--++---------/||||||| \-------+++/| || | ||||| || \-+---+-----------+/| |||| ||||| || ||||
+ | |||||||| /++------\| ||| || /+++---++--+----+++--++----------+++++++----------+++-+-++--+-+++++-++---+---+---------\ | | |||| ||||| || ||||
+ | |||||||| ||| ||/-+++-++-++++---++--+-\ ||| || ||||||| ||| | || | ||||| || | | | | | |||| ||||| || ||||
+ | |||||||| ||| ||| ||| || |||| || | | ||| || ||||||| /+++-+-++--+-+++++-++\ | | | | \--++++-++++/ || ||||
+ | |||||||| ||| ||| ||| || |||| || | | ||| || ||||||| |\++-+-++--+-+++++-+++--+---+---------+-+----++++-++++---/| ||||
+ | /--++++++++---+++------+++-+++-++-++++---++--+-+--+++\ || ||||||| | || | || | ||||| ||| | | | \----++++-++++----+-/|||
+ | | |||||||| ||| ||| ||| || |||| || | | |||| || ||||||| | || | || | ||||| ||| | |/--------+----\ |||| |||| | |||
+ | | |||||||| ||| /+++-+++-++-++++---++--+-+--++++-++----------+++++++---\ | || | || | ||||| ||| | || /------+---\| |||| |||| | |||
+ | | |||||||| ||| |||| ||| || |||| || | | |||| || /-----+++++++---+---\ | || | || | ||||| ||| |/--++-+------+---++-++++-++++----+-\|||
+ \-+--++++++++---+++-----++++-+++-++-++++---++--+-+--/||| || | ||||||| | | | || | || | ||||| ||| || || | | || |||| |||| | ||||
+ | |||||||| /-+++-----++++-+++-++-++++---++--+\| ||| || | ||||||| | | | || | || | ||||| ||| || || | | || |||| |||| | ||||
+ | |||||||| | ||| |||| ||| ||/++++---++--+++---+++-++----+-----+++++++---+---+-+-++-+-++--+-+++++-+++--++--++-+------+\ || |||| |||| | ||||
+/--+--++++++++-+-+++-----++++-+++-+++++++---++--+++---+++-++----+-----+++++++---+---+-+-++-+-++--+-+++++-+++\ || || | || || |||| |||| | ||||
+| | |||||||| | ||| ||||/+++-+++++++---++--+++---+++-++----+-----+++++++---+\ | | || | |\--+-+++++-++++-++--++-+------++--++-++++-++++----+-+/||
+| | |||||||| | ||| |||||||| ||||||| || ||| ||| || | ||||||| || | | || | | | ||||| |||| || || | || || |||| |||| | | ||
+| | |||||||| | |||/----++++++++-+++++++---++--+++---+++-++----+-----+++++++---++--+-+-++-+-+---+-+++++-++++-++\ || | || || |||| |||| | | ||
+| | |||||||| | |||| |||||||| ||||||| /-++--+++---+++-++----+-----+++++++---++--+\| || | | | ||||| |||| ||| || | || || |||| |||| | | ||
+| | |||||||| | |||| |||||||| ||||||| | || ||| ||| || | ||||||| || ||| || | | | ||||| |||| ||| || | || || |||| |||| | | ||
+| | |||\++++-+-++++----++++++++-+++++++-+-++--+++---+++-++----+-----+++++++---++--+++-++-+-+---+-++/|| |||| ||| || | || || |||| |||| | | ||
+| | ||| |||| | |||| ||||||||/+++++++-+-++\ ||| ||| || \-----+++++++---++--/|| || | | | || || |||| ||| || | || || |||| |||| | | ||
+| | ||| |||| | |||| |||||||\++++++++-+-+++-+++---+++-++----------+++++++---++---++-++-+-+---+-++-++-/||| ||| || | || || |||| |||| | | ||
+| | ||| |\++-+-++++----+++++++-++++++++-+-+++-+++---+++-++----------+++++++---++---++-++-+-+---+-/\-++--+++-+++-++-+------++--++-++++-+++/ | | ||
+| | ||| | || | |||| ||||||| |||||||| | ||| ||| ||| ^| ||||\++---++---++-++-+-+---+----++--+++-+++-++-+------++--++-++++-++/ | | ||
+| | ||| | || | |||| ||||||| ||||||\+-+-+++-+++---+++-++----------++++-/|/--++---++-++-+-+---+----++--+++-+++-++-+-\ || || |||| || | | ||
+| | ||| | || \-++++----+++++++-++++++-+-+-+++-+/| /-+++-++-------\ |||| || || || |v | v | \+--+++-+++-++-+-+----++--++-++++-++------/ | ||
+| | ||| | || |\++----+++++++-++++++-+-+-+++-+-+-+-+++-++-------+--++++--++--++---++-++-+-+---+-----+--/|| ||| || | | || || |||| || | ||
+| /+--+++-+-++---+-++----+++++++-++++++-+-+-+++-+-+-+-+++-++-------+--++++--++-\|| || || | | /+-----+---++-+++-++-+-+----++--++-++++-++-----\ | ||
+| || ||| | \+---+-++----+++++++-++++++-+-+-+++-+-+-+-+/| || | |||| || ||| || || | | || | || |\+-++-+-+----++--++-++++-++-----+--/ ||
+| || ||| | | |/++----+++++++-++++++-+-+-+++-+-+-+-+-+-++-------+--++++--++-+++---++-++-+-+--++-----+---++-+\| || | | || || |||| || | ||
+| || ||| | | |||| ||||||\-++++++-+-+-+++-+-+-+-+-+-++-------+--/||| || ||| || || | | || /---+---++-+++-++-+-+----++--++-++++-++---\ | ||
+| || ||| | /+---++++----++++++--++++++-+-+-+++-+-+-+-+-+-++-------+---+++--++-+++---++-++-+-+--++-+--\| || ||| || | | || || |||| || | | ||
+| || ||| | || /-++++----++++++\ |||||| | \-+++-+-+-+-+-+-++-------+---+++--++-+++---/| ||/+-+--++-+--++---++-+++-++-+\| || || |||| || | | ||
+| || ||\-+-++-+-++++----+++++++-++++++-+---+++-+-+-+-+-+-++-------+---+++--/| ||| | |||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | |\-+-++++----+++++++-++++++-+---+++-+-+-+-+-+-++-------+---+++---+-+++----+-+++/ | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | \+++----+/||||| \+++++-+---++/ | | | | | || | ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | |\+----+-+++++--+++++-+---++--+-+-+-/ | || | ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | | | | ||||| ||||| | || | | | /+-++-------+\ ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || \-+--+--+-+----+-+++++--+++++-+---++--+-+-+--++-++-------++--+/| | ||| \-+++--+--++-+--++---/| ||| || ||| || || |||| || | | ||
+| || || | | | | | ||||| ||||| | || | | | || || /----++--+-+---+-+++------+++--+--++-+--++----+-+++-++-+++----++-\|| |||| || | | ||
+| || ||/---+--+-\| |/---+-+++++--+++++-+---++--+-+-+--++-++--+----++--+-+---+-+++----\ ||| | ||/+--++----+-+++-++-+++----++-+++-++++-++---+\| ||
+| || ||| | | || || | ||||| ||||| | || | | | || || | || | | | ||| | ||| \--++++--++----+-+++-++-+++----++-+++-++++-++---+++----/|
+| || ||| | | || || | ||||| ||||| | || | | | /++-++--+----++--+-+---+-+++----+-+++-----++++--++----+-+++-++-+++----++-+++\|||| || ||| |
+| || ||| ^ | || || | ||||| ||||| | || | | | ||| || | || | | | ||| | ||| |||\--++----+-+++-++-+++----++-++++++++-++---/|| |
+| || ||| | | || || | ||||| ||||| | || \-+-+-+++-++--+----++--+-+---+-+++----+-+++-----+++---++----+-+++-++-+++----++-++++/||| || || |
+| || ||| | | || || | ||||| ||||| | || | | ||| || | /-++--+-+---+-+++----+-+++-----+++---++----+-+++-++-+++--\ || |||| ||| || || |
+|/++--+++---+--+-++-++---+-+++++--+++++-+--\|| |/+-+++-++--+--+\|| | | | ||| | ||| ||| |\----+-+++-++-+++--+-++-++++-/|| || || |
+|||| ||| | | || || | ||||| ||||| | ||| /+++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+++-++-+++--+-++-++++\ || || || |
+|||| ||| | | || || | ||||| |\+++-+--++/ |||| ||| || | |||| | | | ||| | ||| ||| | | ||| || ||| | || ||||| || || || |
+|||| ||| | | || || | ||||| |/+++-+--++---\|||| ||| || | |||| | | | ||| | ||| ||| | | ||| || ||| | || ||||| || || || |
+|||| |\+---+--+-++-++---+-+++/| ||||| | |\---+++++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+++-++-+++--+-++-+++++-++-++----++-----/
+|||| | | | | |\-++---+-+++-+--+++++-+--+----+++++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+/| || ||| | || ||||| || || ||
+|||| | | | | | /++---+-+++\| ||||| | | ||||| ||| || | |||| | | | ||| | ||| ||| | | | | || ||| | || ||||| || || ||
+|||| | | | /+-+-+++--\| ||||| ||||| | | ||||| ||| || | |||| | | | ||| | ||| ||| | | | | || ||| | || ||||| || || ||
+|||| | | | || | ||| || ||||| ||||| | | ||||| ||| || | |||| | | | ||| /-+-+++-----+++---+----\| | | || ||| | || ||||| || || ||
+|||| | | | || | ||| /++-+++++--+++++-+--+----+++++-+++-++--+--++++-\| | | ||| | | ||| ||\---+----++-+-+-++-+++--+-++-+++++-++-++----/|
+|||| | | | || | ||| ||| ||||| ||||| \--+----+++++-+++-++--+--++++-++-+---+-+++--+-+-+++-----++----+----++-/ | || ||| | || ||||| || || |
+|||| \-+--<+-++-+-+++-+++-/|||| ||||| | |\+++-+++-++--+--++++-++-+---+-+++--+-+-+++-----++----+----++---+-++-+++--+-++-++++/ || || |
+|||| | | || | ||| ||| |||| ||||| | | ||| ||| || | |||| |\-+---+-+++--+-+-+++-----++----+----++---+-++-+++--+-++-++++--++-+/ |
+|\++----+---+-++-+-+++-+++--++++--+++++----/ | ||| ||| \+--+--++++-+--+---+-+++--+-+-+/| |\----+----++---+-/| ||| | || |||| || | |
+| || | | || | ||| ||| |||| \++++---------+-+++-+++--+--+--++++-+--+---+-+++--+-+-/ | | | || | | ||| | || |||| || | |
+| || | | || | ||| ||| |||| |||\---------+-+++-+++--+--+--++++-+--+---+-+++--+-+---+-----+-----+----++---+--+-+++--+-++-++++--+/ | |
+| || | | || | ||| ||| |||| ||| /----+-+++-+++--+--+--++++-+--+---+-+++--+-+---+-----+--\ | || | | |||/-+-++-++++--+--+------+-\
+| |\----+---+-++-+-+++-+++--++++---+++-----+----+-+++-++/ | | |||| | \---+-+++--+-+---+-----+--+--+----++---+--+-++++-+-++-++++--+--/ | |
+| | | | || | ||| ||| |||| ||| | | ||| || | | |||| | | ||| | | | | | | || | | \+++-+-++-+/|| | | |
+| \-----+---+-++-+-+++-+++--++++---+++-----+----+-+++-++---+--+--++++-+------+-/|| | | \-----+--+--+----++---+--+--/|| | || | || | | |
+| | \-++-+-+++-+++--++++---+++-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+--/ || | | || |/++-+-++--+---------+-+---\
+| | |\-+-+++-+++--+++/ /+++-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+-------++---+--+>--++-++++-+-++--+-------\ | | |
+| | | | ||| ||| ||| ||\+-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+-------++---+--+---++-+++/ | || | | | | |
+| | | | ||| ||| ||| || | | | ||| || \--+--++++-+------+--++--+-+---------+--+-------++---+--+---++-+++--+-++--/ | | | |
+| | | | ||| ||| \++---++-+-----+----+-/|| || | |||| | | || | | | | || | | || ||| | || | | | |
+| | | | \++-+++---+/ || | \----+--++-++------+--++++-+------+--++--+-+---------+--/ || | | || ||| | || | | | |
+| | | | || ||| \----++-+----------+--++-++------+--++++-+---->-+--+/ | | | || | | || ||| | || | | | |
+| | | | || \++--------++-+----------+--++-++------+--++++-/ | | | | \----------++---+--+---++-+++--+-++----------+-/ | |
+| | | | || || || | | || || | |||| | | | | /--------------++---+--+---++-+++--+-++-----\ | | |
+| | | | || || || | | || || | \+++--------+--+---+-+-----+--------------++---+--+---++-/|| | || | | | |
+| | | | || || || | | || || | ||| | | \-+-----+--------------/| | | || || | || | | | |
+| | | | || || /++-+----------+\ || \+------+---+++--------+--+-----+-----+---------------+---+--+---++--++--+-+/ | | | |
+| | | | || || |\+-+----------++-++--+------+---+++--------+--+-----+-----+---------------+---+--+---++--++--+-+------+----/ | |
+| | | | /++--++-------+-+-+----------++-++--+------+---+++-\ \--+-----+-----+---------------+---+--+---/| || | | | | |
+| | | | ||| || | | | || \+--+------+---/|| | | | | | | | | || | | | | |
+| | | | ||| || | | | |v | | | || | | | | | | | | \+--+-+------+--------+---/
+| /-+-----+--+-+++--++-------+-+-+----------++--+--+------+----++-+---------+-----+-----+---------------+\ | | | | | | | |
+| | | | | ||| |\-------+-+-+----------++--+--+------+----++-+---------/ | | || | | | | | | | |
+| | | | | ||| | | | \----------++--+--+------+----++-+---------------+-----+---------------++--+--+----+---/ | | | |
+| | | | | ||| | | | || | \------+----+/ | | | || | | | | | | |
+| | | \--+-+++--/ ^ | || | | | | | | || | | | | | | |
+| | | | ||\-----------+-+------------++--+---------+----+--+---------------/ | || | | \------+-+------+--------/
+| | | | || | | || \---------+----/ | | || | | | | |
+\-----+-+--------+-++------------+-+------------++------------+-------+---------------------+---------------/| | | | | |
+ | | | |\------------+-+------------++------------+-------+-<-------------------+----------------+--/ \-----------+-/ |
+ | | | | \-+------------+/ \-------+---------------------+----------------+-----------------/ |
+ | | | \---------------+------------+---------------------/ | | |
+ | | | \------------/ \----------------+--------------------------/
+ \-+--------+-------------------------------------------------------------------------------------------/
+ \--------/
diff --git a/2018/inputs/15.txt b/2018/inputs/15.txt
new file mode 100644
index 0000000..0bd71e0
--- /dev/null
+++ b/2018/inputs/15.txt
@@ -0,0 +1,32 @@
+################################
+#######################.########
+#######################.########
+########..#############.########
+#######.....#########....#..####
+#######.....##########......####
+######....#..########.......#..#
+#######.G...########...........#
+####..GG....G######..........###
+########....G..###..E.......#.E#
+########...G..#....G..G.....E..#
+########...G...G.G...........E.#
+####....G.....#####..E......#E.#
+####.####.#..#######....G.....##
+####.G#####.#########..........#
+####G#####..#########..........#
+####.####..E#########..........#
+####...#..#.#########.G........#
+####.....G..#########.........##
+####..G....E.#######........####
+####G.........#####...##....####
+#####G................###..E####
+#####..####...............######
+####..#####.............########
+#####.#######...........########
+#####.########.........#########
+#####.########.....E..##########
+#.....#########...#.############
+#..#############....############
+################....############
+##################.#############
+################################
diff --git a/2018/inputs/16_1.txt b/2018/inputs/16_1.txt
new file mode 100644
index 0000000..755acda
--- /dev/null
+++ b/2018/inputs/16_1.txt
@@ -0,0 +1,3143 @@
+Before: [2, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 1, 2, 3]
+6 0 2 0
+After: [0, 1, 2, 3]
+
+Before: [1, 0, 2, 2]
+6 0 2 0
+After: [0, 0, 2, 2]
+
+Before: [1, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [3, 0, 0, 2]
+0 3 3 2
+After: [3, 0, 0, 2]
+
+Before: [1, 1, 2, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [3, 2, 1, 1]
+5 2 1 1
+After: [3, 2, 1, 1]
+
+Before: [1, 1, 0, 3]
+7 1 3 0
+After: [0, 1, 0, 3]
+
+Before: [1, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [0, 2, 2, 0]
+8 0 0 0
+After: [0, 2, 2, 0]
+
+Before: [2, 0, 0, 1]
+3 0 3 0
+After: [1, 0, 0, 1]
+
+Before: [3, 1, 2, 2]
+4 1 3 1
+After: [3, 0, 2, 2]
+
+Before: [2, 2, 1, 1]
+5 2 1 1
+After: [2, 2, 1, 1]
+
+Before: [1, 1, 2, 2]
+6 0 2 2
+After: [1, 1, 0, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [2, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 2, 1]
+13 1 3 1
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 1
+After: [2, 0, 0, 2]
+
+Before: [2, 1, 0, 1]
+2 0 1 3
+After: [2, 1, 0, 1]
+
+Before: [3, 1, 2, 1]
+12 1 2 2
+After: [3, 1, 0, 1]
+
+Before: [1, 1, 3, 2]
+4 1 3 3
+After: [1, 1, 3, 0]
+
+Before: [2, 2, 1, 3]
+7 1 3 0
+After: [0, 2, 1, 3]
+
+Before: [1, 3, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 1
+After: [2, 1, 2, 1]
+
+Before: [2, 1, 3, 0]
+14 2 0 3
+After: [2, 1, 3, 1]
+
+Before: [1, 1, 2, 3]
+6 0 2 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 1, 3]
+11 2 1 2
+After: [1, 1, 2, 3]
+
+Before: [2, 2, 3, 2]
+0 3 3 0
+After: [0, 2, 3, 2]
+
+Before: [1, 2, 0, 2]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [2, 1, 0, 0]
+2 0 1 3
+After: [2, 1, 0, 1]
+
+Before: [0, 2, 1, 1]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [0, 3, 2, 1]
+10 3 2 3
+After: [0, 3, 2, 1]
+
+Before: [3, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [0, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [0, 3, 2, 1]
+8 0 0 0
+After: [0, 3, 2, 1]
+
+Before: [1, 1, 1, 3]
+11 2 1 1
+After: [1, 2, 1, 3]
+
+Before: [0, 1, 1, 2]
+11 2 1 2
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 1, 1]
+13 1 3 1
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [2, 2, 3, 1]
+14 2 0 1
+After: [2, 1, 3, 1]
+
+Before: [0, 3, 0, 3]
+8 0 0 3
+After: [0, 3, 0, 0]
+
+Before: [0, 0, 1, 1]
+8 0 0 2
+After: [0, 0, 0, 1]
+
+Before: [0, 3, 2, 1]
+8 0 0 2
+After: [0, 3, 0, 1]
+
+Before: [2, 1, 2, 3]
+12 1 2 1
+After: [2, 0, 2, 3]
+
+Before: [3, 2, 2, 3]
+14 2 1 2
+After: [3, 2, 1, 3]
+
+Before: [2, 2, 3, 0]
+15 2 2 2
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 3, 2]
+15 2 2 0
+After: [1, 3, 3, 2]
+
+Before: [1, 1, 0, 0]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [3, 2, 2, 2]
+0 3 3 3
+After: [3, 2, 2, 0]
+
+Before: [1, 3, 2, 2]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [2, 1, 0, 1]
+3 0 3 1
+After: [2, 1, 0, 1]
+
+Before: [3, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [0, 2, 1, 0]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [0, 3, 1, 2]
+8 0 0 1
+After: [0, 0, 1, 2]
+
+Before: [2, 1, 3, 3]
+7 1 3 0
+After: [0, 1, 3, 3]
+
+Before: [3, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 0, 1]
+3 0 3 3
+After: [2, 1, 0, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 0, 3]
+7 1 3 1
+After: [2, 0, 0, 3]
+
+Before: [2, 2, 0, 1]
+3 0 3 0
+After: [1, 2, 0, 1]
+
+Before: [2, 2, 3, 1]
+3 0 3 3
+After: [2, 2, 3, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [2, 2, 2, 2]
+14 3 2 1
+After: [2, 0, 2, 2]
+
+Before: [3, 1, 1, 2]
+4 1 3 1
+After: [3, 0, 1, 2]
+
+Before: [2, 1, 1, 1]
+2 0 1 3
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [1, 1, 1, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [3, 1, 2, 2]
+12 1 2 2
+After: [3, 1, 0, 2]
+
+Before: [0, 1, 2, 1]
+12 1 2 2
+After: [0, 1, 0, 1]
+
+Before: [3, 2, 0, 3]
+7 1 3 3
+After: [3, 2, 0, 0]
+
+Before: [2, 1, 2, 3]
+7 2 3 2
+After: [2, 1, 0, 3]
+
+Before: [3, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [2, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 3
+After: [0, 1, 1, 2]
+
+Before: [2, 1, 3, 3]
+7 1 3 2
+After: [2, 1, 0, 3]
+
+Before: [2, 3, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [1, 1, 2, 2]
+4 1 3 1
+After: [1, 0, 2, 2]
+
+Before: [1, 3, 0, 1]
+1 0 2 0
+After: [0, 3, 0, 1]
+
+Before: [1, 3, 0, 3]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [2, 3, 3, 1]
+3 0 3 1
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [2, 1, 1, 1]
+2 0 1 1
+After: [2, 1, 1, 1]
+
+Before: [3, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [2, 0, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [1, 3, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [1, 1, 0, 2]
+9 1 0 0
+After: [1, 1, 0, 2]
+
+Before: [2, 3, 2, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 2, 2, 1]
+0 3 3 3
+After: [1, 2, 2, 0]
+
+Before: [3, 1, 2, 2]
+12 1 2 1
+After: [3, 0, 2, 2]
+
+Before: [0, 2, 3, 1]
+8 0 0 1
+After: [0, 0, 3, 1]
+
+Before: [0, 0, 2, 1]
+10 3 2 2
+After: [0, 0, 1, 1]
+
+Before: [3, 2, 1, 3]
+15 0 0 3
+After: [3, 2, 1, 1]
+
+Before: [1, 3, 2, 2]
+6 0 2 2
+After: [1, 3, 0, 2]
+
+Before: [1, 2, 2, 3]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [1, 1, 3, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [1, 2, 2, 1]
+10 3 2 3
+After: [1, 2, 2, 1]
+
+Before: [1, 2, 2, 1]
+6 0 2 2
+After: [1, 2, 0, 1]
+
+Before: [1, 2, 1, 3]
+7 2 3 1
+After: [1, 0, 1, 3]
+
+Before: [1, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 3, 3, 1]
+3 0 3 3
+After: [2, 3, 3, 1]
+
+Before: [2, 3, 2, 3]
+14 2 0 2
+After: [2, 3, 1, 3]
+
+Before: [2, 1, 3, 1]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [0, 3, 3, 0]
+8 0 0 1
+After: [0, 0, 3, 0]
+
+Before: [2, 1, 1, 3]
+7 2 3 2
+After: [2, 1, 0, 3]
+
+Before: [0, 2, 2, 1]
+10 3 2 3
+After: [0, 2, 2, 1]
+
+Before: [3, 2, 1, 3]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [3, 1, 1, 2]
+0 3 3 2
+After: [3, 1, 0, 2]
+
+Before: [0, 3, 1, 3]
+7 2 3 3
+After: [0, 3, 1, 0]
+
+Before: [2, 0, 2, 1]
+10 3 2 3
+After: [2, 0, 2, 1]
+
+Before: [2, 2, 1, 0]
+5 2 1 2
+After: [2, 2, 2, 0]
+
+Before: [2, 1, 2, 2]
+4 1 3 3
+After: [2, 1, 2, 0]
+
+Before: [1, 3, 1, 1]
+0 2 3 2
+After: [1, 3, 0, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [1, 0, 0, 3]
+1 0 2 2
+After: [1, 0, 0, 3]
+
+Before: [2, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [2, 0, 0, 1]
+3 0 3 3
+After: [2, 0, 0, 1]
+
+Before: [3, 3, 0, 1]
+14 0 2 2
+After: [3, 3, 1, 1]
+
+Before: [0, 1, 2, 0]
+8 0 0 1
+After: [0, 0, 2, 0]
+
+Before: [2, 0, 1, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 3, 2, 0]
+6 0 2 1
+After: [1, 0, 2, 0]
+
+Before: [3, 3, 2, 0]
+2 0 2 3
+After: [3, 3, 2, 1]
+
+Before: [2, 1, 0, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 2, 0]
+6 0 2 2
+After: [1, 3, 0, 0]
+
+Before: [3, 1, 3, 2]
+4 1 3 1
+After: [3, 0, 3, 2]
+
+Before: [2, 3, 2, 2]
+15 0 0 3
+After: [2, 3, 2, 1]
+
+Before: [2, 3, 2, 1]
+3 0 3 3
+After: [2, 3, 2, 1]
+
+Before: [2, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [3, 1, 1, 0]
+11 2 1 2
+After: [3, 1, 2, 0]
+
+Before: [3, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [3, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 3, 1, 3]
+15 0 0 3
+After: [3, 3, 1, 1]
+
+Before: [1, 2, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 1, 0]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [1, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [3, 2, 2, 2]
+14 2 1 2
+After: [3, 2, 1, 2]
+
+Before: [0, 0, 3, 3]
+15 2 2 3
+After: [0, 0, 3, 1]
+
+Before: [0, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 2]
+14 3 2 1
+After: [2, 0, 2, 2]
+
+Before: [1, 0, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [3, 2, 1, 3]
+7 2 3 1
+After: [3, 0, 1, 3]
+
+Before: [3, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [1, 3, 2, 1]
+6 0 2 0
+After: [0, 3, 2, 1]
+
+Before: [2, 0, 3, 1]
+3 0 3 0
+After: [1, 0, 3, 1]
+
+Before: [3, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [3, 1, 2, 0]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [2, 1, 2, 0]
+2 0 1 3
+After: [2, 1, 2, 1]
+
+Before: [1, 1, 3, 1]
+14 2 3 2
+After: [1, 1, 0, 1]
+
+Before: [1, 3, 2, 3]
+6 0 2 0
+After: [0, 3, 2, 3]
+
+Before: [1, 1, 2, 3]
+12 1 2 0
+After: [0, 1, 2, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 1
+After: [3, 1, 2, 1]
+
+Before: [1, 0, 2, 0]
+6 0 2 1
+After: [1, 0, 2, 0]
+
+Before: [2, 3, 1, 3]
+7 2 3 2
+After: [2, 3, 0, 3]
+
+Before: [1, 1, 1, 1]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [2, 1, 2, 2]
+2 0 1 0
+After: [1, 1, 2, 2]
+
+Before: [1, 2, 1, 3]
+7 2 3 3
+After: [1, 2, 1, 0]
+
+Before: [1, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [2, 0, 2, 1]
+10 3 2 2
+After: [2, 0, 1, 1]
+
+Before: [0, 1, 2, 3]
+12 1 2 2
+After: [0, 1, 0, 3]
+
+Before: [2, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [2, 1, 3, 1]
+13 1 3 3
+After: [2, 1, 3, 1]
+
+Before: [0, 2, 1, 1]
+8 0 0 1
+After: [0, 0, 1, 1]
+
+Before: [1, 0, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [2, 1, 3, 3]
+2 0 1 1
+After: [2, 1, 3, 3]
+
+Before: [0, 1, 2, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [1, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 1
+After: [1, 1, 3, 0]
+
+Before: [1, 1, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [2, 2, 3, 1]
+3 0 3 1
+After: [2, 1, 3, 1]
+
+Before: [3, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 0]
+12 1 2 1
+After: [1, 0, 2, 0]
+
+Before: [3, 0, 2, 3]
+2 0 2 3
+After: [3, 0, 2, 1]
+
+Before: [2, 1, 3, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [3, 1, 3, 1]
+15 0 0 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 3, 2]
+4 1 3 1
+After: [0, 0, 3, 2]
+
+Before: [3, 2, 3, 3]
+15 2 0 0
+After: [1, 2, 3, 3]
+
+Before: [1, 3, 3, 1]
+0 3 3 0
+After: [0, 3, 3, 1]
+
+Before: [0, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [0, 2, 1, 3]
+7 2 3 2
+After: [0, 2, 0, 3]
+
+Before: [3, 0, 2, 1]
+2 0 2 0
+After: [1, 0, 2, 1]
+
+Before: [2, 2, 2, 1]
+10 3 2 2
+After: [2, 2, 1, 1]
+
+Before: [1, 2, 0, 1]
+1 0 2 0
+After: [0, 2, 0, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 2
+After: [1, 2, 0, 0]
+
+Before: [3, 1, 2, 1]
+2 0 2 1
+After: [3, 1, 2, 1]
+
+Before: [0, 0, 3, 1]
+8 0 0 1
+After: [0, 0, 3, 1]
+
+Before: [0, 1, 1, 2]
+11 2 1 3
+After: [0, 1, 1, 2]
+
+Before: [0, 1, 3, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 1, 2]
+11 2 1 2
+After: [1, 1, 2, 2]
+
+Before: [2, 0, 3, 1]
+3 0 3 3
+After: [2, 0, 3, 1]
+
+Before: [0, 2, 1, 2]
+8 0 0 0
+After: [0, 2, 1, 2]
+
+Before: [1, 0, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [1, 1, 0, 2]
+4 1 3 3
+After: [1, 1, 0, 0]
+
+Before: [2, 2, 1, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 2
+After: [1, 2, 2, 2]
+
+Before: [2, 0, 2, 1]
+3 0 3 3
+After: [2, 0, 2, 1]
+
+Before: [2, 1, 0, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 1, 2]
+5 2 1 1
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 2]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [2, 2, 1, 3]
+15 0 0 3
+After: [2, 2, 1, 1]
+
+Before: [3, 1, 0, 1]
+13 1 3 3
+After: [3, 1, 0, 1]
+
+Before: [3, 3, 2, 1]
+10 3 2 2
+After: [3, 3, 1, 1]
+
+Before: [0, 1, 3, 2]
+4 1 3 3
+After: [0, 1, 3, 0]
+
+Before: [0, 1, 1, 0]
+11 2 1 2
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 3, 1]
+14 3 1 0
+After: [0, 1, 3, 1]
+
+Before: [0, 1, 3, 3]
+8 0 0 3
+After: [0, 1, 3, 0]
+
+Before: [0, 1, 2, 1]
+10 3 2 0
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [0, 2, 1, 3]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [1, 0, 0, 3]
+1 0 2 0
+After: [0, 0, 0, 3]
+
+Before: [2, 3, 0, 1]
+3 0 3 0
+After: [1, 3, 0, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 1
+After: [2, 0, 2, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 0
+After: [0, 1, 3, 2]
+
+Before: [1, 2, 1, 0]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 1, 3, 1]
+13 1 3 1
+After: [3, 1, 3, 1]
+
+Before: [1, 2, 1, 0]
+5 2 1 1
+After: [1, 2, 1, 0]
+
+Before: [3, 1, 2, 1]
+10 3 2 1
+After: [3, 1, 2, 1]
+
+Before: [1, 1, 1, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [1, 2, 1, 3]
+7 1 3 1
+After: [1, 0, 1, 3]
+
+Before: [0, 0, 2, 2]
+14 3 2 3
+After: [0, 0, 2, 0]
+
+Before: [2, 2, 1, 3]
+15 0 0 1
+After: [2, 1, 1, 3]
+
+Before: [2, 1, 3, 2]
+4 1 3 1
+After: [2, 0, 3, 2]
+
+Before: [1, 2, 1, 3]
+5 2 1 2
+After: [1, 2, 2, 3]
+
+Before: [2, 2, 1, 0]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [2, 0, 2, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 0, 0, 1]
+1 0 2 0
+After: [0, 0, 0, 1]
+
+Before: [2, 1, 1, 0]
+15 0 0 0
+After: [1, 1, 1, 0]
+
+Before: [0, 0, 3, 3]
+8 0 0 0
+After: [0, 0, 3, 3]
+
+Before: [1, 1, 1, 2]
+4 1 3 3
+After: [1, 1, 1, 0]
+
+Before: [1, 2, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 0, 2]
+9 1 0 1
+After: [1, 1, 0, 2]
+
+Before: [3, 1, 1, 1]
+11 2 1 3
+After: [3, 1, 1, 2]
+
+Before: [1, 1, 0, 3]
+7 1 3 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 1, 3]
+7 1 3 2
+After: [1, 1, 0, 3]
+
+Before: [1, 1, 2, 3]
+6 0 2 1
+After: [1, 0, 2, 3]
+
+Before: [2, 1, 1, 2]
+4 1 3 3
+After: [2, 1, 1, 0]
+
+Before: [2, 2, 2, 3]
+7 1 3 2
+After: [2, 2, 0, 3]
+
+Before: [1, 3, 2, 1]
+0 3 3 3
+After: [1, 3, 2, 0]
+
+Before: [0, 0, 3, 3]
+8 0 0 3
+After: [0, 0, 3, 0]
+
+Before: [3, 1, 3, 1]
+15 0 0 1
+After: [3, 1, 3, 1]
+
+Before: [1, 0, 0, 2]
+1 0 2 2
+After: [1, 0, 0, 2]
+
+Before: [0, 0, 0, 1]
+0 3 3 1
+After: [0, 0, 0, 1]
+
+Before: [1, 1, 1, 2]
+9 1 0 0
+After: [1, 1, 1, 2]
+
+Before: [1, 3, 0, 1]
+1 0 2 2
+After: [1, 3, 0, 1]
+
+Before: [1, 1, 3, 3]
+9 1 0 0
+After: [1, 1, 3, 3]
+
+Before: [2, 1, 3, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 3
+After: [2, 1, 3, 0]
+
+Before: [2, 1, 2, 1]
+13 1 3 3
+After: [2, 1, 2, 1]
+
+Before: [1, 0, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 2
+After: [1, 1, 1, 1]
+
+Before: [3, 2, 1, 3]
+5 2 1 2
+After: [3, 2, 2, 3]
+
+Before: [0, 1, 2, 0]
+12 1 2 2
+After: [0, 1, 0, 0]
+
+Before: [2, 1, 1, 3]
+2 0 1 0
+After: [1, 1, 1, 3]
+
+Before: [1, 2, 2, 3]
+14 2 1 2
+After: [1, 2, 1, 3]
+
+Before: [1, 2, 0, 3]
+1 0 2 0
+After: [0, 2, 0, 3]
+
+Before: [0, 1, 2, 2]
+8 0 0 2
+After: [0, 1, 0, 2]
+
+Before: [0, 2, 1, 0]
+5 2 1 1
+After: [0, 2, 1, 0]
+
+Before: [2, 0, 0, 1]
+15 0 0 2
+After: [2, 0, 1, 1]
+
+Before: [2, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [3, 2, 2, 1]
+10 3 2 2
+After: [3, 2, 1, 1]
+
+Before: [0, 3, 2, 2]
+14 3 2 2
+After: [0, 3, 0, 2]
+
+Before: [1, 2, 0, 1]
+1 0 2 2
+After: [1, 2, 0, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [1, 2, 2, 3]
+14 2 1 3
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 3, 1]
+3 0 3 3
+After: [2, 1, 3, 1]
+
+Before: [0, 1, 2, 3]
+7 1 3 3
+After: [0, 1, 2, 0]
+
+Before: [2, 1, 2, 2]
+2 0 1 1
+After: [2, 1, 2, 2]
+
+Before: [2, 2, 1, 0]
+5 2 1 1
+After: [2, 2, 1, 0]
+
+Before: [3, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [1, 1, 2, 1]
+0 3 3 1
+After: [1, 0, 2, 1]
+
+Before: [1, 0, 2, 1]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 0
+After: [0, 3, 0, 2]
+
+Before: [0, 1, 1, 3]
+11 2 1 2
+After: [0, 1, 2, 3]
+
+Before: [1, 1, 3, 3]
+9 1 0 1
+After: [1, 1, 3, 3]
+
+Before: [3, 1, 2, 3]
+12 1 2 1
+After: [3, 0, 2, 3]
+
+Before: [0, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 1
+After: [1, 1, 2, 3]
+
+Before: [0, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 0, 1, 3]
+7 2 3 1
+After: [1, 0, 1, 3]
+
+Before: [1, 1, 0, 3]
+1 0 2 0
+After: [0, 1, 0, 3]
+
+Before: [2, 1, 2, 2]
+12 1 2 2
+After: [2, 1, 0, 2]
+
+Before: [3, 0, 1, 3]
+14 3 0 0
+After: [1, 0, 1, 3]
+
+Before: [3, 1, 3, 3]
+7 1 3 3
+After: [3, 1, 3, 0]
+
+Before: [1, 1, 0, 0]
+1 0 2 0
+After: [0, 1, 0, 0]
+
+Before: [1, 1, 1, 1]
+0 2 3 2
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 1]
+2 0 1 2
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+14 3 1 1
+After: [1, 0, 2, 1]
+
+Before: [0, 0, 2, 3]
+7 2 3 3
+After: [0, 0, 2, 0]
+
+Before: [3, 2, 0, 0]
+14 0 2 1
+After: [3, 1, 0, 0]
+
+Before: [0, 0, 2, 3]
+8 0 0 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 1, 0]
+11 2 1 1
+After: [3, 2, 1, 0]
+
+Before: [1, 2, 1, 1]
+5 2 1 2
+After: [1, 2, 2, 1]
+
+Before: [0, 2, 1, 3]
+7 2 3 3
+After: [0, 2, 1, 0]
+
+Before: [3, 1, 2, 2]
+15 0 0 3
+After: [3, 1, 2, 1]
+
+Before: [0, 0, 0, 2]
+8 0 0 2
+After: [0, 0, 0, 2]
+
+Before: [3, 1, 3, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [1, 2, 0, 2]
+1 0 2 2
+After: [1, 2, 0, 2]
+
+Before: [2, 1, 2, 3]
+2 0 1 3
+After: [2, 1, 2, 1]
+
+Before: [1, 2, 0, 3]
+1 0 2 2
+After: [1, 2, 0, 3]
+
+Before: [1, 0, 2, 0]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 0, 3, 1]
+0 3 3 2
+After: [1, 0, 0, 1]
+
+Before: [1, 3, 2, 1]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [1, 1, 1, 1]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [0, 3, 2, 1]
+0 3 3 1
+After: [0, 0, 2, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 3
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 0, 3]
+7 1 3 0
+After: [0, 2, 0, 3]
+
+Before: [0, 3, 2, 1]
+0 3 3 0
+After: [0, 3, 2, 1]
+
+Before: [1, 0, 0, 1]
+1 0 2 2
+After: [1, 0, 0, 1]
+
+Before: [2, 1, 2, 1]
+2 0 1 2
+After: [2, 1, 1, 1]
+
+Before: [1, 2, 2, 2]
+6 0 2 2
+After: [1, 2, 0, 2]
+
+Before: [0, 1, 1, 1]
+13 1 3 3
+After: [0, 1, 1, 1]
+
+Before: [2, 1, 1, 0]
+11 2 1 2
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 3, 1]
+13 1 3 1
+After: [0, 1, 3, 1]
+
+Before: [3, 2, 0, 2]
+0 3 3 1
+After: [3, 0, 0, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 3
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 0, 1]
+13 1 3 1
+After: [2, 1, 0, 1]
+
+Before: [2, 1, 2, 2]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 2, 0]
+12 1 2 1
+After: [0, 0, 2, 0]
+
+Before: [3, 1, 2, 2]
+4 1 3 2
+After: [3, 1, 0, 2]
+
+Before: [1, 1, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [0, 2, 1, 1]
+0 2 3 2
+After: [0, 2, 0, 1]
+
+Before: [1, 1, 2, 0]
+6 0 2 0
+After: [0, 1, 2, 0]
+
+Before: [0, 3, 1, 2]
+8 0 0 3
+After: [0, 3, 1, 0]
+
+Before: [1, 3, 0, 0]
+1 0 2 2
+After: [1, 3, 0, 0]
+
+Before: [1, 1, 2, 0]
+12 1 2 2
+After: [1, 1, 0, 0]
+
+Before: [2, 1, 0, 2]
+0 3 3 1
+After: [2, 0, 0, 2]
+
+Before: [0, 3, 3, 3]
+8 0 0 1
+After: [0, 0, 3, 3]
+
+Before: [3, 3, 0, 1]
+0 3 3 0
+After: [0, 3, 0, 1]
+
+Before: [3, 1, 1, 2]
+4 1 3 3
+After: [3, 1, 1, 0]
+
+Before: [2, 1, 2, 3]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [3, 1, 2, 1]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [1, 0, 2, 2]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 1, 0, 1]
+0 3 3 1
+After: [1, 0, 0, 1]
+
+Before: [1, 1, 0, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 3
+After: [3, 0, 2, 1]
+
+Before: [2, 2, 3, 3]
+14 3 2 3
+After: [2, 2, 3, 1]
+
+Before: [3, 1, 2, 2]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [0, 1, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 3, 0]
+8 0 0 2
+After: [0, 1, 0, 0]
+
+Before: [3, 1, 2, 0]
+12 1 2 1
+After: [3, 0, 2, 0]
+
+Before: [1, 3, 2, 0]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [2, 0, 1, 3]
+7 2 3 3
+After: [2, 0, 1, 0]
+
+Before: [3, 2, 2, 1]
+10 3 2 3
+After: [3, 2, 2, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [2, 1, 1, 1]
+0 2 3 0
+After: [0, 1, 1, 1]
+
+Before: [3, 2, 1, 1]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [3, 1, 3, 1]
+14 2 3 0
+After: [0, 1, 3, 1]
+
+Before: [2, 1, 1, 3]
+14 2 1 1
+After: [2, 0, 1, 3]
+
+Before: [0, 1, 1, 2]
+8 0 0 0
+After: [0, 1, 1, 2]
+
+Before: [2, 3, 3, 2]
+15 2 2 2
+After: [2, 3, 1, 2]
+
+Before: [0, 1, 2, 3]
+7 2 3 1
+After: [0, 0, 2, 3]
+
+Before: [1, 1, 0, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [0, 2, 3, 0]
+8 0 0 2
+After: [0, 2, 0, 0]
+
+Before: [0, 1, 1, 1]
+11 2 1 1
+After: [0, 2, 1, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [2, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [2, 1, 2, 3]
+12 1 2 2
+After: [2, 1, 0, 3]
+
+Before: [2, 2, 1, 3]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [3, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [0, 0, 1, 3]
+7 2 3 1
+After: [0, 0, 1, 3]
+
+Before: [1, 3, 2, 1]
+10 3 2 2
+After: [1, 3, 1, 1]
+
+Before: [3, 2, 1, 2]
+15 0 0 2
+After: [3, 2, 1, 2]
+
+Before: [1, 2, 1, 1]
+0 2 3 1
+After: [1, 0, 1, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 0, 3]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [0, 1, 1, 1]
+11 2 1 2
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 2, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 2, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [3, 1, 1, 2]
+11 2 1 3
+After: [3, 1, 1, 2]
+
+Before: [2, 2, 3, 2]
+0 3 3 3
+After: [2, 2, 3, 0]
+
+Before: [0, 0, 1, 1]
+0 2 3 1
+After: [0, 0, 1, 1]
+
+Before: [0, 1, 2, 2]
+12 1 2 1
+After: [0, 0, 2, 2]
+
+Before: [2, 0, 3, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 0, 2, 0]
+6 0 2 0
+After: [0, 0, 2, 0]
+
+Before: [0, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [1, 3, 3, 0]
+15 2 2 0
+After: [1, 3, 3, 0]
+
+Before: [0, 3, 2, 0]
+8 0 0 2
+After: [0, 3, 0, 0]
+
+Before: [2, 2, 2, 1]
+0 3 3 1
+After: [2, 0, 2, 1]
+
+Before: [3, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 2, 3, 3]
+15 0 0 0
+After: [1, 2, 3, 3]
+
+Before: [2, 1, 0, 0]
+2 0 1 1
+After: [2, 1, 0, 0]
+
+Before: [1, 2, 2, 3]
+6 0 2 2
+After: [1, 2, 0, 3]
+
+Before: [1, 0, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 1
+After: [2, 1, 0, 1]
+
+Before: [3, 2, 1, 2]
+5 2 1 1
+After: [3, 2, 1, 2]
+
+Before: [2, 1, 3, 2]
+14 2 0 1
+After: [2, 1, 3, 2]
+
+Before: [1, 1, 0, 0]
+9 1 0 2
+After: [1, 1, 1, 0]
+
+Before: [2, 2, 3, 3]
+15 2 2 2
+After: [2, 2, 1, 3]
+
+Before: [0, 2, 1, 0]
+8 0 0 2
+After: [0, 2, 0, 0]
+
+Before: [1, 1, 0, 1]
+9 1 0 0
+After: [1, 1, 0, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 0, 0]
+9 1 0 0
+After: [1, 1, 0, 0]
+
+Before: [2, 3, 2, 1]
+3 0 3 1
+After: [2, 1, 2, 1]
+
+Before: [1, 2, 1, 3]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [2, 1, 1, 3]
+11 2 1 2
+After: [2, 1, 2, 3]
+
+Before: [1, 1, 3, 0]
+9 1 0 2
+After: [1, 1, 1, 0]
+
+Before: [2, 1, 1, 3]
+11 2 1 1
+After: [2, 2, 1, 3]
+
+Before: [2, 1, 3, 2]
+2 0 1 2
+After: [2, 1, 1, 2]
+
+Before: [0, 2, 1, 3]
+5 2 1 2
+After: [0, 2, 2, 3]
+
+Before: [1, 0, 0, 2]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [1, 1, 1, 2]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [1, 0, 2, 2]
+6 0 2 2
+After: [1, 0, 0, 2]
+
+Before: [3, 1, 1, 3]
+11 2 1 1
+After: [3, 2, 1, 3]
+
+Before: [3, 1, 2, 3]
+2 0 2 0
+After: [1, 1, 2, 3]
+
+Before: [1, 2, 0, 2]
+1 0 2 0
+After: [0, 2, 0, 2]
+
+Before: [3, 1, 2, 1]
+10 3 2 2
+After: [3, 1, 1, 1]
+
+Before: [1, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 2, 3]
+12 1 2 0
+After: [0, 1, 2, 3]
+
+Before: [2, 1, 1, 3]
+7 2 3 1
+After: [2, 0, 1, 3]
+
+Before: [0, 2, 1, 2]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [3, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [1, 1, 3, 1]
+9 1 0 0
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 2, 2]
+9 1 0 1
+After: [1, 1, 2, 2]
+
+Before: [2, 1, 1, 3]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 1
+After: [1, 0, 1, 2]
+
+Before: [3, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 2, 2, 3]
+6 0 2 0
+After: [0, 2, 2, 3]
+
+Before: [1, 3, 0, 3]
+1 0 2 0
+After: [0, 3, 0, 3]
+
+Before: [2, 1, 1, 0]
+2 0 1 2
+After: [2, 1, 1, 0]
+
+Before: [0, 1, 2, 1]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [2, 3, 1, 1]
+3 0 3 3
+After: [2, 3, 1, 1]
+
+Before: [2, 1, 3, 3]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [1, 3, 2, 1]
+10 3 2 3
+After: [1, 3, 2, 1]
+
+Before: [1, 1, 3, 3]
+9 1 0 3
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 3, 2]
+9 1 0 1
+After: [1, 1, 3, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [3, 0, 2, 0]
+2 0 2 1
+After: [3, 1, 2, 0]
+
+Before: [2, 0, 0, 0]
+14 0 1 2
+After: [2, 0, 1, 0]
+
+Before: [0, 1, 2, 1]
+13 1 3 3
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 3, 0]
+14 2 0 1
+After: [2, 1, 3, 0]
+
+Before: [2, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 1]
+2 0 1 1
+After: [2, 1, 0, 1]
+
+Before: [0, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [0, 1, 3, 1]
+0 3 3 2
+After: [0, 1, 0, 1]
+
+Before: [0, 2, 1, 1]
+5 2 1 1
+After: [0, 2, 1, 1]
+
+Before: [2, 1, 1, 2]
+15 0 0 3
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 0]
+6 0 2 2
+After: [1, 1, 0, 0]
+
+Before: [1, 1, 2, 1]
+6 0 2 0
+After: [0, 1, 2, 1]
+
+Before: [0, 2, 1, 3]
+7 1 3 1
+After: [0, 0, 1, 3]
+
+Before: [1, 0, 0, 0]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [2, 1, 2, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [0, 2, 0, 2]
+0 3 3 1
+After: [0, 0, 0, 2]
+
+Before: [0, 2, 3, 0]
+15 2 2 2
+After: [0, 2, 1, 0]
+
+Before: [1, 2, 2, 2]
+14 2 1 3
+After: [1, 2, 2, 1]
+
+Before: [0, 1, 3, 1]
+8 0 0 2
+After: [0, 1, 0, 1]
+
+Before: [3, 3, 3, 2]
+15 0 0 3
+After: [3, 3, 3, 1]
+
+Before: [3, 3, 0, 2]
+14 0 2 1
+After: [3, 1, 0, 2]
+
+Before: [0, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [1, 1, 0, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [0, 1, 2, 1]
+10 3 2 3
+After: [0, 1, 2, 1]
+
+Before: [2, 2, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 3
+After: [0, 1, 2, 0]
+
+Before: [1, 2, 2, 1]
+10 3 2 2
+After: [1, 2, 1, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 1
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 1]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [3, 3, 1, 1]
+0 2 3 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 1
+After: [0, 0, 2, 2]
+
+Before: [0, 3, 2, 2]
+8 0 0 3
+After: [0, 3, 2, 0]
+
+Before: [2, 1, 2, 1]
+2 0 1 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [3, 3, 3, 2]
+15 0 0 0
+After: [1, 3, 3, 2]
+
+Before: [0, 1, 1, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [1, 3, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 0, 1]
+1 0 2 2
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 2, 2, 2]
+2 0 2 2
+After: [3, 2, 1, 2]
+
+Before: [0, 2, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 0, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [0, 1, 0, 2]
+4 1 3 3
+After: [0, 1, 0, 0]
+
+Before: [1, 1, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 3, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [0, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [0, 1, 1, 3]
+11 2 1 1
+After: [0, 2, 1, 3]
+
+Before: [3, 2, 1, 0]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [2, 1, 2, 3]
+7 2 3 3
+After: [2, 1, 2, 0]
+
+Before: [1, 1, 1, 1]
+11 2 1 2
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [0, 1, 1, 3]
+8 0 0 1
+After: [0, 0, 1, 3]
+
+Before: [3, 2, 3, 3]
+7 1 3 3
+After: [3, 2, 3, 0]
+
+Before: [0, 3, 0, 0]
+8 0 0 2
+After: [0, 3, 0, 0]
+
+Before: [1, 1, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [0, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 1, 2, 1]
+9 1 0 1
+After: [1, 1, 2, 1]
+
+Before: [3, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [1, 3, 0, 3]
+1 0 2 2
+After: [1, 3, 0, 3]
+
+Before: [1, 1, 0, 3]
+9 1 0 1
+After: [1, 1, 0, 3]
+
+Before: [0, 2, 2, 2]
+8 0 0 1
+After: [0, 0, 2, 2]
+
+Before: [0, 1, 1, 1]
+13 1 3 1
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 2, 1]
+8 0 0 0
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 2
+After: [2, 1, 0, 1]
+
+Before: [1, 0, 2, 3]
+6 0 2 1
+After: [1, 0, 2, 3]
+
+Before: [3, 0, 3, 1]
+15 2 0 2
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 1, 1]
+0 2 3 0
+After: [0, 1, 1, 1]
+
+Before: [3, 0, 0, 3]
+14 0 2 1
+After: [3, 1, 0, 3]
+
+Before: [3, 1, 1, 1]
+0 2 3 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 2, 3]
+7 2 3 3
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 0, 1]
+13 1 3 1
+After: [3, 1, 0, 1]
+
+Before: [0, 0, 3, 0]
+8 0 0 1
+After: [0, 0, 3, 0]
+
+Before: [1, 1, 0, 2]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [2, 1, 1, 2]
+4 1 3 1
+After: [2, 0, 1, 2]
+
+Before: [3, 2, 3, 0]
+15 2 2 3
+After: [3, 2, 3, 1]
+
+Before: [0, 2, 0, 3]
+7 1 3 0
+After: [0, 2, 0, 3]
+
+Before: [1, 1, 3, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [0, 3, 1, 3]
+8 0 0 1
+After: [0, 0, 1, 3]
+
+Before: [3, 1, 2, 1]
+2 0 2 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 3, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 0]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 1, 0]
+11 2 1 1
+After: [2, 2, 1, 0]
+
+Before: [3, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [2, 2, 1, 3]
+5 2 1 1
+After: [2, 2, 1, 3]
+
+Before: [0, 0, 2, 1]
+10 3 2 3
+After: [0, 0, 2, 1]
+
+Before: [3, 3, 0, 2]
+0 3 3 1
+After: [3, 0, 0, 2]
+
+Before: [0, 2, 1, 0]
+8 0 0 0
+After: [0, 2, 1, 0]
+
+Before: [3, 3, 0, 2]
+15 0 0 3
+After: [3, 3, 0, 1]
+
+Before: [1, 0, 2, 3]
+6 0 2 0
+After: [0, 0, 2, 3]
+
+Before: [0, 0, 1, 1]
+8 0 0 1
+After: [0, 0, 1, 1]
+
+Before: [1, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 1
+After: [1, 2, 1, 2]
+
+Before: [2, 1, 3, 1]
+14 2 0 1
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 2, 0]
+2 0 1 0
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 2]
+6 0 2 3
+After: [1, 1, 2, 0]
+
+Before: [2, 1, 1, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [2, 3, 3, 2]
+14 2 0 2
+After: [2, 3, 1, 2]
+
+Before: [1, 0, 0, 2]
+1 0 2 0
+After: [0, 0, 0, 2]
+
+Before: [3, 3, 2, 2]
+15 0 0 0
+After: [1, 3, 2, 2]
+
+Before: [0, 1, 1, 2]
+4 1 3 3
+After: [0, 1, 1, 0]
+
+Before: [2, 2, 1, 2]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [2, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 0, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 2, 1, 1]
+5 2 1 1
+After: [1, 2, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [0, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 1, 0, 2]
+4 1 3 2
+After: [3, 1, 0, 2]
+
+Before: [1, 1, 3, 2]
+4 1 3 1
+After: [1, 0, 3, 2]
+
+Before: [3, 1, 1, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [0, 0, 2, 0]
+8 0 0 3
+After: [0, 0, 2, 0]
+
+Before: [1, 1, 3, 2]
+9 1 0 0
+After: [1, 1, 3, 2]
+
+Before: [3, 2, 1, 0]
+5 2 1 1
+After: [3, 2, 1, 0]
+
+Before: [1, 1, 0, 2]
+1 0 2 0
+After: [0, 1, 0, 2]
+
+Before: [2, 1, 0, 1]
+13 1 3 3
+After: [2, 1, 0, 1]
+
+Before: [3, 1, 2, 0]
+12 1 2 2
+After: [3, 1, 0, 0]
+
+Before: [3, 2, 2, 3]
+2 0 2 0
+After: [1, 2, 2, 3]
+
+Before: [1, 1, 1, 0]
+11 2 1 1
+After: [1, 2, 1, 0]
+
+Before: [0, 0, 1, 2]
+8 0 0 3
+After: [0, 0, 1, 0]
+
+Before: [1, 1, 0, 0]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 3
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 1, 1]
+11 2 1 1
+After: [1, 2, 1, 1]
+
+Before: [3, 0, 0, 0]
+14 0 2 3
+After: [3, 0, 0, 1]
+
+Before: [2, 1, 1, 3]
+7 1 3 3
+After: [2, 1, 1, 0]
+
+Before: [0, 3, 3, 2]
+8 0 0 2
+After: [0, 3, 0, 2]
+
+Before: [3, 1, 2, 1]
+12 1 2 1
+After: [3, 0, 2, 1]
+
+Before: [3, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 1, 1]
+14 3 1 1
+After: [3, 0, 1, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 0
+After: [1, 1, 1, 3]
+
+Before: [0, 0, 3, 3]
+8 0 0 2
+After: [0, 0, 0, 3]
+
+Before: [3, 1, 3, 3]
+7 1 3 1
+After: [3, 0, 3, 3]
+
+Before: [1, 1, 2, 2]
+12 1 2 1
+After: [1, 0, 2, 2]
+
+Before: [1, 1, 0, 1]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [2, 2, 2, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [2, 0, 3, 0]
+14 0 1 1
+After: [2, 1, 3, 0]
+
+Before: [1, 1, 2, 2]
+4 1 3 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 3]
+12 1 2 2
+After: [1, 1, 0, 3]
+
+Before: [1, 2, 1, 3]
+7 2 3 2
+After: [1, 2, 0, 3]
+
+Before: [3, 0, 0, 1]
+14 0 2 2
+After: [3, 0, 1, 1]
+
+Before: [3, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 2, 1]
+3 0 3 0
+After: [1, 3, 2, 1]
+
+Before: [0, 1, 3, 2]
+8 0 0 3
+After: [0, 1, 3, 0]
+
+Before: [2, 2, 1, 1]
+3 0 3 3
+After: [2, 2, 1, 1]
+
+Before: [3, 2, 3, 1]
+0 3 3 3
+After: [3, 2, 3, 0]
+
+Before: [2, 1, 1, 0]
+14 2 1 3
+After: [2, 1, 1, 0]
+
+Before: [2, 2, 1, 3]
+7 2 3 1
+After: [2, 0, 1, 3]
+
+Before: [2, 3, 3, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 1, 2, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [0, 3, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 3
+After: [0, 1, 0, 1]
+
+Before: [1, 1, 1, 3]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [3, 1, 1, 2]
+11 2 1 2
+After: [3, 1, 2, 2]
+
+Before: [1, 3, 2, 3]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [0, 1, 2, 3]
+8 0 0 2
+After: [0, 1, 0, 3]
+
+Before: [3, 0, 1, 3]
+14 3 0 2
+After: [3, 0, 1, 3]
+
+Before: [2, 1, 2, 0]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [2, 3, 2, 1]
+0 3 3 2
+After: [2, 3, 0, 1]
+
+Before: [1, 1, 0, 2]
+0 3 3 3
+After: [1, 1, 0, 0]
+
+Before: [1, 0, 0, 1]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [3, 2, 1, 3]
+7 2 3 3
+After: [3, 2, 1, 0]
+
+Before: [3, 1, 1, 3]
+11 2 1 2
+After: [3, 1, 2, 3]
+
+Before: [0, 1, 2, 2]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [3, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 1
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 1, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [2, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 2
+After: [1, 1, 0, 3]
+
+Before: [1, 2, 0, 1]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [1, 3, 0, 0]
+1 0 2 0
+After: [0, 3, 0, 0]
+
+Before: [2, 1, 1, 3]
+14 2 1 0
+After: [0, 1, 1, 3]
+
+Before: [1, 1, 1, 2]
+9 1 0 1
+After: [1, 1, 1, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 1
+After: [1, 1, 0, 1]
+
+Before: [2, 0, 0, 2]
+15 0 0 0
+After: [1, 0, 0, 2]
+
+Before: [2, 3, 1, 1]
+3 0 3 0
+After: [1, 3, 1, 1]
+
+Before: [0, 1, 2, 0]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [1, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [2, 0, 2, 2]
+14 3 2 2
+After: [2, 0, 0, 2]
+
+Before: [0, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 3
+After: [2, 1, 0, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 2
+After: [1, 3, 0, 2]
+
+Before: [0, 0, 2, 3]
+8 0 0 1
+After: [0, 0, 2, 3]
+
+Before: [2, 1, 1, 3]
+7 1 3 0
+After: [0, 1, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 0, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+13 1 3 1
+After: [1, 1, 2, 1]
+
+Before: [0, 1, 2, 1]
+12 1 2 1
+After: [0, 0, 2, 1]
+
+Before: [2, 2, 3, 3]
+14 3 2 2
+After: [2, 2, 1, 3]
+
+Before: [3, 1, 1, 1]
+13 1 3 3
+After: [3, 1, 1, 1]
+
+Before: [3, 3, 3, 2]
+15 2 0 1
+After: [3, 1, 3, 2]
+
+Before: [2, 1, 2, 1]
+3 0 3 1
+After: [2, 1, 2, 1]
+
+Before: [3, 1, 2, 0]
+2 0 2 3
+After: [3, 1, 2, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [0, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 0
+After: [1, 1, 1, 1]
+
+Before: [3, 1, 1, 2]
+11 2 1 1
+After: [3, 2, 1, 2]
+
+Before: [1, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [1, 1, 2, 0]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [0, 2, 2, 3]
+8 0 0 3
+After: [0, 2, 2, 0]
+
+Before: [0, 0, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 2, 3, 3]
+14 3 2 0
+After: [1, 2, 3, 3]
+
+Before: [2, 1, 0, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [3, 1, 2, 0]
+2 0 2 0
+After: [1, 1, 2, 0]
+
+Before: [3, 1, 0, 2]
+14 0 2 0
+After: [1, 1, 0, 2]
+
+Before: [2, 1, 3, 0]
+2 0 1 1
+After: [2, 1, 3, 0]
+
+Before: [1, 1, 1, 0]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [1, 0, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [0, 3, 2, 2]
+8 0 0 2
+After: [0, 3, 0, 2]
+
+Before: [3, 3, 2, 2]
+2 0 2 0
+After: [1, 3, 2, 2]
+
+Before: [0, 2, 1, 2]
+5 2 1 1
+After: [0, 2, 1, 2]
+
+Before: [3, 3, 2, 2]
+2 0 2 3
+After: [3, 3, 2, 1]
+
+Before: [0, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 2
+After: [1, 0, 1, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [3, 1, 1, 1]
+14 2 1 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 1
+After: [0, 1, 0, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [3, 2, 1, 3]
+14 3 0 0
+After: [1, 2, 1, 3]
+
+Before: [1, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [3, 1, 2, 3]
+7 1 3 1
+After: [3, 0, 2, 3]
+
+Before: [3, 0, 3, 0]
+15 2 2 1
+After: [3, 1, 3, 0]
+
+Before: [0, 2, 2, 2]
+14 2 1 3
+After: [0, 2, 2, 1]
+
+Before: [1, 1, 2, 3]
+12 1 2 1
+After: [1, 0, 2, 3]
+
+Before: [3, 1, 1, 1]
+13 1 3 1
+After: [3, 1, 1, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 3
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 2, 3]
+7 2 3 3
+After: [2, 2, 2, 0]
+
+Before: [2, 3, 3, 3]
+15 0 0 2
+After: [2, 3, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 3
+After: [3, 1, 2, 1]
+
+Before: [3, 3, 3, 2]
+15 0 2 0
+After: [1, 3, 3, 2]
+
+Before: [3, 1, 0, 2]
+0 3 3 0
+After: [0, 1, 0, 2]
+
+Before: [2, 0, 3, 2]
+14 0 1 1
+After: [2, 1, 3, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 3
+After: [1, 0, 2, 1]
+
+Before: [1, 3, 3, 1]
+0 3 3 2
+After: [1, 3, 0, 1]
+
+Before: [0, 2, 2, 1]
+10 3 2 2
+After: [0, 2, 1, 1]
+
+Before: [2, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 0, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 2, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [0, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 0, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [0, 1, 2, 2]
+12 1 2 2
+After: [0, 1, 0, 2]
+
+Before: [2, 1, 2, 0]
+12 1 2 2
+After: [2, 1, 0, 0]
+
+Before: [2, 3, 3, 0]
+15 0 0 3
+After: [2, 3, 3, 1]
+
+Before: [2, 2, 0, 1]
+15 0 0 0
+After: [1, 2, 0, 1]
+
+Before: [2, 0, 3, 2]
+0 3 3 2
+After: [2, 0, 0, 2]
+
+Before: [3, 0, 3, 2]
+15 2 2 3
+After: [3, 0, 3, 1]
+
+Before: [2, 3, 2, 1]
+10 3 2 3
+After: [2, 3, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 3
+After: [2, 1, 2, 1]
+
+Before: [1, 3, 0, 0]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [3, 1, 2, 3]
+2 0 2 3
+After: [3, 1, 2, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 2
+After: [2, 1, 2, 2]
+
+Before: [1, 3, 2, 3]
+7 2 3 1
+After: [1, 0, 2, 3]
+
+Before: [0, 0, 0, 0]
+8 0 0 3
+After: [0, 0, 0, 0]
+
+Before: [1, 0, 3, 1]
+14 2 3 2
+After: [1, 0, 0, 1]
+
+Before: [3, 2, 0, 3]
+14 0 2 3
+After: [3, 2, 0, 1]
+
+Before: [3, 2, 2, 1]
+2 0 2 1
+After: [3, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 3
+After: [2, 2, 0, 1]
+
+Before: [0, 3, 3, 2]
+8 0 0 0
+After: [0, 3, 3, 2]
+
+Before: [3, 2, 0, 1]
+14 0 2 1
+After: [3, 1, 0, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 1
+After: [1, 1, 1, 3]
+
+Before: [0, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 1, 0]
+9 1 0 1
+After: [1, 1, 1, 0]
+
+Before: [1, 3, 2, 2]
+6 0 2 0
+After: [0, 3, 2, 2]
+
+Before: [2, 1, 1, 1]
+14 3 1 0
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 0
+After: [1, 1, 3, 0]
+
+Before: [2, 1, 3, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [3, 2, 1, 3]
+7 1 3 3
+After: [3, 2, 1, 0]
+
+Before: [2, 0, 3, 3]
+15 0 0 2
+After: [2, 0, 1, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 2
+After: [3, 0, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 0
+After: [1, 1, 2, 3]
+
+Before: [1, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [0, 1, 2, 3]
+12 1 2 1
+After: [0, 0, 2, 3]
+
+Before: [1, 3, 0, 1]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [2, 1, 0, 1]
+2 0 1 0
+After: [1, 1, 0, 1]
+
+Before: [3, 2, 2, 3]
+2 0 2 1
+After: [3, 1, 2, 3]
+
+Before: [1, 2, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [1, 2, 2, 0]
+6 0 2 0
+After: [0, 2, 2, 0]
+
+Before: [2, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [3, 1, 1, 3]
+7 1 3 2
+After: [3, 1, 0, 3]
+
+Before: [2, 2, 1, 3]
+5 2 1 2
+After: [2, 2, 2, 3]
+
+Before: [3, 1, 1, 1]
+11 2 1 1
+After: [3, 2, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 1
+After: [2, 0, 2, 2]
+
+Before: [1, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [1, 1, 0, 2]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [3, 3, 2, 3]
+2 0 2 0
+After: [1, 3, 2, 3]
+
+Before: [1, 1, 2, 3]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [1, 1, 0, 2]
+4 1 3 1
+After: [1, 0, 0, 2]
+
+Before: [1, 2, 2, 0]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [2, 1, 1, 0]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 3
+After: [1, 1, 0, 1]
+
+Before: [3, 1, 2, 3]
+7 1 3 3
+After: [3, 1, 2, 0]
+
+Before: [0, 2, 1, 3]
+8 0 0 0
+After: [0, 2, 1, 3]
+
+Before: [3, 2, 1, 3]
+7 1 3 0
+After: [0, 2, 1, 3]
+
+Before: [1, 2, 2, 2]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [1, 1, 1, 1]
+13 1 3 3
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+15 2 2 1
+After: [2, 1, 3, 2]
+
+Before: [2, 1, 0, 3]
+2 0 1 0
+After: [1, 1, 0, 3]
+
+Before: [1, 1, 2, 1]
+12 1 2 2
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 3, 2]
+4 1 3 0
+After: [0, 1, 3, 2]
+
+Before: [2, 3, 2, 3]
+7 2 3 2
+After: [2, 3, 0, 3]
+
+Before: [2, 2, 1, 1]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [0, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [3, 1, 0, 3]
+7 1 3 2
+After: [3, 1, 0, 3]
+
+Before: [2, 1, 3, 2]
+2 0 1 1
+After: [2, 1, 3, 2]
+
+Before: [2, 3, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 1, 3]
+7 1 3 3
+After: [2, 2, 1, 0]
+
+Before: [3, 3, 3, 1]
+15 0 2 1
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 1
+After: [0, 2, 1, 0]
+
+Before: [1, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [3, 1, 3, 1]
+13 1 3 3
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 3, 2]
+8 0 0 1
+After: [0, 0, 3, 2]
+
+Before: [2, 2, 0, 3]
+7 1 3 3
+After: [2, 2, 0, 0]
+
+Before: [1, 0, 2, 1]
+6 0 2 2
+After: [1, 0, 0, 1]
+
+Before: [1, 3, 0, 2]
+0 3 3 3
+After: [1, 3, 0, 0]
+
+Before: [1, 1, 0, 1]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [1, 2, 2, 3]
+7 1 3 1
+After: [1, 0, 2, 3]
+
+Before: [1, 1, 2, 2]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 0]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [0, 1, 0, 2]
+4 1 3 1
+After: [0, 0, 0, 2]
+
+Before: [1, 1, 1, 0]
+9 1 0 0
+After: [1, 1, 1, 0]
+
+Before: [1, 1, 2, 0]
+9 1 0 0
+After: [1, 1, 2, 0]
+
+Before: [1, 2, 1, 1]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 0, 3, 2]
+15 2 2 0
+After: [1, 0, 3, 2]
+
+Before: [2, 2, 1, 3]
+7 2 3 3
+After: [2, 2, 1, 0]
+
+Before: [3, 1, 2, 2]
+4 1 3 3
+After: [3, 1, 2, 0]
+
+Before: [3, 1, 2, 1]
+15 0 0 1
+After: [3, 1, 2, 1]
+
+Before: [2, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [2, 1, 2, 2]
+0 3 3 1
+After: [2, 0, 2, 2]
+
+Before: [1, 2, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [3, 3, 2, 0]
+2 0 2 0
+After: [1, 3, 2, 0]
+
+Before: [0, 1, 1, 2]
+11 2 1 1
+After: [0, 2, 1, 2]
+
+Before: [3, 1, 2, 1]
+13 1 3 1
+After: [3, 1, 2, 1]
+
+Before: [3, 1, 3, 3]
+15 2 0 3
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 0, 1]
+8 0 0 3
+After: [0, 1, 0, 0]
+
+Before: [2, 3, 2, 1]
+0 3 3 3
+After: [2, 3, 2, 0]
+
+Before: [2, 1, 1, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [0, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [3, 1, 2, 0]
+15 0 0 0
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 1, 1]
+9 1 0 0
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 2, 2]
+12 1 2 2
+After: [1, 1, 0, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 0
+After: [1, 1, 2, 1]
+
+Before: [2, 0, 1, 1]
+3 0 3 3
+After: [2, 0, 1, 1]
diff --git a/2018/inputs/16_2.txt b/2018/inputs/16_2.txt
new file mode 100644
index 0000000..6f6f812
--- /dev/null
+++ b/2018/inputs/16_2.txt
@@ -0,0 +1,1014 @@
+8 0 0 2
+5 2 2 2
+6 3 1 1
+8 0 0 3
+5 3 0 3
+9 2 3 1
+8 1 3 1
+8 1 2 1
+11 0 1 0
+10 0 0 1
+8 0 0 2
+5 2 3 2
+6 3 0 3
+8 2 0 0
+5 0 1 0
+12 3 2 0
+8 0 3 0
+11 1 0 1
+10 1 1 3
+6 1 2 0
+8 1 0 1
+5 1 0 1
+6 0 0 2
+5 0 1 1
+8 1 3 1
+11 3 1 3
+10 3 3 2
+6 3 0 3
+6 2 1 1
+4 3 1 0
+8 0 3 0
+11 0 2 2
+10 2 0 1
+8 1 0 0
+5 0 1 0
+8 3 0 2
+5 2 0 2
+6 2 1 3
+8 0 2 3
+8 3 3 3
+8 3 3 3
+11 3 1 1
+10 1 1 3
+6 3 3 2
+6 0 0 1
+8 0 2 0
+8 0 1 0
+8 0 1 0
+11 3 0 3
+10 3 0 0
+6 2 2 1
+6 1 0 3
+13 1 2 1
+8 1 2 1
+11 1 0 0
+10 0 3 2
+6 2 0 0
+6 3 1 1
+6 2 0 3
+9 0 3 1
+8 1 1 1
+8 1 3 1
+11 1 2 2
+10 2 0 0
+6 3 1 1
+6 2 1 2
+6 0 2 3
+7 3 2 1
+8 1 2 1
+8 1 2 1
+11 1 0 0
+10 0 3 3
+6 3 1 2
+6 1 2 0
+6 0 1 1
+6 2 1 1
+8 1 1 1
+11 3 1 3
+10 3 3 1
+6 2 0 3
+8 0 0 2
+5 2 0 2
+6 2 2 0
+15 0 3 0
+8 0 1 0
+8 0 2 0
+11 0 1 1
+10 1 0 0
+6 3 1 1
+6 0 0 3
+6 2 1 2
+7 3 2 2
+8 2 2 2
+11 2 0 0
+10 0 1 1
+6 1 0 3
+8 0 0 0
+5 0 2 0
+8 0 0 2
+5 2 0 2
+3 0 3 2
+8 2 3 2
+8 2 2 2
+11 1 2 1
+10 1 1 3
+8 2 0 2
+5 2 3 2
+6 3 2 0
+6 1 3 1
+8 1 2 2
+8 2 1 2
+11 2 3 3
+6 1 1 0
+8 1 0 2
+5 2 0 2
+6 2 0 0
+8 0 3 0
+11 3 0 3
+10 3 3 2
+6 2 1 0
+6 2 2 3
+6 0 1 1
+9 0 3 0
+8 0 1 0
+8 0 1 0
+11 0 2 2
+10 2 3 3
+6 3 1 1
+8 3 0 2
+5 2 1 2
+6 1 3 0
+5 0 1 0
+8 0 2 0
+11 0 3 3
+10 3 0 0
+6 1 3 3
+8 0 0 2
+5 2 0 2
+6 0 1 1
+5 3 1 2
+8 2 2 2
+11 0 2 0
+10 0 2 3
+6 2 1 1
+6 2 0 2
+6 3 3 0
+13 1 0 1
+8 1 2 1
+11 1 3 3
+10 3 2 2
+6 1 1 3
+6 0 2 1
+6 0 2 0
+5 3 1 3
+8 3 2 3
+11 2 3 2
+10 2 3 3
+6 1 3 0
+6 0 0 2
+6 3 1 1
+8 0 2 1
+8 1 3 1
+11 3 1 3
+10 3 0 1
+6 2 2 0
+6 2 1 3
+6 3 3 2
+9 0 3 2
+8 2 2 2
+8 2 3 2
+11 2 1 1
+10 1 3 3
+6 0 3 2
+8 2 0 1
+5 1 3 1
+2 0 1 1
+8 1 1 1
+11 1 3 3
+10 3 3 2
+6 3 0 1
+6 1 1 3
+3 0 3 1
+8 1 3 1
+11 2 1 2
+10 2 1 0
+6 2 1 1
+6 1 3 2
+6 2 0 3
+9 1 3 3
+8 3 3 3
+11 3 0 0
+10 0 3 2
+6 2 3 0
+6 1 0 3
+3 0 3 3
+8 3 2 3
+11 2 3 2
+10 2 2 1
+6 1 2 3
+6 2 3 2
+3 0 3 2
+8 2 1 2
+8 2 2 2
+11 2 1 1
+10 1 0 2
+6 3 2 1
+6 3 3 0
+11 3 3 1
+8 1 2 1
+8 1 2 1
+11 2 1 2
+6 2 1 1
+13 1 0 0
+8 0 3 0
+8 0 1 0
+11 0 2 2
+10 2 1 3
+8 1 0 0
+5 0 1 0
+6 0 0 2
+8 0 2 0
+8 0 3 0
+8 0 2 0
+11 3 0 3
+10 3 3 1
+6 3 3 2
+6 2 1 0
+6 2 2 3
+15 0 3 3
+8 3 2 3
+11 3 1 1
+10 1 3 2
+6 3 1 1
+8 2 0 3
+5 3 0 3
+4 1 0 1
+8 1 2 1
+11 2 1 2
+10 2 0 1
+6 3 1 2
+6 1 1 3
+6 1 0 0
+8 3 2 3
+8 3 2 3
+11 1 3 1
+10 1 2 3
+6 2 1 1
+6 2 1 2
+10 0 2 2
+8 2 1 2
+11 3 2 3
+6 0 0 1
+6 2 1 2
+10 0 2 0
+8 0 3 0
+11 3 0 3
+10 3 1 2
+8 2 0 3
+5 3 0 3
+6 1 1 0
+11 0 0 3
+8 3 2 3
+11 3 2 2
+10 2 3 3
+6 2 1 1
+6 3 2 2
+6 2 2 0
+0 0 2 0
+8 0 1 0
+11 0 3 3
+10 3 3 2
+6 2 1 3
+6 2 0 0
+6 3 0 1
+15 0 3 3
+8 3 1 3
+8 3 3 3
+11 3 2 2
+10 2 3 1
+8 1 0 0
+5 0 1 0
+6 3 3 2
+8 0 0 3
+5 3 1 3
+8 0 2 3
+8 3 1 3
+11 3 1 1
+10 1 1 3
+6 0 0 1
+6 2 1 2
+10 0 2 1
+8 1 2 1
+11 1 3 3
+10 3 2 0
+8 0 0 2
+5 2 0 2
+6 3 2 3
+6 3 3 1
+12 3 2 1
+8 1 1 1
+11 1 0 0
+10 0 0 3
+6 3 2 1
+6 2 2 0
+6 3 3 2
+0 0 2 0
+8 0 3 0
+8 0 1 0
+11 0 3 3
+10 3 3 2
+6 1 3 1
+8 1 0 3
+5 3 2 3
+8 0 0 0
+5 0 2 0
+1 1 3 0
+8 0 1 0
+11 2 0 2
+6 3 1 1
+6 2 0 0
+4 1 0 1
+8 1 2 1
+11 2 1 2
+10 2 1 1
+6 3 0 2
+6 1 2 3
+3 0 3 0
+8 0 1 0
+11 0 1 1
+8 3 0 2
+5 2 2 2
+6 2 0 3
+8 2 0 0
+5 0 3 0
+2 2 0 2
+8 2 1 2
+11 1 2 1
+10 1 2 0
+6 3 0 1
+8 0 0 2
+5 2 0 2
+14 2 3 1
+8 1 2 1
+11 1 0 0
+10 0 2 3
+6 3 3 2
+6 1 3 0
+8 3 0 1
+5 1 1 1
+11 1 0 2
+8 2 3 2
+8 2 3 2
+11 3 2 3
+10 3 3 1
+6 2 2 2
+6 0 2 3
+7 3 2 0
+8 0 2 0
+8 0 2 0
+11 1 0 1
+10 1 2 3
+6 3 2 0
+8 2 0 2
+5 2 0 2
+8 1 0 1
+5 1 3 1
+0 2 0 0
+8 0 3 0
+11 0 3 3
+10 3 2 1
+6 1 1 0
+8 3 0 3
+5 3 0 3
+6 1 1 2
+6 3 0 2
+8 2 2 2
+11 2 1 1
+10 1 3 2
+8 3 0 1
+5 1 1 1
+6 3 1 3
+11 0 0 1
+8 1 1 1
+11 1 2 2
+10 2 1 1
+6 1 2 2
+6 3 2 0
+6 2 1 3
+12 0 2 0
+8 0 3 0
+11 1 0 1
+10 1 1 2
+6 2 3 0
+8 2 0 3
+5 3 1 3
+6 3 1 1
+5 3 1 3
+8 3 2 3
+11 2 3 2
+6 0 3 3
+6 3 0 0
+8 2 0 1
+5 1 2 1
+13 1 0 0
+8 0 1 0
+11 0 2 2
+10 2 3 1
+6 2 1 2
+6 1 2 3
+6 3 0 0
+2 2 0 3
+8 3 3 3
+11 1 3 1
+10 1 2 3
+6 1 3 0
+6 3 0 1
+5 0 1 1
+8 1 2 1
+11 1 3 3
+10 3 3 2
+6 1 3 3
+8 0 0 1
+5 1 0 1
+8 1 0 0
+5 0 2 0
+3 0 3 1
+8 1 2 1
+11 2 1 2
+6 1 1 0
+6 0 2 1
+8 3 0 3
+5 3 2 3
+5 0 1 0
+8 0 3 0
+8 0 2 0
+11 0 2 2
+6 1 0 1
+6 2 1 0
+15 0 3 3
+8 3 3 3
+11 3 2 2
+6 0 2 1
+6 2 3 3
+6 3 3 0
+4 0 3 1
+8 1 2 1
+11 2 1 2
+6 0 1 3
+8 0 0 0
+5 0 2 0
+8 3 0 1
+5 1 2 1
+6 3 0 0
+8 0 2 0
+8 0 3 0
+11 0 2 2
+10 2 1 3
+8 2 0 2
+5 2 3 2
+6 1 1 1
+6 2 3 0
+1 1 0 2
+8 2 3 2
+11 3 2 3
+10 3 0 0
+6 0 3 3
+8 3 0 1
+5 1 0 1
+6 2 0 2
+7 3 2 2
+8 2 2 2
+11 0 2 0
+10 0 0 3
+6 2 3 1
+8 3 0 2
+5 2 0 2
+6 3 3 0
+13 1 0 2
+8 2 3 2
+8 2 3 2
+11 3 2 3
+8 3 0 2
+5 2 2 2
+2 2 0 1
+8 1 3 1
+11 3 1 3
+10 3 2 2
+6 1 3 3
+6 3 3 1
+6 2 0 0
+3 0 3 3
+8 3 3 3
+11 3 2 2
+10 2 2 0
+6 1 1 1
+6 2 1 3
+8 2 0 2
+5 2 0 2
+14 2 3 2
+8 2 2 2
+8 2 3 2
+11 2 0 0
+10 0 1 3
+6 3 0 1
+6 3 2 2
+6 2 0 0
+6 2 1 0
+8 0 2 0
+11 3 0 3
+10 3 0 1
+6 0 1 3
+6 2 3 2
+8 3 0 0
+5 0 0 0
+7 3 2 3
+8 3 3 3
+8 3 2 3
+11 1 3 1
+10 1 1 2
+6 2 0 0
+8 0 0 3
+5 3 1 3
+6 1 1 1
+1 3 0 1
+8 1 2 1
+11 1 2 2
+10 2 2 3
+6 0 2 1
+6 3 1 0
+6 2 2 2
+2 2 0 1
+8 1 3 1
+8 1 1 1
+11 1 3 3
+10 3 1 2
+6 1 0 1
+6 2 2 3
+1 1 3 0
+8 0 2 0
+8 0 3 0
+11 2 0 2
+10 2 3 1
+6 2 0 0
+6 2 0 2
+15 0 3 3
+8 3 1 3
+11 3 1 1
+10 1 0 3
+6 3 0 2
+6 1 3 1
+0 0 2 2
+8 2 3 2
+11 3 2 3
+10 3 3 0
+6 1 2 3
+6 3 1 1
+6 0 0 2
+12 1 2 3
+8 3 3 3
+8 3 3 3
+11 3 0 0
+10 0 3 1
+8 1 0 0
+5 0 2 0
+8 1 0 2
+5 2 2 2
+6 0 2 3
+7 3 2 2
+8 2 2 2
+11 2 1 1
+10 1 2 3
+6 2 3 1
+6 3 1 2
+13 1 2 0
+8 0 3 0
+11 0 3 3
+10 3 1 1
+6 1 2 3
+6 3 1 0
+8 3 2 0
+8 0 1 0
+11 1 0 1
+6 1 3 0
+6 2 2 2
+6 3 0 3
+10 0 2 0
+8 0 1 0
+11 0 1 1
+6 3 0 0
+2 2 0 3
+8 3 1 3
+11 3 1 1
+10 1 2 3
+6 1 2 2
+8 1 0 1
+5 1 1 1
+6 2 2 0
+1 1 0 0
+8 0 3 0
+11 3 0 3
+10 3 1 0
+6 2 0 3
+6 2 0 2
+1 1 3 3
+8 3 1 3
+11 3 0 0
+10 0 0 3
+6 3 2 1
+8 3 0 0
+5 0 2 0
+6 3 2 2
+0 0 2 2
+8 2 1 2
+11 3 2 3
+10 3 3 0
+8 0 0 3
+5 3 0 3
+6 1 3 1
+6 2 2 2
+7 3 2 3
+8 3 1 3
+8 3 3 3
+11 0 3 0
+10 0 0 3
+6 3 2 2
+6 2 1 0
+0 0 2 1
+8 1 3 1
+8 1 2 1
+11 1 3 3
+8 1 0 2
+5 2 2 2
+6 3 1 0
+6 3 3 1
+2 2 1 1
+8 1 1 1
+11 3 1 3
+10 3 1 1
+6 3 2 3
+6 2 0 0
+6 3 0 2
+13 0 2 3
+8 3 3 3
+8 3 1 3
+11 3 1 1
+10 1 2 3
+8 2 0 0
+5 0 1 0
+8 3 0 2
+5 2 2 2
+8 0 0 1
+5 1 0 1
+11 0 0 1
+8 1 2 1
+11 3 1 3
+10 3 3 0
+6 0 1 3
+6 3 3 1
+6 3 1 2
+14 3 2 3
+8 3 3 3
+11 0 3 0
+10 0 2 3
+6 1 0 1
+6 1 0 0
+6 2 3 2
+10 0 2 1
+8 1 1 1
+8 1 2 1
+11 1 3 3
+6 1 1 2
+6 0 3 1
+5 0 1 2
+8 2 3 2
+11 3 2 3
+10 3 2 1
+8 3 0 3
+5 3 2 3
+8 1 0 0
+5 0 2 0
+6 3 3 2
+0 0 2 3
+8 3 2 3
+8 3 1 3
+11 3 1 1
+10 1 2 0
+6 1 3 3
+8 3 0 2
+5 2 1 2
+6 0 1 1
+5 3 1 3
+8 3 1 3
+11 0 3 0
+10 0 3 1
+6 1 3 0
+6 0 3 3
+8 1 0 2
+5 2 2 2
+7 3 2 3
+8 3 2 3
+11 3 1 1
+6 0 0 2
+6 2 3 3
+6 0 3 0
+14 2 3 0
+8 0 1 0
+8 0 1 0
+11 0 1 1
+10 1 0 3
+6 3 0 2
+6 2 2 0
+6 2 0 1
+13 0 2 1
+8 1 3 1
+8 1 1 1
+11 3 1 3
+10 3 2 1
+6 3 1 3
+6 1 2 0
+8 0 2 2
+8 2 3 2
+11 1 2 1
+6 1 0 3
+6 3 3 2
+11 0 0 2
+8 2 2 2
+11 1 2 1
+10 1 2 3
+6 0 3 0
+8 1 0 2
+5 2 2 2
+6 3 2 1
+2 2 1 2
+8 2 1 2
+11 3 2 3
+6 0 0 2
+6 1 3 1
+8 1 2 0
+8 0 3 0
+8 0 2 0
+11 0 3 3
+10 3 2 2
+6 2 2 0
+6 1 2 3
+3 0 3 0
+8 0 2 0
+11 2 0 2
+10 2 3 3
+6 0 0 1
+6 2 0 0
+6 3 3 2
+0 0 2 2
+8 2 1 2
+8 2 1 2
+11 2 3 3
+10 3 1 0
+6 2 3 1
+6 2 3 3
+8 3 0 2
+5 2 0 2
+14 2 3 2
+8 2 3 2
+11 2 0 0
+10 0 0 1
+8 2 0 2
+5 2 0 2
+6 1 0 0
+1 0 3 3
+8 3 2 3
+8 3 2 3
+11 1 3 1
+6 2 2 0
+6 2 0 3
+6 1 3 2
+15 0 3 0
+8 0 2 0
+11 1 0 1
+10 1 2 0
+6 3 0 1
+6 0 3 2
+6 1 1 3
+12 1 2 1
+8 1 1 1
+11 1 0 0
+10 0 1 2
+6 3 1 1
+6 3 1 0
+5 3 1 3
+8 3 3 3
+11 2 3 2
+10 2 1 0
+6 0 2 3
+6 2 3 2
+8 1 0 1
+5 1 0 1
+7 3 2 3
+8 3 1 3
+8 3 1 3
+11 3 0 0
+6 2 1 1
+6 3 0 2
+6 0 1 3
+14 3 2 2
+8 2 2 2
+11 2 0 0
+8 2 0 2
+5 2 0 2
+6 1 1 3
+6 2 3 1
+8 1 3 1
+11 0 1 0
+10 0 0 1
+6 2 1 0
+6 3 1 2
+1 3 0 0
+8 0 2 0
+11 0 1 1
+10 1 3 0
+6 0 3 3
+6 1 1 1
+14 3 2 1
+8 1 2 1
+11 0 1 0
+10 0 3 2
+6 2 3 1
+6 2 0 0
+6 1 1 3
+1 3 0 0
+8 0 1 0
+11 0 2 2
+10 2 0 1
+6 0 2 2
+6 2 0 3
+6 2 1 0
+15 0 3 3
+8 3 2 3
+8 3 3 3
+11 1 3 1
+6 3 0 0
+8 0 0 3
+5 3 1 3
+11 3 3 3
+8 3 1 3
+8 3 1 3
+11 3 1 1
+10 1 3 3
+6 2 0 0
+6 3 0 2
+8 0 0 1
+5 1 2 1
+0 0 2 1
+8 1 1 1
+8 1 1 1
+11 1 3 3
+10 3 1 2
+6 2 0 1
+6 2 3 3
+15 0 3 1
+8 1 1 1
+8 1 1 1
+11 1 2 2
+10 2 1 0
+6 0 2 3
+6 3 3 1
+6 2 1 2
+7 3 2 3
+8 3 3 3
+11 3 0 0
+10 0 0 2
+6 2 3 0
+6 0 0 3
+2 0 1 3
+8 3 3 3
+11 2 3 2
+10 2 2 3
+6 1 0 2
+6 1 0 1
+1 1 0 1
+8 1 1 1
+11 3 1 3
+8 1 0 1
+5 1 3 1
+2 0 1 1
+8 1 3 1
+11 3 1 3
+10 3 0 2
+6 2 2 3
+8 2 0 1
+5 1 3 1
+15 0 3 1
+8 1 1 1
+8 1 1 1
+11 2 1 2
+10 2 3 0
+6 3 0 1
+6 1 0 3
+6 2 1 2
+2 2 1 2
+8 2 2 2
+8 2 3 2
+11 0 2 0
+10 0 0 1
+6 1 0 0
+6 2 2 2
+10 0 2 2
+8 2 1 2
+11 1 2 1
+10 1 2 0
+6 3 1 1
+6 2 0 3
+6 2 0 2
+9 2 3 2
+8 2 1 2
+11 0 2 0
+10 0 2 2
+6 1 1 3
+6 0 2 1
+8 0 0 0
+5 0 1 0
+5 3 1 3
+8 3 2 3
+11 3 2 2
+10 2 0 1
+6 1 2 2
+6 2 1 3
+1 0 3 2
+8 2 2 2
+11 2 1 1
+6 3 3 2
+6 2 3 0
+15 0 3 2
+8 2 2 2
+11 2 1 1
+10 1 2 0
+6 2 1 1
+6 3 3 2
+9 1 3 3
+8 3 3 3
+11 0 3 0
+10 0 2 1
+6 0 0 2
+6 2 0 0
+6 1 1 3
+1 3 0 2
+8 2 1 2
+8 2 1 2
+11 2 1 1
+10 1 0 0
+6 2 2 1
+6 0 0 3
+6 3 2 2
+13 1 2 2
+8 2 3 2
+11 0 2 0
+10 0 0 2
+6 2 2 3
+8 2 0 0
+5 0 0 0
+6 3 1 1
+6 3 0 0
+8 0 3 0
+11 0 2 2
+10 2 0 1
+6 0 1 2
+6 3 2 0
+6 0 1 3
+12 0 2 3
+8 3 1 3
+8 3 2 3
+11 3 1 1
+10 1 3 2
+6 2 2 1
+6 2 3 0
+6 3 2 3
+4 3 1 1
+8 1 2 1
+11 2 1 2
+10 2 0 0
+8 3 0 3
+5 3 1 3
+6 1 1 1
+6 3 3 2
+8 3 2 3
+8 3 2 3
+11 0 3 0
+6 2 3 2
+6 2 0 1
+6 2 0 3
+9 1 3 3
+8 3 1 3
+11 0 3 0
+10 0 1 2
+6 1 3 3
+6 2 2 0
+11 3 3 3
+8 3 2 3
+11 2 3 2
+6 2 0 3
+6 3 1 1
+15 0 3 0
+8 0 2 0
+8 0 2 0
+11 2 0 2
+10 2 2 3
+8 2 0 0
+5 0 1 0
+8 3 0 1
+5 1 1 1
+6 0 0 2
+8 1 2 2
+8 2 2 2
+8 2 1 2
+11 3 2 3
+10 3 2 0
diff --git a/2018/inputs/17.txt b/2018/inputs/17.txt
new file mode 100644
index 0000000..1e2ccdd
--- /dev/null
+++ b/2018/inputs/17.txt
@@ -0,0 +1,1713 @@
+y=1181, x=576..579
+y=434, x=498..503
+x=647, y=653..675
+y=1204, x=593..595
+y=268, x=475..498
+x=599, y=619..638
+y=1130, x=452..478
+x=439, y=1365..1377
+y=652, x=589..595
+y=1552, x=560..577
+x=439, y=852..867
+x=605, y=292..298
+x=489, y=709..718
+x=567, y=1087..1097
+y=1774, x=631..634
+x=649, y=592..612
+x=610, y=533..555
+x=564, y=996..1008
+x=651, y=416..441
+y=1106, x=502..519
+y=1015, x=479..487
+x=572, y=25..35
+x=630, y=849..865
+x=573, y=884..897
+x=614, y=667..688
+x=464, y=1542..1567
+x=645, y=258..270
+y=1029, x=656..662
+y=1502, x=483..511
+x=589, y=1553..1555
+x=535, y=1792..1795
+x=469, y=166..193
+x=484, y=1117..1142
+x=655, y=1277..1295
+x=598, y=162..170
+y=620, x=430..455
+x=665, y=1205..1212
+x=501, y=1347..1364
+x=661, y=664..684
+x=583, y=131..142
+x=542, y=722..727
+x=475, y=748..761
+x=602, y=1386..1393
+x=578, y=1651..1662
+y=1711, x=598..603
+y=164, x=642..660
+x=488, y=1176..1183
+x=644, y=207..221
+x=654, y=1678..1691
+y=1673, x=448..454
+x=630, y=1299..1312
+y=695, x=472..474
+x=465, y=1022..1045
+x=645, y=1216..1243
+x=623, y=423..437
+x=625, y=200..219
+x=565, y=1153..1166
+x=490, y=1510..1519
+x=553, y=941..947
+x=634, y=1101..1126
+x=515, y=111..113
+y=1146, x=427..438
+y=1096, x=451..460
+x=464, y=1339..1346
+x=612, y=1383..1396
+y=500, x=516..532
+x=555, y=941..947
+x=528, y=1243..1270
+x=646, y=1136..1146
+y=887, x=470..484
+x=617, y=316..343
+x=575, y=1060..1069
+y=1047, x=443..455
+y=1120, x=527..580
+x=514, y=126..135
+y=292, x=484..500
+x=556, y=75..91
+y=646, x=494..518
+x=644, y=552..568
+x=509, y=8..17
+y=735, x=591..614
+x=586, y=1215..1228
+y=1335, x=443..465
+y=495, x=522..526
+x=610, y=864..867
+y=221, x=639..644
+y=1346, x=464..469
+x=489, y=967..983
+x=602, y=1277..1289
+x=620, y=1348..1375
+x=575, y=1736..1744
+x=629, y=462..466
+y=270, x=645..652
+x=518, y=1244..1270
+x=576, y=1151..1162
+x=483, y=970..973
+y=1349, x=606..610
+y=1335, x=634..655
+y=1671, x=650..657
+x=619, y=243..265
+x=585, y=558..563
+x=536, y=1876..1887
+x=652, y=551..559
+x=593, y=1256..1268
+x=440, y=1480..1496
+y=1401, x=520..541
+x=624, y=1297..1306
+x=501, y=1510..1528
+x=587, y=567..575
+y=1470, x=560..580
+y=776, x=519..523
+x=601, y=981..983
+x=516, y=655..666
+y=1803, x=573..578
+x=504, y=1654..1677
+y=1931, x=537..667
+x=540, y=145..163
+x=616, y=204..210
+x=473, y=1856..1859
+x=547, y=241..259
+x=664, y=932..939
+x=475, y=306..316
+y=1572, x=622..628
+x=641, y=985..1001
+x=527, y=1572..1575
+x=447, y=1116..1124
+x=595, y=650..652
+y=1326, x=616..619
+x=626, y=822..835
+x=583, y=1063..1075
+x=576, y=1212..1222
+y=1206, x=486..495
+x=602, y=1885..1910
+x=460, y=1781..1805
+y=996, x=521..527
+x=591, y=1083..1103
+x=569, y=1563..1574
+y=785, x=560..579
+y=857, x=522..524
+x=599, y=804..805
+x=651, y=1724..1736
+y=637, x=449..467
+x=455, y=815..842
+x=476, y=1327..1345
+y=1533, x=615..624
+y=1268, x=633..655
+x=653, y=295..299
+x=522, y=388..415
+y=1365, x=462..487
+y=1430, x=428..438
+x=487, y=488..499
+y=1150, x=599..608
+x=559, y=1922..1927
+x=664, y=170..193
+y=1531, x=441..444
+y=1315, x=600..604
+x=603, y=1541..1543
+x=664, y=1401..1420
+x=580, y=322..345
+x=449, y=627..637
+y=1749, x=497..511
+x=577, y=1060..1069
+y=289, x=492..494
+x=443, y=1330..1335
+x=487, y=405..416
+x=603, y=18..33
+y=1312, x=612..630
+x=605, y=625..633
+x=546, y=1230..1232
+x=553, y=1126..1142
+x=441, y=936..943
+y=1715, x=544..641
+y=1693, x=594..596
+x=649, y=1151..1170
+x=490, y=405..416
+x=602, y=1602..1623
+y=142, x=580..583
+x=574, y=646..660
+y=789, x=479..485
+y=1093, x=640..655
+y=1200, x=501..508
+y=225, x=557..572
+x=591, y=727..735
+x=515, y=1653..1665
+x=467, y=489..499
+y=193, x=459..469
+x=593, y=1143..1162
+x=461, y=489..493
+x=547, y=198..217
+x=522, y=61..73
+x=626, y=1767..1779
+y=446, x=437..448
+y=840, x=443..451
+x=496, y=597..601
+x=650, y=1004..1013
+x=429, y=936..943
+x=557, y=812..822
+x=542, y=1633..1635
+x=469, y=1607..1615
+y=1654, x=624..626
+x=504, y=787..798
+x=569, y=1868..1875
+y=902, x=641..644
+y=1170, x=649..651
+x=606, y=532..555
+x=493, y=1509..1528
+x=452, y=1410..1425
+x=535, y=468..480
+x=599, y=1150..1158
+y=1486, x=429..437
+y=415, x=518..522
+x=511, y=1490..1502
+x=634, y=1765..1774
+x=539, y=869..879
+x=470, y=1413..1418
+x=516, y=1641..1648
+y=598, x=432..434
+x=494, y=807..818
+x=477, y=1875..1898
+x=577, y=77..98
+x=477, y=324..337
+x=451, y=1510..1535
+x=590, y=838..849
+x=565, y=1872..1898
+x=516, y=825..831
+x=541, y=869..879
+y=695, x=427..444
+x=437, y=1166..1194
+x=593, y=1279..1292
+x=518, y=469..480
+x=532, y=1851..1861
+y=1861, x=532..536
+y=1485, x=636..652
+y=1887, x=493..496
+x=436, y=749..766
+y=1268, x=593..610
+y=1145, x=512..520
+y=334, x=482..485
+y=1351, x=553..565
+x=491, y=1547..1556
+y=1908, x=530..549
+y=521, x=607..634
+x=602, y=1687..1698
+x=631, y=1725..1736
+y=1792, x=432..456
+x=530, y=1572..1575
+x=584, y=1154..1166
+x=620, y=1286..1292
+x=537, y=1918..1931
+x=608, y=1474..1489
+x=461, y=989..1006
+x=477, y=1672..1678
+y=1287, x=492..495
+y=1318, x=532..554
+x=463, y=12..30
+x=628, y=595..608
+x=560, y=778..785
+y=1624, x=472..480
+y=673, x=486..489
+x=475, y=1241..1254
+y=1479, x=472..485
+x=458, y=468..477
+y=1298, x=494..497
+x=641, y=1437..1447
+y=973, x=464..483
+y=1695, x=594..596
+x=460, y=1084..1096
+x=613, y=293..298
+x=503, y=1548..1556
+x=574, y=915..931
+y=25, x=482..501
+x=637, y=529..549
+x=441, y=1440..1453
+y=91, x=556..567
+x=432, y=1695..1711
+y=1375, x=620..644
+y=1912, x=553..556
+y=413, x=595..598
+x=584, y=1257..1281
+y=131, x=551..556
+x=493, y=573..576
+x=551, y=860..864
+x=469, y=79..91
+x=462, y=1144..1150
+x=513, y=812..814
+y=1789, x=582..607
+y=1246, x=590..592
+x=544, y=1703..1715
+y=677, x=480..496
+x=432, y=588..598
+x=566, y=556..559
+y=1926, x=511..515
+y=592, x=455..478
+x=610, y=1647..1659
+x=651, y=213..238
+y=1622, x=543..565
+x=451, y=90..104
+x=576, y=1174..1181
+y=1243, x=645..651
+x=553, y=1343..1351
+x=572, y=201..225
+x=648, y=947..970
+x=581, y=444..462
+x=459, y=36..59
+x=642, y=147..164
+x=561, y=1634..1635
+x=593, y=697..707
+x=557, y=200..225
+y=1077, x=457..461
+y=1429, x=600..626
+x=631, y=781..785
+x=565, y=1343..1351
+x=651, y=891..905
+x=445, y=1827..1843
+y=1711, x=432..460
+x=491, y=1819..1821
+x=558, y=725..730
+x=434, y=991..1012
+x=634, y=434..442
+x=452, y=527..540
+x=618, y=1479..1484
+x=644, y=621..626
+x=533, y=1526..1544
+y=831, x=490..516
+y=466, x=629..649
+y=1228, x=568..586
+x=567, y=1062..1075
+x=640, y=1747..1758
+x=579, y=777..785
+x=549, y=812..822
+y=1732, x=638..640
+y=490, x=576..594
+x=516, y=1495..1518
+x=620, y=1297..1306
+y=254, x=460..468
+x=475, y=254..268
+x=482, y=12..25
+y=1183, x=468..488
+x=587, y=666..675
+y=68, x=479..500
+x=524, y=1789..1801
+x=613, y=1046..1058
+x=580, y=567..575
+y=879, x=539..541
+x=448, y=533..537
+x=658, y=1363..1375
+y=410, x=427..438
+y=176, x=501..504
+x=491, y=783..794
+x=570, y=351..373
+y=259, x=521..547
+y=480, x=518..535
+y=633, x=605..607
+x=523, y=767..776
+y=898, x=552..556
+x=606, y=1340..1349
+x=494, y=631..646
+x=496, y=1688..1695
+y=821, x=634..642
+y=1393, x=602..605
+x=443, y=1175..1177
+x=531, y=851..861
+y=582, x=442..546
+y=864, x=551..570
+x=562, y=996..1008
+y=575, x=580..587
+x=529, y=1763..1775
+y=40, x=502..506
+y=73, x=522..529
+y=798, x=504..526
+y=628, x=513..529
+x=520, y=1657..1662
+y=1648, x=516..536
+y=1142, x=484..495
+x=492, y=302..315
+x=586, y=1176..1187
+y=512, x=516..518
+y=218, x=502..504
+y=515, x=516..518
+x=516, y=512..515
+x=444, y=690..695
+y=626, x=624..644
+x=637, y=1276..1295
+y=1370, x=592..595
+y=1860, x=609..620
+x=620, y=900..915
+x=614, y=727..735
+x=437, y=1464..1486
+y=1254, x=457..475
+y=910, x=583..585
+y=294, x=429..436
+y=398, x=481..501
+x=642, y=1768..1779
+y=1845, x=500..524
+y=1898, x=561..565
+y=712, x=571..573
+y=735, x=489..491
+y=887, x=586..589
+y=1518, x=516..521
+x=466, y=551..560
+x=472, y=1613..1624
+x=561, y=701..715
+y=33, x=599..603
+x=538, y=896..908
+x=568, y=1456..1464
+y=559, x=566..568
+x=515, y=328..356
+x=662, y=1020..1029
+x=624, y=355..377
+x=480, y=1612..1624
+y=1139, x=570..574
+y=1795, x=530..535
+x=516, y=490..500
+x=462, y=1830..1837
+x=437, y=202..223
+x=661, y=1504..1509
+x=451, y=470..481
+x=515, y=1836..1840
+x=633, y=189..191
+x=467, y=708..718
+x=528, y=900..902
+x=497, y=232..241
+x=588, y=1686..1698
+y=1306, x=620..624
+x=480, y=667..677
+x=493, y=9..21
+y=1416, x=490..515
+x=624, y=1507..1533
+x=436, y=290..294
+y=708, x=571..573
+x=462, y=601..615
+y=595, x=628..638
+y=1205, x=621..626
+x=582, y=1130..1142
+x=487, y=1000..1015
+x=651, y=1695..1703
+x=544, y=891..902
+x=459, y=165..193
+x=549, y=1897..1908
+y=1484, x=616..618
+x=556, y=1887..1912
+y=1868, x=462..480
+x=621, y=1177..1205
+x=561, y=1873..1898
+x=624, y=1475..1489
+y=1377, x=439..451
+y=943, x=429..441
+y=1553, x=610..615
+x=509, y=1048..1074
+x=483, y=915..928
+x=480, y=606..608
+x=580, y=1027..1043
+x=630, y=978..996
+x=516, y=1875..1887
+x=501, y=1190..1200
+y=377, x=624..632
+y=481, x=451..470
+y=555, x=606..610
+x=445, y=1542..1567
+x=514, y=1231..1233
+x=572, y=62..72
+y=1097, x=548..567
+x=593, y=1784..1786
+x=556, y=29..31
+x=514, y=34..44
+x=651, y=29..31
+x=601, y=1342..1352
+x=439, y=177..182
+x=522, y=853..857
+x=638, y=110..114
+y=1166, x=565..584
+x=549, y=447..457
+x=508, y=1896..1898
+x=525, y=1763..1775
+x=572, y=350..373
+x=583, y=273..301
+x=496, y=148..158
+x=427, y=690..695
+x=506, y=449..461
+x=622, y=592..612
+x=492, y=497..521
+x=554, y=962..972
+x=543, y=827..840
+y=91, x=469..487
+x=446, y=614..616
+x=477, y=453..456
+x=501, y=366..376
+y=487, x=564..568
+x=495, y=1188..1206
+x=530, y=1896..1908
+x=436, y=123..147
+x=471, y=1856..1859
+x=486, y=664..673
+y=770, x=573..583
+x=565, y=1403..1411
+x=599, y=18..33
+y=1599, x=556..577
+y=1411, x=565..567
+x=541, y=986..1012
+x=601, y=1083..1103
+y=1825, x=486..502
+y=1695, x=480..496
+x=440, y=122..147
+x=476, y=364..376
+y=409, x=449..463
+x=446, y=1143..1150
+x=536, y=1614..1619
+y=290, x=510..514
+y=600, x=454..459
+y=1837, x=562..579
+x=462, y=1851..1868
+x=544, y=278..297
+y=902, x=544..563
+x=580, y=1438..1447
+x=546, y=570..582
+x=644, y=1874..1875
+x=447, y=306..316
+x=556, y=277..297
+x=626, y=424..437
+y=806, x=549..557
+x=596, y=1693..1695
+y=936, x=444..451
+y=1156, x=486..510
+y=1567, x=445..464
+y=779, x=514..530
+x=536, y=1851..1861
+y=992, x=504..509
+x=535, y=329..356
+y=814, x=513..519
+y=210, x=604..616
+x=491, y=731..735
+x=558, y=1084..1093
+y=352, x=642..648
+x=425, y=591..601
+x=634, y=1586..1603
+x=554, y=599..608
+x=605, y=397..419
+x=514, y=267..290
+y=263, x=554..568
+x=473, y=911..937
+y=897, x=573..579
+x=595, y=1401..1409
+x=613, y=367..370
+y=1535, x=433..451
+x=573, y=767..770
+x=665, y=41..45
+y=1093, x=558..561
+x=454, y=1666..1673
+x=495, y=1662..1672
+x=566, y=220..222
+x=492, y=1268..1287
+x=534, y=808..818
+x=480, y=1852..1868
+y=282, x=590..616
+x=502, y=218..221
+y=1187, x=566..586
+x=598, y=317..343
+x=562, y=1833..1837
+x=499, y=470..481
+y=113, x=456..478
+y=1703, x=649..651
+x=454, y=598..600
+x=474, y=1058..1074
+x=498, y=434..436
+y=1680, x=481..483
+x=662, y=851..868
+y=987, x=563..565
+y=299, x=653..660
+y=1590, x=617..625
+y=608, x=476..480
+x=538, y=527..540
+y=246, x=488..504
+x=455, y=611..620
+x=490, y=345..356
+x=566, y=602..604
+y=1603, x=634..650
+x=608, y=1150..1158
+x=454, y=363..376
+y=1679, x=596..623
+x=483, y=1569..1571
+x=554, y=1309..1318
+x=660, y=146..164
+x=442, y=752..755
+x=514, y=850..861
+y=1142, x=531..553
+y=1509, x=653..661
+x=509, y=1836..1840
+x=604, y=1301..1315
+x=488, y=426..440
+x=475, y=1733..1758
+x=543, y=41..67
+x=527, y=1107..1120
+y=660, x=574..577
+x=502, y=1081..1106
+x=469, y=1428..1434
+y=564, x=488..492
+x=430, y=1435..1455
+x=547, y=919..929
+x=641, y=1560..1563
+x=480, y=646..657
+y=715, x=478..480
+x=622, y=193..215
+x=445, y=271..274
+x=612, y=1280..1292
+y=938, x=608..621
+x=526, y=1897..1898
+x=610, y=441..443
+x=610, y=666..688
+y=1887, x=516..536
+x=625, y=1287..1292
+x=512, y=1204..1207
+x=505, y=1292..1303
+y=1045, x=465..485
+x=485, y=327..334
+x=574, y=570..587
+x=463, y=394..409
+x=485, y=1460..1479
+y=457, x=549..552
+y=456, x=477..479
+x=453, y=758..770
+x=660, y=360..381
+y=1895, x=616..620
+x=530, y=93..101
+x=589, y=861..887
+x=657, y=41..45
+y=31, x=556..564
+y=1823, x=512..656
+x=542, y=381..398
+y=1897, x=616..620
+x=610, y=1922..1927
+y=675, x=635..647
+x=535, y=938..950
+x=525, y=180..188
+x=635, y=654..675
+y=356, x=515..535
+x=520, y=1525..1544
+x=469, y=1799..1801
+x=478, y=1780..1805
+x=604, y=204..210
+x=456, y=490..493
+x=504, y=1875..1898
+x=527, y=1013..1027
+x=521, y=974..996
+x=583, y=737..760
+x=598, y=410..413
+x=476, y=493..496
+x=478, y=588..592
+x=438, y=1134..1146
+x=639, y=172..182
+x=471, y=1826..1843
+x=489, y=731..735
+x=427, y=888..914
+x=490, y=215..224
+y=1287, x=644..649
+x=655, y=729..747
+x=493, y=1788..1792
+x=596, y=763..765
+y=1236, x=446..456
+x=442, y=590..601
+x=600, y=1277..1289
+y=1224, x=590..608
+x=452, y=1102..1130
+x=504, y=165..176
+x=494, y=1296..1298
+x=615, y=511..516
+x=512, y=1465..1469
+x=649, y=1280..1287
+x=656, y=1811..1823
+x=567, y=76..91
+y=111, x=502..510
+y=867, x=439..444
+x=638, y=595..608
+y=87, x=531..549
+x=484, y=278..292
+y=1364, x=501..511
+x=454, y=1848..1872
+x=607, y=821..835
+x=504, y=218..221
+y=1402, x=626..640
+x=468, y=244..254
+x=554, y=1735..1744
+y=540, x=452..538
+x=472, y=493..496
+x=434, y=1757..1760
+x=502, y=97..111
+x=630, y=1250..1254
+y=1479, x=616..618
+x=549, y=788..806
+x=522, y=198..217
+x=577, y=1539..1552
+x=639, y=206..221
+x=591, y=697..707
+x=514, y=1554..1581
+x=647, y=1325..1330
+x=597, y=192..215
+x=461, y=1058..1077
+y=1528, x=493..501
+x=503, y=191..203
+y=1348, x=431..435
+y=1898, x=477..504
+x=487, y=79..91
+y=1074, x=509..519
+x=601, y=1361..1373
+x=579, y=499..504
+x=640, y=243..265
+y=1922, x=435..438
+y=1267, x=429..448
+x=650, y=156..158
+x=449, y=1439..1453
+x=545, y=417..419
+y=521, x=492..504
+x=517, y=895..908
+y=315, x=492..510
+x=644, y=1280..1287
+y=666, x=512..516
+y=395, x=490..494
+x=433, y=1434..1455
+x=510, y=1595..1617
+x=588, y=763..765
+x=631, y=1550..1552
+x=612, y=1102..1126
+y=1635, x=542..561
+x=526, y=787..798
+x=580, y=1497..1511
+x=603, y=1709..1711
+x=471, y=947..963
+y=730, x=558..564
+x=496, y=168..180
+x=435, y=1331..1348
+y=983, x=489..501
+y=257, x=597..613
+x=617, y=1343..1352
+x=598, y=498..504
+x=580, y=78..98
+y=104, x=441..451
+x=500, y=279..292
+x=626, y=1419..1429
+x=613, y=254..257
+x=610, y=1552..1553
+y=1418, x=470..472
+x=470, y=1038..1041
+y=1375, x=652..658
+y=230, x=457..467
+x=547, y=1370..1395
+x=597, y=1324..1349
+x=504, y=235..246
+x=499, y=728..739
+y=1910, x=602..627
+y=1830, x=456..462
+x=487, y=445..459
+x=525, y=590..610
+y=238, x=651..654
+x=587, y=367..370
+y=1336, x=554..575
+y=462, x=566..581
+x=452, y=1167..1194
+y=798, x=626..643
+x=507, y=507..518
+x=554, y=1523..1525
+x=536, y=1766..1778
+x=539, y=1465..1469
+x=465, y=1329..1335
+x=516, y=1697..1722
+y=970, x=644..648
+y=739, x=483..499
+x=625, y=1584..1590
+x=631, y=1765..1774
+x=598, y=1709..1711
+y=1330, x=645..647
+y=914, x=427..455
+y=1177, x=443..445
+x=618, y=1142..1162
+x=434, y=588..598
+y=560, x=450..466
+x=621, y=921..938
+y=481, x=478..499
+x=620, y=1857..1860
+x=577, y=843..845
+x=486, y=1647..1649
+x=589, y=534..537
+x=576, y=216..223
+y=606, x=476..480
+x=500, y=1831..1845
+x=450, y=644..650
+x=490, y=1401..1416
+x=581, y=63..72
+x=547, y=543..563
+x=605, y=1386..1393
+y=1249, x=575..599
+x=518, y=632..646
+y=563, x=581..585
+y=1805, x=460..478
+x=551, y=125..131
+x=483, y=366..376
+y=1013, x=645..650
+y=1560, x=641..649
+x=664, y=1267..1295
+y=462, x=543..560
+y=221, x=502..504
+x=604, y=101..107
+y=1263, x=602..604
+x=624, y=621..626
+y=996, x=630..632
+y=1659, x=567..571
+y=851, x=606..608
+y=928, x=483..486
+y=840, x=523..543
+y=1649, x=463..486
+x=592, y=1358..1370
+y=1615, x=457..469
+y=1295, x=546..550
+x=581, y=855..868
+y=698, x=462..480
+x=594, y=864..867
+x=593, y=216..223
+x=552, y=723..727
+y=707, x=591..593
+y=1142, x=565..582
+x=496, y=127..135
+x=637, y=1197..1223
+x=608, y=839..851
+x=641, y=1703..1715
+y=745, x=506..518
+x=536, y=1205..1207
+y=1233, x=502..514
+x=447, y=1732..1758
+x=627, y=529..549
+y=1008, x=562..564
+y=1784, x=593..598
+x=496, y=407..421
+x=583, y=163..170
+x=595, y=1193..1204
+x=519, y=1049..1074
+x=509, y=971..992
+y=785, x=631..634
+x=495, y=1117..1142
+y=1563, x=641..649
+x=540, y=591..603
+x=572, y=838..849
+y=1898, x=508..526
+y=568, x=642..644
+y=1571, x=576..585
+y=1001, x=453..455
+x=448, y=1702..1704
+x=553, y=141..164
+y=559, x=647..652
+y=297, x=544..556
+x=451, y=925..936
+x=626, y=1400..1402
+x=467, y=1058..1074
+x=502, y=1230..1233
+y=376, x=454..476
+x=487, y=1354..1365
+x=537, y=1554..1581
+x=495, y=1269..1287
+y=1212, x=656..665
+x=519, y=1082..1106
+x=628, y=728..747
+x=552, y=1652..1662
+x=510, y=98..111
+x=640, y=1730..1732
+y=1035, x=539..558
+x=616, y=1479..1484
+x=472, y=1460..1479
+x=626, y=771..798
+x=520, y=1395..1401
+y=163, x=533..540
+y=931, x=574..578
+y=1455, x=430..433
+x=552, y=674..689
+x=579, y=1832..1837
+x=467, y=208..230
+x=650, y=1587..1603
+x=464, y=969..973
+x=565, y=1129..1142
+x=660, y=294..299
+y=180, x=496..513
+x=622, y=1566..1572
+y=1556, x=491..503
+y=516, x=612..615
+y=1006, x=445..461
+x=574, y=404..411
+x=485, y=787..789
+x=548, y=1086..1097
+x=538, y=7..25
+x=504, y=971..992
+x=517, y=9..17
+x=615, y=803..805
+x=570, y=998..1012
+x=519, y=767..776
+x=571, y=708..712
+y=1295, x=637..655
+y=215, x=597..622
+x=569, y=737..760
+y=1779, x=626..642
+x=549, y=81..87
+y=135, x=496..514
+x=644, y=848..865
+x=543, y=417..419
+x=551, y=591..603
+y=939, x=585..591
+x=498, y=947..963
+x=568, y=1214..1228
+x=588, y=1477..1489
+x=586, y=1196..1207
+x=514, y=749..761
+x=455, y=548..557
+y=1162, x=576..578
+x=481, y=1326..1345
+y=1069, x=575..577
+x=573, y=1777..1803
+x=483, y=1490..1502
+x=595, y=410..413
+x=636, y=1463..1485
+y=1001, x=641..655
+x=486, y=1189..1206
+x=488, y=190..203
+x=493, y=1883..1887
+x=560, y=1539..1552
+x=455, y=992..1001
+x=564, y=482..487
+y=1292, x=593..612
+y=587, x=559..574
+x=436, y=37..59
+x=549, y=872..885
+x=456, y=177..182
+y=991, x=552..572
+y=812, x=513..519
+x=469, y=1338..1346
+x=500, y=1570..1571
+x=518, y=721..745
+y=1821, x=491..493
+x=429, y=1239..1267
+x=430, y=749..766
+x=470, y=471..481
+x=532, y=491..500
+x=612, y=1796..1805
+x=478, y=1103..1130
+x=478, y=471..481
+x=647, y=931..939
+y=983, x=601..622
+x=628, y=1565..1572
+x=631, y=1197..1223
+y=1489, x=570..588
+x=460, y=926..934
+x=542, y=112..113
+x=444, y=482..503
+x=557, y=789..806
+x=446, y=12..30
+x=635, y=1557..1567
+x=660, y=1197..1200
+x=565, y=977..987
+y=549, x=627..637
+x=654, y=213..238
+y=504, x=579..598
+x=565, y=1627..1640
+y=885, x=531..549
+x=474, y=683..695
+x=531, y=380..398
+x=445, y=1175..1177
+y=1455, x=548..550
+y=1235, x=536..556
+x=627, y=1249..1254
+x=595, y=1358..1370
+x=459, y=598..600
+x=496, y=910..937
+x=580, y=1108..1120
+y=1840, x=509..515
+x=499, y=324..337
+x=575, y=1893..1914
+x=593, y=1892..1914
+x=599, y=1239..1249
+x=520, y=1137..1145
+y=343, x=598..617
+x=575, y=1238..1249
+y=947, x=553..555
+x=568, y=482..487
+x=556, y=1224..1235
+y=241, x=495..497
+x=454, y=124..138
+x=550, y=1438..1455
+x=645, y=1004..1013
+y=1722, x=514..516
+x=486, y=915..928
+y=768, x=547..561
+x=499, y=1789..1792
+x=531, y=871..885
+y=1805, x=606..612
+x=437, y=1757..1760
+y=1158, x=599..608
+x=480, y=713..715
+x=541, y=1396..1401
+x=441, y=89..104
+y=493, x=456..461
+x=648, y=359..381
+x=552, y=1043..1053
+x=634, y=1318..1335
+y=1345, x=476..481
+x=620, y=1895..1897
+y=223, x=437..442
+x=432, y=271..274
+x=429, y=1463..1486
+x=579, y=884..897
+x=577, y=1585..1599
+y=141, x=610..633
+y=1075, x=567..583
+y=1270, x=518..528
+x=572, y=980..991
+y=35, x=551..572
+x=656, y=1205..1212
+y=1914, x=575..593
+x=441, y=1516..1531
+y=1801, x=524..550
+x=439, y=614..616
+y=604, x=566..572
+y=222, x=563..566
+x=531, y=674..689
+y=1281, x=559..584
+x=590, y=1222..1224
+x=633, y=120..141
+x=451, y=1365..1377
+x=595, y=534..537
+y=219, x=625..635
+y=1413, x=588..608
+x=470, y=445..459
+y=615, x=462..486
+y=1659, x=610..632
+x=585, y=950..974
+x=603, y=1583..1596
+y=747, x=628..655
+y=1519, x=472..490
+x=643, y=771..798
+x=578, y=914..931
+y=1678, x=461..477
+x=498, y=1531..1542
+y=101, x=627..641
+x=667, y=1918..1931
+x=455, y=587..592
+x=632, y=979..996
+y=1331, x=603..625
+x=519, y=792..794
+y=1223, x=631..637
+x=560, y=1458..1470
+y=1511, x=556..580
+x=610, y=998..1020
+x=441, y=532..537
+y=608, x=628..638
+y=158, x=650..653
+x=568, y=253..263
+y=608, x=554..578
+x=488, y=552..564
+y=1778, x=520..536
+x=430, y=610..620
+x=493, y=1532..1542
+x=497, y=1743..1749
+y=223, x=576..593
+x=500, y=878..881
+x=512, y=427..440
+y=822, x=549..557
+x=551, y=181..188
+y=1640, x=565..618
+x=432, y=1788..1792
+y=437, x=623..626
+x=608, y=1403..1413
+y=1786, x=593..598
+y=1289, x=600..602
+x=477, y=1590..1599
+x=467, y=628..637
+x=513, y=627..628
+y=164, x=553..565
+x=658, y=1400..1420
+x=438, y=645..650
+x=554, y=1422..1437
+x=514, y=1696..1722
+x=492, y=553..564
+x=632, y=1136..1146
+x=648, y=1679..1691
+x=472, y=1412..1418
+y=421, x=479..496
+x=444, y=1745..1773
+x=454, y=645..657
+x=479, y=1000..1015
+x=493, y=1819..1821
+x=490, y=382..395
+x=472, y=683..695
+x=543, y=1609..1622
+x=616, y=1895..1897
+y=881, x=500..515
+y=557, x=455..459
+x=657, y=1656..1671
+y=356, x=468..490
+x=584, y=1028..1043
+y=537, x=589..595
+x=580, y=702..715
+y=657, x=454..480
+x=642, y=810..821
+x=572, y=602..604
+x=474, y=1038..1041
+x=655, y=985..1001
+x=563, y=890..902
+y=107, x=604..614
+x=571, y=1654..1659
+x=609, y=947..963
+x=526, y=488..495
+x=612, y=511..516
+x=466, y=925..934
+x=575, y=542..563
+x=456, y=1224..1236
+y=1927, x=559..610
+y=1124, x=428..447
+x=641, y=899..902
+x=490, y=824..831
+x=600, y=1302..1315
+x=616, y=172..182
+y=527, x=565..567
+y=1596, x=581..603
+y=21, x=491..493
+x=566, y=443..462
+y=1792, x=493..499
+x=607, y=493..521
+y=381, x=648..660
+x=545, y=1519..1530
+y=67, x=535..543
+x=506, y=37..40
+x=529, y=626..628
+y=1043, x=580..584
+x=464, y=784..794
+x=500, y=54..68
+y=934, x=460..466
+y=477, x=458..464
+x=550, y=1789..1801
+x=460, y=245..254
+y=274, x=432..445
+y=204, x=604..616
+x=591, y=919..939
+x=438, y=1915..1922
+x=592, y=1563..1574
+y=1623, x=592..602
+x=445, y=989..1006
+y=1150, x=446..462
+x=567, y=501..527
+x=474, y=125..138
+x=501, y=11..25
+y=1396, x=590..612
+x=652, y=1463..1485
+x=478, y=102..113
+x=479, y=408..421
+x=578, y=1151..1162
+x=461, y=122..135
+x=640, y=111..114
+x=461, y=1671..1678
+x=489, y=1654..1677
+y=135, x=461..466
+x=536, y=1225..1235
+x=579, y=843..845
+y=170, x=583..598
+x=524, y=1832..1845
+x=501, y=165..176
+x=457, y=1059..1077
+x=466, y=122..135
+x=652, y=1442..1456
+x=565, y=500..527
+y=1792, x=530..535
+y=1295, x=659..664
+x=427, y=386..410
+y=31, x=648..651
+x=509, y=597..601
+x=585, y=1324..1349
+x=623, y=1668..1679
+x=435, y=1849..1872
+x=445, y=147..158
+y=1544, x=520..533
+x=592, y=1243..1246
+x=556, y=1585..1599
+x=624, y=947..963
+y=781, x=631..634
+x=626, y=1654..1656
+x=527, y=973..996
+x=442, y=1340..1350
+y=1662, x=520..530
+x=602, y=1260..1263
+x=606, y=1796..1805
+x=633, y=890..905
+x=494, y=35..44
+x=456, y=1788..1792
+x=498, y=255..268
+y=1656, x=624..626
+y=1162, x=593..618
+x=510, y=1154..1156
+x=633, y=1258..1268
+x=547, y=765..768
+y=217, x=522..547
+x=444, y=926..936
+x=581, y=1582..1596
+x=593, y=1193..1204
+x=471, y=1799..1801
+x=483, y=1589..1599
+y=849, x=572..590
+y=1837, x=456..462
+x=496, y=666..677
+x=458, y=753..755
+x=468, y=345..356
+x=511, y=214..224
+x=444, y=853..867
+y=1469, x=512..539
+x=523, y=589..610
+y=761, x=475..514
+x=439, y=326..335
+x=597, y=255..257
+x=579, y=1212..1222
+x=426, y=954..975
+x=489, y=1293..1303
+x=615, y=1551..1553
+x=582, y=1541..1543
+x=650, y=1656..1671
+x=575, y=1324..1336
+x=568, y=1519..1530
+y=147, x=436..440
+x=638, y=189..191
+x=627, y=77..101
+x=518, y=512..515
+x=515, y=1400..1416
+y=684, x=657..661
+y=1654, x=567..571
+y=1856, x=471..473
+y=1875, x=631..644
+x=494, y=382..395
+x=524, y=853..857
+x=645, y=1478..1480
+x=552, y=447..457
+y=612, x=622..649
+x=645, y=169..193
+x=462, y=1354..1365
+y=1555, x=589..606
+x=428, y=1746..1773
+x=590, y=1383..1396
+x=647, y=552..559
+y=503, x=444..446
+y=25, x=523..538
+y=1672, x=495..498
+y=794, x=511..519
+x=663, y=1557..1567
+y=1012, x=425..434
+x=495, y=232..241
+x=478, y=713..715
+x=484, y=861..887
+y=1464, x=568..571
+x=655, y=1319..1335
+y=1373, x=584..601
+y=576, x=493..532
+x=574, y=1127..1139
+y=1456, x=652..665
+x=455, y=888..914
+y=1859, x=471..473
+x=649, y=461..466
+x=579, y=1174..1181
+y=1425, x=445..452
+y=1194, x=437..452
+x=556, y=124..131
+y=496, x=472..476
+y=718, x=467..489
+x=652, y=1363..1375
+x=627, y=1884..1910
+y=794, x=464..491
+y=1437, x=554..561
+x=550, y=999..1012
+x=578, y=598..608
+x=446, y=481..503
+x=581, y=558..563
+x=481, y=384..398
+x=559, y=1256..1281
+y=937, x=473..496
+x=585, y=1568..1571
+x=465, y=758..770
+y=867, x=594..610
+y=805, x=599..615
+y=1395, x=547..575
+x=511, y=792..794
+y=675, x=568..587
+y=1207, x=512..536
+y=845, x=577..579
+x=470, y=860..887
+x=481, y=1675..1680
+x=642, y=553..568
+y=974, x=585..599
+x=479, y=55..68
+x=583, y=768..770
+x=518, y=387..415
+x=443, y=1020..1047
+x=480, y=686..698
+x=616, y=620..638
+x=592, y=1602..1623
+x=612, y=1300..1312
+x=550, y=1273..1295
+y=461, x=506..525
+y=316, x=447..475
+x=638, y=1730..1732
+x=634, y=781..785
+x=521, y=1496..1518
+x=563, y=977..987
+y=1496, x=440..465
+x=510, y=266..290
+x=519, y=812..814
+x=497, y=1595..1618
+x=438, y=387..410
+x=448, y=436..446
+x=658, y=224..247
+x=455, y=1021..1047
+y=459, x=470..487
+x=479, y=453..456
+x=443, y=833..840
+x=528, y=1614..1619
+x=448, y=1240..1267
+x=542, y=1230..1232
+x=632, y=354..377
+x=511, y=1743..1749
+y=1027, x=513..527
+y=963, x=471..498
+x=464, y=468..477
+y=939, x=647..664
+x=433, y=1510..1535
+x=511, y=1346..1364
+x=553, y=1886..1912
+x=602, y=441..443
+x=551, y=26..35
+y=376, x=483..501
+y=1698, x=588..602
+x=640, y=1400..1402
+x=536, y=414..424
+x=506, y=722..745
+x=502, y=1809..1825
+y=1691, x=648..654
+x=449, y=395..409
+x=643, y=1478..1480
+x=600, y=1418..1429
+x=502, y=37..40
+y=908, x=517..538
+y=1074, x=467..474
+y=1662, x=552..578
+x=514, y=1596..1617
+y=441, x=651..663
+x=445, y=1411..1425
+y=894, x=552..556
+y=1058, x=613..628
+x=645, y=1325..1330
+y=1568, x=576..585
+y=370, x=587..613
+x=515, y=878..881
+x=442, y=203..223
+x=435, y=1914..1922
+y=1420, x=658..664
+x=530, y=1792..1795
+y=443, x=602..610
+x=598, y=1784..1786
+x=607, y=625..633
+x=537, y=1653..1665
+x=524, y=900..902
+x=561, y=1084..1093
+x=468, y=1175..1183
+y=766, x=430..436
+x=645, y=1891..1908
+x=663, y=416..441
+x=425, y=992..1012
+x=457, y=1608..1615
+y=1349, x=585..597
+y=1760, x=434..437
+y=1200, x=656..660
+x=513, y=1013..1027
+y=688, x=610..614
+x=523, y=828..840
+y=59, x=436..459
+y=715, x=561..580
+x=570, y=1127..1139
+x=585, y=998..1020
+x=501, y=385..398
+x=590, y=1243..1246
+x=536, y=1747..1758
+y=835, x=607..626
+y=424, x=536..552
+x=622, y=980..983
+x=604, y=1260..1263
+x=648, y=343..352
+x=645, y=435..442
+x=536, y=1640..1648
+y=770, x=453..465
+x=552, y=894..898
+x=606, y=839..851
+y=1736, x=631..651
+x=564, y=29..31
+y=1434, x=469..490
+x=521, y=242..259
+y=114, x=638..640
+y=765, x=588..596
+x=577, y=647..660
+x=606, y=1552..1555
+x=653, y=1505..1509
+y=1617, x=510..514
+y=499, x=467..487
+y=915, x=607..620
+y=1908, x=637..645
+x=463, y=1646..1649
+x=483, y=1674..1680
+y=1677, x=489..504
+y=373, x=570..572
+x=624, y=1654..1656
+x=453, y=1897..1912
+x=585, y=919..939
+x=626, y=1177..1205
+x=529, y=61..73
+x=531, y=1125..1142
+x=450, y=550..560
+y=1012, x=550..570
+x=583, y=906..910
+x=592, y=1869..1875
+y=865, x=630..644
+x=490, y=1428..1434
+x=582, y=1773..1789
+x=655, y=1258..1268
+x=608, y=1223..1224
+x=558, y=1023..1035
+x=486, y=601..615
+x=635, y=201..219
+x=659, y=1267..1295
+x=576, y=1568..1571
+y=1704, x=448..453
+x=503, y=434..436
+y=72, x=572..581
+x=657, y=663..684
+x=665, y=1443..1456
+x=453, y=1702..1704
+x=580, y=1459..1470
+x=588, y=1404..1413
+x=524, y=1854..1867
+y=905, x=633..651
+x=567, y=1044..1053
+x=499, y=701..713
+y=601, x=425..442
+y=1883, x=493..496
+x=492, y=276..289
+y=193, x=645..664
+y=442, x=634..645
+x=610, y=121..141
+x=570, y=1478..1489
+x=427, y=1133..1146
+x=652, y=257..270
+y=1126, x=612..634
+x=568, y=667..675
+x=559, y=403..411
+y=224, x=490..511
+y=537, x=441..448
+x=642, y=343..352
+y=518, x=507..529
+x=561, y=765..768
+x=586, y=862..887
+x=614, y=102..107
+x=451, y=1083..1096
+x=533, y=144..163
+x=522, y=488..495
+x=557, y=322..345
+y=1775, x=525..529
+x=585, y=906..910
+x=644, y=899..902
+y=610, x=523..525
+x=476, y=606..608
+y=1041, x=470..474
+y=603, x=540..551
+y=1574, x=569..592
+x=594, y=476..490
+y=1254, x=627..630
+x=610, y=1340..1349
+x=510, y=301..315
+x=535, y=40..67
+x=485, y=1023..1045
+x=644, y=948..970
+x=459, y=548..557
+y=1409, x=595..599
+y=1665, x=515..537
+x=653, y=156..158
+y=247, x=658..662
+x=483, y=728..739
+y=861, x=514..531
+y=1801, x=469..471
+y=17, x=509..517
+y=818, x=494..534
+x=610, y=1257..1268
+y=1489, x=608..624
+x=649, y=1560..1563
+y=950, x=535..561
+y=713, x=499..511
+y=301, x=570..583
+x=463, y=816..842
+x=573, y=961..972
+y=335, x=439..453
+x=496, y=1883..1887
+x=556, y=1523..1525
+x=515, y=1904..1926
+x=656, y=1197..1200
+x=456, y=103..113
+x=617, y=1583..1590
+y=1543, x=582..603
+x=570, y=274..301
+x=460, y=1696..1711
+y=1758, x=536..640
+x=437, y=435..446
+x=465, y=1479..1496
+y=1020, x=585..610
+x=641, y=77..101
+y=929, x=527..547
+x=618, y=1627..1640
+y=601, x=496..509
+x=651, y=1217..1243
+x=494, y=276..289
+x=656, y=1021..1029
+x=616, y=266..282
+x=619, y=1324..1326
+y=616, x=439..446
+x=514, y=770..779
+x=616, y=1324..1326
+y=899, x=641..644
+y=1103, x=591..601
+y=1710, x=659..663
+x=542, y=1853..1867
+x=488, y=234..246
+y=1352, x=601..617
+x=523, y=6..25
+x=630, y=1231..1233
+x=444, y=1339..1350
+y=975, x=426..434
+x=438, y=1412..1430
+x=546, y=1272..1295
+y=1530, x=545..568
+x=590, y=266..282
+y=868, x=656..662
+x=603, y=1320..1331
+x=457, y=1241..1254
+x=498, y=1662..1672
+x=573, y=856..868
+x=634, y=494..521
+x=552, y=979..991
+x=532, y=573..576
+x=428, y=1412..1430
+y=158, x=445..496
+x=644, y=1347..1375
+y=182, x=616..639
+x=491, y=9..21
+x=532, y=1309..1318
+x=442, y=1896..1912
+x=520, y=1765..1778
+x=497, y=1296..1298
+y=1233, x=620..630
+y=1296, x=494..497
+y=1447, x=580..641
+x=659, y=1709..1710
+x=615, y=1507..1533
+x=564, y=726..730
+x=462, y=685..698
+x=640, y=1075..1093
+x=632, y=1647..1659
+x=576, y=476..490
+x=482, y=327..334
+x=559, y=569..587
+y=345, x=557..580
+x=656, y=851..868
+x=456, y=1830..1837
+x=607, y=1773..1789
+y=755, x=442..458
+y=101, x=530..550
+x=561, y=939..950
+y=1744, x=554..575
+y=1567, x=635..663
+x=556, y=894..898
+y=1525, x=554..556
+x=655, y=1076..1093
+y=1618, x=490..497
+x=442, y=571..582
+x=649, y=1694..1703
+y=1453, x=441..449
+y=1575, x=527..530
+y=1843, x=445..471
+x=512, y=1811..1823
+y=650, x=438..450
+x=434, y=954..975
+x=662, y=223..247
+x=472, y=1511..1519
+x=568, y=556..559
+x=453, y=992..1001
+y=398, x=531..542
+x=619, y=1550..1552
+x=561, y=1421..1437
+y=337, x=477..499
+y=44, x=494..514
+x=457, y=208..230
+x=511, y=701..713
+x=620, y=1232..1233
+y=1146, x=632..646
+y=1872, x=435..454
+x=451, y=834..840
+x=565, y=142..164
+y=419, x=543..545
+y=1875, x=569..592
+y=1552, x=619..631
+x=490, y=1595..1618
+x=578, y=1777..1803
+x=543, y=434..462
+y=113, x=515..542
+y=1350, x=442..444
+y=963, x=609..624
+x=587, y=398..419
+y=1572, x=527..530
+x=501, y=966..983
+x=563, y=220..222
+x=566, y=1177..1187
+x=429, y=289..294
+y=972, x=554..573
+x=554, y=1323..1336
+x=584, y=1360..1373
+y=419, x=587..605
+x=565, y=1610..1622
+x=486, y=1810..1825
+y=1571, x=483..500
+y=30, x=446..463
+x=512, y=656..666
+y=1599, x=477..483
+x=530, y=1657..1662
+y=138, x=454..474
+y=1773, x=428..444
+y=1619, x=528..536
+x=486, y=1154..1156
+x=550, y=92..101
+y=1581, x=514..537
+y=440, x=488..512
+x=634, y=809..821
+x=599, y=1401..1409
+y=1222, x=576..579
+x=552, y=413..424
+y=265, x=619..640
+x=599, y=951..974
+x=504, y=496..521
+x=532, y=985..1012
+x=508, y=1189..1200
+y=188, x=525..551
+y=727, x=542..552
+x=631, y=1873..1875
+y=638, x=599..616
+x=556, y=1498..1511
+y=1292, x=620..625
+x=513, y=167..180
+y=1912, x=442..453
+x=531, y=82..87
+x=589, y=651..652
+x=637, y=1892..1908
+x=560, y=435..462
+y=411, x=559..574
+y=416, x=487..490
+y=1542, x=493..498
+x=602, y=1195..1207
+x=573, y=708..712
+x=575, y=1370..1395
+y=1480, x=643..645
+x=489, y=664..673
+x=428, y=1116..1124
+x=651, y=1152..1170
+x=625, y=1319..1331
+y=45, x=657..665
+x=453, y=325..335
+y=760, x=569..583
+x=628, y=1047..1058
+x=530, y=769..779
+y=842, x=455..463
+x=596, y=1669..1679
+x=571, y=1456..1464
+x=448, y=1667..1673
+x=648, y=29..31
+y=868, x=573..581
+y=1207, x=586..602
+y=1758, x=447..475
+x=444, y=1516..1531
+y=1303, x=489..505
+x=567, y=1404..1411
+y=689, x=531..552
+y=182, x=439..456
+x=570, y=861..864
+y=1012, x=532..541
+x=608, y=920..938
+y=563, x=547..575
+x=525, y=450..461
+y=1232, x=542..546
+x=539, y=1023..1035
+x=480, y=1689..1695
+y=191, x=633..638
+x=548, y=1437..1455
+y=1243, x=590..592
+x=431, y=1330..1348
+y=1053, x=552..567
+x=594, y=1693..1695
+x=479, y=787..789
+x=567, y=1654..1659
+y=902, x=524..528
+y=98, x=577..580
+x=554, y=253..263
+x=609, y=1856..1860
+y=203, x=488..503
+x=527, y=918..929
+x=607, y=901..915
+x=511, y=1905..1926
+y=436, x=498..503
+x=446, y=1224..1236
+x=580, y=131..142
+x=663, y=1708..1710
+x=512, y=1138..1145
+x=529, y=508..518
+y=298, x=605..613
+y=1867, x=524..542
diff --git a/2018/inputs/18.txt b/2018/inputs/18.txt
new file mode 100644
index 0000000..9e354bc
--- /dev/null
+++ b/2018/inputs/18.txt
@@ -0,0 +1,50 @@
+#.#.|..#|.||.#...|...#.|.......##|##..#..||.||....
+#.......#.....|##..#|..#.##..##|.|.#..|.#...|....#
+.|..........#.|..|.....|..|#.#...##|#|.|#|##|...#|
+#|....#|##..#|.|||.#.|.#...#.##.......#||..#......
+.#|....|.|..#..||...#||...|......###.#.#...##..#..
+..||#...|.#.|||||.....|.......##...#.#....|..#....
+###|..##...|.#|..|.#|#...|.#.|....||.|...#|.|#...#
+|.#.|#.#.|###.|..#..|....#....#|.#..||.||.....#..#
+.#..|.#..#|##..|.....|.#.|.#.#|.......#..|...#..|.
+...|||##...|..#.#|#|..#.#..#|.|.|#..##........##.#
+|#.#..||....|...|#..|....|#|...#.#.#.##|.|.#......
+|..|...|.|#.........|..#|...|.#.|##....|..|..|#.||
+|....#..||..|...#|......|||||.|#....||....|.#|.#..
+......#||.#.#.||..|.......|....||#||#.|.#.|.##||#|
+.##.#....##.#.|....|...###..#...|.#....|.#...|..##
+.##..#|#.#.##.||..|.#|..|.|.##|....|...#||||.|..#.
+|.|..|#|....|.#.#..||.....|.....##....||....|.||..
+#|.|.##...||...........|..#.||.|.#..##..|#||......
+||..||.||..#.##.#...|.#|.....|###....#.....#...|..
+|.#.##|.|...||#.#...||....|.|#..|.#....##........#
+..|....|.#.##|....|||#....#.|.|.##....|##|.|#.....
+.|.....#|.#....|###|..#|||........||#.#..||..|..#.
+#..#...|#|.#...|.||##..#.|..|.|.#.|..#.#.|.....#.#
+|#||.##..#..|||.......#|..#...#..##....#||.#|.....
+.|.#.....|..#...#...##...|.#...|.#|.......|..#...|
+.||.......|..##..##.#|.|..|...#.|.#..#.|....#.|#.|
+....#..#|##|....#..|.#..|||..#....#.#|...||.#..|..
+#......#|.##..|..|....|.##.#|...#..#.|..|..|..|##.
+...|||.#|#.#.|..|||.#.#.#...||...||..##..#.....|..
+..#..|.|#.#..|..##|..#....#.|..|.......|||#.|.|.|#
+.##|..#...#..||..|.........|#.|#.....|...##.|..||#
+#.....||....#.....|#.||......|.#|.#|....||.||.#.#.
+#..|#..|......|.#.#.#.##..||.|.#.|......#|#||#.|.#
+..||..||.....|.#..###.#.|#..|.......|....#||.|..#.
+.#...###|#|#|||...|...#.#|.#|..|...#..#.|#|.#...|.
+...|..#||....##|..#...#....#||#.......|....#.|###.
+..#....|#..#|.....|.#|..#..|#....||......|.|.#.|#.
+..|##....#.|..#..#.|.#..||....#...|.....|..#.....|
+.......#||..#||...|.#.|#...#....|.|.||.#.|...#.##|
+.|.|||.....#............#..#..|..|..#.|.#..|......
+|...|.|####..#.....#..#..|#|#..#..|......|...|.#|#
+|.|...#..#..|....|.....#|#||..#.||..|#|..|||.|.|.|
+..#...|#.......||.#.#.#....#.........##|.|..#.##||
+#|#..|..|#|.##.|.|#......||......|.....#||###.|###
+....#..#.|..|...#|#|..|#..|.#|....||#|.||.|#|.....
+|..#.|..#.|#......#...#|.#|#|.....|#...###....##..
+...##..#..|..#..#.#...|.#..#|...|#.##|.#|..##..#.#
+|.|.|...#.|..##.|.|....|..#..|...|..##|...|..|....
+.#|..|..|..|.|..#...|.||#...#......||.#.#.........
+.#.##..|............|.||.....#||..|##.|..|.....#.|
diff --git a/2018/inputs/19.txt b/2018/inputs/19.txt
new file mode 100644
index 0000000..1207b7b
--- /dev/null
+++ b/2018/inputs/19.txt
@@ -0,0 +1,37 @@
+#ip 4
+addi 4 16 4
+seti 1 7 2
+seti 1 1 5
+mulr 2 5 3
+eqrr 3 1 3
+addr 3 4 4
+addi 4 1 4
+addr 2 0 0
+addi 5 1 5
+gtrr 5 1 3
+addr 4 3 4
+seti 2 7 4
+addi 2 1 2
+gtrr 2 1 3
+addr 3 4 4
+seti 1 3 4
+mulr 4 4 4
+addi 1 2 1
+mulr 1 1 1
+mulr 4 1 1
+muli 1 11 1
+addi 3 3 3
+mulr 3 4 3
+addi 3 9 3
+addr 1 3 1
+addr 4 0 4
+seti 0 1 4
+setr 4 9 3
+mulr 3 4 3
+addr 4 3 3
+mulr 4 3 3
+muli 3 14 3
+mulr 3 4 3
+addr 1 3 1
+seti 0 6 0
+seti 0 7 4
diff --git a/2018/inputs/2.txt b/2018/inputs/2.txt
new file mode 100644
index 0000000..1edb865
--- /dev/null
+++ b/2018/inputs/2.txt
@@ -0,0 +1,250 @@
+krdmtuqjmwfoevnadixyclzspv
+yrdmtuqjiwfoevnabfxyclzsph
+kqjvtuqjgwfoevnabixyclzsph
+krdmtuqjgwjoevnaolxyclzsph
+krdmtnqjgwfoevnabiiyxlzsph
+lrymtuqjgwhoevnabixyclzsph
+krdmguqjgwfoevnabixkclzsah
+krdmtuqjgwfoevnibinyclzdph
+krdmtucjgwfoevnabhxyclzspv
+krdmtuqjgwfoevtabixyulzsuh
+krdmtuqqgwfoevnabixdblzsph
+krdmtuqjawfsevnabiyyclzsph
+krdmtuqjgwfoevnabzxccldsph
+krdmtcqegwfhevnabixyclzsph
+krdmtuqjgwforvnaxixycgzsph
+krdmtuqjgwfoqvnaxixyclzskh
+krdmtutjgwfoevyajixyclzsph
+krdmtuqmgwfoevnabixycxzspc
+krdptuqjgwhoevkabixyclzsph
+krdttuqjhwfoevnabixyclzspa
+krdmtuqjgwfoevnabibyhnzsph
+krdmtuqjywfoevntbidyclzsph
+krdmtojdgwfoevnabixyclzsph
+krdmtuqjgpfuevnauixyclzsph
+krdmtoqjgwfrevjabixyclzsph
+krdmtuqjgwfoyvndbixyclzyph
+krdmtxqjgwfomvnayixyclzsph
+crdmtuqjgwfoevnabixyoxzsph
+krdmtpqjgwfdevnabixycqzsph
+krdmtuqjgwfoevuabfxsclzsph
+krdmtuqjgwfoevnybixycdzskh
+krdmtusjgwfoevnabixxclzdph
+krdmtuqjgwfoevnaboxyglzjph
+zrdmtuqjgrfoevnalixyclzsph
+krdmtuqjclfoevnabixyclzsih
+kqdmtlqjgwfoevnabtxyclzsph
+krdmtuqggwpoevnabixyclzlph
+krdmtuqjgwfobwnrbixyclzsph
+krdmtuqjgwfoevwabkxycnzsph
+kldmtuqjgwfogvyabixyclzsph
+krdmtuqvgwfoevnabixtcrzsph
+krdmtuqjgwroevnabixyrlzspw
+krdmtuqjgjfoevnabixyelzrph
+krdmtuqjgffoevnaaixyclzspa
+krdmtuqjgwfoevxabifywlzsph
+krdmtuqjgwfoevlabixycrzsrh
+krdmtuqjgwfpevnabixocqzsph
+krdmtuqjgwfoevdabixycnhsph
+krdmtmqjgwfoevnajixyclvsph
+krdmtuqjjvfoevnabgxyclzsph
+krzmtuqjgwfoevnabioyckzsph
+kodmtwqjgwfoevnabieyclzsph
+ehdmthqjgwfoevnabixyclzsph
+krdmtuqjxwioevnabixyclbsph
+grdmkutjgwfoevnabixyclzsph
+krdutuqjgwfoebnabixaclzsph
+krdmtuqjgwfoebnabixyclcjph
+krdmteqjgwfoevnlbixycizsph
+krdmtegjgwhoevnabixyclzsph
+krdmtuqjgwfdrvnabixbclzsph
+krdmtuqjgyfoevidbixyclzsph
+krdmtubjawfoevnabixyclzuph
+krdmtuqjgwfoavjabixyclzssh
+krdmtuqjgwfoeonabixyclzsvo
+vrdmtuqjgwffevnabixpclzsph
+krdmtuqonwfoevnabixycfzsph
+krdmtumjgwfpevnubixyclzsph
+krdmtutjgwfoevnaciyyclzsph
+krdrtuqjgwfoevnwbixyglzsph
+krdmtuqjgwfoevbabixyclesdh
+krdmtuqcgwfoevnabixyqdzsph
+krdmtuqjgwfogvnabrxycezsph
+krdmujqkgwfoevnabixyclzsph
+krdmtuqjgtooevnabixyclzzph
+jrdntuqjgwfoevnabixyclrsph
+krdmtuqjgzfoevkebixyclzsph
+krdmtuqjgwfosvnaeixyclztph
+krdmtuqjgwfoevzabixydlzaph
+krdmtuqzgwfoavnabiqyclzsph
+krdmtuqvgwfoevnabixycwzspv
+krdmvuqjgwteevnabixyclzsph
+krdmtujjgwfoevgybixyclzsph
+kydmtuqjgwfoeunacixyclzsph
+krdmtuqjgifoqvnabicyclzsph
+krnltiqjgwfoevnabixyclzsph
+krdmtuqjgwfoevnabhxyclzsgi
+kfdmtuqjnwfowvnabixyclzsph
+kmdmtuljgwfoevnabixycvzsph
+krdmtxqjgwaoevvabixyclzsph
+kramduqjgwfoevnabixyclzwph
+krdutuqjgwfoennabixyclziph
+krdmvuqfgwfoevnacixyclzsph
+krdmtuqogwfoevnabmvyclzsph
+krdmfuqjgwfoyvnabixyclzseh
+krdmtuqjgweoelnabixyclzspd
+krdmtumjgwfoevnabixyclzypo
+krdmtuqjgkfoevhabixyclzsqh
+kjdmtuqjgwfoevgabixyclzsah
+krdmtuqjgwfoevnlbixyclzsbw
+mrdmtxqjgwfoevnabgxyclzsph
+krdmtuqpgwfoevnhbixycltsph
+krdmtuqjgwfmqvnabixyclzslh
+krqmtuqogwfoevnaqixyclzsph
+krdmtusjggfoevnabicyclzsph
+krcmtuljgwfoevlabixyclzsph
+krdmtuojgwfoeknabixyclzsrh
+krdmtuqjtwfoevnabiypclzsph
+krvmtupjgwfoevnabixycldsph
+krdmtuxjgwfoevaabxxyclzsph
+krdmtvqlgwfoehnabixyclzsph
+wrdmtuqjgwfoevnabixyclzdpy
+krdatuqlgwfoevnabixyclzsjh
+krdmtuqjgwfoevpabkxyclzsjh
+krdmtuqjgwqvsvnabixyclzsph
+krdmtwqjgwfoevnobixyclzspm
+krdmtuqjgssoevnabixyclgsph
+krdmtuqjgwfoevnafixyclzbpp
+krdmtuqjowfoevxabiuyclzsph
+krdmtuqrgwfoevntbixyclzspu
+krdmtucjgwfoevnabixcnlzsph
+krddtuojgwfoevnabixyclzzph
+krdmtuqjgwuoevnabiqycldsph
+kpdmpuqjgwfoevnabixyclzslh
+krdmtuqjgwfoewnabixyzxzsph
+krdmtuejswfoevhabixyclzsph
+krdmtuqggwfoevntbikyclzsph
+krdmtuqjgwfoevnabixydlhnph
+krdmtcqjglfoevnaxixyclzsph
+krumyuqjgwfoevnrbixyclzsph
+kgdmmuqjgwooevnabixyclzsph
+krdmteqjgwfqevwabixyclzsph
+krdmfuqjgwfpevnabixyclzspq
+erdmtycjgwfoevnabixyclzsph
+krdmcuqjgwfoevnabixjglzsph
+krdmtuqjgtfoeunabixiclzsph
+krdmtuqjgwfoevmqbixyclzspu
+krlmtuqjvwfoevnabikyclzsph
+krdotuqjgwfoevnagrxyclzsph
+krdmtuqbgwfoefnabixyclasph
+kwdmtuqjgwfosjnabixyclzsph
+kydmtuqjgwfoevcabixycezsph
+crdmtuqjgwloevnabixkclzsph
+krimtuqhgwfoevnbbixyclzsph
+krdmjuqagwfoevnabicyclzsph
+krdmtuqdgzfoevnabixydlzsph
+krdmtuqjgwwoevnaqixyclzspf
+krdmtuqjgwfoevnabdxyzvzsph
+krdmtuqjgwaofvnabixyclzsnh
+krdmturjgwfmevnabixyclzspn
+krdmvuqjgwboevnabixyolzsph
+krdmtuqjgwfomvnabijyclzspx
+bedmtuqjgwfoevnabixyslzsph
+krdmtenjgwfoevnabixyclzsqh
+krdmtuqugwfoevnabixpcdzsph
+krdmtuqjgiloevnabrxyclzsph
+krdmtupjcwfoevnabixyclwsph
+kremtuqjgwfoevnabixyyjzsph
+krdmtuqjgwnoovnabixyclzshh
+qrdmtuqjgwfoevnabixyciasph
+krdituqjgbfoevnagixyclzsph
+krdmnoqjgwfoqvnabixyclzsph
+krdmtuqegwfoevhkbixyclzsph
+krdmkucjgwfoevnabixnclzsph
+krdmtuqbnwpoevnabixyclzsph
+krdmttqjgwfoevnabixyclbspz
+srdmtubjgwfrevnabixyclzsph
+krdmruqjzwfoevnabixyclesph
+ardmtuqfgwwoevnabixyclzsph
+yrumtuqjgwhoevnabixyclzsph
+rrdmtuqjgwfoevnabsxycwzsph
+krpmtuqjgwfoevdabixyclzzph
+krdmuuqjgwfoevnabixyclriph
+krdmtuqjgwfobvnabixyvgzsph
+krdmbuujgwfoevnabixycczsph
+krhmtuwjgwfoeqnabixyclzsph
+krdwtuqjgwfoevnkbixyclzzph
+krdmtuqjgwkoeqnabixyvlzsph
+kadmtuqjgwfoednabcxyclzsph
+krdmtyqqgwfoevnabizyclzsph
+krdmtuqjgnfoevnabiyycmzsph
+krdmtuqjcwfouvnabixyclznph
+krdmtuqjjwfcevnqbixyclzsph
+krdmtuqfgbfoevgabixyclzsph
+kkdmtuqjgwfoevnapixyclzsth
+nrdmtuqjgwtoevnakixyclzsph
+krdmtuqjglfoevlabixdclzsph
+zrdmtuqjgwfoevndbixbclzsph
+krdmeuqjgwfoeenabixyclrsph
+krdmoaqjzwfoevnabixyclzsph
+krsmtuqjgwfoevnwbixyclzsfh
+kadmtuqjgwfoqdnabixyclzsph
+krsmtuqjgofoevnabixkclzsph
+krdmtuqjdwfoevnibixdclzsph
+mrdmtuqjgwfouvnabixyclzfph
+trdmtlqjgwfoevnabixyclzjph
+trdmyuqjgwfozvnabixyclzsph
+krdmtiqjgwroevnabixyclzspk
+erdmtutjgwftevnabixyclzsph
+krdwyuqjgwfoevnaaixyclzsph
+krdmthqbgwfoevnabixyclksph
+krdmttqjgwfoivnabixyclvsph
+krdmtuqjgwfoefnabixyflgsph
+khdmtuqjgwfoevnajixyvlzsph
+krdmtuqvgwfoevnasixyclzspt
+krdmtuqjgkwogvnabixyclzsph
+krdmtuqjgwfoevnaboxpglzjph
+kadmtuqjgwfoxvnabixyclziph
+krdmtuqjfwfoevnabaxycbzsph
+krdjtuqjgwfoevnabiryhlzsph
+krdvtuqjgpfoevnabcxyclzsph
+brdmtuqjgwfoevnafixyqlzsph
+krdmtuqjgwfoevnavixxcllsph
+krdhtuqjkwfoevfabixyclzsph
+krdmtuqjgjfoevnawixyclzsuh
+krddtuqjgwfoeqnabiwyclzsph
+krhmtuqjgwfnevnabinyclzsph
+kedmtuqjgzfmevnabixyclzsph
+qrdmtuqjgwfoevntbixyclzxph
+krdmtuqsgwfoevnabixvclzrph
+scdmtuqjgwfoevnabixtclzsph
+krymtuqjgjfolvnabixyclzsph
+krdmtuqjgwfkevnablxyclzskh
+krymtuqjswfoevnabixyclzvph
+krdmtuqjhwfoevnabixycwzspd
+krdmtuxjgwfoevnabyxyclzzph
+krdmtlqjgwfovvnabilyclzsph
+krdmtuqjgwfoevnaaijcclzsph
+krdatrqjgwfokvnabixyclzsph
+krdmtuqjgwfoevnaxifyclzkph
+krddtuqjgwfoevnabixccozsph
+krdmtuqngwfoevnabiyycxzsph
+krdmtumdgwfoevnqbixyclzsph
+krdmtuqjgwfoevnabixyxlmsch
+krdmtudzgwfoevnabixtclzsph
+krdmtuqjgwfoevnpbixyclhspl
+krdmtqqjgwjoevnabexyclzsph
+kydmtuqzgwfoevnabixyclwsph
+krdmeucjgwqoevnabixyclzsph
+krdmtuqjghfoevjabixyclzspp
+krdmtuqjgjfwevnabixyclzskh
+krdmkuhjgwfoevnabipyclzsph
+krdytuqjgwfoevnabibyclztph
+krdmtuqjgwfpevnabisyzlzsph
+kmdmtgqjgwfsevnabixyclzsph
+krdmtuqjgsfoevnabijyclzszh
+krdmtuqjgwfoevnabivyclzuuh
+krdstuqjgrfoevnabixyclzspu
+jrdmtuqjgwfotvnabixyclzspj
+krdmrumjgwfoevnabixeclzsph
+krpmtusjgwfoevnabioyclzsph
diff --git a/2018/inputs/20.txt b/2018/inputs/20.txt
new file mode 100644
index 0000000..620f018
--- /dev/null
+++ b/2018/inputs/20.txt
@@ -0,0 +1 @@
+^ESEEEESSWNWSWSEESESENENNNW(SSWENN|)NENWWWWWNWNWWS(SWSEESE(SSWSWNWSSSESWWSSSSEEESWWSESSEENN(WSNE|)NENEEEEESSSEENNNNENEEENNWWS(WWNNNENWW(NENNNNNEEENWNNWWWWWWWSWNNNWNNEES(SENNNWNNWNNNWWNWSWNWNNENNEENNNWSWNNNWWNWWWSWWSEEEE(NWES|)SENESSS(EE|WNWSSSSE(NNESNWSS|)SWWNNNNNWN(E|WWWWNNWSWWSWWWWWNNESEENNEEE(SWWSNEEN|)NWWNWNNWWSESWSE(E|S(WWNNNNWNWWNNENNWNWNNNNWSSWWNENWWWNWSSSWSSENESEEEE(NWWWNWNE(WSESEEWWNWNE|)|SSE(SWSWNNNWSSWSSSWNWSWNNWNNN(NWSWWNENWWNWWNWWNNNESSEEES(W|ENNENNESENNWWNNWWNWNNNWWWSEESSWSSENESESE(N|SSWSWNW(S|NWN(EESEWNWW|)WWNNE(NWWNNE(SEEWWN|)NWWSWWWN(WSWSEEEEESSSE(SSSSWSSWNWSSWNWWWNENEE(SWEN|)ENE(S|NN(ESSNNW|)NWSWNWSWWSW(NNNEN(NNN(WSSSNNNE|)E|ES(SWEN|)EEEN(ESNW|)WW)|SE(SWSSSEEESWSSESSSENNNENEN(WWSWENEE|)EEESSWW(NEWS|)WSWSEENESSEEENNNW(SWSEWNEN|)NNE(SESEE(NWNWESES|)SSSWSW(NNNESNWSSS|)WSWSSWWNENWN(EE|WSSSWSWWNWWNWSW(NNNNNESSE(NNNWWNNE(NWES|)S|EEENE(SSSW(S|WN(W(WW|S)|E))|E))|SESWSSSESESEEEESWWWSSWWNENWNW(N|SSSSSSEEENN(WSWNSENE|)EEENWWNEEESSSSSENENNENNNNWWW(SEESSW(N|SS)|NNNWWSS(ENSW|)WNW(NW(S|WNENNESSE(S|NEEENEEEESWSWNWS(WWW|SSSEENN(WSNE|)EEN(W|NEENENEEEEESSWWN(WWSWSEE(SENEESENNENEESSW(N|SEENNNEEEE(SWWSEESWSWSSSSSSESSENNEESESSWSWWWSWNWSWNWSSWNWWWWWSWWNWNWSWWNNE(NWWW(NENNNENEENNNEE(NWWNWSSSSWNW(NEWS|)SS|ESWWSEESSWNWSSESWWNNWSSW(SEESES(W|EENN(NNEESWSSEEN(W|NEENESENENE(NWWWNWSS(EE|WSWNNWNNESE(NN(E(SEEES(ENN(N(E|NN)|WWW)|W)|NN)|WW(WSSSSE|N))|S))|SSWSSEE(NWES|)S(WWWWNWSW(NNEEES|WS(WNWSW(S|W)|EEE))|EEEN(N|E))))|W(S|W)))|N))|SWSESWSWNNWWSWNWWWN(WWSESWSESESSEEEEENESSWSESWSESSENESENNNNWSW(SEWN|)NNENENENN(W(WS(SW(S|NWWN(WSSWWNENWW(SS|N(WSNE|)E)|N))|E)|NNN)|ESEE(NWES|)SSWW(NEWS|)SESSSWNW(N(N(N|W)|E)|SSESSESSSSSWWNENNNWN(WWWWWSWSESWWWNWWWNNW(NEEEEES(WS(WWNE|ES)|ENN(ESNW|)NNWSWS(WNWSWWNNE(S|EENE(S|N(EESWENWW|)WWSWNW(NN(ESNW|)N|S)))|E))|SSSEESE(ESSWNWWW(NEWS|)SSESEESSENESESWWWWWW(SSSSSSSSEESESSEENESEENENENESSWSESSESWSEENESSWSEENEESENNENWNNENEEEEENWWNWNWWNWNNEENNWSWWWSESSSSSE(SWSWSESSWNW(S|NWNENNNE(NWWWW(NEENWNNWNWSSWNNWSSSES(ENENSWSW|)WWWWWNNNENEE(NWN(ENNW(NNNWS(S|WWN(WWNWESEE|)ENNNESES(W|EEEE(NWWWN(W|NESENNE(NWWSWN|S(ENSW|)S))|ESSESENENN(WSWNSENE|)NNNNESENEENWWNNENEEEENEENNNNESSEESSENNNWWNNWN(WWS(E|WSWSWWSWNWSWSW(SSWSESSENNNEN(W|NESENENES(SWEN|)ENNE(N|SS))|NNENEENESENENWN(EESNWW|)WSWWWSE(WNEEENSWWWSE|)))|EN(ESSSENESENEEEEESESENESENEESSENNNESSSESESWWSSENES(ENNNNENENE(NNNNWNN(WWNWWWSESE(SSEE(NNWSNESS|)ESWWWSSW(SE(ENEN(E|W)|S)|NNWWWSWWWWWNWNENNNNWNWW(NEENWWNEEESEESWS(WNSE|)ESSSW(SSES(EENNNW(S(W|S)|NENEE(N(EEE|NNWSWNNEENWN(WSWWNWN(EE(EE|S)|W(NEWS|)SWS(WNWSWNWWSWNW(NE(EEEEEE|N)|SSES(W|ENE(SE(N|S)|N)))|EESEESSS(S|EE)))|E))|SSW(N|SSENE(SENSWN|)N)))|W)|NN)|SESESSWSSWNNN(WSSSWWWN(WS|EENWW)|N|E)))|N)|EES(SSESWENWNN|)W)|SSWSWSEEE(SESEEN(EN(EES(EENWESWW|)S(SSSS|W(N|W))|W)|W)|N(W|N)))|SSWSWWSWSEEEE(N(NESE(E|N)|WW)|SSSWWNENWWSSSWSSESENN(W|NESSSSWWWNWWSESESSESENNWNEEESWSSESWSWWWSESENEENEN(NNWESS|)EEESSEEEENWWNW(S|NNEEEE(NNWWWS(EE|W)|SS(WNW(S|W)|EEN(EEENWNENN(WSNE|)NESENESEENNNEESWSSEEN(W|NEESENENENWNNWWNWNENESEENNENWWWS(ESNW|)WNWNEEENNESSEENWNENNENESSEESEESWSWSWNN(WSW(NN(N|EE)|SSSW(SSW(SS(WNNWWEESSE|)EEENNN(WSSWENNE|)EENESENNN(WSWWSWNN(SSENEEWWSWNN|)|NESSSEENWNENWNWNNNESSENNNWNWSWSSWNNWW(SEWN|)NNNWWNENNWNENESSEENNNW(SS|NNWWNENEEENNEESSW(SESSWSW(SSESSEENNW(S|N(W|NEES(ENENWNENEENWNWSWWW(NNENNWNWNEENNWSWWWSESSS(E(N|E)|WWWWSS(EENWESWW|)WSWSWWNNNWNNENNWSWWNWWWSWSWSWWSESEEN(NESESSENENE(NNWWNWS(SE(S|E)|W)|SSSE(SSWWWSESSSSSSWWWSEESENESSSENNNNESE(NNWNNNE(SSEWNN|)NENWNW(SWS(SSSW(S(S|E)|NNNN)|E)|NEESEESW(ENWWNWESEESW|))|EESWWSW(SSWWWSWS(E|WWSWWSWNNENWNNWNEENE(ESE(N|SE(ENWESW|)SWWS(E|W(S|NN(WSNE|)(N|E))))|NNWNWNEEENWNNENWNWWSWWSEEE(SWWS(EE|SWSESSE(E|SWWWSW(SSEE(N(N|W)|ESWWSESWSSWNNWSW(SSSEN(N|ESEESENENN(WSW(NNENNSSWSS|)W|ESSEE(SSESSENESSWWWNWN(NWSWS(E|WSS(WNNNEN(ENEEWWSW|)WWSWNW(SWS|NEE)|S))|E)|NENWW(NEWS|)S)))|N))|WNWSWNNEEE(EN(ESNW|)WWNNNEE(SWSEWNEN|)N(ESNW|)NWNNNWWWWWNWNNNEENNENWWSSWWSWWSESSWWWS(ESEEEN(NNN|ESSSEEENWWNEEEESSS(W(NN|WWWWSEEESSWWN(E|W(SSSSES(ENNWNEEENNN(SSSWWWEEENNN|)|WWW)|WNNNW(NEWS|)S)))|E)|WW)|W(W|NNEE(E|NNNNNEENESS(WWSEWNEE|)ENNNWWNWWSS(ENSW|)WNW(SSEWNN|)NWNNNEENNESESSS(WW(S|N(EN|WS))|ENNEENNWNWNWS(SESEWNWN|)WNNENNWNNESEENWNEESSESEENWNNNW(SS|WWWNNESEEEEEENNNEENNNNWWWN(EEEESSSSSENNENWNEN(EEESESSWWN(E|W(NEWS|)SSSSSSSENESSWWWWWSEEESESWSESENENWNEN(NEEESENNWWWNW(NWNENWW(NEEESESEEENWNNENESESW(W|SEEEEENNNENESSSSENENNESEESESESSENNNESESWSSWSEEENWNEESENNWWNEENNNESESWSSSESENNWNEESE(SWSESWWWSESWSESSSSWNNNWNNNN(WSSWN(N|WSSEESSSSSWSSEEN(N(NNN|ESENESE(NNWNENNW(NNNESS|S)|SSSSSSSWNNWSSSEESSSSSWNWSWWNENWWSWWNNWWNWNENWNWSSSWSWNNW(NNENNNWS(S|WNNEENENESENENESE(SSESSEEE(ENE(NWW(NEE|SWNWS)|S)|SSSSSES(SENNSSWN|)WWNNNWSSSW(NNNNEENWWWNWWWS(EES(SE(SSWNSENN|)N|W)|WNNN(WSSSSS(W|S)|EEE(NWES|)S(E|WW)))|S))|NNENWWNWNWSWSES(WS(WWWS(E|WWS(EE|WWNENEENNENENE(ENNWSWWSWWNWWWSWWWWWWSEEESWWWWSEEESENENEESS(W(N|WSEESWWWSWWWSESSWS(WWNEN(E|WWWWWSS(ENESE(S|N)|WNNWSSWS(SWWWWNENNNWSWNNWNNNESSEENWNNNNNWWSSWNN(NEENNNN(WWWSSENESSW(ENNWSWENESSW|)|NES(ENNN(WSWNSENE|)ESSSENNNNN(SSSSSWENNNNN|)|SSSSEESWSSESEESSWNW(WNSE|)SSS(WW|SES(WSESWENWNE|)ENNN(WSNE|)EES(EENNNENNWSWSWW(SEESNWWN|)NEN(WWNW(NNNWWEESSS|)(S|W)|ENEEESE(SWSESWWSSENESENNENE(SENE|NWWS)|NNWWWNNNESSEEE(N(ENWNENWNN(ENESENESEESWWSWSW(SSENESENN(W|EEENESENNESENNEE(NWNWNWSWSWS(EENEWSWW|)WW(N(WW|NNN|E)|S(SWWEEN|)EE)|SESWW(N|S(EEESEE(NWES|)S(SESENSWNWN|)WW|SWW(NEWS|)(S|WWWWWS)))))|NN(E|W))|WSWWN(WNSE|)E)|WW)|S)))|W))))|WWSWWS(WNNE(NWWSSNNEES|)E|SEESEN(N(WW|N)|E(EENNSSWW|)SSWWSW(SWSS(WNNSSE|)ESENENN(WSWENE|)E(NWES|)SESWSEE(E|SSSESWSWSWNN(WSSSES(EEESES(WSNE|)ENENEN(WWSWNN(E|W(WS(W|E)|NENNEE))|ESE(NN|EEE(N|S(WWS(WNWWEESE|)SSESW(W|SESWS(E|WW))|E))))|WWNWNE)|NNE(NWW(WW|N)|SS)))|NN))))|E)))|SENENNEN(W|ENESENESEE(NWES|)SWWS(WWN(WSWSESE(N|SS(ENSW|)WNWSWN(NEWS|)WWSS(SE(ENWN|SWS)|W))|E)|E))))|ENEENN(WNWS(SEWN|)WWW|E))|SSSW(N|W))))|E)|E(E|N))))|SSS(SWEN|)EEESESESESENN(WNWN(WNWESE|)E|ESE(N|SWSWSSWSSSWSWWNNE(S|NWNW(NENN(WSNE|)E(ESWSSE(NENSWS|)SS|N)|WSWWSESSSWSW(WWWSWNW(S|NNWNEESE(NN|S(W|ENEE(SW|EN))))|SESSSESWS(W|SSSENEESESESESSWSSESSENNN(W|NENNESESEEESWSWWWN(N|WSSEEESSSWWNENWWSSWWN(E|WNWWNWSSSSSWNWNNE(NNWSWSSWWSEESWSEE(N|SSSWSEESENNESEESENNWNEENENNESENN(WWWSWNWNWW(NEWS|)SSE(N|SE(N|E(E|SWWS(S|WNNWSW(N|S(E|S))))))|EEENWNNEN(W|ESE(NNNW(SWEN|)NNWNENE(SSS|NWWSWSSWNNNENNNENESE(NNWWNNWWSSS(ENNSSW|)SWSWWSWSW(SE(ENEE(S(S|W)|N(ENSW|)W)|SS)|WNNW(S|NEEE(SWSNEN|)NWNWWS(WSSWWNENNENENENEEENENNNEESEESESS(SE(SWEN|)NNNNNNNWNENNWWS(SSWWS(EES(E(S|N)|W)|WNNW(SWS(SSWS(E|SWWN(E|WSWS(WN(NENNW(NENSWS|)S|WSSSENE(WSWNNNSSSENE|))|E)))|E)|NEEE(SWEN|)NNEN(WWSSW|EESW)))|E)|WWWNN(ESEWNW|)W(SSSSSSWNW(SSEWNN|)WNEN(WWSWENEE|)E(S|N)|N))|E)))|SWWSEE))|SSSW(NNWESS|)SESSWWN(E|NWWSESSSSWSWNWNN(ESENNWW(EESSWNSENNWW|)|WSSSESEEESWWSWWWWWNWSSSWNNNWN(ENESEESEN(ESEWNW|)NNN|WSWWWSWNWNWSWSESSEN(N|EEESEEE(SEESENESSSENESESEESESESWSSWWSESESEENE(NNWSW(S|W|NNEENNW(S|NENNNNNWSSWNNWNNN(ESSENE(S|NWNWNN(ENE(NNWSW(S|N)|SS(S|W))|W))|WSWWSSEE(NWES|)SESWW(WN(E|WNW(S|NENWWWSE(WNEEESNWWWSE|)))|SEEEESW(W|S)))))|SSSSSWSSWSESE(SSSWNNWWSESWWWS(WNNNENWNNNESSES(SSWENN|)E(E|NNWNNENWNEN(WWSWSS(ENSW|)WNNNWWSSE(SSWSWWWNENWWWSSWSESEESESENESSS(ENNE(SS|NWNWWN(EEE(N(W|N)|S)|W(WWNNSSEE|)S))|WNWWS(E|WNN(NWSWNWN(WSSWSES(WWWWNEENNENWNNWSWWNNE(NNWWWNENENNNWSWWWNEENNWNENNNNEEESSEEESEENNW(NENNWWS(E|WNWN(EENESEESE(N|EESESSSESWWSEESWWSESSWNWWSESESESS(WWN(WSWNNWWNWNWWSSS(W(NNNNEEENNEN(WWSSWWNENN(WWW(NNESNWSS|)SE(SSWNSENN|)E|E)|ESSWSSEE(S(ESEWNW|)W|N(NNNEE(SWSEWNEN|)NNNN(ESSNNW|)NWWSSE(SSWNSENN|)N|W)))|W)|SSEENWNE(NWNSES|)ESSE(ESWWSW(NWW|SEEN)|NN))|E)|E(S(E|S)|NNN(W|NNESSEENE(NWNW(NNW(SSWENN|)NEESES(S|W|EENWN(E|NW(WNWSWNWNN(SSESENSWNWNN|)|S)))|SS)|ES(WSNE|)E)))))|WWNENWNNWWNNENNNNWNENESSEENEE(SSW(N|WWWSEESWS(EEESEN(EESWENWW|)NN(NNES|WWSE)|SW(W|NN)))|NWWW(S|NEENNENE(NNNWSSWNWSS(SWS(WNWNEENNW(WS(E|WSSWNW(NNE(S|E)|SSESWWNW(NENSWS|)SWWSWSSWSESWSSESSSESSSSESSEENWNNNEESENNN(EESWSSE(SWS(WSSSSWNN(NNN(WNSE|)E|WSSSSWWSESWSWWNWNENNNES(EENWNENWWSWNNWSSWSESSWNWNWWNEENWNNNNESSSE(S|NNEE(NWWNEENWNWWWNEEN(ESNW|)NWSWWWWNEENE(S|EENWNWNNWSWSS(E(E|N)|WNNW(SWSSSSE(NN(EE|N)|SESWWSSWNNWWWNWNN(EEENWN(WSWNSENE|)EE(NWES|)SSSWW(SEEEWWWN|)W|WSWSWWWNWSWSEEEEESSSENNE(NWNSES|)SSSSSWNNWSSWNNWSWWSSSWWWWSESWSESEEEENWWNW(NEESEENWNEESSSEESWSEESESESEENWNEEENNNENE(NWNWSWWSSWWNWSS(EEEE(NNEWSS|)SWWW(W|S)|WNNNWNN(W(WWWNE|SSSE)|ESENENNENN(ESSSWSS(ENE(ENESE(ENWNNWSWW(NNE(EENWN(WSNE|)ENE(NWES|)SES(WSSS|ENE)|S)|S)|S)|S)|WS(ESNW|)W)|NWN(WSSS(ENSW|)SS|E))))|SENESSSEN(ESSWWWNWSW(NNEEWWSS|)SWWSESESWSESENENWNN(NEESS(WNSE|)EESSEEEENWWWNNEN(W(WSWNSENE|)N|ESS(ENEESWSESWSEESWWWWN(E|WSWSWWNEN(E|WW(NNESNWSS|)WSSSSEESENN(WWNNSSEE|)ESSENNNESSENEN(ESESENEE(SSW(N|WSS(EEEN(WW|NEENNWSWN(SENESSNNWSWN|))|WWWWNN(ENESESWW(EENWNWESESWW|)|WSSWNWSWNWSWWWWWWWNENENESS(W|EN(ESENSWNW|)NNNWWWWSWNWSWWNENEENEE(NWWNN(ESENSWNW|)WSSSWWWNNESENNWWNE(NWNWWSWWNWWWWSSWWSWWWNNESENEENWNE(EEEEEE(ENWNSESW|)S|NWNNWWSESWSWWS(EEENSWWW|)WSSWSWSSESWSESESWWWSSWWNWWNNWSSSWWNNNE(SS|NWNENENNWWS(E|WS(E|SWWWWSSSESWSSES(ENN(ENWNENN(WSWNSENE|)ESSSSSEEES(WWWWNSEEEE|)EEEN(WWNEWSEE|)EEEES(EENENNW(SW(S|WN(WSNE|)E)|NEESSSS(W|ENESEEENEENWWNWNNEENWNEENNWNNW(NEESSENESSSW(SSWSEEESSEE(SEEN(W|ESE(EN(ENEEWWSW|)W|SSWNWSWWN(E|WSWNN(E|WW(SS(ENSW|)WW|NN(ESNW|)WW(SEWN|)W)))))|NWNN(E(E|S)|WN(WSNE|)ENNW(NNE(N|S)|S)))|N)|SSS(WSSWSWNWS(WWNENEENWWN(EEE(ENWESW|)SS|WSSWS(WNNN(W|NE(SS|NN))|S))|SEESWWSEESEN(SWNWWNSEESEN|))|E))))|WWW)|W)|WWWNENNNWWSS(ENSW|)WWNNWSSWSES(WWWWNENE(S|NWWSWSSWNWSWNNWSWNWNEENWWWWWSESSS(WNWWW(SEEWWN|)NNNENWNEENNNENNWNNWSW(SSSE(SSWNSENN|)N(E|N)|NNENNW(S|NENESSSSENENENNNWSW(S(S|E)|NWNWNW(NNNEESWSEES(W|ES(EEEEESWWWSESEEN(W|ESSSWWWSWW(SSESSENEENNW(W(SEWN|)W|NEESSSEESSSWSEESENEESWSE(S(S|WWWN(WSSWNNN(WWNWNEE(S|NENWWWS(E|WWSESSWS(EE(N|ESSE(SEWN|)NN)|WWNEN(E|WW(SSWSSS(WNSE|)E|NENE(NWN(E|NN(WSNE|)N)|S))))))|E)|E))|EEE(SS|ENWNENNNEEESWS(EENENWNEENNWWWNWNNNNNNWNENESSESENNWNNENNWWS(WWS(W(NNENN(WSWENE|)EES(WSNE|)ENESEESWSSS(SSSSSSESWWNWW(SESEEEENNESSSSENNNNNNNESENEEENENNNNNWWNWWSESWSSWWNNWSSWNW(SSEEES(WWWSSEE(SWW|NW)|ENEEE(SWWEEN|)ENWN(WS|ENW))|NENNNEESS(WNSE|)E(SS|NNENNEEEESWS(WWNEWSEE|)SEESESSSSW(NNN|SSWSSWWSWSWNW(NEENEE|SSESWSS(SSEESESSE(NNNWNNNW(NEN(NESESE(NNE(EENWNENENNNNNENWWNW(NEENWWW(W(NNNNNEENE(SSWWSSSEENN(WSNE|)ESES(W|SEEEE(SWSEESWWSEE(EENNW(N(EESE(SWEN|)N|W)|S)|SSWWWN(EE|NNNW(SSSSW(SE(SWSEWNEN|)EEEE|N)|N(WSWENE|)E)))|NWNW(SWNSEN|)NEENEE(NWES|)S(WSWENE|)EEE(SWEN|)E))|E(NWNNWNWWWWWWNNNESSENNEEE(SSWWNE|NWNNWSSWNNNENENEENNE(ENNWSWWWNNNWSWWNENEENN(WWNWNWSSES(WS(SWSSSEEEN(WWNSEE|)ESSS(ENESNWSW|)SWSWWNENENWWWWNWSWSWNNENEENNNWNW(NEN(W|EE(SWSES|NW))|SSWWWW(NENWESWS|)WSSWWSESSWWSSWSWNWN(WWSSE(N|ESESWSSSWNNNW(NEWS|)SSW(SESESS(ENNESENNWNEENEENWNEESESESEESENNEEE(SWSSW(WSWSWWSSESSEEESWSEE(NNESENNESSES(ENNWNNNN(EESWSEE(ENWN|SWW)|WSWS(WNN(E|N(WSSSS(WWNW(N(EE(S|N(N|W))|W)|S)|E)|NN))|E))|WWW)|SWWWNNWWNWSS(WWNENWW(NW(SWNWESEN|)NNNNEESSW(SEES(E(NNWNENENWN(EES(S|E)|WN(E|WWSS(WNSE|)E(ESNW|)N|N))|E)|W)|N)|S)|ESWSESEN(NN|EEEE)))|NN)|EENNWSWNWWS(E|WWNNNEEENN(WSWWWSWWWN(NENN(WSNE|)NNESE(SWSS(EN|SW)|EN(EENSWW|)W)|WWSES(WWSWS(SWEN|)E|EEEESS(SE|WNW)))|E(SSS(WWWSNEEE|)EE|E))))|WWN(NWWS(WNWSWWNNE(S|NEN(NNWSWNWSSE(E|S)|ESEESWWW(EEENWWEESWWW|)))|SE(SES(SSENSWNN|)W|N))|E))|N))|NESENNNE(SEWN|)NWW(W|NEEEEN)))|E)|EE)|EESE(NN|EE(E|SWSWWN(E|W(N|SSSENEEE(SSENEWSWNN|)N)))))|SSSWWS(ESWSEE(SWSEWNEN|)NEN(W|N)|W)))|EE))|W)|S)|SSESWSSS(ENNSSW|)W(S(SW(N|S(W(S|W)|E))|E)|N))|S)|SWSW(NN|S))|W)|SW(SEWN|)N)|S(WS(WNNW(SS|WN(NESE|WS))|S)|E))|WWWW(SWSSW|NENW))))))|NEENWWN(SEESWWEENWWN|))|W)|WSE(SSWNWSWNW(N|WSWSEE(N|SSWNWSSSESESSSENNNNWN(EENNN(WSSNNE|)ESESE(NNWESS|)SSWNW(N|SWSSEESES(EN(NWNWWEESES|)E(EE|S)|WWW(NEWS|)SESWS(E|SSWNNNWSWWWNENNW(S|NWNEE(NWWNW(SSS|NNESE(NNWNNE(S|N(WWSS(WNNWWWNEENNWSWWWW(SESENSWNWN|)WNENNWSWWNEN(EEESESWSEENNN(ESES(E(NNWNSESS|)SSES(ENSW|)W|W)|W)|NNWW(NEWS|)SESWSS)|S)|E))|S))|SE(N|SS(EE|S)))))))|W)))|E))|EE)|E)|SW(SESWENWN|)NN))))|NEN(EEE|N)))|W))|SS(S|E)))))|EE(NWNNSSES|)EE))|EEENWW))))))|E)|ES(WW|EE))))))|NWW(W|NNESENN(E|WWWNNNE(EN(E|WWWW(NENNE(E|NN)|W))|SS))))|W)))|W))|W)|N))|S)))|NENN(WSNE|)ES(ENEES(W|ENE(SSWS(WNSE|)S|EN(EE|N)))|S))))|S(ESNW|)W))|SSS))|EEE(NWES|)ESEESWW(EENWWNSEESWW|))|N)|WWS(WNW(NENWNNEEESSS(WNNWESSE|)ENNNNWWNNWNEESE(NN(ENNESE|WWWWSSW(N|SS(EENWESWW|)S(SSS|W)))|S(ESSNNW|)W)|SSS)|E))))|NNNEEEES(WSWNWS|EESS(EEEEE(SEWN|)NWNEN(WN(NW(SSSWW(SEEWWN|)NWN(W(S|W)|EE(NWES|)S)|N)|E)|E)|S)))|E)|E)|S)))))|S)|S)|EN(EESWENWW|)N)|E)|E)))|N)|ESE(SWSSWENNEN|)N))|EEEEE)|NNN))|NNWW(SEWN|)W)))))))))|S))|EE))))))))|W)))|W))|N)|NNNNWNN(ESNW|)WWS(ES(SSENSWNN|)W|WWWSWSW(SEENSWWN|)WNWNWSS(E|WNWNN(E(S|EEEES(ENEEEWWWSW|)(S|W))|WS(WNWW(S(SS|E)|WWWSWWSESSWNW(S|NNW(S|WN(WSWSWSW(SESNWN|)NW(S|NN(ESENEWSWNW|)W)|EEEE))))|S))|S))))|SS)|S)|WW))|W)|WWSWNWSSSWWNNN(ESSNNW|)WWSESSWWN(NNWSWWSEESSSEEEN(WW|ESS(WWWWSSESENN(ESSSWWSWNNWSSWNWWNNENENWNNN(ESE(S(W|SSSWSW)|N)|NWNWWSWNN(EEEE(EE|S)|WWWWSWNWSSWSEEEN(W|ENESE(SWWSSEEN(W|EESSSWWSESWWNWSWSWSESENESEENESSENESEN(NWWNW(NNE(NNE(S|NNNW(N|SS|WW))|S)|WW(WW|S))|EEESE(S(E|WWNWSSESWWSWNNENWWWWWWN(EE|WWSWNNWWSWSWNWNNWNEENNENNEENN(WSWNWNWSSWSWWNWNEE(S|ENNNN(WWSSS(ENNSSW|)WNWNWN(EESNWW|)WSWSEESWWWSWSWNNWSWNW(WWNNESEEEEE(ENN(E|WSWWN(WSWNWWWSS(NNEEESNWWWSS|)|E))|S)|SSEESSENESS(EENENEE(ESESES(ENN(W|E(SS|EN(W|N)))|SSWNW(SSSEEN(ESSSE(N|SENEEE(ESSSWSW(SEESW(W|SEEENNNW(NEENNN(EEEESSSSESWWWWSSSE(EEEEE(SEWN|)NNNNW(N(W|ENEE(SWSE|ENNWS))|SSWS(WWN(WSNE|)E|E))|SWW(N(WWSEWNEE|)NNNNENESENNWWNEE(WWSEESNWWNEE|)|SS))|W(WSSENSWNNE|)N)|SS|W))|WNENN(ESNW|)WSWWWW(S(ESENES|W)|N(NNWESS|)E))|N(W|N)))|W)|N(NWSWW(NENEWSWS|)WW|E)))|NWN(ENSW|)WWS(WS(S|E)|E))|WWSWWSSW(S(ESENNENW(ESWSSWENNENW|)|W)|N)))|EEES(ENSW|)S(WNWSNESE|)S))|EESWSSWWSSE(EN(ENEN(E(EENSWW|)S|W)|W)|SSWW(WSEWNE|)N(N|E)))))|N)))|N))))|W)|EESEENNEE(SWSEWNEN|)NNEE(SWEN|)NWWW(N|WWSES(ENSW|)WWWSEES(NWWNEEWWSEES|))))|E)))))))|S))|N))|N)))|N))|NN))|W))|SE(SWSEWNEN|)E)|W)))|NN(E|NW(W|SS)))|N)))|NN)|NN))|E))|W)))))))|W)))))|S)|WWS(E|SWNWN(WWSESESESSWS(WWNEN(WN(E|N)|E)|ES(W|S(EEN(EE(SWSNEN|)E|W)|S)))|E)))|SSW(WSEEWWNE|)N)|SSEE(NWES|)SWWSES)|SS))|EN(WN|ESE))|NN(EESWENWW|)N)|N))|N)))|EEENWNEESS(NNWWSEWNEESS|)))|S)|NNWNWWSS(E(E|N)|WWWWW(N(EENN(N|ESE(NEN|SW))|WWWNWWNNW(SWSES(EE|WSWW(SEWN|)N(ENW|WS))|NNESE(SSEWNN|)N))|S))))|N)|E)))))|S)))))|NWWNW(SWWEEN|)NENNNE)|EEEN(WW|E))))|N)|EE)|S))))|ESSEE(SWEN|)NN(WS|ES))|E|N))|S))))|W)|SWSESSWNWWSWSWS(WW(S|WWWNEEEENWNNEES(S|W|EN(EE|NWNWSW(W(SSSWWEENNN|)W|N))))|EEEEE(SSS|N(WW(W|N)|E))))|E)|E)|E)$
diff --git a/2018/inputs/21.txt b/2018/inputs/21.txt
new file mode 100644
index 0000000..aaebbac
--- /dev/null
+++ b/2018/inputs/21.txt
@@ -0,0 +1,32 @@
+#ip 2
+seti 123 0 4
+bani 4 456 4
+eqri 4 72 4
+addr 4 2 2
+seti 0 0 2
+seti 0 1 4
+bori 4 65536 1
+seti 16031208 7 4
+bani 1 255 3
+addr 4 3 4
+bani 4 16777215 4
+muli 4 65899 4
+bani 4 16777215 4
+gtir 256 1 3
+addr 3 2 2
+addi 2 1 2
+seti 27 3 2
+seti 0 9 3
+addi 3 1 5
+muli 5 256 5
+gtrr 5 1 5
+addr 5 2 2
+addi 2 1 2
+seti 25 7 2
+addi 3 1 3
+seti 17 4 2
+setr 3 1 1
+seti 7 5 2
+eqrr 4 0 3
+addr 3 2 2
+seti 5 1 2
diff --git a/2018/inputs/22.txt b/2018/inputs/22.txt
new file mode 100644
index 0000000..e2e94a0
--- /dev/null
+++ b/2018/inputs/22.txt
@@ -0,0 +1,2 @@
+depth: 7863
+target: 14,760
diff --git a/2018/inputs/23.txt b/2018/inputs/23.txt
new file mode 100644
index 0000000..306c4ad
--- /dev/null
+++ b/2018/inputs/23.txt
@@ -0,0 +1,1000 @@
+pos=<61981295,70302690,50074583>, r=86817788
+pos=<-39574082,11593440,52034024>, r=86226353
+pos=<-22613800,41560771,22762338>, r=83067593
+pos=<-12414843,51978293,68300191>, r=85018769
+pos=<-12727191,34870716,52975971>, r=52899633
+pos=<-32063168,40924402,49558575>, r=74871596
+pos=<18752046,16372097,-9651854>, r=70068867
+pos=<3474631,29804741,98417262>, r=77072884
+pos=<18354169,57026789,74027645>, r=65025959
+pos=<22104105,74882695,61927007>, r=67031041
+pos=<-42133805,38530007,57591711>, r=90581205
+pos=<-47869746,22599340,42855147>, r=77956291
+pos=<-27020782,-4791281,34203354>, r=93149809
+pos=<-18487970,40655084,49627122>, r=61095611
+pos=<10137288,54171533,97007570>, r=93367254
+pos=<21836035,43430190,47217893>, r=78376026
+pos=<8216569,21003453,101684850>, r=78676489
+pos=<-40466865,34952266,70038151>, r=97782720
+pos=<72670731,-8427298,58419388>, r=97862747
+pos=<-26904810,19437248,39548346>, r=63460381
+pos=<-14862223,38537164,6158587>, r=88895667
+pos=<-4093645,28809183,65079634>, r=50307904
+pos=<-13276886,43613687,45971502>, r=55187766
+pos=<49089034,29003918,14560017>, r=57321614
+pos=<-13807521,-29104885,50131321>, r=99255387
+pos=<48476757,37188242,72540714>, r=62665037
+pos=<7140081,51751715,-8561127>, r=94827577
+pos=<-43249072,32737116,53752441>, r=82064216
+pos=<6641528,98591490,47271959>, r=91547386
+pos=<-23305462,10475650,56073326>, r=75115096
+pos=<6053316,21990329,84119652>, r=62287689
+pos=<7023331,60698763,57949984>, r=63950985
+pos=<-36608889,31399128,35446137>, r=74217136
+pos=<6817093,34966536,98116734>, r=78591704
+pos=<4957605,61740316,52702032>, r=61810336
+pos=<-2269508,-8851147,43341014>, r=63321024
+pos=<12839874,52090204,58609561>, r=50185956
+pos=<-24117273,33915884,49793440>, r=60152075
+pos=<74759590,28034712,42456610>, r=54126256
+pos=<-48197949,37668470,48713802>, r=86905688
+pos=<-465248,41562365,60498029>, r=54851108
+pos=<10694430,32208520,48027772>, r=61692668
+pos=<-8548512,14246214,83247198>, r=83761331
+pos=<43950964,33755026,90173201>, r=72338199
+pos=<-14628694,43441676,58236468>, r=68632319
+pos=<106381567,34503222,46141825>, r=91485627
+pos=<-42403687,53189612,46049581>, r=93968393
+pos=<3940021,35797440,82233626>, r=66416478
+pos=<-12215361,4082478,43661351>, r=60012674
+pos=<19860123,68466722,60165468>, r=61097501
+pos=<70777186,32758921,32118468>, r=65206073
+pos=<-38591125,46522298,54596946>, r=92035892
+pos=<22636563,105345403,45688673>, r=80723037
+pos=<-3951303,29434316,22353040>, r=52688125
+pos=<-176419819,31194464,52039201>, r=76587195
+pos=<-3596358,48726226,78390625>, r=83038642
+pos=<7182613,37282188,20126279>, r=51628082
+pos=<-25240363,51483969,55323702>, r=84373768
+pos=<21428319,64401806,57994375>, r=53293330
+pos=<-5939048,7790261,21935573>, r=71754303
+pos=<-14391272,30291007,70042112>, r=67049881
+pos=<-22323827,29920141,55916312>, r=60485891
+pos=<13475129,52193445,63897921>, r=54942071
+pos=<-3994272,15505795,89454649>, r=84155011
+pos=<475865,1537450,69193888>, r=73392255
+pos=<-10815135,44879964,69035166>, r=77056155
+pos=<11306358,28884419,64442081>, r=91273574
+pos=<14678811,33694651,48185622>, r=71901550
+pos=<3756099,71276526,21743645>, r=87431573
+pos=<40262582,59466852,61256380>, r=65445301
+pos=<11616060,70966185,64722364>, r=76397938
+pos=<3872060,39650278,107716165>, r=95819913
+pos=<9586133,45083261,78735554>, r=66558242
+pos=<77865670,42917012,73695024>, r=98936729
+pos=<-1745961,55327607,42088395>, r=56640112
+pos=<26855240,67981174,26878283>, r=61746856
+pos=<-14224458,28877026,31495228>, r=53261041
+pos=<15850501,66941649,70246547>, r=73663230
+pos=<-22483771,25856673,49504583>, r=52343508
+pos=<9442908,53159770,55875115>, r=51917541
+pos=<1959101,903989,50510107>, r=53859027
+pos=<7569188,-24881655,45995388>, r=69519533
+pos=<1336123,50534199,50773018>, r=52296589
+pos=<-6780305,30188574,97998637>, r=87293233
+pos=<-27347231,32710526,48539527>, r=60922750
+pos=<-54109318,45563567,46755290>, r=98753653
+pos=<-23931716,34591305,51177382>, r=62025865
+pos=<1842700,54313361,57870403>, r=62666497
+pos=<9906862,47176518,46588813>, r=49926624
+pos=<-5650338,36212767,99081721>, r=93270578
+pos=<-9210222,73861103,51071528>, r=86469031
+pos=<-48605170,28058111,39410284>, r=78908074
+pos=<6277738,31698726,83207681>, r=60954109
+pos=<5935953,25376812,52194560>, r=66482724
+pos=<-33349449,32090950,46515684>, r=64281651
+pos=<-1144497,68829923,72349587>, r=94649606
+pos=<68150356,106204720,129297951>, r=83514523
+pos=<8426203,98908672,49758875>, r=92566786
+pos=<16538168,48418035,65737293>, r=49942650
+pos=<19573131,82515397,58801909>, r=74069662
+pos=<98906639,46422007,45986912>, r=95774562
+pos=<12340098,62609442,59505078>, r=62099865
+pos=<-28251146,31055125,25461712>, r=75499853
+pos=<19758085,59632651,60443124>, r=52643379
+pos=<-63046046,25663836,40121278>, r=92801960
+pos=<-37359413,31532323,71313730>, r=92530910
+pos=<53387378,31226416,70902974>, r=59975761
+pos=<-111343725,90010574,65438544>, r=96905196
+pos=<39565178,36023094,48981621>, r=96285986
+pos=<-18425354,35959496,54078093>, r=60788536
+pos=<4117058,66844365,17924670>, r=86457430
+pos=<4823188,-14314294,64385895>, r=80088678
+pos=<20323219,61060408,10757887>, r=71634602
+pos=<89860271,38268711,51332073>, r=83920073
+pos=<6829746,30401653,100430131>, r=76327501
+pos=<-18163621,73955629,42658058>, r=91116552
+pos=<-9868198,28983545,82688052>, r=73865474
+pos=<-3955635,32776886,7789254>, r=70598099
+pos=<22115720,88382733,50485824>, r=69078561
+pos=<-25241164,31938266,56917737>, r=66422608
+pos=<14985873,-15753032,55823238>, r=62802267
+pos=<16643466,61628684,29386869>, r=57253552
+pos=<21580242,42328478,123256438>, r=96330398
+pos=<-25199672,13587085,61865724>, r=79689986
+pos=<25598120,-21677261,57401363>, r=63021973
+pos=<20683805,43416073,80207144>, r=55264851
+pos=<-12206963,28525784,76317729>, r=69375956
+pos=<66517337,40023722,63765750>, r=74765959
+pos=<21046583,32632182,66997632>, r=92540759
+pos=<-13138431,65411819,48286547>, r=79162230
+pos=<-33524737,76477821,155964131>, r=73103463
+pos=<-33331228,9961241,69359006>, r=98940886
+pos=<39564979,28572472,53811503>, r=61407169
+pos=<-48869811,21665479,51245298>, r=84661484
+pos=<-8710194,53780076,47547665>, r=62363657
+pos=<-7314943,55087956,46146524>, r=60875047
+pos=<-61837954,25859003,56641091>, r=98831768
+pos=<-5695240,58983811,70577156>, r=87581649
+pos=<-25981379,35101300,31842886>, r=70894580
+pos=<3669996,59130810,1907555>, r=95208068
+pos=<34776272,-4188188,70499131>, r=67808809
+pos=<-35530241,30475154,50076449>, r=68407314
+pos=<-8155622,43149031,72681791>, r=76311918
+pos=<6666752,64359993,46401448>, r=56420132
+pos=<14935236,11018971,47709423>, r=95072999
+pos=<-31457362,28416643,49636691>, r=61836519
+pos=<-16109927,48371152,51014763>, r=67821289
+pos=<42694611,33011663,86560963>, r=66726260
+pos=<10684191,49511278,21069239>, r=59412987
+pos=<-423180,40569321,15553431>, r=67093941
+pos=<-32350990,31916431,66781337>, r=83374335
+pos=<-40417062,33333028,20729982>, r=94675000
+pos=<-5784232,29640751,62496121>, r=50246685
+pos=<-15428974,17471422,52568175>, r=56737766
+pos=<-2932788,33823267,68046768>, r=57128261
+pos=<63579456,43455645,46047101>, r=57541191
+pos=<15403015,31974701,112979009>, r=81876224
+pos=<-24087841,19769551,56050682>, r=66580826
+pos=<-11649390,82772147,39945831>, r=96130620
+pos=<20266288,41030544,49627298>, r=52471876
+pos=<15271488,104802139,55747920>, r=97604129
+pos=<-17294454,29095937,38121063>, r=49924113
+pos=<-28047432,15028531,34900811>, r=73659132
+pos=<63036558,50019938,71871561>, r=89387198
+pos=<-34801957,36642230,53036734>, r=76806612
+pos=<-38144076,30407351,68440798>, r=89317810
+pos=<3512495,54767308,49076598>, r=52656960
+pos=<14274088,34274498,46377106>, r=89548213
+pos=<39329258,25136254,46456590>, r=73770931
+pos=<-43496380,31317940,30852295>, r=85616814
+pos=<14184631,31298574,54769039>, r=52386260
+pos=<80496193,20583845,74488856>, r=92746549
+pos=<-23389071,63823214,32693625>, r=96173548
+pos=<-25690209,44737890,68493032>, r=91246752
+pos=<-27606431,29594954,78055471>, r=87582356
+pos=<72441600,37663099,5449732>, r=98443349
+pos=<64033149,70075201,56633740>, r=95201164
+pos=<-41252112,41584295,58764742>, r=93926622
+pos=<-12824950,60182885,70449830>, r=95783330
+pos=<63858499,1902299,56897189>, r=77198605
+pos=<-35302433,28371559,42263514>, r=63065421
+pos=<-50193553,13029004,178032706>, r=87155339
+pos=<-10241339,30475433,65035094>, r=58077303
+pos=<27176667,88255399,39199151>, r=70021298
+pos=<3789738,63200642,58556644>, r=70293009
+pos=<-29026962,17065408,63626804>, r=81800634
+pos=<-15528112,28599049,55171449>, r=51624044
+pos=<67553889,-12734884,46684710>, r=85318716
+pos=<-22058789,25579659,47800035>, r=50491043
+pos=<65502868,77153034,48367762>, r=95482653
+pos=<52012555,29111973,69892338>, r=55475892
+pos=<7094796,39275693,83735416>, r=68242166
+pos=<1860284,40455320,92877446>, r=83797940
+pos=<11928924,-2446863,70048662>, r=66778312
+pos=<7667696,94196419,41409153>, r=86774357
+pos=<-47571004,37469854,46817463>, r=84183789
+pos=<-4156736,84010739,52365610>, r=92858630
+pos=<6056924,12888978,84519517>, r=71785287
+pos=<-47345906,30387796,45986301>, r=76045882
+pos=<-14305750,38815805,53464135>, r=58911123
+pos=<-5509681,53176769,46879448>, r=57891332
+pos=<-12499446,35923605,56390435>, r=57139055
+pos=<-52764985,37485922,49356853>, r=91933283
+pos=<-995676,157395073,-3073485>, r=52828911
+pos=<20007537,18034710,53163539>, r=53689323
+pos=<14489164,16396768,90904833>, r=66230860
+pos=<-56656961,29846250,59765242>, r=98593988
+pos=<12580077,72518760,77049199>, r=89313340
+pos=<100504676,32770164,49001641>, r=86735485
+pos=<56363428,40982042,51325603>, r=53130348
+pos=<67579027,45292106,26873551>, r=79786057
+pos=<26991023,51464352,68172728>, r=51087111
+pos=<-2477721,38040811,90549029>, r=83393046
+pos=<39812282,49420172,27946843>, r=55074069
+pos=<-7592987,58715561,48320434>, r=66954427
+pos=<7777052,28459937,51985707>, r=53419415
+pos=<-34825568,30793001,25736210>, r=81537269
+pos=<-24303136,54965408,48394944>, r=79988927
+pos=<-23117889,8738217,68644161>, r=89235517
+pos=<-25024083,8306905,47947646>, r=70876621
+pos=<2007442,56985136,59636415>, r=66939562
+pos=<-13687550,71578246,57121637>, r=94712935
+pos=<-16345760,32983233,89061217>, r=90715694
+pos=<86368374,35824210,61445425>, r=88097056
+pos=<-35743614,53334234,57645839>, r=99049305
+pos=<-15191744,62377081,28606960>, r=90616727
+pos=<15180924,74088799,62177344>, r=73410680
+pos=<87747671,31399471,31905651>, r=81030076
+pos=<490300,35168974,87629502>, r=74633619
+pos=<-7639730,47107985,53037366>, r=60110529
+pos=<-15154000,47565888,46724248>, r=61769578
+pos=<-15930553,8949295,49890450>, r=63083820
+pos=<-2085646,59550216,190147611>, r=69262241
+pos=<7225777,50890764,62861738>, r=58852281
+pos=<90275849,20142660,46920592>, r=75399045
+pos=<-26764544,42182428,46746825>, r=68019674
+pos=<76321467,29233298,55996378>, r=66010239
+pos=<-72399950,54572749,137176788>, r=75623903
+pos=<20511710,69381130,54777605>, r=55972482
+pos=<11171812,-1838585,60251989>, r=57130513
+pos=<-15322219,34977106,95397324>, r=98022178
+pos=<45186029,75515109,54316351>, r=79476635
+pos=<-33243023,32685580,54621141>, r=72875433
+pos=<-61584462,35077699,48778369>, r=97765970
+pos=<-2080973,32701858,77315532>, r=64423903
+pos=<-28378799,39591108,22227847>, r=87396852
+pos=<-8099746,62641467,55946146>, r=79012806
+pos=<-24720179,45274695,48132554>, r=70452861
+pos=<20784250,45013508,95099754>, r=71654519
+pos=<-30064753,33988072,46097252>, r=62475758
+pos=<34563348,30488217,55672227>, r=86287854
+pos=<-16742541,7677207,74209817>, r=89487059
+pos=<48717911,60141573,64839376>, r=78157946
+pos=<11980231,77201897,12503508>, r=94373076
+pos=<-35767666,29757894,59267775>, r=77118779
+pos=<-22126819,32362172,682297>, r=95461509
+pos=<-20183006,18654168,80542091>, r=88282618
+pos=<29158741,90530365,43109268>, r=70368234
+pos=<78589607,47357015,57145573>, r=87551217
+pos=<53822697,51713673,83991488>, r=93986944
+pos=<-37287747,28688663,72807970>, r=91110215
+pos=<13542941,37989744,51992083>, r=61754737
+pos=<14525371,30291586,55624740>, r=74352172
+pos=<65594982,25847880,72811378>, r=70903881
+pos=<85028254,32319009,59775298>, r=81581589
+pos=<-47952231,24568531,49936283>, r=79531659
+pos=<-21321958,21913518,49475661>, r=55095834
+pos=<-48453939,34233126,49830769>, r=84843339
+pos=<99391685,35202974,43142729>, r=85240537
+pos=<22710331,34170304,55092906>, r=91207796
+pos=<-12135705,32243191,63938331>, r=60642766
+pos=<-12338157,43480193,54115729>, r=62259632
+pos=<8622864,24881999,3805702>, r=58230495
+pos=<34000374,4364405,71395390>, r=59376643
+pos=<-19712623,50327429,47038637>, r=69404671
+pos=<-8596487,17062414,87164926>, r=84910663
+pos=<-18913938,45008114,51843283>, r=68090880
+pos=<19472967,181579393,106030809>, r=56142937
+pos=<-17173370,-3226764,55066991>, r=81678816
+pos=<63850431,62835473,23871657>, r=96602589
+pos=<-3798894,30299579,101412001>, r=87836232
+pos=<9068586,62089120,57368844>, r=62714847
+pos=<-22474207,29499886,47923819>, r=52223751
+pos=<-45651602,35036414,46323892>, r=79337438
+pos=<-12419250,32111741,56514558>, r=53370983
+pos=<12664542,52854651,103268523>, r=95784065
+pos=<22357114,12328694,108875611>, r=80401468
+pos=<-6746842,50055566,49180574>, r=58308458
+pos=<-27320265,33686937,48286622>, r=61619350
+pos=<-5359976,29458721,92619986>, r=79764181
+pos=<10052919,30248699,46342959>, r=64500134
+pos=<31603672,24458394,109318746>, r=74809324
+pos=<15363324,39635782,101274262>, r=77872183
+pos=<13846270,53578231,29556061>, r=51830690
+pos=<-15354477,46149883,46658194>, r=60488156
+pos=<-569362,85626876,46006904>, r=84528844
+pos=<10749296,42284246,82711135>, r=66571646
+pos=<-14856420,53289609,77345425>, r=97817094
+pos=<-23825436,15929136,64937891>, r=79045870
+pos=<89568342,30383137,46009564>, r=70420359
+pos=<13145554,32649278,85217834>, r=57047183
+pos=<554467,16643477,85598183>, r=74612189
+pos=<36666635,41828463,88364574>, r=71318747
+pos=<12602990,89529451,67821002>, r=97072935
+pos=<-33112360,18329619,59694200>, r=80688742
+pos=<-15561603,38236853,67667639>, r=73791835
+pos=<3519076,58523179,5256274>, r=91402635
+pos=<37058015,73816180,6497217>, r=98165326
+pos=<-485820,34664283,76480969>, r=63956703
+pos=<8046540,50222182,60417372>, r=54918488
+pos=<6698732,2095928,57478145>, r=54895175
+pos=<-110267625,103715108,49404770>, r=83596582
+pos=<14488717,37517183,47868787>, r=90880734
+pos=<11594929,31481958,92334208>, r=64546675
+pos=<13142664,33433973,51871828>, r=78783673
+pos=<14725843,21079396,84588725>, r=54995145
+pos=<17991922,28746415,53178977>, r=62665596
+pos=<21345476,109893878,54658351>, r=95532225
+pos=<99514509,32213492,45962288>, r=82149323
+pos=<37772543,40405568,108402968>, r=91040181
+pos=<16477866,1889108,-9755558>, r=86930037
+pos=<6066766,45074819,93307079>, r=84640752
+pos=<63259627,39790194,63298460>, r=70807277
+pos=<85870661,25697065,48142683>, r=66661876
+pos=<-20063299,13270466,81943036>, r=94947530
+pos=<9219021,14187810,110350611>, r=93155487
+pos=<11396690,79601451,29059476>, r=80800086
+pos=<-5992626,63895408,63403216>, r=85617223
+pos=<13745746,56178190,15154849>, r=68932414
+pos=<-19200598,41415603,54301128>, r=67242872
+pos=<66801369,67709049,33790327>, r=94508881
+pos=<-58054899,31429373,50412427>, r=92222250
+pos=<17725131,19747008,101361033>, r=70100661
+pos=<16315702,21937157,109577476>, r=77536345
+pos=<-21450279,31429149,47689387>, r=52894343
+pos=<16503867,46780903,71008828>, r=53611297
+pos=<-10617311,71781674,53581209>, r=88305651
+pos=<-18369624,34464166,58808640>, r=63968022
+pos=<-44338154,47516775,49329347>, r=93509756
+pos=<7546939,23561808,74615854>, r=49718921
+pos=<-23553075,43233473,30179868>, r=78262286
+pos=<-33728549,33419608,75400040>, r=94873708
+pos=<4130401,-415851,60422323>, r=62919529
+pos=<12199308,42656684,46658363>, r=62914010
+pos=<-10823045,40017720,87358982>, r=90525236
+pos=<54855928,43498518,54679995>, r=57493498
+pos=<12261573,29515175,45893575>, r=97366173
+pos=<15817533,48376146,72425161>, r=57309456
+pos=<22499943,43484899,49303866>, r=84870164
+pos=<15087449,40820405,15442472>, r=51945357
+pos=<2380830,39189079,87564730>, r=76698440
+pos=<10292232,61644825,58639264>, r=62317309
+pos=<-25063352,29824290,49726684>, r=56939825
+pos=<9247300,60592893,82851862>, r=86522910
+pos=<34974237,51631378,71206261>, r=62271044
+pos=<11115341,39008866,88216499>, r=68435471
+pos=<-47347839,33255463,54507917>, r=87436830
+pos=<-12385471,35476634,66586332>, r=66774052
+pos=<40297014,43609070,76102045>, r=64467152
+pos=<-25028316,48459326,70188306>, r=96001387
+pos=<29716238,95743100,36047260>, r=83200834
+pos=<-2195894,57161709,59974579>, r=71657615
+pos=<-34897564,36092514,37195303>, r=75449626
+pos=<-34350080,30930206,62762967>, r=80368703
+pos=<-13299160,-1305686,52546724>, r=73363335
+pos=<74203994,40071747,39943051>, r=68121068
+pos=<-30255218,53252625,55149209>, r=90982504
+pos=<-23708755,36047177,30518158>, r=70892646
+pos=<-42225041,28551593,47086408>, r=70188476
+pos=<45093813,91953991,40089158>, r=90747011
+pos=<20989497,-9578662,65146013>, r=59947021
+pos=<-9469151,9360043,19787978>, r=75862353
+pos=<-10455182,76182076,47046337>, r=86009032
+pos=<1489674,30920418,49075947>, r=50871653
+pos=<-1805815,40895592,59548754>, r=54575822
+pos=<22434664,50411195,76723826>, r=57025799
+pos=<1351173,-35240030,57415985>, r=97516622
+pos=<-32995557,45695405,31582059>, r=88763841
+pos=<96147879,48598772,48672050>, r=97877850
+pos=<71556712,165083816,80525352>, r=61212474
+pos=<-26738516,51821211,51973287>, r=82858872
+pos=<-45126452,24625563,45768892>, r=72481504
+pos=<-1724534,91435747,47738636>, r=93224354
+pos=<-42642617,17009143,50075464>, r=81920769
+pos=<52222152,55156460,54199932>, r=66037534
+pos=<8639285,85433958,47459393>, r=76579513
+pos=<10141717,61817092,48597374>, r=52598556
+pos=<47916267,47143215,50290112>, r=49808644
+pos=<-1999143,50275699,76700962>, r=81301257
+pos=<-41681257,20679616,56340422>, r=83553725
+pos=<35884408,41646080,79776061>, r=61765620
+pos=<4301038,52856724,21630776>, r=68579717
+pos=<-40960612,30439627,37255922>, r=75799466
+pos=<35444048,43762938,84706440>, r=68372926
+pos=<79975658,29137911,50197120>, r=63769730
+pos=<93007,44307904,61961116>, r=58501565
+pos=<-32671755,39076539,66101849>, r=90175907
+pos=<-19991034,51969552,46041742>, r=70328104
+pos=<-35314188,37602800,46861313>, r=72103772
+pos=<37201145,71666894,82972323>, r=96299533
+pos=<-49234235,28079826,57132180>, r=86771712
+pos=<8312877,40022919,72604965>, r=56640475
+pos=<39181205,52790049,92153926>, r=88584204
+pos=<7068698,47606987,62510305>, r=55374127
+pos=<30603349,56814294,106942634>, r=98819430
+pos=<16115552,28332758,35601360>, r=54887656
+pos=<10074393,95989908,47950308>, r=86191298
+pos=<-5591354,49710053,47446079>, r=55073040
+pos=<-16059874,70092354,52417407>, r=90895487
+pos=<-3286599,20110685,83441267>, r=72828890
+pos=<-6936335,22574502,22140566>, r=57762340
+pos=<32992478,36116750,76761537>, r=50329801
+pos=<-89483882,3641127,125934475>, r=84985845
+pos=<45083402,48971622,84039680>, r=82553733
+pos=<16543763,-12232511,59927146>, r=61828172
+pos=<-128930120,71482570,52773218>, r=59057806
+pos=<-3321066,36249470,10553454>, r=70672189
+pos=<11035114,-4452527,60224262>, r=59853336
+pos=<-26291008,49849603,66835908>, r=95302073
+pos=<7937807,81400916,47819246>, r=73607886
+pos=<16576233,48187487,42040402>, r=56973312
+pos=<4344158,75290424,35788694>, r=76812485
+pos=<32189900,-55403075,49857150>, r=95795351
+pos=<17696418,36185949,87820170>, r=58635317
+pos=<777488,12020182,61326632>, r=54740630
+pos=<33863194,35023084,109647702>, r=82992971
+pos=<27201238,50703815,113905343>, r=96269385
+pos=<13342983,51362786,14113529>, r=65561106
+pos=<-3406344,1514525,71500197>, r=79603699
+pos=<-4003952,88211664,52599168>, r=97140440
+pos=<7364870,66805533,30929588>, r=70166122
+pos=<4337235,69741240,49137686>, r=66867686
+pos=<39289283,41543331,80086140>, r=65377837
+pos=<31061019,37187231,96617615>, r=69325024
+pos=<12227872,90873558,49623164>, r=80594302
+pos=<-29205869,34879980,48574906>, r=64986227
+pos=<-23428908,25034353,70988758>, r=75595080
+pos=<31236415,75651801,72043812>, r=83391270
+pos=<-35663336,33550704,50545521>, r=72085007
+pos=<-25373194,33271630,48939058>, r=59909386
+pos=<81186014,21770112,48774152>, r=66535373
+pos=<-36266473,21205391,64408172>, r=85681063
+pos=<46509791,41930052,-8736829>, r=90965014
+pos=<-22028107,15234691,51487555>, r=64492638
+pos=<-20542339,31539802,48757530>, r=53165383
+pos=<13662571,56928981,15523678>, r=69397563
+pos=<-12746344,18867316,85938166>, r=86028894
+pos=<-301007,47558794,60352290>, r=60537813
+pos=<32207624,60299805,78729522>, r=75695968
+pos=<100081770,31328053,46754080>, r=82623316
+pos=<-48070787,30652729,47098499>, r=78147703
+pos=<3499835,47702960,54008261>, r=50536940
+pos=<-30212070,27990135,63986849>, r=74514607
+pos=<-15832151,28224015,56445561>, r=52827166
+pos=<-67978767,28737500,46365512>, r=95407212
+pos=<-30015019,22627881,66498575>, r=80097431
+pos=<-3376964,87518399,46889764>, r=90110663
+pos=<-12133745,41888151,15297059>, r=80379652
+pos=<-3430750,43859378,-4475364>, r=93420295
+pos=<10612582,58698878,71450281>, r=71862044
+pos=<-16853417,30239412,55512427>, r=54930714
+pos=<9856655,-15034177,76105296>, r=87495006
+pos=<19700487,14896792,94233323>, r=65848189
+pos=<90908533,40366432,47407308>, r=83141710
+pos=<53053613,45815347,47231085>, r=50559042
+pos=<91606120,30241005,62870344>, r=89176478
+pos=<6549177,28253488,45947118>, r=89716871
+pos=<-54966251,31984766,51327953>, r=90604410
+pos=<11739879,47302011,70593259>, r=58480946
+pos=<17782015,-43385757,45900297>, r=77715722
+pos=<-22321136,33175591,26785779>, r=70365922
+pos=<7447288,64317364,46803776>, r=55999602
+pos=<7212096,101522192,49782085>, r=96417911
+pos=<9756698,57513943,50726200>, r=50809212
+pos=<53938302,42703477,85380074>, r=86480889
+pos=<6127018,32634301,81765609>, r=60598446
+pos=<16024259,75089269,42148970>, r=58570841
+pos=<-14467950,30833664,53148474>, r=50775521
+pos=<1055620,-8213227,49647151>, r=63016576
+pos=<20109959,34289334,98011242>, r=64516119
+pos=<-51406886,30261849,39781808>, r=83541835
+pos=<21609187,48166640,103039225>, r=81922186
+pos=<-37318020,42076555,46223326>, r=77943551
+pos=<-9802864,50149053,57309602>, r=69587023
+pos=<8892924,30956296,4508427>, r=59209772
+pos=<17951962,38815438,50096954>, r=68485096
+pos=<12306030,97501425,46533603>, r=84054466
+pos=<-37463875,31083117,49553934>, r=70426366
+pos=<92230728,52683980,47015111>, r=96388808
+pos=<9364608,56647782,54993450>, r=54602057
+pos=<8684942,36838535,105538060>, r=86017275
+pos=<-35827611,42789189,57956518>, r=88898907
+pos=<5807845,31720781,7757680>, r=59810369
+pos=<-25365859,48253374,51239130>, r=77183993
+pos=<-13706311,23188045,2328735>, r=83730603
+pos=<-1053434,40958215,58697392>, r=53034540
+pos=<16686564,43884661,76779893>, r=56303739
+pos=<94046858,44171067,48044994>, r=90722205
+pos=<-59177933,25088148,47504944>, r=87806389
+pos=<-18654288,54793837,56331529>, r=82105172
+pos=<113519092,134203172,41554166>, r=95154840
+pos=<9436438,34715386,46078979>, r=73810378
+pos=<49732913,61362619,75247356>, r=90801939
+pos=<-54495041,22320842,50939618>, r=89325794
+pos=<12427539,17900057,11259909>, r=53954136
+pos=<16888421,45562882,95425764>, r=76425888
+pos=<-13394846,17877372,48322242>, r=50051600
+pos=<-20925432,28703245,52084455>, r=54038872
+pos=<8561924,38380609,101695915>, r=83840427
+pos=<76633366,35686884,48280680>, r=65060182
+pos=<15355031,32838431,53406732>, r=83822095
+pos=<-22241568,21612015,21308708>, r=74861862
+pos=<-45540364,39478825,56854957>, r=94199599
+pos=<-130761639,-7225545,18556230>, r=71625415
+pos=<12371981,60358241,50483820>, r=50795545
+pos=<-52881118,38556375,50525246>, r=94288177
+pos=<-5508845,44982595,39309821>, r=52836406
+pos=<-12223578,42705080,48054452>, r=55308618
+pos=<19782229,-391087,65138940>, r=51959480
+pos=<11688897,65712575,56641017>, r=62990663
+pos=<26728983,4877916,77607591>, r=57803924
+pos=<-66749809,31885857,41453884>, r=98836603
+pos=<12947494,40474371,72186292>, r=52038612
+pos=<22710949,73206326,90156950>, r=92977765
+pos=<21418285,58754538,74497516>, r=64159328
+pos=<-14006029,39388620,45791459>, r=51511854
+pos=<32331392,-9548718,53912995>, r=54138363
+pos=<-11103143,48665873,60597818>, r=72692378
+pos=<8404016,40264319,-15387292>, r=88902405
+pos=<-60697351,19761606,51535474>, r=98682907
+pos=<113332017,31654847,49314512>, r=98760760
+pos=<-17968649,23774520,26514627>, r=63220547
+pos=<-7891448,38548696,51246202>, r=50011819
+pos=<-36243928,28580831,31232834>, r=75246710
+pos=<2236746,78152395,33336820>, r=84233689
+pos=<-42646767,27988371,50996303>, r=73957310
+pos=<-12975938,19343337,62716304>, r=62560618
+pos=<-6698310,59281250,50138827>, r=68443906
+pos=<-29169469,6610144,55165008>, r=83936144
+pos=<-859099,48228088,68790664>, r=70203324
+pos=<-53259426,43091307,49454062>, r=98130240
+pos=<40051035,15273208,52961854>, r=55405641
+pos=<8599969,22173989,57555102>, r=96158345
+pos=<11561358,34996323,107452493>, r=83213190
+pos=<12971841,75769901,53455514>, r=68579059
+pos=<-24609077,31137632,12599716>, r=84801836
+pos=<39964941,58818274,67271078>, r=70513393
+pos=<11590874,44091058,16246818>, r=57908243
+pos=<11534010,42492557,73281128>, r=56565109
+pos=<46029692,44356665,33034407>, r=51140346
+pos=<230818789,28332006,48666836>, r=77009932
+pos=<-49307134,28877489,51162598>, r=81672730
+pos=<-24858611,61344602,49583599>, r=88112245
+pos=<-33971422,31026034,46645662>, r=63968617
+pos=<-14920621,60364341,48024490>, r=75635084
+pos=<-18886432,44383739,46645651>, r=62241356
+pos=<63367787,57050728,56716295>, r=81594314
+pos=<-29235501,30020585,46865414>, r=58446946
+pos=<-1116549,51739608,46803263>, r=51985095
+pos=<-12898335,8922965,49532990>, r=59720175
+pos=<11377440,35121435,54012286>, r=63237886
+pos=<-28362629,38084006,47961632>, r=66733755
+pos=<-32732759,53759806,34185847>, r=93961530
+pos=<-2049132,35100887,26872869>, r=51932182
+pos=<10307391,63192491,78308824>, r=83519668
+pos=<-11173886,50879581,47031969>, r=61411041
+pos=<-6714487,69428860,48945046>, r=77413940
+pos=<-35145310,126288277,94537390>, r=86514887
+pos=<15372059,77344628,57152598>, r=71450857
+pos=<-5534049,28501573,47802916>, r=70800310
+pos=<30282369,-27855631,57777471>, r=74260879
+pos=<27578388,34577846,94631718>, r=61246950
+pos=<5377307,28529784,46392652>, r=82994735
+pos=<-9288964,40034367,85892017>, r=87541479
+pos=<32663376,50111633,96347262>, r=83581281
+pos=<64590061,24883190,74402048>, r=72454312
+pos=<6011059,52895297,-9651139>, r=98190405
+pos=<-40075559,29164760,46796031>, r=68361786
+pos=<-27324257,33280398,58797836>, r=71727947
+pos=<65478625,51242475,73962244>, r=95142344
+pos=<-8161052,44514515,51881665>, r=56882708
+pos=<37117480,70516429,65453164>, r=77546136
+pos=<-66556175,24793456,46807708>, r=94782274
+pos=<6745175,-9697218,46249405>, r=55413236
+pos=<-15842202,54067556,49741202>, r=71976478
+pos=<-26234670,32761687,62384539>, r=73706383
+pos=<27047080,45210798,96262259>, r=72979567
+pos=<-54875381,19475504,41999639>, r=88941400
+pos=<15588049,51830394,45712337>, r=63164637
+pos=<78521098,9084198,53510654>, r=81292772
+pos=<-35117158,30884180,40930824>, r=66725315
+pos=<38517388,31310367,53377273>, r=93263507
+pos=<-34824848,35863485,57039123>, r=80052924
+pos=<87999262,21593229,36952685>, r=77127999
+pos=<-14970039,39281480,31602555>, r=64303877
+pos=<30996868,32710257,-7944148>, r=65439616
+pos=<-46544578,32730823,48455778>, r=80056612
+pos=<-25655223,54235827,24268664>, r=97277174
+pos=<-31661104,34739101,46810221>, r=65535871
+pos=<-15725105,33623089,58648908>, r=60322582
+pos=<30366481,48524611,105759957>, r=89110268
+pos=<7896511,67058144,60224279>, r=71711348
+pos=<8886133,36820409,69879921>, r=50139913
+pos=<-35009499,24967338,48346229>, r=64600051
+pos=<12236743,61232811,36406256>, r=54244674
+pos=<32133015,71147471,65672434>, r=73411928
+pos=<-4312430,48491142,58819757>, r=63948774
+pos=<-11255504,48618070,49019953>, r=61218979
+pos=<-36126448,28661597,45905741>, r=63019487
+pos=<6995492,-14641677,39110487>, r=64076982
+pos=<-494882,62507397,74981307>, r=90309172
+pos=<21658971,20515757,32538766>, r=68078733
+pos=<-42721200,2165630,50987236>, r=97754561
+pos=<-46441522,14810192,60365689>, r=98209160
+pos=<48051150,31166319,50307623>, r=70921992
+pos=<28821739,29694631,-1122960>, r=53427671
+pos=<-54273229,34572094,50463893>, r=91634895
+pos=<14673784,34863932,82993530>, r=55509157
+pos=<-32934723,17649588,51138183>, r=72635067
+pos=<-50994378,41060824,52259311>, r=96639953
+pos=<-13412903,29052830,62027839>, r=56819094
+pos=<16028543,72922360,86313287>, r=95532757
+pos=<-29190239,30088199,43593943>, r=57339282
+pos=<-67676350,28809916,49909454>, r=98721154
+pos=<-43374507,39597274,53913745>, r=89211024
+pos=<-27366900,30364601,50115222>, r=60172177
+pos=<16917628,52399768,64291470>, r=52099066
+pos=<41279617,21014635,54307699>, r=93725431
+pos=<1365818,19740622,70504983>, r=55610202
+pos=<-54647289,29012271,49857475>, r=85842468
+pos=<44221414,66917783,53886884>, r=69485079
+pos=<-9940873,70529264,26788845>, r=95336159
+pos=<-2891536,43027095,81243592>, r=79487809
+pos=<16856578,70770998,65638794>, r=71878974
+pos=<48647431,57474901,3221288>, r=96689472
+pos=<18398962,37387340,106423442>, r=77737407
+pos=<6875506,40281303,93455690>, r=79187050
+pos=<2454291,28249463,81600089>, r=59720809
+pos=<-1468549,29220087,631469>, r=71712205
+pos=<1576323,77863026,52114347>, r=80726896
+pos=<11328724,-1103809,57250256>, r=53237238
+pos=<14166873,32412130,88906135>, r=59476952
+pos=<68172516,66679724,50794113>, r=90105431
+pos=<-4882904,63239852,64521058>, r=84969357
+pos=<-39573626,43281992,58908860>, r=94089955
+pos=<47082853,25450033,45728957>, r=77686997
+pos=<30259034,36081601,79825507>, r=50625134
+pos=<13485963,34007713,111156423>, r=84003646
+pos=<-103414983,93539548,30098680>, r=85922019
+pos=<-6802701,-3790574,59234245>, r=76039201
+pos=<82390172,51540341,50478214>, r=88867872
+pos=<5396715,-12159909,37977747>, r=64326869
+pos=<60082922,38998779,61741375>, r=65282109
+pos=<-16364819,10714145,61687053>, r=73549544
+pos=<-58301485,30719708,55794510>, r=97141432
+pos=<16352057,56953747,89166657>, r=82093799
+pos=<-34630538,59464956,51639108>, r=98060041
+pos=<490228,30703545,109025168>, r=91563918
+pos=<-6013632,8426824,52874814>, r=56673453
+pos=<-36209880,25159205,51113229>, r=68375671
+pos=<17796723,1411910,80111570>, r=67114697
+pos=<-31889116,28510083,45862954>, r=58587653
+pos=<19168448,33254095,39684567>, r=98395168
+pos=<-6095859,46062067,73594989>, r=78078378
+pos=<-304797,59105732,57302395>, r=69038374
+pos=<55099745,36449947,86305322>, r=82314003
+pos=<33473188,6098096,-4438050>, r=79487709
+pos=<-31472777,36089404,51315048>, r=71202749
+pos=<15962314,28423814,-7317040>, r=61433573
+pos=<7998189,2801039,69890583>, r=65303215
+pos=<130870385,104831832,11196492>, r=68126888
+pos=<-5327566,58947831,12940865>, r=92989660
+pos=<3824920,57094208,49926985>, r=55521839
+pos=<-1717656,36673098,102114555>, r=92830763
+pos=<-6542148,37528701,53564176>, r=49960544
+pos=<-14811298,29054822,83783336>, r=79975290
+pos=<-37201984,61523961,41570442>, r=98810391
+pos=<20636169,30198837,103026121>, r=64914223
+pos=<10371395,31519349,55590694>, r=62337567
+pos=<31884149,40789942,72870652>, r=50003827
+pos=<-30398435,29198407,42512686>, r=58738952
+pos=<43939568,28346223,78157090>, r=54901870
+pos=<9128846,67552702,83250788>, r=94000232
+pos=<-2588856,30760371,91977867>, r=77653177
+pos=<15962420,82995471,76760935>, r=96119428
+pos=<-33661280,31365698,48813484>, r=66166075
+pos=<-16115499,43852463,46308402>, r=58601848
+pos=<-6987272,33841983,84781289>, r=77936013
+pos=<-485860,34594456,81980122>, r=69386193
+pos=<-15363694,37898885,53146470>, r=58734501
+pos=<-17124380,71830052,45774058>, r=87053925
+pos=<8219084,70226598,55923252>, r=70256199
+pos=<-3903209,29453615,46544603>, r=75288840
+pos=<-9159457,25097083,71581481>, r=61856037
+pos=<-6436575,16618931,70357346>, r=66386656
+pos=<-8806699,29246129,72352585>, r=62730916
+pos=<68862343,36688765,49225208>, r=59235344
+pos=<-79171684,112113447,67348279>, r=92995215
+pos=<2638935,25190324,85791990>, r=64174419
+pos=<14827988,29466545,48474491>, r=98818958
+pos=<-14381380,32037768,62743833>, r=61488450
+pos=<3154619,88011848,41382872>, r=85129150
+pos=<51747013,31306559,79606148>, r=67118845
+pos=<4782291,34063349,70169217>, r=51776099
+pos=<-39091050,45657329,51675336>, r=88749304
+pos=<-26634338,29826468,49344705>, r=58131168
+pos=<28955639,11886714,83389681>, r=58803847
+pos=<-13895377,39956378,49929456>, r=56106810
+pos=<-20174467,38776446,18529455>, r=82076331
+pos=<11908029,50316295,76200518>, r=66934331
+pos=<79036827,16924288,76062556>, r=96520365
+pos=<9584540,67893747,64596741>, r=75231780
+pos=<1999297,28072699,90660851>, r=69059706
+pos=<-4999516,1406744,49697518>, r=59502059
+pos=<-12138046,52832626,53760320>, r=71057036
+pos=<14911107,50532270,74102432>, r=62049081
+pos=<-28076669,-5209886,42939079>, r=85888492
+pos=<-1381979,35962916,89448258>, r=79118686
+pos=<-27555180,38443112,78090455>, r=96414564
+pos=<-45684157,22499678,51249216>, r=80645467
+pos=<-33262343,42412693,21018032>, r=96311801
+pos=<-24933943,30266769,36206604>, r=60648927
+pos=<47087640,55749463,76069992>, r=83366515
+pos=<40948562,39725308,77828570>, r=62961879
+pos=<-21047756,32265813,60780681>, r=66419686
+pos=<37924327,42452651,67877724>, r=52713763
+pos=<-58689938,30781189,50489915>, r=92286565
+pos=<13216582,64885410,61404468>, r=65398749
+pos=<-43382614,29830485,70345833>, r=95884395
+pos=<-20520219,36470699,75190567>, r=84507131
+pos=<14237854,59338973,85949685>, r=83376237
+pos=<-450228,37867875,64907958>, r=55551952
+pos=<17760677,61033651,84995936>, r=80594372
+pos=<22176975,82022403,46533128>, r=58704060
+pos=<22779974,94329178,17857701>, r=95346900
+pos=<-38001053,34049218,49600706>, r=73976424
+pos=<16848379,29946291,48116237>, r=55533891
+pos=<-42631692,35454176,53098888>, r=83510344
+pos=<4649340,48178580,58429391>, r=54284128
+pos=<847183,51607513,81674534>, r=84760407
+pos=<-21437870,4973092,57201053>, r=79877495
+pos=<-31919810,30134447,55487065>, r=69866771
+pos=<-27341158,67125553,48484104>, r=95276520
+pos=<34772295,-8690710,66519732>, r=68327958
+pos=<-31969415,39408252,48343122>, r=72046242
+pos=<102875003,13271850,46851582>, r=94799961
+pos=<-12487583,35034265,55339911>, r=55187220
+pos=<9093156,39769707,84017977>, r=67020115
+pos=<-16380910,41574541,66165228>, r=76446125
+pos=<78145797,37164108,49128463>, r=68897409
+pos=<12696275,29248422,93349910>, r=62227566
+pos=<3806267,80300805,32983373>, r=85166064
+pos=<96882526,36942217,48757938>, r=87041670
+pos=<-171249798,39499790,57712028>, r=97294519
+pos=<-2013420,51530722,55656270>, r=61525906
+pos=<10506453,22608309,43074519>, r=92987198
+pos=<-12980027,57643628,73634339>, r=96583452
+pos=<9759074,34807718,46383535>, r=76510831
+pos=<-46481921,33185083,62928260>, r=94920705
+pos=<-41982125,32478135,69194276>, r=95980083
+pos=<6066850,16557724,-23317282>, r=96233732
+pos=<-27420476,39804614,13027130>, r=95852751
+pos=<-35598484,27994414,43416148>, r=61831662
+pos=<53497255,74968025,34467126>, r=87786515
+pos=<5629165,76030721,52476464>, r=75203884
+pos=<-52112524,15110086,40185629>, r=92357875
+pos=<-23905340,18683396,67786661>, r=79220265
+pos=<1204692,65009004,78621903>, r=94751674
+pos=<-10066560,46695198,48547405>, r=57634798
+pos=<10289802,-10697128,21104545>, r=74844012
+pos=<-40310292,28833507,46959457>, r=68428878
+pos=<-13764816,49841026,61895287>, r=77826610
+pos=<-19679027,58605601,66152788>, r=96763074
+pos=<8809311,33356810,46152100>, r=63432984
+pos=<-29709153,29461995,49058531>, r=60555118
+pos=<-13129092,-9705209,46828679>, r=75874660
+pos=<102118197,31480871,42422516>, r=84965146
+pos=<-32517383,30565130,33503263>, r=71234788
+pos=<9534874,52896280,70697014>, r=66384094
+pos=<16880678,65311318,51702479>, r=52458646
+pos=<-36132788,43209378,55775064>, r=87442665
+pos=<22744530,34380596,134099136>, r=98061118
+pos=<-26547963,41862023,60462772>, r=81198255
+pos=<-545734,40978449,60677738>, r=54527403
+pos=<16538063,68562231,28273188>, r=65405796
+pos=<14494679,58745235,31512009>, r=54393346
+pos=<7791169,67262375,35493930>, r=65632071
+pos=<8485973,48520508,103076567>, r=95436538
+pos=<8214274,28745216,50655896>, r=92680074
+pos=<-6937397,27971689,49092605>, r=65350532
+pos=<-22481435,9380958,40012423>, r=68629066
+pos=<62129884,16597211,12546768>, r=80660497
+pos=<6258688,62081024,87730516>, r=95878363
+pos=<-32278381,28495170,53585234>, r=66684251
+pos=<8040391,72063718,51083757>, r=67432585
+pos=<-5673174,25046673,73686241>, r=60524423
+pos=<-8001243,63756911,61002978>, r=85086692
+pos=<-26577068,41949907,46813510>, r=67665926
+pos=<27314118,87945331,52949180>, r=72667621
+pos=<-20191543,30416348,7242015>, r=85020749
+pos=<-40509210,25805511,61018374>, r=81933846
+pos=<-27572422,16102428,56368833>, r=74050704
+pos=<-11240828,50248391,27895560>, r=75248609
+pos=<34613570,41153477,100115019>, r=80341645
+pos=<15579024,9723842,69284527>, r=50193328
+pos=<-46066212,37488646,47288596>, r=83168980
+pos=<16651399,81480864,60218612>, r=77373965
+pos=<-4490123,12256693,29836426>, r=57938091
+pos=<-9722027,38414943,53203837>, r=53666284
+pos=<-17608773,53047624,65044179>, r=88026024
+pos=<-46201175,24018662,58511638>, r=86905837
+pos=<83707615,22862590,47033198>, r=66223477
+pos=<75278564,31837146,46877582>, r=58452382
+pos=<66228245,28297748,1246309>, r=87068293
+pos=<-41563889,138361221,22834552>, r=92320836
+pos=<-15149458,41692211,57568440>, r=66735557
+pos=<-29959760,29199939,50714596>, r=62199729
+pos=<42142694,49570710,97616140>, r=93788536
+pos=<61202922,61131481,71470186>, r=98263590
+pos=<29827492,38051686,24415070>, r=56692483
+pos=<17592777,73628928,77556835>, r=85918423
+pos=<-20783874,35242533,54629155>, r=62981079
+pos=<64237574,1302210,73405037>, r=94685683
+pos=<-21188594,47968883,69462691>, r=90945802
+pos=<30657831,49880981,-20723938>, r=95051093
+pos=<22864844,93114017,56937539>, r=79512153
+pos=<36531726,66041045,59031978>, r=66063917
+pos=<19846259,-13074428,65015549>, r=64455431
+pos=<-7113733,38738967,15168250>, r=72339348
+pos=<-25341686,54431754,46334838>, r=78433824
+pos=<20656999,57196763,75771625>, r=64636928
+pos=<-22838713,34493030,27829494>, r=71157081
+pos=<-27835555,38366205,61876949>, r=80404149
+pos=<79754868,48144480,60613367>, r=92971746
+pos=<20721233,45043536,93948762>, r=70596524
+pos=<-46680111,37879564,53763782>, r=90648947
+pos=<16009840,86125003,58588086>, r=81028766
+pos=<20025736,5391570,85015946>, r=65810395
+pos=<33720066,104264468,55486952>, r=97930498
+pos=<-63554526,31193768,49947114>, r=97020908
+pos=<-55699886,23371204,32454537>, r=95415201
+pos=<73230725,36900143,48087090>, r=62677110
+pos=<-32963671,28309367,52478944>, r=66077418
+pos=<5939165,55024902,62755578>, r=64166779
+pos=<-24917309,29082130,46444648>, r=52769524
+pos=<7735621,49034186,60918429>, r=54542530
+pos=<4877732,8430499,59198278>, r=52101779
+pos=<83731770,35839732,49766995>, r=73797528
+pos=<-11074931,33743791,62322816>, r=59467077
+pos=<47699715,55835903,55060273>, r=63055430
+pos=<37657191,-9104085,74776203>, r=79882754
+pos=<-46744861,30151111,64292721>, r=93514232
+pos=<-13186319,46003906,17086538>, r=83758581
+pos=<32840031,56015193,64841941>, r=58156157
+pos=<6062205,42632964,47615029>, r=73781872
+pos=<-19799971,51835559,58790016>, r=82751306
+pos=<-30893469,30656893,46300617>, r=60176438
+pos=<-55830501,22240501,57274377>, r=97076042
+pos=<15868849,46019629,96676898>, r=79153313
+pos=<-16265649,52075245,75590161>, r=96256506
+pos=<14624864,56207969,57618910>, r=51527552
+pos=<318934,59504614,60032696>, r=71543938
+pos=<-23487442,41093331,19776590>, r=86459237
+pos=<67237678,41609284,51037661>, r=64343635
+pos=<-19179700,33732993,56360250>, r=61598596
+pos=<-34730837,5580174,61364913>, r=96727618
+pos=<53061020,1668645,85754857>, r=95492537
+pos=<3877306,43959248,85023639>, r=77431037
+pos=<-10413451,33996655,77197477>, r=73933065
+pos=<-15270541,18375898,55749133>, r=58855471
+pos=<37599773,64150517,58789624>, r=64998919
+pos=<6641382,32884368,86779494>, r=65348099
+pos=<-28989825,39572241,63995218>, r=84883334
+pos=<12972158,71582537,87975353>, r=98911274
+pos=<41852603,48069590,65721204>, r=60103061
+pos=<-12895423,34234299,51393776>, r=50848940
+pos=<76683281,42692313,48821155>, r=72655746
+pos=<9795431,-286238,55311954>, r=52014423
+pos=<-12408641,28693619,67844073>, r=61271790
+pos=<18776047,80030396,38475557>, r=64433947
+pos=<75995398,33442514,24888484>, r=78338116
+pos=<-22764877,22172460,58097441>, r=64901579
+pos=<10239772,40250323,68821851>, r=51158213
+pos=<-6984206,11263546,-3408779>, r=94670545
+pos=<-25723496,46861709,48289286>, r=73199930
+pos=<5729735,28403922,117678625>, r=92678286
+pos=<11079147,38654325,86908021>, r=66808654
+pos=<19012903,51490161,13432661>, r=60699507
+pos=<-19708767,24665073,51422478>, r=52677853
+pos=<2549542,80274103,46746108>, r=76796138
+pos=<-48466554,29995042,56395431>, r=87182744
+pos=<86083343,46696534,52688635>, r=89927531
+pos=<19978558,94248897,26059694>, r=89865438
+pos=<21928133,43444423,89266701>, r=63108468
+pos=<-32662150,34466095,53616954>, r=73070642
+pos=<-4767571,24202491,48306992>, r=52750940
+pos=<-6049891,44411137,66256832>, r=69043725
+pos=<14845730,-1633797,-11680131>, r=94009220
+pos=<65363,73430740,49753549>, r=75444608
+pos=<10919543,55374161,60523054>, r=57303105
+pos=<-33344704,36874381,61740346>, r=84284898
+pos=<90823294,32581102,47524970>, r=75388376
+pos=<56762466,39329407,28284461>, r=61595785
+pos=<14326905,38412743,-13806339>, r=79547110
+pos=<-27408929,29564102,49418580>, r=58717093
+pos=<72828690,34540465,56644790>, r=68473289
+pos=<-23879984,-80533415,-13926388>, r=52569551
+pos=<623363,23117915,46129959>, r=71699945
+pos=<-21310687,28343530,48201114>, r=50180986
+pos=<-11268087,54197123,60947343>, r=78738009
+pos=<62637156,43374891,28845119>, r=70955785
+pos=<101486863,29252465,58609523>, r=93807860
+pos=<-7121743,-17618647,50972485>, r=81924604
+pos=<33712412,33093334,104500328>, r=75765083
+pos=<70057598,30520257,59928664>, r=64965508
+pos=<13577885,32272356,41344051>, r=98076208
+pos=<8955771,46905424,22660149>, r=56944295
+pos=<-31671198,35282234,47777117>, r=67056086
+pos=<-28701991,29968381,30147369>, r=70177802
+pos=<46883174,34145057,15459578>, r=59357035
+pos=<-21541824,-3738229,54506228>, r=85997940
+pos=<-7165905,-13698956,55634555>, r=82711088
+pos=<-42136026,37824576,54914702>, r=87201260
+pos=<75444044,34090961,64356096>, r=78350113
+pos=<27070208,76993574,17498441>, r=80354253
+pos=<-24556265,40605071,29335340>, r=77481284
+pos=<7679148,40322729,74549753>, r=59518815
+pos=<64743952,34069862,51081505>, r=54354571
+pos=<7888777,51012156,-6093924>, r=90872090
+pos=<-38312643,6053130,45786004>, r=84257215
+pos=<-10907447,30880694,71717384>, r=65831363
+pos=<-21415341,33770607,55616361>, r=63127773
+pos=<-9268341,12931923,58776983>, r=61325095
+pos=<53680780,36878021,92991425>, r=88009224
+pos=<16325289,32873290,52486621>, r=50056228
+pos=<2379678,52409295,64101601>, r=66456683
+pos=<12407570,48986679,9677595>, r=68556317
+pos=<-23196672,47847216,47491952>, r=70861580
+pos=<17092834,24513176,91350037>, r=55955816
+pos=<8752629,37508985,49239757>, r=72585978
+pos=<52794942,76928483,47757542>, r=81940023
+pos=<12527582,-6613411,50632808>, r=50930382
+pos=<-70810892,45621857,-48305364>, r=62008194
+pos=<-18412210,36869794,57144258>, r=64752285
+pos=<87656632,20763685,66883781>, r=92122439
+pos=<61764769,33809145,-512978>, r=89875236
+pos=<-21591807,57503330,27237264>, r=93512809
+pos=<-8980322,48822102,24813214>, r=74644293
+pos=<-13586166,29673545,54387395>, r=49972553
+pos=<-21336027,12684379,50240160>, r=65103467
+pos=<15312696,61249932,61078049>, r=59340843
+pos=<3820682,55264026,85971673>, r=89740512
+pos=<-8720944,7901096,48785694>, r=55817204
+pos=<46676113,42744663,57067759>, r=50947525
+pos=<63180707,54936070,46238435>, r=68814227
+pos=<-59988823,31676130,52904181>, r=96894648
+pos=<-55767575,34582277,42911408>, r=89093361
+pos=<-24727493,22617024,22771261>, r=74880311
+pos=<30402823,52581940,78464394>, r=65908330
+pos=<-12446120,14245346,47969322>, r=52381926
+pos=<13932111,12087077,52306416>, r=71083363
+pos=<12361114,5008235,62369519>, r=51211858
+pos=<62655763,37235551,16180822>, r=77498932
+pos=<5158458,57101119,21414371>, r=72183092
+pos=<2908218,33006742,52557556>, r=82743046
+pos=<57439166,18173939,101222852>, r=98833513
+pos=<52238468,31780002,45678724>, r=78491149
+pos=<-45793920,10537217,50965371>, r=92433881
+pos=<-13743952,64107054,54632417>, r=84808943
+pos=<-170006460,33686904,57787874>, r=58950081
+pos=<-26862218,29083237,47085032>, r=55356188
+pos=<794530,52505491,57994889>, r=62031400
+pos=<62469765,31544111,56755533>, r=55228669
+pos=<33597386,32945456,56175425>, r=60893404
+pos=<67662625,38142990,51575060>, r=61839764
+pos=<-48808932,29332298,47264670>, r=77731645
+pos=<-13897506,80448804,52473065>, r=99144940
+pos=<-41499426,33500208,34694650>, r=81959864
+pos=<21500730,1820261,108639134>, r=91529831
+pos=<37273144,59821099,54577329>, r=56130643
+pos=<-21429926,6902774,61057229>, r=81796239
+pos=<3340434,50630706,26961101>, r=61983979
+pos=<20112657,-7766263,32920789>, r=50273913
+pos=<66869619,52342243,67598868>, r=91270061
+pos=<6129880,42603189,67116575>, r=55915349
+pos=<6398878,1688559,79467734>, r=77591971
+pos=<14501207,33194081,103787164>, r=74805573
+pos=<-41363813,41379031,51239687>, r=86308022
+pos=<-5072359,37511009,73502277>, r=68411104
+pos=<9979161,47203323,76860857>, r=66410591
+pos=<8272810,70008182,48415971>, r=62477175
+pos=<16131738,39072448,57020881>, r=66650334
+pos=<-18513223,15536711,73318828>, r=82507011
+pos=<-53344764,29150642,46822282>, r=81643567
+pos=<-19488382,39476575,49309757>, r=60600153
+pos=<17795545,86761153,34350936>, r=76269651
+pos=<-39860391,37740470,42830687>, r=76425286
+pos=<75357927,42659157,48122833>, r=70599033
+pos=<67060727,20786860,43203283>, r=50745152
+pos=<11307310,64243278,77782998>, r=83044472
diff --git a/2018/inputs/24.txt b/2018/inputs/24.txt
new file mode 100644
index 0000000..0c90bb1
--- /dev/null
+++ b/2018/inputs/24.txt
@@ -0,0 +1,23 @@
+Immune System:
+2991 units each with 8084 hit points (weak to fire) with an attack that does 19 radiation damage at initiative 11
+4513 units each with 3901 hit points (weak to slashing; immune to bludgeoning, radiation) with an attack that does 7 bludgeoning damage at initiative 12
+5007 units each with 9502 hit points (immune to bludgeoning; weak to fire) with an attack that does 16 fire damage at initiative 2
+2007 units each with 5188 hit points (weak to radiation) with an attack that does 23 cold damage at initiative 9
+1680 units each with 1873 hit points (immune to bludgeoning; weak to radiation) with an attack that does 10 bludgeoning damage at initiative 10
+1344 units each with 9093 hit points (immune to bludgeoning, cold; weak to radiation) with an attack that does 63 cold damage at initiative 16
+498 units each with 2425 hit points (immune to fire, bludgeoning, cold) with an attack that does 44 slashing damage at initiative 3
+1166 units each with 7295 hit points with an attack that does 56 bludgeoning damage at initiative 8
+613 units each with 13254 hit points (immune to radiation, cold, fire) with an attack that does 162 radiation damage at initiative 15
+1431 units each with 2848 hit points (weak to radiation) with an attack that does 19 cold damage at initiative 1
+
+Infection:
+700 units each with 47055 hit points (weak to fire; immune to slashing) with an attack that does 116 fire damage at initiative 14
+2654 units each with 13093 hit points (weak to radiation) with an attack that does 8 radiation damage at initiative 19
+5513 units each with 18026 hit points (immune to radiation; weak to slashing) with an attack that does 6 slashing damage at initiative 20
+89 units each with 48412 hit points (weak to cold) with an attack that does 815 radiation damage at initiative 17
+2995 units each with 51205 hit points (weak to cold) with an attack that does 28 slashing damage at initiative 7
+495 units each with 21912 hit points with an attack that does 82 cold damage at initiative 13
+2911 units each with 13547 hit points with an attack that does 7 slashing damage at initiative 18
+1017 units each with 28427 hit points (immune to fire) with an attack that does 52 fire damage at initiative 4
+2048 units each with 29191 hit points (weak to bludgeoning) with an attack that does 22 bludgeoning damage at initiative 6
+1718 units each with 15725 hit points (immune to cold) with an attack that does 18 slashing damage at initiative 5
diff --git a/2018/inputs/25.txt b/2018/inputs/25.txt
new file mode 100644
index 0000000..d359c48
--- /dev/null
+++ b/2018/inputs/25.txt
@@ -0,0 +1,1248 @@
+-6,2,-8,3
+7,8,-1,-8
+7,-2,-4,-2
+4,-4,2,7
+5,8,-1,6
+-1,6,-4,-5
+-2,-6,-6,-6
+1,4,7,0
+-1,-3,-8,2
+5,-6,-5,-2
+-5,7,4,-2
+-2,6,-1,6
+5,4,0,-7
+1,5,-8,-3
+-3,3,8,2
+4,0,0,6
+4,-8,-3,3
+0,0,-7,-5
+-2,0,5,-3
+2,1,7,-1
+1,6,2,2
+4,4,7,-6
+-1,0,-1,1
+2,4,4,6
+-4,3,-7,2
+-5,-2,8,-7
+6,-8,-1,3
+-8,-6,-7,-3
+4,1,-7,-1
+-7,-5,-4,4
+5,-2,8,-5
+-5,-1,4,-4
+3,-3,8,4
+3,8,-8,-7
+-3,7,7,0
+-7,-5,-3,5
+-4,-5,-3,-2
+6,-8,3,8
+-2,0,8,7
+-4,3,5,7
+-6,3,5,0
+5,2,-3,-3
+0,8,0,5
+-5,-8,-1,-8
+2,6,0,6
+5,-4,0,0
+3,-2,-8,-5
+8,-4,-7,-7
+-3,-7,-8,-2
+6,7,-2,3
+5,0,-6,0
+0,-6,0,2
+8,-4,6,-3
+-5,-4,4,-4
+2,0,3,-1
+3,-5,8,5
+6,-1,5,5
+-6,-5,-4,8
+7,-4,0,5
+5,3,1,6
+-7,2,-3,1
+-4,1,-6,-7
+-4,4,0,8
+-6,4,1,-8
+3,-6,-6,5
+2,-4,-3,2
+-2,2,-2,1
+2,-4,0,0
+3,1,4,8
+-1,3,-7,-5
+-3,-7,2,0
+-2,-2,-8,0
+1,6,0,7
+-6,-3,0,-1
+7,0,-2,-7
+5,-5,-3,0
+7,0,0,5
+-6,5,6,2
+0,8,3,-1
+0,-8,-7,-1
+3,6,7,-7
+-2,4,-8,-3
+3,-3,-6,-4
+-1,-5,0,2
+-7,2,4,0
+-2,7,4,-2
+2,4,-1,5
+-1,-6,-6,4
+4,-6,-7,-2
+-6,6,-4,-2
+5,-5,-2,-6
+4,5,4,0
+3,3,0,-5
+-5,4,3,-2
+-6,1,7,-6
+3,5,-8,5
+-2,8,-2,-2
+-5,6,-2,-7
+-3,-6,7,-4
+-8,-6,7,7
+-5,-7,4,-4
+-8,-8,-6,7
+-7,-1,-2,-1
+3,-1,4,0
+3,6,1,-8
+2,6,-4,0
+-6,4,4,6
+7,7,6,-5
+4,-3,-2,7
+-1,8,2,-2
+3,-1,-4,5
+-2,1,-6,-8
+-3,1,7,-1
+-7,-1,8,6
+4,2,6,-6
+8,-1,8,-8
+4,6,-1,4
+7,-1,6,5
+0,-6,2,3
+-2,-8,-8,-6
+0,6,-4,-8
+4,-8,-7,6
+-3,-3,2,2
+2,1,4,7
+-3,7,-1,-8
+1,1,-2,-5
+3,-6,-4,7
+-3,5,0,8
+3,3,1,0
+1,5,4,6
+7,0,-2,-5
+1,5,-3,7
+-1,-4,3,4
+-4,3,-2,0
+-1,-8,2,0
+-8,-8,3,-3
+-2,-6,5,2
+8,-1,-3,-6
+2,-8,3,-5
+-8,-8,3,4
+-3,-5,-7,0
+0,3,1,3
+-8,5,-6,4
+2,0,4,-2
+-5,1,-7,0
+-5,0,-2,1
+4,-7,0,3
+7,0,4,-1
+0,-3,5,4
+-8,-8,-2,3
+2,5,4,6
+7,0,-8,-7
+-1,8,3,-3
+1,-2,2,-4
+-1,-3,3,-2
+4,6,7,-1
+3,8,2,-3
+-1,-8,8,7
+-8,4,7,-2
+-8,2,-8,-7
+-2,5,0,-5
+-1,-2,-5,-5
+4,6,-2,0
+0,8,0,-4
+2,0,-2,-1
+-8,0,-5,0
+-2,-8,-5,6
+2,0,5,7
+6,0,7,0
+-6,-8,3,-1
+2,2,6,-8
+-8,7,-8,7
+5,0,7,-6
+0,-3,6,-4
+-5,7,-6,-6
+2,5,0,-6
+-6,8,-3,3
+-8,-7,-1,-8
+-1,3,0,0
+1,2,3,-7
+-5,-1,7,2
+4,2,0,2
+-6,-6,-1,-2
+1,0,8,-1
+0,-1,-8,7
+2,2,-6,-4
+-2,3,2,6
+-6,-6,-2,-3
+-2,6,-2,1
+4,0,-8,7
+4,8,1,-1
+4,2,-2,5
+1,-2,-6,1
+1,5,-5,-4
+0,8,7,-6
+8,8,2,-3
+-3,-4,-5,3
+-2,6,-8,-1
+-2,-2,-4,2
+0,6,-3,7
+8,3,-3,7
+6,0,-1,-6
+8,8,3,0
+-7,0,8,7
+-5,7,-2,0
+2,-7,7,3
+8,-5,0,0
+-6,-8,1,-7
+-7,-3,0,5
+5,6,1,-7
+-3,8,-3,6
+-4,0,-4,-5
+7,4,2,1
+-7,-7,-8,6
+7,-7,4,4
+-6,-2,-1,1
+5,7,-6,-5
+1,6,-2,5
+-6,5,-6,3
+-6,-8,0,0
+2,-4,2,8
+0,0,0,-8
+-8,0,-2,2
+0,-4,-8,-8
+1,-5,-8,5
+6,-4,-5,6
+8,4,-5,-1
+8,-7,4,-4
+-7,-6,-8,0
+-2,3,-2,3
+-8,-3,-6,-3
+0,5,5,0
+3,7,-8,6
+0,-7,-5,-1
+1,6,-4,-3
+-4,5,-3,5
+7,-5,-5,8
+-4,4,0,-8
+7,-7,0,2
+6,0,2,-8
+-6,-4,1,0
+-1,0,-2,4
+-4,-8,5,7
+-8,4,-5,-2
+2,8,-8,-8
+-4,7,1,6
+-2,-2,-7,3
+6,4,-1,0
+-1,-7,-4,0
+-4,0,3,0
+0,3,5,2
+-4,-5,-1,0
+8,2,-6,0
+-2,5,-3,8
+7,0,3,-2
+6,0,-5,0
+4,-6,-5,6
+-7,8,0,-1
+8,-2,3,-4
+7,0,-4,7
+-4,-6,-7,-7
+2,8,0,4
+1,-6,5,-6
+4,-7,-2,-2
+4,1,-6,2
+0,7,4,3
+4,1,-1,-5
+1,-4,6,-6
+1,2,-2,-2
+2,-2,6,-5
+-8,6,-6,6
+0,6,8,2
+-3,-2,0,-8
+-6,-5,2,-6
+0,5,-8,-5
+1,-1,7,6
+-6,-3,-7,-3
+-4,-6,-1,0
+8,-3,-6,-2
+-5,-2,6,-1
+-1,0,3,1
+0,2,-6,7
+3,3,5,-2
+8,4,5,-1
+-5,-1,0,-1
+-6,-1,0,6
+2,6,-3,-3
+8,7,-8,4
+-6,-8,-3,0
+-1,-1,0,7
+6,-2,-8,4
+-3,8,3,-1
+6,2,0,4
+0,-3,7,3
+-5,3,-2,-1
+-6,-7,-2,-3
+4,-5,-3,-6
+-7,6,-2,4
+-2,-5,7,0
+1,8,-8,7
+8,3,-3,4
+-3,3,2,-4
+5,-7,4,1
+8,-3,-5,0
+-5,-4,-1,-8
+2,1,-2,-3
+-1,-4,-1,-7
+-7,-8,-7,-2
+3,0,7,4
+6,3,7,7
+0,-2,-4,2
+0,-1,-6,7
+-3,-8,-1,-7
+-8,-6,-6,-4
+-5,-4,-4,0
+0,7,-7,3
+-8,-7,-6,-8
+-5,3,0,-3
+-7,-6,0,7
+-7,6,-6,-2
+-2,8,2,-4
+2,0,0,5
+0,5,-2,0
+8,-7,-7,-1
+-1,3,2,-7
+-3,4,-7,-4
+-6,-3,2,-7
+-7,5,4,3
+5,-1,-6,-2
+3,-7,1,0
+-7,0,-4,-3
+-6,8,-1,0
+3,8,4,-2
+-1,-4,-8,-7
+3,3,8,1
+-5,1,4,5
+8,8,-1,2
+-3,-3,7,-4
+8,-3,2,-4
+6,-8,-6,8
+3,6,3,-2
+-7,-2,6,-4
+-6,-8,-8,5
+6,0,0,7
+-6,7,0,7
+8,0,-6,-3
+0,-3,-7,0
+-2,6,-7,-7
+5,-1,-3,0
+2,3,4,-5
+1,7,-6,0
+3,3,0,-3
+-1,0,-8,-8
+-2,5,-7,4
+7,-1,-8,5
+-2,-1,-1,6
+-2,-6,5,1
+4,-2,5,5
+-7,8,4,7
+-2,-2,6,5
+-6,1,-5,3
+-8,4,0,7
+8,-4,5,5
+-4,8,-4,1
+-8,0,5,4
+8,1,0,0
+-6,-8,-6,-2
+2,-5,0,0
+5,-6,5,-4
+1,2,7,2
+8,-4,6,5
+-6,0,7,6
+6,5,7,-6
+-2,-6,-2,5
+-6,-4,3,1
+6,-8,4,-4
+8,6,1,2
+7,5,7,-2
+7,-2,-6,-1
+4,-2,1,2
+1,1,-3,5
+0,-4,8,4
+5,2,-3,-4
+8,4,1,-3
+-1,1,-8,1
+-1,-1,0,5
+-4,4,6,0
+0,6,-2,6
+-3,4,5,5
+-7,5,4,-4
+2,2,-2,-4
+8,-1,2,-5
+-5,-2,6,-2
+7,2,1,6
+-3,-2,4,-5
+8,8,-7,-8
+0,1,-8,-4
+-3,-6,-3,3
+-4,-4,8,4
+-3,2,-4,-6
+-6,5,-5,-2
+-3,-7,-3,8
+0,6,-1,8
+8,0,7,1
+1,1,-8,-2
+6,-6,-7,3
+4,-5,8,-8
+-3,-6,6,7
+8,-5,2,4
+2,5,-3,-4
+-3,0,-6,7
+-1,-7,7,0
+2,-3,-5,5
+-7,-7,0,-2
+0,-4,7,8
+5,3,7,2
+-2,-7,5,5
+-6,-1,0,-8
+-3,0,8,-5
+-8,-1,1,1
+1,0,-6,8
+-1,-5,8,4
+-5,-4,4,8
+2,-3,0,-4
+-4,-3,0,7
+5,6,5,-5
+-3,-8,-3,-2
+5,8,-8,5
+-7,-2,-2,-2
+7,6,8,6
+0,-6,4,-7
+-1,-4,-7,0
+8,7,-6,6
+6,-5,-1,-3
+5,-2,-2,-3
+6,-3,-5,0
+-8,5,6,-5
+3,-7,7,8
+1,3,-8,0
+-6,8,-5,6
+6,-5,-5,-2
+3,8,1,-8
+-8,5,2,0
+0,5,-3,6
+-5,-7,-8,4
+0,7,0,0
+-5,6,-5,6
+-5,1,6,5
+6,1,-2,-8
+0,-8,3,1
+0,-3,-8,-3
+0,6,0,-2
+-8,0,-7,-5
+-8,2,0,6
+1,6,3,-4
+8,-5,0,-4
+-6,7,0,0
+5,0,1,0
+-8,8,2,8
+-7,4,2,4
+0,3,-2,-4
+-5,5,7,0
+5,0,-1,5
+-7,8,-6,8
+-8,-1,3,-3
+0,-7,-7,-7
+-4,4,8,-2
+1,2,1,-4
+1,-5,-1,8
+-3,8,-2,-2
+8,0,4,-4
+-8,5,-5,3
+-7,-7,-6,-2
+0,-6,-8,-8
+-1,-2,-3,0
+-4,0,1,7
+1,-6,-8,4
+0,8,6,-1
+-8,-5,-7,8
+2,7,-8,4
+-8,4,-3,2
+3,-1,-7,3
+4,-2,-6,-6
+-1,-4,1,-2
+3,-4,2,-6
+2,4,5,-3
+-7,7,1,6
+8,-6,-5,-3
+-7,1,-6,0
+-3,-6,-6,-8
+-8,-5,-6,4
+-5,-1,7,8
+0,7,6,2
+6,-2,-1,5
+0,4,-8,8
+-3,-5,-8,0
+2,-6,-2,-1
+5,8,-6,4
+-5,-1,0,-6
+-8,-5,8,2
+5,6,-3,-3
+-4,-7,2,6
+0,-3,-6,7
+-4,-6,-8,-8
+6,7,1,3
+7,-2,4,-3
+4,2,3,1
+0,8,-3,-8
+-8,0,1,0
+4,5,-4,-2
+-2,-6,4,2
+-4,0,-4,0
+8,-1,2,-2
+5,-7,8,1
+-2,5,-6,1
+6,-7,3,-7
+2,1,0,6
+-8,-3,-1,0
+8,-1,8,-3
+0,-6,6,0
+7,3,7,3
+-8,0,6,-1
+-5,-4,-5,0
+-2,0,3,-7
+0,2,0,0
+-3,6,6,3
+-6,-3,-1,-3
+8,0,1,5
+-7,4,-8,0
+8,8,-5,4
+-2,0,-7,-4
+-8,5,-7,-7
+8,0,-1,4
+8,-7,5,0
+-6,-1,-4,2
+-8,-8,6,-5
+7,2,-3,1
+2,0,2,6
+8,-7,-8,3
+-2,-7,-8,0
+0,3,-1,4
+-8,7,5,3
+0,-4,0,3
+6,6,-2,-6
+-4,8,6,-3
+0,3,0,-4
+6,-2,1,5
+1,4,4,3
+0,-7,4,-1
+1,3,-8,-2
+-5,0,4,0
+8,2,-6,-4
+-8,8,-2,6
+-5,7,-7,-2
+5,0,-4,-4
+-1,-5,3,7
+-2,-3,7,3
+-3,4,2,0
+-7,-8,1,3
+-8,-8,-3,2
+0,5,-8,7
+1,7,-6,5
+2,-6,-5,0
+-8,4,4,2
+7,3,1,-6
+-5,-4,8,2
+-7,7,0,0
+8,6,-1,6
+2,5,3,-7
+-7,3,1,5
+-8,-3,-4,3
+0,-2,0,8
+-7,-7,-5,8
+3,6,3,0
+-4,2,8,-4
+-6,2,6,-3
+0,-7,-6,-7
+0,-6,3,-6
+-4,-5,-5,-2
+1,-7,-2,-5
+5,7,0,4
+2,-1,3,-3
+7,1,-5,8
+0,3,0,2
+5,0,-5,-3
+-2,6,2,5
+6,4,-4,-7
+4,-8,4,8
+-5,-2,-6,7
+-1,-4,-4,5
+-2,-7,3,7
+-3,-8,-2,2
+1,-2,-5,-3
+0,-4,-1,3
+4,8,2,-5
+8,6,-6,1
+-8,-1,1,-4
+5,6,4,-8
+-7,-6,-5,4
+-3,-3,5,0
+-6,7,2,1
+-5,5,-1,0
+1,-8,2,0
+0,-3,-7,6
+4,-4,1,0
+-4,-6,0,4
+4,0,4,0
+4,-7,3,-2
+0,-3,0,4
+2,-3,2,2
+2,0,0,-4
+-8,6,6,4
+7,7,4,-2
+0,5,0,-1
+5,7,3,6
+5,2,4,-3
+5,4,-7,-6
+-8,1,7,2
+0,5,8,-1
+5,-3,-6,0
+-6,0,4,6
+-2,-2,6,-6
+-6,3,5,2
+8,-2,-3,-1
+-8,1,3,-4
+1,-6,-5,-6
+8,-4,6,-1
+-5,-7,-7,-5
+-1,-6,1,-4
+4,2,-3,0
+7,1,-4,4
+2,6,-8,0
+7,7,2,-5
+5,-2,-8,-3
+-5,0,3,2
+-1,6,-1,-4
+6,4,-3,-4
+4,1,4,-6
+3,5,0,-1
+5,-3,7,2
+3,-3,-7,5
+-3,-6,-1,2
+-7,-6,5,5
+-3,-7,1,-7
+5,5,-4,3
+6,-4,0,-1
+-7,-8,-1,7
+6,1,3,8
+8,-3,-5,2
+-3,1,-2,7
+-3,8,3,-4
+0,-8,7,3
+5,0,-4,-3
+3,-8,2,4
+-8,-3,6,-3
+0,6,-5,4
+-2,-8,-2,0
+-4,-4,-4,8
+-6,8,-5,-1
+-8,0,1,1
+-4,3,1,-2
+-1,-7,4,8
+3,0,7,-4
+5,7,3,-1
+7,-8,-3,1
+5,5,0,1
+-3,-1,0,8
+-6,-8,-4,1
+-3,-1,-6,0
+0,-1,0,0
+6,0,0,8
+3,-1,-4,6
+-4,4,0,-5
+3,7,1,7
+-5,0,6,7
+5,-5,2,3
+5,-7,2,1
+-6,1,-3,-6
+7,8,-2,8
+5,4,0,6
+-8,-3,4,-3
+-3,-6,2,6
+1,4,2,5
+0,7,6,-5
+-1,7,5,4
+4,-5,-4,0
+-2,1,4,-7
+-2,0,0,8
+7,0,1,1
+-3,-7,8,6
+-2,-8,6,7
+6,3,-4,5
+5,2,-5,8
+4,-2,5,-2
+8,5,-4,-4
+2,6,-7,6
+-4,-2,-6,-5
+0,5,-6,-1
+5,3,4,3
+4,2,1,5
+6,-6,-8,3
+-7,2,3,-2
+0,2,2,1
+0,1,2,3
+-6,4,1,-4
+7,-4,-1,4
+-5,3,-3,0
+3,8,-3,-4
+-2,-3,4,2
+4,7,-2,4
+4,-4,-3,-8
+1,0,-2,-6
+6,7,-4,0
+-2,-7,2,-2
+0,4,2,2
+-4,8,-1,0
+-4,5,1,1
+-2,-8,-1,4
+2,3,-3,4
+-8,-4,-5,0
+-6,3,0,2
+6,-5,1,0
+4,-2,-8,4
+0,7,-5,-2
+-7,-3,5,-1
+5,7,-4,1
+-3,-3,3,5
+2,0,-4,-4
+-7,0,6,6
+4,-4,-3,-1
+-6,6,-1,-6
+-1,2,1,-8
+-2,3,4,6
+5,8,-4,-8
+0,5,0,-4
+-5,-3,7,7
+5,4,5,-2
+4,-2,8,-5
+-4,2,-7,4
+1,-8,4,-4
+7,8,-7,3
+2,7,-8,-5
+-1,-5,6,-7
+5,-4,7,-2
+0,-3,0,6
+0,-7,-2,2
+4,8,0,-1
+0,-3,5,-3
+5,-6,0,4
+1,-7,2,-2
+-1,0,-3,1
+-4,0,4,-6
+5,3,7,3
+7,-4,7,-8
+-3,-5,3,7
+0,-6,8,2
+4,-6,-1,8
+0,-7,0,-8
+-4,5,0,6
+7,6,-6,2
+-6,-5,-7,3
+0,-1,4,-8
+4,6,-4,4
+-4,-2,5,4
+-8,-8,0,4
+2,-8,4,-1
+2,4,0,0
+-6,-1,8,7
+-6,5,8,-5
+-3,-5,-7,-3
+3,-1,-5,-7
+0,4,-4,-7
+2,-4,-1,-6
+-6,-6,0,5
+0,6,3,-5
+0,-3,8,2
+7,-6,6,-1
+-3,7,-4,-5
+-3,1,3,7
+5,-2,-6,-7
+-6,3,-1,8
+0,0,-4,-2
+-8,2,3,-4
+0,-2,-4,0
+1,8,-3,-7
+-2,-4,3,0
+3,-8,7,0
+-1,-6,3,-4
+3,0,8,4
+3,3,-5,-6
+5,0,-1,-2
+7,1,-4,8
+4,-5,3,-2
+4,-4,0,8
+-4,2,1,-8
+-8,0,-7,-2
+4,-2,0,0
+-8,3,7,-8
+8,-8,6,-5
+-8,0,3,-5
+6,3,-2,-3
+4,0,-5,7
+-1,-5,-6,2
+4,-1,-7,2
+-8,-1,-2,0
+1,7,-7,-2
+5,0,-5,-7
+8,-3,6,-2
+1,-6,2,-3
+6,-1,6,3
+-7,4,3,4
+-7,-5,-5,-4
+-7,2,-8,-4
+-5,8,3,-3
+1,2,-3,4
+-6,-5,-4,1
+5,4,5,7
+0,0,-1,-4
+5,-8,3,-1
+5,6,-5,0
+-7,-3,-6,0
+2,-8,0,1
+1,4,-7,-8
+-4,-7,-6,3
+0,1,-1,0
+-6,-1,6,0
+1,6,-4,-2
+8,-3,0,0
+-2,0,-3,7
+3,8,-4,3
+-8,7,2,0
+1,4,-6,3
+5,-3,4,-4
+-3,-5,5,5
+-6,4,-2,2
+-4,0,2,4
+-7,1,6,1
+-2,2,4,6
+-5,-2,6,0
+-1,4,8,0
+0,8,6,-6
+-6,6,-4,-7
+-6,-7,3,0
+4,-1,3,4
+0,-7,-4,-6
+-6,-5,-5,0
+-2,-5,-4,0
+2,0,-8,6
+-1,1,0,0
+-6,-4,-3,-1
+7,5,-7,1
+-5,-1,3,3
+6,1,0,1
+6,7,6,7
+-3,1,0,-3
+-5,-1,-6,4
+-5,1,1,8
+8,-1,-2,-6
+3,0,6,7
+0,8,4,0
+-8,0,-2,5
+-4,-3,-5,5
+-5,3,2,5
+-2,-3,0,-6
+-3,-4,1,-2
+8,-4,-7,-6
+2,8,6,-7
+3,-1,1,-6
+0,-8,1,3
+-2,-4,8,0
+7,-7,-3,5
+8,5,6,-5
+-3,7,2,8
+6,-1,-7,1
+-4,0,-2,-2
+7,8,1,-3
+-2,5,8,6
+-7,-5,0,3
+-7,3,-1,6
+2,-1,-4,0
+-8,-6,2,-8
+-7,-5,-5,1
+0,-5,-4,4
+5,-2,-3,-8
+-5,-8,1,4
+5,0,7,-4
+8,7,1,-1
+-4,-1,-5,2
+4,8,-6,1
+-3,2,3,4
+-5,-2,1,3
+-3,5,5,4
+-6,4,-1,5
+6,1,3,0
+0,-4,-5,0
+-4,4,2,6
+-7,-8,-6,7
+8,4,5,1
+0,5,-3,-1
+3,6,5,-8
+1,8,3,-6
+3,-3,-5,-8
+-7,5,-5,0
+-6,4,0,-6
+-7,7,6,-3
+-3,-1,7,8
+-7,-7,1,-4
+-7,-1,-8,6
+6,0,-2,2
+-5,-8,0,7
+-5,-4,8,4
+1,5,4,2
+8,8,-2,6
+-3,2,-2,1
+-5,-2,1,-2
+8,8,-8,-4
+-7,-8,8,-4
+0,-6,8,-2
+-6,8,1,0
+-8,0,8,-4
+-6,5,1,2
+1,7,5,-2
+-4,1,0,-7
+2,-8,3,7
+-1,-6,-2,-1
+3,-5,-1,7
+0,-7,2,1
+0,8,2,0
+-1,-2,-8,-2
+6,2,5,0
+7,-8,-8,0
+-2,1,2,6
+-3,-7,-4,2
+7,1,4,-3
+5,4,-1,1
+8,-8,8,-7
+3,7,7,-1
+0,-7,0,-4
+-4,2,7,-7
+-7,2,-5,7
+7,-3,2,0
+-8,1,2,0
+5,8,8,-3
+0,7,-2,7
+-3,0,0,-1
+6,8,3,-1
+1,0,-8,0
+8,-5,6,6
+3,0,0,3
+1,4,-4,4
+-2,-5,-3,3
+7,3,-1,-1
+2,-5,1,-5
+-3,-2,6,6
+0,7,-2,-2
+0,0,3,-7
+-1,-7,2,-2
+-6,-1,0,1
+-4,1,1,8
+-4,-6,1,1
+5,7,3,-3
+8,-2,4,2
+0,-6,5,-8
+4,5,0,-6
+1,0,-2,-1
+-6,0,0,-6
+-5,-7,-4,-6
+-8,8,-5,-2
+1,-7,0,4
+4,6,8,1
+-2,-6,6,6
+7,1,-6,0
+-5,6,-4,0
+-4,1,1,4
+8,-7,-1,4
+-7,8,4,-2
+8,5,-7,3
+2,-5,5,-1
+-5,-5,3,8
+-5,-3,-7,6
+5,2,2,1
+-1,-7,-5,2
+0,7,8,-5
+6,-4,5,0
+-1,5,-2,8
+-8,7,0,7
+-4,8,-1,1
+5,-1,1,-2
+2,-3,8,0
+0,6,-1,1
+-2,7,-7,8
+-6,1,-1,6
+5,7,-6,0
+-5,-1,-6,-6
+-2,3,-8,-5
+1,5,-7,-8
+7,-5,-2,5
+-5,7,5,-2
+-5,0,0,7
+-4,-4,0,0
+-3,0,2,-7
+5,4,3,-1
+-5,-7,7,5
+-2,-3,4,5
+-5,-3,4,2
+-7,0,-5,3
+0,0,-8,8
+0,5,-7,4
+-8,-3,8,-2
+-5,8,-2,-5
+-8,8,0,0
+-8,-3,5,-1
+-6,1,8,-3
+3,7,-6,3
+-6,6,2,5
+1,-4,-3,0
+-8,-8,5,3
+1,-4,8,-2
+4,7,3,1
+7,0,4,0
+0,3,-4,-2
+-7,3,7,4
+-4,-7,-1,3
+1,-7,2,1
+3,3,-5,-1
+5,-7,2,2
+1,-4,-4,0
+-8,5,-3,-1
+3,-3,4,0
+7,0,4,-5
+0,1,1,2
+1,-5,6,-5
+-3,2,7,7
+-3,-3,6,2
+2,-2,0,-3
+3,8,-3,2
+-1,1,3,-4
+2,7,4,8
+7,6,-1,6
+8,8,6,5
+2,8,-6,-7
+-1,-3,-3,3
+4,0,-5,-1
+-4,-4,-1,2
+2,-1,-2,-3
+3,3,-3,1
+-1,3,2,2
+4,1,4,7
+-1,-6,-4,2
+-5,-5,2,-1
+-2,2,0,-5
+-1,-8,5,-2
+-6,1,-1,-1
+-8,-8,0,2
+7,8,-7,-1
+-6,7,0,-6
+-4,4,8,-7
+7,1,5,7
+-5,2,2,-5
+1,-2,-3,0
+0,7,-8,-5
+-1,0,-5,6
+-6,1,-4,-3
+8,2,4,-7
+0,-3,0,-7
+6,-5,-8,-4
+-3,4,-3,7
+0,-1,-8,2
+3,1,-8,0
+-8,1,3,7
+-7,1,8,6
+7,7,-3,7
+4,0,2,-3
+0,-2,1,-7
+-7,6,-3,7
+-3,8,-7,4
+6,4,2,5
+3,-3,6,-7
+6,-8,-3,-1
+-2,-8,-8,4
+-3,-2,1,6
+3,1,-1,-1
+8,6,7,5
+5,7,7,-8
+-7,3,3,4
+8,6,-5,-4
+1,-4,-5,-3
+4,6,-6,-6
+-3,4,0,7
+1,-4,-3,8
+3,-7,-2,1
+2,-4,4,8
+-5,1,-7,5
+0,-5,0,3
+0,7,-8,5
+-8,-2,1,3
+-5,8,8,6
+0,5,4,-1
+0,-8,-7,8
+3,2,1,-7
+2,-3,4,1
+5,4,7,-3
+-8,-3,7,-3
+-2,5,6,-5
+5,0,0,-3
+-4,6,6,1
+8,-2,-5,2
+0,4,-2,3
+-8,-5,-8,6
+-5,0,5,7
+-7,1,-8,4
+7,2,6,-2
+-2,-7,-2,6
+-7,7,0,5
+-5,-3,1,4
+-4,8,2,3
+-7,0,0,-6
+2,4,0,8
+2,7,7,0
+7,4,-4,-3
+2,7,5,7
+-3,4,1,3
+-2,-3,-3,1
+2,8,-1,8
+0,-7,6,8
+1,6,5,5
+-8,-6,-6,-5
+6,-8,-8,-1
+-8,3,3,3
+5,-7,7,-2
+5,8,1,6
+0,2,3,5
+-2,7,-7,-3
+-5,6,1,-5
+6,7,-1,4
+8,-3,6,-7
+5,0,-8,3
+0,6,2,0
+-8,-6,-6,5
+0,7,2,-3
+1,-4,6,-7
+-6,7,0,4
+4,-4,0,4
+6,3,7,-2
+3,-8,2,3
+0,5,3,-8
+2,6,7,4
+2,-7,-5,1
+-8,-3,-2,4
+-7,-7,0,4
+-4,-5,-6,1
+-6,-6,0,-3
+-8,8,-3,-4
+-6,7,1,-6
+-5,4,0,7
+-4,-1,5,3
+5,-7,3,1
+0,-4,-6,-3
+6,-6,-1,-5
+3,1,5,-3
+-1,1,2,-3
+0,7,-1,-7
+-8,0,8,0
+0,8,0,-6
+2,-7,2,0
+0,-1,-2,-7
+-2,0,1,1
+1,-7,8,4
+3,-6,0,7
+0,0,-5,4
+2,-7,0,6
+-6,4,5,-7
+-3,5,7,4
+-2,-1,7,8
+-7,0,-2,-4
+3,-6,6,0
+5,-4,-4,4
+6,8,8,-3
+6,-6,-6,3
+2,-3,-3,-3
+8,-5,-2,0
+-3,5,7,-4
+-7,-8,1,5
+0,-1,-1,-1
+8,1,7,-8
+4,4,2,4
+6,2,-1,2
+-5,6,-6,5
+-2,-5,-3,4
+6,-3,-4,0
+8,8,-5,-7
+2,2,0,-3
+-5,-8,1,2
+7,-6,-2,8
+-5,0,-3,3
+-2,7,-4,-5
+8,-1,-6,1
+7,6,-1,-4
+-3,0,2,1
+0,0,5,0
+-1,8,-2,3
+-3,2,1,-8
+1,7,-7,0
+1,4,-1,0
+6,-4,3,-2
+-1,-6,-2,2
+-2,2,2,2
+2,0,-3,5
+-4,1,-8,-3
+-4,1,5,-7
+-6,8,1,4
+5,3,0,1
+-8,-7,7,-1
+-8,-3,1,-7
+0,2,4,7
+6,7,2,-8
+4,1,2,8
+3,-2,1,-5
+8,2,-7,6
+8,0,5,3
+-7,4,8,-7
+3,8,-1,-7
+-1,-5,-2,0
+-3,0,6,3
+6,5,-3,-2
+1,8,7,-2
+-4,-1,-7,-2
+-6,-1,8,3
+8,-1,5,-6
+5,0,5,2
+-4,8,0,-1
+-5,2,7,-3
+5,-2,-6,5
+4,-4,4,0
+-7,-1,-5,-5
+-8,-5,4,5
+4,-6,-8,3
+7,2,7,-5
+1,6,2,-3
+-3,3,-8,0
+1,-6,7,-3
+-5,8,6,-3
+-3,-2,-4,-6
+7,-7,-2,1
+5,4,-7,-1
+3,-4,-5,-1
+-1,-5,6,-1
+-8,4,-5,1
diff --git a/2018/inputs/3.txt b/2018/inputs/3.txt
new file mode 100644
index 0000000..4701818
--- /dev/null
+++ b/2018/inputs/3.txt
@@ -0,0 +1,1385 @@
+#1 @ 342,645: 25x20
+#2 @ 124,968: 28x19
+#3 @ 680,765: 26x20
+#4 @ 832,699: 12x15
+#5 @ 4,746: 29x14
+#6 @ 926,115: 19x17
+#7 @ 662,587: 28x12
+#8 @ 532,568: 27x23
+#9 @ 860,23: 16x21
+#10 @ 530,562: 12x27
+#11 @ 15,254: 10x27
+#12 @ 375,611: 18x10
+#13 @ 357,389: 22x23
+#14 @ 483,392: 14x16
+#15 @ 426,705: 17x13
+#16 @ 273,918: 23x28
+#17 @ 873,722: 13x13
+#18 @ 429,749: 12x25
+#19 @ 701,937: 14x11
+#20 @ 89,231: 23x26
+#21 @ 704,220: 10x27
+#22 @ 481,847: 21x24
+#23 @ 9,378: 14x19
+#24 @ 682,442: 10x21
+#25 @ 242,63: 21x23
+#26 @ 748,871: 20x13
+#27 @ 784,338: 25x25
+#28 @ 966,669: 20x20
+#29 @ 589,833: 22x25
+#30 @ 489,489: 16x24
+#31 @ 976,478: 4x4
+#32 @ 739,826: 13x15
+#33 @ 783,753: 21x17
+#34 @ 433,367: 22x11
+#35 @ 32,841: 10x20
+#36 @ 258,497: 26x28
+#37 @ 632,776: 18x25
+#38 @ 517,389: 20x14
+#39 @ 446,740: 19x26
+#40 @ 667,455: 15x14
+#41 @ 664,252: 25x26
+#42 @ 227,45: 29x21
+#43 @ 127,138: 29x27
+#44 @ 466,308: 19x17
+#45 @ 356,134: 12x19
+#46 @ 609,640: 28x24
+#47 @ 677,228: 16x27
+#48 @ 149,610: 10x28
+#49 @ 863,498: 21x28
+#50 @ 913,511: 12x27
+#51 @ 748,761: 24x11
+#52 @ 802,288: 10x22
+#53 @ 26,442: 29x20
+#54 @ 85,464: 20x21
+#55 @ 262,944: 21x18
+#56 @ 876,753: 15x10
+#57 @ 105,199: 23x19
+#58 @ 335,848: 23x24
+#59 @ 467,537: 24x22
+#60 @ 552,217: 14x13
+#61 @ 534,820: 10x19
+#62 @ 261,579: 25x13
+#63 @ 541,445: 19x17
+#64 @ 869,769: 28x11
+#65 @ 447,668: 25x26
+#66 @ 42,734: 18x16
+#67 @ 553,233: 13x13
+#68 @ 47,861: 12x16
+#69 @ 33,834: 21x14
+#70 @ 240,174: 29x13
+#71 @ 611,362: 24x14
+#72 @ 899,371: 21x21
+#73 @ 340,5: 23x23
+#74 @ 69,246: 14x18
+#75 @ 432,558: 11x10
+#76 @ 737,175: 27x20
+#77 @ 623,365: 15x22
+#78 @ 666,453: 26x28
+#79 @ 368,774: 25x10
+#80 @ 923,879: 18x16
+#81 @ 37,315: 16x23
+#82 @ 119,279: 18x26
+#83 @ 928,850: 20x18
+#84 @ 896,902: 18x16
+#85 @ 332,590: 28x13
+#86 @ 902,815: 27x21
+#87 @ 215,508: 19x12
+#88 @ 981,57: 10x15
+#89 @ 706,393: 21x24
+#90 @ 975,369: 10x11
+#91 @ 635,845: 29x18
+#92 @ 831,543: 15x16
+#93 @ 296,865: 19x10
+#94 @ 889,189: 24x19
+#95 @ 59,749: 11x22
+#96 @ 739,946: 24x27
+#97 @ 536,759: 27x29
+#98 @ 982,234: 17x11
+#99 @ 639,615: 26x25
+#100 @ 867,397: 26x29
+#101 @ 881,784: 19x19
+#102 @ 215,912: 22x28
+#103 @ 127,336: 10x15
+#104 @ 313,729: 15x12
+#105 @ 695,74: 17x28
+#106 @ 748,187: 11x16
+#107 @ 809,2: 16x27
+#108 @ 891,192: 17x18
+#109 @ 72,920: 16x20
+#110 @ 41,967: 22x28
+#111 @ 91,733: 22x20
+#112 @ 464,641: 13x13
+#113 @ 464,860: 17x10
+#114 @ 623,106: 13x28
+#115 @ 358,85: 24x21
+#116 @ 774,944: 19x28
+#117 @ 752,587: 11x20
+#118 @ 635,103: 25x11
+#119 @ 498,36: 17x11
+#120 @ 227,659: 15x13
+#121 @ 924,553: 13x13
+#122 @ 775,297: 23x24
+#123 @ 479,866: 10x11
+#124 @ 387,798: 11x28
+#125 @ 526,847: 19x27
+#126 @ 747,861: 11x25
+#127 @ 789,652: 14x10
+#128 @ 419,7: 17x13
+#129 @ 356,142: 26x10
+#130 @ 436,239: 14x27
+#131 @ 555,710: 14x23
+#132 @ 871,447: 13x27
+#133 @ 473,730: 14x14
+#134 @ 558,170: 16x18
+#135 @ 888,882: 29x25
+#136 @ 834,147: 24x18
+#137 @ 721,467: 28x12
+#138 @ 223,105: 28x26
+#139 @ 285,326: 28x23
+#140 @ 584,300: 3x6
+#141 @ 710,754: 23x21
+#142 @ 283,892: 21x14
+#143 @ 448,894: 18x3
+#144 @ 380,479: 16x15
+#145 @ 703,57: 16x20
+#146 @ 692,448: 24x11
+#147 @ 926,350: 20x26
+#148 @ 167,528: 25x12
+#149 @ 444,722: 28x21
+#150 @ 166,183: 15x18
+#151 @ 546,472: 29x18
+#152 @ 532,900: 12x22
+#153 @ 215,490: 29x20
+#154 @ 678,458: 25x23
+#155 @ 601,462: 24x11
+#156 @ 484,514: 12x11
+#157 @ 863,763: 10x18
+#158 @ 653,452: 16x23
+#159 @ 464,302: 13x21
+#160 @ 868,65: 21x18
+#161 @ 227,824: 20x11
+#162 @ 111,629: 29x19
+#163 @ 55,554: 27x21
+#164 @ 0,757: 21x17
+#165 @ 418,861: 13x16
+#166 @ 932,903: 12x16
+#167 @ 429,772: 11x14
+#168 @ 706,805: 11x23
+#169 @ 487,24: 26x15
+#170 @ 806,900: 16x16
+#171 @ 580,719: 24x22
+#172 @ 458,481: 20x17
+#173 @ 343,488: 18x11
+#174 @ 734,342: 12x27
+#175 @ 320,439: 4x3
+#176 @ 446,635: 26x25
+#177 @ 552,683: 11x23
+#178 @ 181,168: 26x24
+#179 @ 851,583: 27x28
+#180 @ 879,363: 10x11
+#181 @ 884,139: 11x21
+#182 @ 912,88: 24x27
+#183 @ 52,35: 22x18
+#184 @ 657,705: 11x14
+#185 @ 370,777: 11x17
+#186 @ 801,354: 21x24
+#187 @ 773,546: 16x20
+#188 @ 888,322: 19x11
+#189 @ 807,788: 27x13
+#190 @ 465,956: 19x29
+#191 @ 369,770: 13x21
+#192 @ 311,137: 12x14
+#193 @ 148,150: 19x29
+#194 @ 389,613: 28x25
+#195 @ 429,373: 10x25
+#196 @ 892,148: 20x15
+#197 @ 890,271: 11x19
+#198 @ 58,861: 18x19
+#199 @ 449,255: 9x5
+#200 @ 257,887: 27x15
+#201 @ 383,616: 20x18
+#202 @ 663,657: 18x21
+#203 @ 331,648: 25x13
+#204 @ 509,53: 10x28
+#205 @ 86,287: 15x20
+#206 @ 753,190: 20x20
+#207 @ 922,527: 19x12
+#208 @ 132,948: 20x26
+#209 @ 883,786: 15x21
+#210 @ 117,592: 27x15
+#211 @ 960,611: 13x22
+#212 @ 829,769: 14x19
+#213 @ 669,686: 17x13
+#214 @ 276,787: 27x10
+#215 @ 619,909: 18x22
+#216 @ 418,209: 21x25
+#217 @ 231,831: 27x18
+#218 @ 336,538: 22x18
+#219 @ 180,783: 14x23
+#220 @ 609,263: 22x10
+#221 @ 360,982: 21x16
+#222 @ 775,813: 14x26
+#223 @ 906,198: 10x24
+#224 @ 937,144: 28x28
+#225 @ 475,903: 24x12
+#226 @ 887,149: 11x16
+#227 @ 927,259: 20x25
+#228 @ 71,862: 29x26
+#229 @ 136,954: 26x17
+#230 @ 721,827: 15x13
+#231 @ 769,931: 21x25
+#232 @ 728,119: 13x28
+#233 @ 654,942: 13x27
+#234 @ 434,737: 18x13
+#235 @ 672,331: 27x20
+#236 @ 816,17: 25x21
+#237 @ 251,781: 28x20
+#238 @ 342,209: 16x10
+#239 @ 581,434: 23x22
+#240 @ 782,100: 14x11
+#241 @ 878,831: 14x12
+#242 @ 667,233: 19x28
+#243 @ 237,650: 28x24
+#244 @ 425,738: 11x15
+#245 @ 936,470: 23x23
+#246 @ 68,321: 21x19
+#247 @ 356,539: 27x29
+#248 @ 945,353: 18x23
+#249 @ 906,933: 22x28
+#250 @ 360,812: 10x29
+#251 @ 884,774: 17x27
+#252 @ 413,769: 23x20
+#253 @ 594,75: 21x15
+#254 @ 676,702: 15x11
+#255 @ 233,529: 27x25
+#256 @ 173,236: 15x17
+#257 @ 907,949: 16x13
+#258 @ 809,570: 24x10
+#259 @ 67,678: 29x22
+#260 @ 176,951: 25x18
+#261 @ 754,625: 10x18
+#262 @ 142,270: 26x29
+#263 @ 558,673: 24x19
+#264 @ 224,27: 24x14
+#265 @ 725,829: 7x6
+#266 @ 703,941: 9x3
+#267 @ 880,864: 28x27
+#268 @ 727,445: 25x24
+#269 @ 747,520: 17x15
+#270 @ 850,410: 26x21
+#271 @ 363,964: 10x16
+#272 @ 752,721: 23x16
+#273 @ 295,351: 26x20
+#274 @ 899,877: 26x16
+#275 @ 95,804: 20x28
+#276 @ 543,866: 20x16
+#277 @ 917,887: 19x27
+#278 @ 449,474: 16x22
+#279 @ 673,459: 28x23
+#280 @ 971,786: 13x17
+#281 @ 42,176: 21x18
+#282 @ 531,886: 15x13
+#283 @ 679,438: 15x22
+#284 @ 161,659: 19x25
+#285 @ 838,148: 15x23
+#286 @ 496,732: 26x14
+#287 @ 482,256: 19x26
+#288 @ 389,941: 27x25
+#289 @ 352,255: 23x15
+#290 @ 825,688: 25x24
+#291 @ 894,313: 23x20
+#292 @ 906,553: 21x17
+#293 @ 293,130: 21x13
+#294 @ 549,80: 25x18
+#295 @ 85,871: 20x10
+#296 @ 876,734: 20x24
+#297 @ 831,935: 14x17
+#298 @ 618,819: 23x20
+#299 @ 750,70: 24x14
+#300 @ 749,711: 22x17
+#301 @ 555,801: 17x12
+#302 @ 544,64: 28x21
+#303 @ 114,413: 21x22
+#304 @ 215,526: 13x21
+#305 @ 147,31: 25x12
+#306 @ 679,427: 18x17
+#307 @ 634,930: 23x24
+#308 @ 41,419: 21x28
+#309 @ 892,162: 18x24
+#310 @ 812,886: 19x14
+#311 @ 440,700: 28x13
+#312 @ 586,832: 28x21
+#313 @ 255,687: 13x22
+#314 @ 945,879: 22x16
+#315 @ 480,731: 18x11
+#316 @ 738,731: 15x10
+#317 @ 528,621: 11x16
+#318 @ 243,787: 28x26
+#319 @ 512,493: 22x13
+#320 @ 762,692: 27x11
+#321 @ 316,57: 12x14
+#322 @ 410,860: 17x12
+#323 @ 772,591: 14x24
+#324 @ 813,221: 13x11
+#325 @ 161,271: 12x14
+#326 @ 520,597: 26x19
+#327 @ 577,129: 25x20
+#328 @ 448,31: 10x15
+#329 @ 594,33: 16x27
+#330 @ 170,498: 25x19
+#331 @ 882,833: 6x4
+#332 @ 190,548: 12x26
+#333 @ 639,879: 28x25
+#334 @ 473,817: 19x26
+#335 @ 543,458: 11x23
+#336 @ 676,657: 26x25
+#337 @ 786,353: 28x17
+#338 @ 873,508: 14x17
+#339 @ 208,782: 17x27
+#340 @ 392,542: 10x26
+#341 @ 672,650: 29x23
+#342 @ 446,637: 20x18
+#343 @ 534,58: 16x15
+#344 @ 696,760: 23x17
+#345 @ 265,767: 18x15
+#346 @ 105,750: 12x16
+#347 @ 731,438: 28x10
+#348 @ 535,833: 24x21
+#349 @ 72,531: 18x28
+#350 @ 640,734: 27x21
+#351 @ 156,265: 15x16
+#352 @ 227,299: 24x22
+#353 @ 552,492: 11x29
+#354 @ 605,95: 14x20
+#355 @ 665,490: 11x25
+#356 @ 456,289: 25x12
+#357 @ 876,516: 13x18
+#358 @ 26,163: 20x28
+#359 @ 228,769: 19x11
+#360 @ 766,766: 16x12
+#361 @ 167,654: 13x28
+#362 @ 728,185: 20x25
+#363 @ 321,340: 23x20
+#364 @ 327,175: 18x14
+#365 @ 83,860: 10x19
+#366 @ 361,177: 20x24
+#367 @ 282,505: 18x16
+#368 @ 780,44: 29x28
+#369 @ 854,406: 15x25
+#370 @ 142,928: 10x19
+#371 @ 114,594: 11x20
+#372 @ 775,78: 26x24
+#373 @ 264,791: 28x12
+#374 @ 789,217: 24x20
+#375 @ 931,559: 19x22
+#376 @ 523,549: 22x20
+#377 @ 744,356: 23x24
+#378 @ 630,746: 25x11
+#379 @ 339,201: 11x28
+#380 @ 777,698: 25x14
+#381 @ 198,933: 29x21
+#382 @ 222,919: 27x25
+#383 @ 356,648: 16x19
+#384 @ 237,915: 10x12
+#385 @ 10,864: 17x26
+#386 @ 494,808: 29x23
+#387 @ 440,547: 24x25
+#388 @ 688,247: 10x16
+#389 @ 95,580: 16x19
+#390 @ 374,8: 12x27
+#391 @ 287,332: 20x26
+#392 @ 453,940: 24x22
+#393 @ 344,878: 10x22
+#394 @ 541,277: 16x18
+#395 @ 965,360: 24x12
+#396 @ 280,878: 21x20
+#397 @ 680,384: 25x19
+#398 @ 670,76: 12x12
+#399 @ 540,457: 18x20
+#400 @ 524,406: 17x16
+#401 @ 625,272: 25x22
+#402 @ 100,906: 26x12
+#403 @ 281,871: 7x10
+#404 @ 275,849: 21x26
+#405 @ 357,559: 13x13
+#406 @ 918,753: 25x21
+#407 @ 270,837: 25x17
+#408 @ 780,84: 20x20
+#409 @ 503,893: 11x13
+#410 @ 154,609: 12x23
+#411 @ 871,739: 21x22
+#412 @ 529,698: 27x27
+#413 @ 376,844: 14x23
+#414 @ 498,876: 13x21
+#415 @ 893,958: 15x27
+#416 @ 635,498: 20x20
+#417 @ 571,884: 24x21
+#418 @ 336,586: 24x24
+#419 @ 0,206: 29x16
+#420 @ 655,64: 24x11
+#421 @ 436,648: 28x16
+#422 @ 952,593: 17x11
+#423 @ 643,6: 17x18
+#424 @ 224,166: 29x11
+#425 @ 818,905: 15x14
+#426 @ 18,863: 18x11
+#427 @ 497,902: 15x10
+#428 @ 564,545: 16x29
+#429 @ 657,446: 18x20
+#430 @ 245,25: 17x11
+#431 @ 936,346: 23x24
+#432 @ 127,152: 24x19
+#433 @ 563,928: 19x27
+#434 @ 684,407: 27x13
+#435 @ 737,584: 15x15
+#436 @ 644,837: 16x14
+#437 @ 702,978: 20x15
+#438 @ 422,65: 11x16
+#439 @ 121,142: 13x20
+#440 @ 68,437: 19x16
+#441 @ 121,382: 24x28
+#442 @ 805,910: 29x14
+#443 @ 795,432: 21x20
+#444 @ 269,735: 25x22
+#445 @ 226,877: 11x17
+#446 @ 550,450: 29x18
+#447 @ 606,726: 14x25
+#448 @ 46,546: 10x19
+#449 @ 320,95: 11x25
+#450 @ 935,419: 12x15
+#451 @ 453,862: 13x16
+#452 @ 315,500: 23x12
+#453 @ 181,127: 17x18
+#454 @ 243,907: 19x13
+#455 @ 263,960: 29x22
+#456 @ 509,159: 14x17
+#457 @ 486,810: 23x21
+#458 @ 560,945: 25x13
+#459 @ 6,400: 24x28
+#460 @ 368,783: 17x23
+#461 @ 75,792: 26x29
+#462 @ 543,395: 22x23
+#463 @ 47,464: 19x10
+#464 @ 342,494: 27x24
+#465 @ 911,861: 19x25
+#466 @ 94,272: 23x23
+#467 @ 420,516: 15x26
+#468 @ 146,233: 20x27
+#469 @ 201,907: 10x23
+#470 @ 446,887: 23x16
+#471 @ 468,702: 14x27
+#472 @ 799,865: 23x25
+#473 @ 451,242: 27x20
+#474 @ 915,801: 28x27
+#475 @ 471,445: 23x16
+#476 @ 381,751: 26x28
+#477 @ 903,539: 23x21
+#478 @ 621,280: 13x26
+#479 @ 658,132: 27x19
+#480 @ 136,639: 22x26
+#481 @ 24,185: 22x23
+#482 @ 732,779: 25x25
+#483 @ 760,858: 20x22
+#484 @ 24,408: 26x19
+#485 @ 457,627: 20x16
+#486 @ 353,284: 20x10
+#487 @ 920,899: 10x3
+#488 @ 436,694: 11x17
+#489 @ 849,162: 17x16
+#490 @ 786,236: 27x20
+#491 @ 709,245: 11x28
+#492 @ 462,389: 13x17
+#493 @ 738,88: 27x21
+#494 @ 111,617: 24x24
+#495 @ 896,764: 11x23
+#496 @ 473,321: 23x16
+#497 @ 589,67: 17x16
+#498 @ 183,298: 18x17
+#499 @ 557,675: 10x11
+#500 @ 875,298: 21x17
+#501 @ 128,420: 18x25
+#502 @ 158,17: 27x26
+#503 @ 966,380: 13x29
+#504 @ 571,449: 15x28
+#505 @ 968,404: 12x27
+#506 @ 722,350: 10x24
+#507 @ 247,595: 17x25
+#508 @ 65,734: 22x21
+#509 @ 411,715: 25x12
+#510 @ 123,742: 15x12
+#511 @ 439,687: 19x12
+#512 @ 829,932: 12x13
+#513 @ 893,146: 23x19
+#514 @ 861,131: 15x23
+#515 @ 551,85: 20x7
+#516 @ 957,437: 22x17
+#517 @ 777,65: 22x24
+#518 @ 638,851: 24x21
+#519 @ 116,492: 12x29
+#520 @ 187,785: 3x18
+#521 @ 791,56: 17x27
+#522 @ 406,108: 28x28
+#523 @ 695,252: 21x16
+#524 @ 498,247: 24x17
+#525 @ 301,235: 19x27
+#526 @ 14,173: 13x10
+#527 @ 116,587: 11x29
+#528 @ 170,247: 18x22
+#529 @ 714,745: 20x23
+#530 @ 682,474: 27x19
+#531 @ 838,605: 23x22
+#532 @ 684,330: 20x18
+#533 @ 754,852: 27x25
+#534 @ 885,197: 24x26
+#535 @ 97,256: 16x18
+#536 @ 604,669: 20x19
+#537 @ 612,14: 18x29
+#538 @ 278,738: 8x14
+#539 @ 102,976: 13x15
+#540 @ 50,860: 16x12
+#541 @ 574,411: 16x22
+#542 @ 124,894: 26x20
+#543 @ 848,521: 25x25
+#544 @ 271,287: 25x27
+#545 @ 253,656: 21x16
+#546 @ 547,979: 18x11
+#547 @ 444,332: 12x26
+#548 @ 106,753: 15x16
+#549 @ 886,615: 14x15
+#550 @ 549,216: 27x24
+#551 @ 481,720: 23x13
+#552 @ 505,7: 17x22
+#553 @ 539,106: 28x27
+#554 @ 395,174: 24x12
+#555 @ 547,490: 10x22
+#556 @ 950,79: 21x12
+#557 @ 529,817: 12x23
+#558 @ 40,270: 19x24
+#559 @ 556,127: 25x14
+#560 @ 407,39: 16x26
+#561 @ 130,852: 29x14
+#562 @ 144,368: 27x22
+#563 @ 980,174: 18x22
+#564 @ 285,98: 16x24
+#565 @ 648,686: 16x26
+#566 @ 361,487: 21x16
+#567 @ 471,380: 23x14
+#568 @ 167,331: 23x25
+#569 @ 768,773: 14x16
+#570 @ 328,13: 29x15
+#571 @ 444,697: 14x17
+#572 @ 215,301: 27x27
+#573 @ 238,207: 23x14
+#574 @ 252,346: 21x20
+#575 @ 910,272: 11x18
+#576 @ 751,833: 18x13
+#577 @ 781,221: 10x17
+#578 @ 538,775: 14x26
+#579 @ 982,705: 11x21
+#580 @ 205,805: 25x27
+#581 @ 948,713: 21x12
+#582 @ 647,249: 11x20
+#583 @ 841,156: 19x21
+#584 @ 401,835: 13x28
+#585 @ 637,819: 24x12
+#586 @ 286,241: 19x23
+#587 @ 661,878: 15x24
+#588 @ 115,774: 19x14
+#589 @ 353,655: 22x14
+#590 @ 838,616: 25x23
+#591 @ 573,395: 28x27
+#592 @ 321,67: 26x13
+#593 @ 371,931: 17x19
+#594 @ 765,719: 24x10
+#595 @ 595,574: 21x21
+#596 @ 346,497: 10x16
+#597 @ 67,869: 16x19
+#598 @ 133,284: 10x25
+#599 @ 464,174: 20x25
+#600 @ 613,82: 29x28
+#601 @ 98,519: 27x12
+#602 @ 896,934: 14x17
+#603 @ 645,205: 23x23
+#604 @ 810,96: 9x15
+#605 @ 91,464: 14x23
+#606 @ 798,67: 18x21
+#607 @ 560,243: 27x20
+#608 @ 486,52: 14x12
+#609 @ 623,174: 11x20
+#610 @ 203,404: 10x14
+#611 @ 927,293: 12x10
+#612 @ 457,860: 26x14
+#613 @ 690,648: 13x15
+#614 @ 673,615: 23x22
+#615 @ 399,718: 16x14
+#616 @ 309,695: 23x17
+#617 @ 881,450: 10x24
+#618 @ 879,295: 12x29
+#619 @ 914,865: 5x4
+#620 @ 692,653: 28x26
+#621 @ 468,183: 19x11
+#622 @ 487,258: 13x25
+#623 @ 458,724: 13x16
+#624 @ 793,416: 28x23
+#625 @ 804,843: 28x13
+#626 @ 345,711: 15x20
+#627 @ 679,461: 28x23
+#628 @ 652,655: 20x20
+#629 @ 330,343: 12x13
+#630 @ 919,801: 16x11
+#631 @ 974,473: 10x28
+#632 @ 112,537: 11x18
+#633 @ 680,494: 23x25
+#634 @ 307,283: 16x28
+#635 @ 904,314: 11x25
+#636 @ 718,778: 12x22
+#637 @ 30,550: 23x25
+#638 @ 146,964: 14x18
+#639 @ 167,242: 28x19
+#640 @ 228,443: 17x15
+#641 @ 914,547: 10x15
+#642 @ 931,708: 23x23
+#643 @ 105,180: 16x10
+#644 @ 455,283: 14x16
+#645 @ 491,723: 28x17
+#646 @ 618,6: 17x27
+#647 @ 635,361: 24x25
+#648 @ 883,585: 26x16
+#649 @ 131,346: 17x26
+#650 @ 78,25: 22x12
+#651 @ 611,643: 28x22
+#652 @ 647,114: 15x23
+#653 @ 229,550: 21x28
+#654 @ 190,124: 15x14
+#655 @ 903,330: 13x16
+#656 @ 750,722: 20x19
+#657 @ 26,456: 25x13
+#658 @ 414,283: 16x16
+#659 @ 940,221: 28x25
+#660 @ 585,932: 20x18
+#661 @ 96,398: 20x17
+#662 @ 371,915: 12x19
+#663 @ 819,706: 22x25
+#664 @ 347,500: 15x9
+#665 @ 275,85: 24x10
+#666 @ 435,743: 26x26
+#667 @ 535,568: 22x20
+#668 @ 46,389: 17x25
+#669 @ 584,880: 24x18
+#670 @ 630,266: 18x18
+#671 @ 431,377: 26x14
+#672 @ 559,677: 4x3
+#673 @ 701,439: 16x14
+#674 @ 829,446: 20x11
+#675 @ 555,565: 20x13
+#676 @ 917,846: 14x17
+#677 @ 593,676: 18x16
+#678 @ 542,798: 20x19
+#679 @ 6,372: 24x29
+#680 @ 578,809: 24x24
+#681 @ 64,522: 11x4
+#682 @ 591,896: 13x26
+#683 @ 932,572: 11x25
+#684 @ 867,131: 27x19
+#685 @ 495,889: 23x22
+#686 @ 367,827: 21x13
+#687 @ 232,45: 18x28
+#688 @ 704,711: 11x27
+#689 @ 309,517: 23x13
+#690 @ 429,199: 17x11
+#691 @ 717,52: 20x15
+#692 @ 912,877: 27x25
+#693 @ 447,764: 16x11
+#694 @ 799,769: 28x22
+#695 @ 361,912: 27x26
+#696 @ 891,829: 10x28
+#697 @ 233,895: 20x23
+#698 @ 806,276: 16x13
+#699 @ 377,966: 21x18
+#700 @ 792,875: 20x22
+#701 @ 255,807: 18x19
+#702 @ 634,238: 15x26
+#703 @ 492,519: 13x24
+#704 @ 953,632: 19x26
+#705 @ 684,587: 10x17
+#706 @ 391,424: 16x17
+#707 @ 654,158: 14x27
+#708 @ 118,638: 23x11
+#709 @ 302,282: 17x13
+#710 @ 662,54: 14x19
+#711 @ 909,835: 14x23
+#712 @ 558,971: 18x11
+#713 @ 90,774: 11x28
+#714 @ 745,346: 15x11
+#715 @ 488,860: 22x14
+#716 @ 848,568: 26x23
+#717 @ 6,625: 28x25
+#718 @ 34,388: 15x18
+#719 @ 965,778: 23x24
+#720 @ 103,500: 20x18
+#721 @ 506,222: 29x17
+#722 @ 226,197: 24x25
+#723 @ 129,939: 15x25
+#724 @ 140,644: 11x18
+#725 @ 905,904: 20x25
+#726 @ 423,276: 13x12
+#727 @ 62,511: 17x24
+#728 @ 932,814: 19x26
+#729 @ 9,810: 11x26
+#730 @ 32,624: 16x20
+#731 @ 967,236: 28x18
+#732 @ 616,948: 27x12
+#733 @ 714,733: 15x17
+#734 @ 277,783: 25x24
+#735 @ 482,675: 16x12
+#736 @ 862,11: 19x26
+#737 @ 667,668: 27x15
+#738 @ 131,406: 13x28
+#739 @ 707,788: 26x27
+#740 @ 859,505: 21x21
+#741 @ 968,785: 4x6
+#742 @ 813,939: 11x27
+#743 @ 611,781: 28x17
+#744 @ 298,82: 28x27
+#745 @ 352,828: 16x27
+#746 @ 920,831: 20x23
+#747 @ 967,694: 19x29
+#748 @ 370,50: 25x18
+#749 @ 545,724: 13x16
+#750 @ 102,391: 13x22
+#751 @ 904,122: 22x19
+#752 @ 118,439: 23x10
+#753 @ 793,859: 23x27
+#754 @ 722,798: 27x29
+#755 @ 97,774: 24x10
+#756 @ 326,707: 26x14
+#757 @ 559,909: 28x14
+#758 @ 33,822: 29x21
+#759 @ 508,227: 24x7
+#760 @ 115,427: 26x16
+#761 @ 665,766: 27x25
+#762 @ 303,847: 19x28
+#763 @ 157,535: 19x12
+#764 @ 968,680: 18x10
+#765 @ 668,464: 20x9
+#766 @ 114,534: 27x10
+#767 @ 841,609: 17x21
+#768 @ 972,671: 20x13
+#769 @ 490,506: 27x18
+#770 @ 0,407: 13x26
+#771 @ 626,219: 11x14
+#772 @ 174,512: 12x24
+#773 @ 162,251: 10x18
+#774 @ 612,206: 11x25
+#775 @ 97,517: 11x10
+#776 @ 31,916: 11x17
+#777 @ 261,148: 17x16
+#778 @ 815,577: 26x24
+#779 @ 545,521: 29x23
+#780 @ 842,800: 25x23
+#781 @ 391,437: 23x20
+#782 @ 333,886: 20x14
+#783 @ 109,171: 11x14
+#784 @ 344,483: 28x16
+#785 @ 581,195: 15x24
+#786 @ 608,372: 12x13
+#787 @ 740,279: 14x18
+#788 @ 653,626: 27x22
+#789 @ 308,182: 24x20
+#790 @ 899,219: 16x12
+#791 @ 515,556: 21x11
+#792 @ 171,0: 18x29
+#793 @ 204,304: 27x14
+#794 @ 488,289: 25x25
+#795 @ 479,382: 14x18
+#796 @ 626,889: 25x11
+#797 @ 604,948: 16x10
+#798 @ 182,277: 21x18
+#799 @ 623,205: 24x20
+#800 @ 720,654: 11x25
+#801 @ 731,103: 26x17
+#802 @ 829,581: 14x25
+#803 @ 431,738: 17x29
+#804 @ 524,620: 15x12
+#805 @ 512,539: 23x23
+#806 @ 829,943: 29x18
+#807 @ 93,176: 13x26
+#808 @ 883,796: 12x12
+#809 @ 214,543: 28x16
+#810 @ 518,231: 15x14
+#811 @ 213,502: 21x20
+#812 @ 255,598: 10x22
+#813 @ 352,477: 24x16
+#814 @ 664,653: 15x20
+#815 @ 741,338: 28x26
+#816 @ 361,174: 25x22
+#817 @ 101,582: 14x27
+#818 @ 237,103: 13x12
+#819 @ 814,157: 20x17
+#820 @ 182,216: 28x21
+#821 @ 194,282: 17x18
+#822 @ 247,657: 20x14
+#823 @ 0,647: 14x29
+#824 @ 899,959: 12x23
+#825 @ 151,90: 20x20
+#826 @ 341,562: 25x22
+#827 @ 895,137: 28x18
+#828 @ 853,703: 16x11
+#829 @ 8,934: 11x17
+#830 @ 395,528: 28x13
+#831 @ 874,122: 13x28
+#832 @ 605,187: 19x17
+#833 @ 684,219: 24x24
+#834 @ 382,885: 13x21
+#835 @ 751,858: 19x21
+#836 @ 518,38: 11x27
+#837 @ 812,383: 21x28
+#838 @ 904,886: 21x19
+#839 @ 356,751: 25x24
+#840 @ 586,554: 28x20
+#841 @ 98,582: 10x25
+#842 @ 438,552: 11x21
+#843 @ 231,601: 20x20
+#844 @ 906,176: 11x21
+#845 @ 237,52: 12x23
+#846 @ 81,19: 15x21
+#847 @ 600,731: 19x14
+#848 @ 553,43: 10x22
+#849 @ 703,825: 14x21
+#850 @ 193,283: 10x26
+#851 @ 73,407: 22x26
+#852 @ 226,602: 25x21
+#853 @ 515,223: 26x15
+#854 @ 95,363: 28x13
+#855 @ 927,2: 28x22
+#856 @ 457,470: 16x13
+#857 @ 67,23: 24x14
+#858 @ 435,244: 10x16
+#859 @ 640,450: 29x22
+#860 @ 385,778: 16x23
+#861 @ 734,157: 23x25
+#862 @ 516,727: 11x15
+#863 @ 488,733: 16x12
+#864 @ 83,719: 19x21
+#865 @ 530,287: 15x15
+#866 @ 729,671: 24x16
+#867 @ 240,320: 26x18
+#868 @ 311,583: 13x24
+#869 @ 224,956: 10x13
+#870 @ 662,482: 17x14
+#871 @ 533,896: 12x17
+#872 @ 844,440: 10x26
+#873 @ 104,625: 16x11
+#874 @ 632,431: 25x17
+#875 @ 735,292: 22x24
+#876 @ 74,625: 22x24
+#877 @ 752,738: 24x25
+#878 @ 599,594: 18x10
+#879 @ 220,951: 15x26
+#880 @ 339,67: 14x19
+#881 @ 856,704: 15x22
+#882 @ 829,158: 10x13
+#883 @ 823,838: 27x11
+#884 @ 368,952: 10x15
+#885 @ 32,281: 23x28
+#886 @ 700,84: 11x26
+#887 @ 800,342: 23x9
+#888 @ 392,728: 18x10
+#889 @ 488,802: 22x26
+#890 @ 206,785: 18x25
+#891 @ 411,294: 24x11
+#892 @ 566,932: 24x10
+#893 @ 529,409: 15x17
+#894 @ 477,549: 24x24
+#895 @ 816,957: 14x22
+#896 @ 256,719: 23x20
+#897 @ 860,304: 15x16
+#898 @ 881,268: 27x10
+#899 @ 470,387: 17x10
+#900 @ 173,25: 24x13
+#901 @ 144,28: 26x16
+#902 @ 685,372: 14x23
+#903 @ 695,681: 22x14
+#904 @ 748,874: 29x22
+#905 @ 897,765: 18x17
+#906 @ 880,756: 24x12
+#907 @ 627,112: 24x18
+#908 @ 655,479: 16x11
+#909 @ 392,560: 15x16
+#910 @ 61,740: 23x20
+#911 @ 696,232: 11x20
+#912 @ 452,30: 11x24
+#913 @ 581,289: 16x23
+#914 @ 786,561: 16x19
+#915 @ 774,346: 23x28
+#916 @ 537,171: 25x11
+#917 @ 326,723: 11x27
+#918 @ 224,914: 17x16
+#919 @ 906,176: 25x18
+#920 @ 878,572: 27x25
+#921 @ 391,561: 19x27
+#922 @ 715,976: 19x12
+#923 @ 275,748: 23x19
+#924 @ 381,802: 10x14
+#925 @ 940,217: 24x23
+#926 @ 741,53: 27x15
+#927 @ 104,445: 16x18
+#928 @ 519,127: 27x20
+#929 @ 445,598: 23x21
+#930 @ 126,601: 29x13
+#931 @ 658,225: 24x19
+#932 @ 920,952: 26x23
+#933 @ 110,776: 16x14
+#934 @ 896,945: 24x14
+#935 @ 733,125: 11x17
+#936 @ 849,555: 23x17
+#937 @ 376,546: 24x18
+#938 @ 153,930: 24x24
+#939 @ 470,855: 22x21
+#940 @ 45,321: 27x10
+#941 @ 773,553: 26x14
+#942 @ 749,180: 12x14
+#943 @ 736,631: 28x26
+#944 @ 737,871: 11x14
+#945 @ 447,253: 14x11
+#946 @ 825,628: 27x26
+#947 @ 749,435: 11x20
+#948 @ 919,271: 10x14
+#949 @ 556,558: 10x14
+#950 @ 258,595: 14x28
+#951 @ 324,858: 12x15
+#952 @ 54,735: 24x20
+#953 @ 718,354: 25x10
+#954 @ 954,20: 22x17
+#955 @ 625,176: 15x28
+#956 @ 828,374: 26x14
+#957 @ 946,677: 29x25
+#958 @ 94,678: 12x26
+#959 @ 657,251: 16x22
+#960 @ 537,124: 26x14
+#961 @ 893,609: 14x11
+#962 @ 131,596: 12x13
+#963 @ 436,44: 18x17
+#964 @ 359,651: 18x21
+#965 @ 427,288: 29x14
+#966 @ 521,545: 13x22
+#967 @ 558,231: 17x28
+#968 @ 179,334: 26x28
+#969 @ 801,166: 20x29
+#970 @ 542,41: 25x27
+#971 @ 545,606: 24x29
+#972 @ 278,868: 20x17
+#973 @ 46,956: 16x25
+#974 @ 62,784: 26x15
+#975 @ 346,55: 13x26
+#976 @ 772,213: 22x28
+#977 @ 581,146: 29x17
+#978 @ 283,845: 16x13
+#979 @ 961,683: 19x13
+#980 @ 968,686: 25x17
+#981 @ 637,18: 29x22
+#982 @ 558,932: 24x10
+#983 @ 376,193: 26x10
+#984 @ 884,430: 15x10
+#985 @ 317,13: 21x18
+#986 @ 568,56: 28x13
+#987 @ 661,718: 25x15
+#988 @ 715,672: 20x20
+#989 @ 861,782: 17x26
+#990 @ 455,852: 12x25
+#991 @ 889,802: 17x11
+#992 @ 879,106: 25x23
+#993 @ 867,347: 15x21
+#994 @ 924,422: 18x10
+#995 @ 814,942: 18x29
+#996 @ 84,858: 12x22
+#997 @ 581,427: 28x24
+#998 @ 247,182: 27x21
+#999 @ 971,182: 23x21
+#1000 @ 978,776: 11x17
+#1001 @ 1,786: 13x26
+#1002 @ 977,224: 20x25
+#1003 @ 576,413: 12x12
+#1004 @ 892,182: 23x11
+#1005 @ 680,350: 26x15
+#1006 @ 489,881: 21x15
+#1007 @ 900,891: 21x17
+#1008 @ 591,883: 12x22
+#1009 @ 826,602: 14x24
+#1010 @ 366,486: 23x22
+#1011 @ 711,115: 19x19
+#1012 @ 707,116: 27x10
+#1013 @ 826,817: 27x19
+#1014 @ 315,770: 14x11
+#1015 @ 296,676: 21x26
+#1016 @ 713,373: 19x18
+#1017 @ 7,925: 28x26
+#1018 @ 821,893: 26x19
+#1019 @ 679,85: 28x11
+#1020 @ 2,802: 27x12
+#1021 @ 335,491: 27x22
+#1022 @ 299,337: 12x21
+#1023 @ 804,708: 20x18
+#1024 @ 903,888: 26x19
+#1025 @ 264,744: 29x26
+#1026 @ 813,823: 18x29
+#1027 @ 757,36: 12x18
+#1028 @ 589,217: 14x29
+#1029 @ 761,553: 16x15
+#1030 @ 632,430: 10x13
+#1031 @ 855,795: 28x27
+#1032 @ 93,625: 15x26
+#1033 @ 139,934: 19x20
+#1034 @ 561,850: 12x17
+#1035 @ 834,159: 23x13
+#1036 @ 479,845: 29x16
+#1037 @ 767,935: 10x29
+#1038 @ 506,816: 18x17
+#1039 @ 670,548: 25x22
+#1040 @ 415,58: 14x27
+#1041 @ 943,188: 12x26
+#1042 @ 7,381: 22x17
+#1043 @ 674,568: 12x17
+#1044 @ 410,2: 12x10
+#1045 @ 685,688: 13x23
+#1046 @ 609,566: 18x10
+#1047 @ 484,48: 29x22
+#1048 @ 676,659: 27x14
+#1049 @ 0,812: 12x28
+#1050 @ 282,572: 20x23
+#1051 @ 898,860: 17x25
+#1052 @ 892,949: 14x20
+#1053 @ 580,906: 14x16
+#1054 @ 65,234: 20x19
+#1055 @ 856,479: 10x24
+#1056 @ 475,143: 13x13
+#1057 @ 822,556: 14x27
+#1058 @ 970,678: 22x16
+#1059 @ 488,191: 19x10
+#1060 @ 843,298: 23x10
+#1061 @ 686,225: 17x12
+#1062 @ 224,784: 24x19
+#1063 @ 104,978: 6x10
+#1064 @ 809,756: 29x23
+#1065 @ 851,756: 28x21
+#1066 @ 144,943: 13x26
+#1067 @ 491,667: 10x27
+#1068 @ 383,574: 29x19
+#1069 @ 525,485: 13x11
+#1070 @ 494,721: 21x14
+#1071 @ 670,473: 16x16
+#1072 @ 923,103: 20x23
+#1073 @ 425,367: 27x11
+#1074 @ 975,667: 18x23
+#1075 @ 607,94: 16x25
+#1076 @ 29,617: 10x14
+#1077 @ 741,763: 27x15
+#1078 @ 907,281: 24x21
+#1079 @ 527,545: 21x24
+#1080 @ 751,599: 26x28
+#1081 @ 129,945: 10x28
+#1082 @ 545,718: 17x21
+#1083 @ 833,143: 14x23
+#1084 @ 678,337: 13x22
+#1085 @ 450,473: 10x20
+#1086 @ 883,388: 17x28
+#1087 @ 865,314: 16x21
+#1088 @ 861,408: 20x22
+#1089 @ 582,264: 15x26
+#1090 @ 612,913: 10x11
+#1091 @ 868,575: 11x15
+#1092 @ 854,596: 14x18
+#1093 @ 551,232: 22x24
+#1094 @ 675,898: 24x10
+#1095 @ 70,425: 12x16
+#1096 @ 325,763: 29x19
+#1097 @ 907,855: 16x21
+#1098 @ 770,817: 11x25
+#1099 @ 370,788: 20x22
+#1100 @ 883,426: 22x13
+#1101 @ 718,42: 10x23
+#1102 @ 670,568: 19x28
+#1103 @ 556,702: 23x27
+#1104 @ 224,245: 17x19
+#1105 @ 861,50: 18x25
+#1106 @ 840,622: 21x16
+#1107 @ 827,711: 13x21
+#1108 @ 211,46: 12x16
+#1109 @ 243,918: 19x19
+#1110 @ 855,323: 17x14
+#1111 @ 409,758: 27x24
+#1112 @ 337,193: 26x24
+#1113 @ 272,288: 12x26
+#1114 @ 197,340: 22x21
+#1115 @ 950,574: 16x21
+#1116 @ 311,508: 27x13
+#1117 @ 798,339: 29x17
+#1118 @ 892,173: 10x15
+#1119 @ 779,604: 11x12
+#1120 @ 225,818: 13x15
+#1121 @ 784,25: 19x11
+#1122 @ 88,25: 25x27
+#1123 @ 246,755: 25x28
+#1124 @ 239,175: 26x24
+#1125 @ 398,547: 18x23
+#1126 @ 756,193: 29x25
+#1127 @ 96,680: 4x20
+#1128 @ 916,826: 20x12
+#1129 @ 457,578: 29x29
+#1130 @ 91,576: 23x27
+#1131 @ 618,39: 29x18
+#1132 @ 621,960: 25x21
+#1133 @ 275,936: 14x27
+#1134 @ 130,144: 29x16
+#1135 @ 400,747: 15x29
+#1136 @ 619,221: 20x15
+#1137 @ 734,169: 17x11
+#1138 @ 359,635: 18x16
+#1139 @ 244,349: 29x22
+#1140 @ 202,270: 14x29
+#1141 @ 461,556: 29x28
+#1142 @ 503,155: 24x21
+#1143 @ 857,610: 18x15
+#1144 @ 660,592: 29x27
+#1145 @ 218,446: 12x13
+#1146 @ 149,850: 28x14
+#1147 @ 564,679: 16x11
+#1148 @ 709,112: 28x22
+#1149 @ 465,713: 17x19
+#1150 @ 36,827: 17x21
+#1151 @ 755,284: 14x29
+#1152 @ 313,74: 12x28
+#1153 @ 371,863: 25x26
+#1154 @ 908,817: 10x28
+#1155 @ 561,136: 17x13
+#1156 @ 449,55: 25x14
+#1157 @ 229,617: 18x11
+#1158 @ 841,529: 23x27
+#1159 @ 946,219: 4x17
+#1160 @ 255,612: 15x28
+#1161 @ 617,908: 28x23
+#1162 @ 830,821: 10x15
+#1163 @ 936,168: 15x27
+#1164 @ 275,84: 11x24
+#1165 @ 182,337: 22x18
+#1166 @ 722,642: 17x19
+#1167 @ 120,542: 20x22
+#1168 @ 377,916: 20x26
+#1169 @ 407,724: 25x10
+#1170 @ 380,470: 23x27
+#1171 @ 235,732: 28x15
+#1172 @ 485,445: 19x21
+#1173 @ 8,248: 11x10
+#1174 @ 96,594: 28x10
+#1175 @ 417,110: 13x17
+#1176 @ 316,128: 15x28
+#1177 @ 895,164: 11x10
+#1178 @ 720,148: 28x22
+#1179 @ 932,807: 13x25
+#1180 @ 615,487: 23x12
+#1181 @ 291,846: 21x21
+#1182 @ 931,467: 13x21
+#1183 @ 766,736: 27x13
+#1184 @ 345,728: 19x12
+#1185 @ 781,161: 17x27
+#1186 @ 262,891: 15x25
+#1187 @ 219,755: 12x20
+#1188 @ 681,109: 23x11
+#1189 @ 941,959: 29x16
+#1190 @ 800,13: 23x25
+#1191 @ 51,902: 28x24
+#1192 @ 261,704: 18x12
+#1193 @ 63,438: 20x17
+#1194 @ 428,339: 22x23
+#1195 @ 732,860: 18x25
+#1196 @ 132,750: 23x12
+#1197 @ 771,59: 26x18
+#1198 @ 19,322: 24x17
+#1199 @ 558,119: 11x22
+#1200 @ 213,33: 13x14
+#1201 @ 746,843: 13x12
+#1202 @ 607,223: 15x25
+#1203 @ 744,185: 13x16
+#1204 @ 896,863: 14x11
+#1205 @ 781,653: 20x16
+#1206 @ 519,411: 14x10
+#1207 @ 587,708: 27x14
+#1208 @ 353,41: 29x16
+#1209 @ 555,555: 14x11
+#1210 @ 408,553: 25x22
+#1211 @ 639,190: 27x29
+#1212 @ 149,88: 12x27
+#1213 @ 988,44: 10x20
+#1214 @ 617,812: 26x19
+#1215 @ 308,435: 25x12
+#1216 @ 629,405: 11x29
+#1217 @ 732,761: 11x25
+#1218 @ 802,229: 16x17
+#1219 @ 302,310: 28x26
+#1220 @ 918,368: 16x10
+#1221 @ 66,423: 12x16
+#1222 @ 917,267: 23x28
+#1223 @ 601,956: 3x10
+#1224 @ 653,919: 14x24
+#1225 @ 144,271: 20x16
+#1226 @ 508,421: 27x15
+#1227 @ 519,505: 18x11
+#1228 @ 530,385: 12x13
+#1229 @ 665,446: 18x16
+#1230 @ 520,399: 19x25
+#1231 @ 637,653: 22x29
+#1232 @ 583,956: 14x11
+#1233 @ 484,567: 23x21
+#1234 @ 216,301: 17x12
+#1235 @ 691,507: 12x17
+#1236 @ 854,476: 12x11
+#1237 @ 64,49: 11x16
+#1238 @ 863,564: 16x10
+#1239 @ 360,381: 16x17
+#1240 @ 925,888: 10x18
+#1241 @ 665,330: 12x18
+#1242 @ 228,601: 16x13
+#1243 @ 574,908: 17x13
+#1244 @ 597,953: 14x20
+#1245 @ 954,866: 17x19
+#1246 @ 791,870: 14x12
+#1247 @ 667,476: 13x28
+#1248 @ 662,488: 10x12
+#1249 @ 497,34: 10x27
+#1250 @ 110,132: 22x24
+#1251 @ 177,93: 4x11
+#1252 @ 721,114: 10x20
+#1253 @ 476,376: 21x27
+#1254 @ 384,888: 6x14
+#1255 @ 698,514: 16x26
+#1256 @ 779,308: 16x11
+#1257 @ 701,777: 26x22
+#1258 @ 933,733: 15x26
+#1259 @ 934,70: 24x26
+#1260 @ 72,787: 22x27
+#1261 @ 449,652: 18x15
+#1262 @ 425,558: 16x22
+#1263 @ 622,445: 15x16
+#1264 @ 157,175: 20x23
+#1265 @ 887,212: 21x21
+#1266 @ 514,490: 16x20
+#1267 @ 368,488: 4x6
+#1268 @ 797,41: 18x27
+#1269 @ 91,685: 22x23
+#1270 @ 277,115: 27x28
+#1271 @ 297,360: 27x20
+#1272 @ 195,559: 3x11
+#1273 @ 719,686: 23x10
+#1274 @ 397,818: 29x15
+#1275 @ 487,267: 27x10
+#1276 @ 711,388: 20x18
+#1277 @ 309,496: 27x27
+#1278 @ 414,173: 29x11
+#1279 @ 857,568: 12x18
+#1280 @ 165,155: 19x28
+#1281 @ 656,714: 12x26
+#1282 @ 255,921: 3x12
+#1283 @ 276,163: 12x14
+#1284 @ 634,812: 16x29
+#1285 @ 340,248: 23x23
+#1286 @ 193,268: 12x10
+#1287 @ 383,629: 21x26
+#1288 @ 933,297: 8x16
+#1289 @ 613,167: 13x25
+#1290 @ 852,118: 15x25
+#1291 @ 661,343: 11x20
+#1292 @ 827,119: 14x28
+#1293 @ 636,46: 27x11
+#1294 @ 629,202: 11x15
+#1295 @ 361,286: 18x23
+#1296 @ 539,925: 10x26
+#1297 @ 489,869: 15x18
+#1298 @ 415,45: 26x17
+#1299 @ 94,358: 20x17
+#1300 @ 413,552: 13x17
+#1301 @ 529,918: 16x24
+#1302 @ 400,808: 10x21
+#1303 @ 940,370: 21x27
+#1304 @ 813,185: 29x14
+#1305 @ 95,28: 24x11
+#1306 @ 249,327: 24x16
+#1307 @ 760,926: 26x12
+#1308 @ 732,957: 13x12
+#1309 @ 582,910: 13x13
+#1310 @ 0,162: 17x20
+#1311 @ 747,594: 10x11
+#1312 @ 712,513: 20x23
+#1313 @ 489,795: 26x29
+#1314 @ 474,335: 11x11
+#1315 @ 928,854: 27x16
+#1316 @ 7,377: 14x23
+#1317 @ 923,373: 20x22
+#1318 @ 411,954: 16x11
+#1319 @ 9,935: 20x14
+#1320 @ 887,848: 26x10
+#1321 @ 404,860: 11x11
+#1322 @ 475,281: 24x22
+#1323 @ 710,774: 21x22
+#1324 @ 794,158: 17x24
+#1325 @ 513,797: 25x28
+#1326 @ 707,755: 26x26
+#1327 @ 53,33: 29x24
+#1328 @ 506,184: 13x26
+#1329 @ 829,145: 20x10
+#1330 @ 891,774: 16x12
+#1331 @ 807,597: 26x27
+#1332 @ 375,313: 16x25
+#1333 @ 918,895: 16x11
+#1334 @ 884,128: 24x23
+#1335 @ 340,833: 25x24
+#1336 @ 202,485: 26x10
+#1337 @ 279,681: 21x10
+#1338 @ 199,913: 19x14
+#1339 @ 537,813: 26x29
+#1340 @ 89,723: 10x24
+#1341 @ 286,935: 22x27
+#1342 @ 347,72: 22x25
+#1343 @ 805,893: 11x28
+#1344 @ 917,81: 18x11
+#1345 @ 630,949: 21x16
+#1346 @ 526,905: 22x17
+#1347 @ 908,578: 17x15
+#1348 @ 235,237: 10x25
+#1349 @ 224,798: 20x23
+#1350 @ 759,525: 24x27
+#1351 @ 738,299: 25x16
+#1352 @ 224,888: 25x14
+#1353 @ 319,601: 28x26
+#1354 @ 212,397: 11x25
+#1355 @ 102,538: 21x28
+#1356 @ 457,251: 14x17
+#1357 @ 931,293: 13x24
+#1358 @ 808,93: 14x22
+#1359 @ 593,814: 12x23
+#1360 @ 468,131: 10x21
+#1361 @ 593,251: 15x15
+#1362 @ 362,16: 20x19
+#1363 @ 862,511: 14x11
+#1364 @ 671,626: 17x16
+#1365 @ 473,697: 16x14
+#1366 @ 368,329: 28x18
+#1367 @ 925,194: 24x29
+#1368 @ 875,511: 12x12
+#1369 @ 967,411: 25x27
+#1370 @ 89,411: 15x18
+#1371 @ 307,943: 12x28
+#1372 @ 119,13: 29x16
+#1373 @ 806,710: 15x11
+#1374 @ 544,534: 13x18
+#1375 @ 672,698: 14x17
+#1376 @ 645,848: 23x20
+#1377 @ 889,954: 25x13
+#1378 @ 378,24: 12x14
+#1379 @ 542,442: 22x15
+#1380 @ 42,454: 18x28
+#1381 @ 175,91: 11x22
+#1382 @ 840,533: 12x21
+#1383 @ 792,736: 24x27
+#1384 @ 731,713: 17x27
+#1385 @ 614,449: 22x20
diff --git a/2018/inputs/4.txt b/2018/inputs/4.txt
new file mode 100644
index 0000000..4a0ff6e
--- /dev/null
+++ b/2018/inputs/4.txt
@@ -0,0 +1,1088 @@
+[1518-09-17 23:48] Guard #1307 begins shift
+[1518-06-03 00:00] Guard #3217 begins shift
+[1518-07-28 00:49] falls asleep
+[1518-03-30 00:57] falls asleep
+[1518-07-01 23:58] Guard #409 begins shift
+[1518-04-13 00:25] wakes up
+[1518-04-09 00:22] wakes up
+[1518-11-02 00:41] falls asleep
+[1518-11-21 00:23] falls asleep
+[1518-05-03 00:59] wakes up
+[1518-11-21 00:02] Guard #1459 begins shift
+[1518-08-18 00:27] wakes up
+[1518-08-09 00:48] falls asleep
+[1518-09-23 00:23] falls asleep
+[1518-03-29 23:57] Guard #113 begins shift
+[1518-04-16 00:43] wakes up
+[1518-05-13 00:33] falls asleep
+[1518-05-19 00:58] wakes up
+[1518-07-09 00:44] wakes up
+[1518-04-26 00:03] falls asleep
+[1518-08-24 00:55] falls asleep
+[1518-06-30 00:51] falls asleep
+[1518-10-14 00:06] falls asleep
+[1518-04-28 00:23] falls asleep
+[1518-10-05 00:57] wakes up
+[1518-09-02 00:56] wakes up
+[1518-03-11 00:38] falls asleep
+[1518-07-30 00:54] wakes up
+[1518-09-15 23:58] Guard #1811 begins shift
+[1518-08-08 23:58] Guard #1033 begins shift
+[1518-08-07 00:08] falls asleep
+[1518-06-13 00:46] wakes up
+[1518-10-08 00:54] falls asleep
+[1518-06-08 23:46] Guard #557 begins shift
+[1518-06-01 00:22] wakes up
+[1518-08-05 00:59] wakes up
+[1518-03-08 00:03] Guard #3271 begins shift
+[1518-07-18 23:59] Guard #449 begins shift
+[1518-09-24 00:00] Guard #389 begins shift
+[1518-04-22 00:45] wakes up
+[1518-07-31 00:41] falls asleep
+[1518-03-24 00:02] falls asleep
+[1518-05-21 00:29] falls asleep
+[1518-05-27 23:59] Guard #449 begins shift
+[1518-10-30 00:52] wakes up
+[1518-08-09 00:51] wakes up
+[1518-03-16 00:54] wakes up
+[1518-04-11 00:28] falls asleep
+[1518-04-25 00:58] wakes up
+[1518-10-06 00:07] falls asleep
+[1518-08-15 23:49] Guard #557 begins shift
+[1518-10-17 23:51] Guard #739 begins shift
+[1518-06-27 00:00] Guard #3217 begins shift
+[1518-06-30 00:01] Guard #1237 begins shift
+[1518-04-29 00:01] Guard #3271 begins shift
+[1518-11-12 00:19] falls asleep
+[1518-07-27 00:50] wakes up
+[1518-03-06 00:42] falls asleep
+[1518-11-17 00:57] wakes up
+[1518-07-21 00:48] wakes up
+[1518-03-04 00:28] falls asleep
+[1518-08-24 00:37] falls asleep
+[1518-09-19 00:21] wakes up
+[1518-11-05 00:24] wakes up
+[1518-06-24 00:02] falls asleep
+[1518-10-24 00:55] falls asleep
+[1518-06-14 00:56] wakes up
+[1518-06-29 00:47] wakes up
+[1518-04-15 00:14] wakes up
+[1518-08-21 00:08] falls asleep
+[1518-09-16 00:48] falls asleep
+[1518-10-11 00:42] wakes up
+[1518-03-04 00:09] wakes up
+[1518-03-13 00:18] falls asleep
+[1518-10-28 00:56] wakes up
+[1518-03-27 00:20] wakes up
+[1518-05-24 00:03] Guard #739 begins shift
+[1518-08-31 00:54] wakes up
+[1518-06-22 00:50] falls asleep
+[1518-06-15 00:45] wakes up
+[1518-07-22 23:47] Guard #2647 begins shift
+[1518-09-02 00:00] falls asleep
+[1518-05-04 00:14] falls asleep
+[1518-03-06 00:51] wakes up
+[1518-10-02 00:35] wakes up
+[1518-10-05 00:20] falls asleep
+[1518-05-06 00:53] falls asleep
+[1518-10-12 00:47] wakes up
+[1518-04-08 00:30] wakes up
+[1518-11-19 00:40] falls asleep
+[1518-11-13 00:32] falls asleep
+[1518-08-21 23:46] Guard #3271 begins shift
+[1518-05-31 00:56] falls asleep
+[1518-05-18 00:57] wakes up
+[1518-05-17 00:56] wakes up
+[1518-05-24 23:51] Guard #601 begins shift
+[1518-10-30 00:32] wakes up
+[1518-10-05 00:13] wakes up
+[1518-11-02 00:03] Guard #2647 begins shift
+[1518-05-02 00:36] wakes up
+[1518-07-29 00:40] wakes up
+[1518-07-16 00:53] wakes up
+[1518-09-04 00:18] wakes up
+[1518-05-11 00:33] falls asleep
+[1518-03-09 00:00] Guard #1811 begins shift
+[1518-10-24 23:57] Guard #827 begins shift
+[1518-11-18 00:46] wakes up
+[1518-08-14 00:27] falls asleep
+[1518-05-25 00:17] wakes up
+[1518-03-03 00:02] Guard #947 begins shift
+[1518-05-29 00:00] falls asleep
+[1518-06-05 00:04] wakes up
+[1518-07-26 00:42] wakes up
+[1518-10-01 00:39] falls asleep
+[1518-06-22 00:54] wakes up
+[1518-09-06 00:24] wakes up
+[1518-08-04 00:24] falls asleep
+[1518-04-25 00:35] wakes up
+[1518-11-11 00:11] falls asleep
+[1518-09-27 00:58] wakes up
+[1518-09-16 00:15] falls asleep
+[1518-07-25 00:55] wakes up
+[1518-08-28 00:27] falls asleep
+[1518-08-12 00:39] falls asleep
+[1518-11-05 00:32] falls asleep
+[1518-05-29 23:52] Guard #3209 begins shift
+[1518-04-27 00:35] wakes up
+[1518-04-20 00:06] falls asleep
+[1518-03-21 00:47] falls asleep
+[1518-10-18 00:55] wakes up
+[1518-09-29 00:31] falls asleep
+[1518-09-17 00:40] wakes up
+[1518-04-22 00:19] falls asleep
+[1518-06-14 00:32] falls asleep
+[1518-10-07 23:59] Guard #1307 begins shift
+[1518-04-25 00:55] falls asleep
+[1518-08-27 00:24] falls asleep
+[1518-08-01 23:56] Guard #389 begins shift
+[1518-09-04 23:56] Guard #409 begins shift
+[1518-09-29 23:56] Guard #449 begins shift
+[1518-10-05 00:23] wakes up
+[1518-04-04 00:58] wakes up
+[1518-08-05 00:54] falls asleep
+[1518-07-20 00:46] wakes up
+[1518-04-08 00:46] wakes up
+[1518-06-18 00:52] wakes up
+[1518-05-03 23:59] Guard #1033 begins shift
+[1518-11-01 00:37] wakes up
+[1518-03-11 00:30] wakes up
+[1518-06-06 00:42] wakes up
+[1518-06-20 00:06] falls asleep
+[1518-04-05 00:55] wakes up
+[1518-09-13 23:57] Guard #3217 begins shift
+[1518-04-21 00:00] Guard #1459 begins shift
+[1518-03-18 00:00] Guard #1307 begins shift
+[1518-09-13 00:03] Guard #557 begins shift
+[1518-05-28 23:51] Guard #3217 begins shift
+[1518-10-23 23:49] Guard #113 begins shift
+[1518-03-11 23:59] Guard #113 begins shift
+[1518-09-06 00:07] falls asleep
+[1518-03-03 00:42] falls asleep
+[1518-07-21 00:57] falls asleep
+[1518-06-12 00:08] falls asleep
+[1518-10-04 23:59] Guard #1237 begins shift
+[1518-08-19 00:36] falls asleep
+[1518-10-13 00:09] falls asleep
+[1518-08-18 00:57] wakes up
+[1518-08-28 23:52] Guard #1307 begins shift
+[1518-09-09 00:58] wakes up
+[1518-10-11 00:14] falls asleep
+[1518-07-25 23:50] Guard #1559 begins shift
+[1518-07-14 23:59] Guard #1237 begins shift
+[1518-09-26 00:58] wakes up
+[1518-05-22 23:59] Guard #3067 begins shift
+[1518-05-22 00:57] falls asleep
+[1518-05-02 00:58] wakes up
+[1518-05-14 00:52] wakes up
+[1518-04-18 00:51] wakes up
+[1518-06-17 00:35] wakes up
+[1518-05-18 23:59] Guard #389 begins shift
+[1518-08-16 00:12] wakes up
+[1518-11-08 00:49] wakes up
+[1518-08-18 00:04] Guard #1307 begins shift
+[1518-07-13 00:48] wakes up
+[1518-08-18 23:58] Guard #1459 begins shift
+[1518-03-09 00:52] wakes up
+[1518-03-16 00:00] Guard #1237 begins shift
+[1518-06-13 00:24] falls asleep
+[1518-08-16 00:04] falls asleep
+[1518-09-19 00:55] wakes up
+[1518-10-04 00:47] wakes up
+[1518-05-04 23:50] Guard #389 begins shift
+[1518-07-03 00:57] wakes up
+[1518-04-24 00:14] falls asleep
+[1518-09-03 00:22] wakes up
+[1518-11-09 00:54] falls asleep
+[1518-09-02 00:36] wakes up
+[1518-06-30 00:56] wakes up
+[1518-08-26 00:51] wakes up
+[1518-04-27 23:56] Guard #1307 begins shift
+[1518-11-02 00:10] falls asleep
+[1518-09-20 23:57] Guard #1811 begins shift
+[1518-03-14 00:48] wakes up
+[1518-05-31 00:30] wakes up
+[1518-08-07 00:03] Guard #3209 begins shift
+[1518-08-07 00:50] falls asleep
+[1518-09-25 00:57] wakes up
+[1518-10-18 00:08] wakes up
+[1518-10-03 00:56] wakes up
+[1518-05-27 00:46] wakes up
+[1518-06-07 00:18] falls asleep
+[1518-06-06 00:55] wakes up
+[1518-03-18 00:56] wakes up
+[1518-04-04 23:59] Guard #449 begins shift
+[1518-09-28 00:59] wakes up
+[1518-08-10 00:12] wakes up
+[1518-05-30 00:21] wakes up
+[1518-11-09 00:57] wakes up
+[1518-11-15 00:13] falls asleep
+[1518-06-10 23:57] Guard #1811 begins shift
+[1518-11-04 00:01] falls asleep
+[1518-05-21 00:47] falls asleep
+[1518-10-07 00:05] falls asleep
+[1518-03-12 00:36] wakes up
+[1518-08-09 00:37] wakes up
+[1518-09-23 00:58] wakes up
+[1518-04-14 00:22] falls asleep
+[1518-07-07 00:35] falls asleep
+[1518-03-15 00:59] wakes up
+[1518-03-14 00:44] falls asleep
+[1518-11-06 00:04] Guard #3067 begins shift
+[1518-07-14 00:01] Guard #3217 begins shift
+[1518-10-23 00:09] falls asleep
+[1518-07-01 00:38] wakes up
+[1518-11-05 00:51] wakes up
+[1518-04-08 00:52] falls asleep
+[1518-09-22 00:40] falls asleep
+[1518-09-08 00:20] falls asleep
+[1518-05-09 00:49] falls asleep
+[1518-10-17 00:02] Guard #3067 begins shift
+[1518-10-01 23:56] Guard #3217 begins shift
+[1518-05-10 00:58] wakes up
+[1518-11-11 23:57] Guard #3271 begins shift
+[1518-09-27 00:49] falls asleep
+[1518-09-30 00:48] wakes up
+[1518-06-06 00:01] Guard #601 begins shift
+[1518-03-18 23:59] Guard #3217 begins shift
+[1518-03-20 23:57] Guard #2647 begins shift
+[1518-07-29 00:52] falls asleep
+[1518-04-01 23:51] Guard #1459 begins shift
+[1518-03-23 00:14] falls asleep
+[1518-07-28 00:38] wakes up
+[1518-09-04 00:49] wakes up
+[1518-06-10 00:57] wakes up
+[1518-10-26 00:57] wakes up
+[1518-04-01 00:52] wakes up
+[1518-07-10 00:47] wakes up
+[1518-03-24 23:56] Guard #3217 begins shift
+[1518-07-07 00:58] wakes up
+[1518-08-10 00:11] falls asleep
+[1518-08-22 00:56] falls asleep
+[1518-11-03 00:21] wakes up
+[1518-03-28 23:59] Guard #947 begins shift
+[1518-07-29 00:35] falls asleep
+[1518-09-09 00:05] falls asleep
+[1518-04-11 00:58] wakes up
+[1518-10-12 00:55] wakes up
+[1518-11-14 00:44] wakes up
+[1518-03-17 00:47] wakes up
+[1518-03-29 00:13] falls asleep
+[1518-06-04 00:40] falls asleep
+[1518-11-16 00:14] falls asleep
+[1518-05-11 00:04] Guard #1459 begins shift
+[1518-06-03 00:11] falls asleep
+[1518-10-22 00:58] wakes up
+[1518-04-15 00:57] falls asleep
+[1518-07-12 00:59] wakes up
+[1518-05-21 00:31] wakes up
+[1518-06-27 00:09] falls asleep
+[1518-08-07 00:41] wakes up
+[1518-10-22 00:11] falls asleep
+[1518-09-02 00:43] falls asleep
+[1518-05-31 00:28] falls asleep
+[1518-05-25 00:07] falls asleep
+[1518-07-25 00:13] wakes up
+[1518-06-13 00:35] wakes up
+[1518-08-17 00:40] falls asleep
+[1518-08-02 00:58] wakes up
+[1518-03-26 00:23] falls asleep
+[1518-11-04 00:59] wakes up
+[1518-03-28 00:38] falls asleep
+[1518-10-29 23:57] Guard #113 begins shift
+[1518-09-11 23:59] Guard #2647 begins shift
+[1518-03-09 00:48] falls asleep
+[1518-08-18 00:53] wakes up
+[1518-09-02 00:46] wakes up
+[1518-06-18 00:02] Guard #739 begins shift
+[1518-10-22 00:00] Guard #1811 begins shift
+[1518-09-23 00:27] wakes up
+[1518-08-31 00:38] falls asleep
+[1518-09-25 00:39] falls asleep
+[1518-08-08 00:03] Guard #2647 begins shift
+[1518-09-14 00:23] falls asleep
+[1518-08-21 00:04] Guard #877 begins shift
+[1518-10-09 00:31] wakes up
+[1518-06-20 00:51] wakes up
+[1518-06-06 00:17] falls asleep
+[1518-08-10 00:17] falls asleep
+[1518-05-08 00:57] wakes up
+[1518-11-10 00:06] falls asleep
+[1518-05-30 23:58] Guard #1559 begins shift
+[1518-10-12 00:44] falls asleep
+[1518-09-08 00:53] wakes up
+[1518-04-08 00:28] falls asleep
+[1518-08-17 00:52] wakes up
+[1518-05-02 00:57] falls asleep
+[1518-05-06 00:56] wakes up
+[1518-03-23 00:00] Guard #1811 begins shift
+[1518-04-27 00:10] falls asleep
+[1518-06-09 00:04] falls asleep
+[1518-08-18 00:10] falls asleep
+[1518-07-25 00:46] falls asleep
+[1518-10-10 00:43] wakes up
+[1518-04-19 00:48] wakes up
+[1518-10-20 00:49] wakes up
+[1518-04-17 00:01] Guard #1237 begins shift
+[1518-05-21 00:06] falls asleep
+[1518-11-15 00:37] wakes up
+[1518-05-04 00:24] wakes up
+[1518-10-04 00:01] Guard #2647 begins shift
+[1518-03-26 00:00] Guard #389 begins shift
+[1518-08-29 00:23] wakes up
+[1518-04-02 00:03] falls asleep
+[1518-05-14 00:12] falls asleep
+[1518-04-14 00:57] wakes up
+[1518-06-01 23:56] Guard #449 begins shift
+[1518-08-11 23:56] Guard #1811 begins shift
+[1518-07-04 00:01] Guard #3271 begins shift
+[1518-07-22 00:38] falls asleep
+[1518-11-13 23:58] Guard #2647 begins shift
+[1518-05-07 00:59] wakes up
+[1518-06-22 00:26] falls asleep
+[1518-08-28 00:01] Guard #3067 begins shift
+[1518-10-31 00:03] Guard #113 begins shift
+[1518-06-24 00:48] wakes up
+[1518-03-18 00:28] falls asleep
+[1518-03-16 00:13] falls asleep
+[1518-04-27 00:57] falls asleep
+[1518-07-14 00:24] wakes up
+[1518-11-18 00:59] wakes up
+[1518-05-01 00:00] Guard #739 begins shift
+[1518-11-08 23:56] Guard #3209 begins shift
+[1518-06-20 00:36] falls asleep
+[1518-09-21 00:20] falls asleep
+[1518-05-28 00:21] wakes up
+[1518-03-05 00:23] falls asleep
+[1518-03-30 00:38] wakes up
+[1518-07-12 00:56] falls asleep
+[1518-04-03 00:25] wakes up
+[1518-03-21 00:58] wakes up
+[1518-08-11 00:17] falls asleep
+[1518-08-12 23:59] Guard #947 begins shift
+[1518-04-29 23:53] Guard #947 begins shift
+[1518-05-10 00:03] Guard #3209 begins shift
+[1518-03-04 00:38] wakes up
+[1518-05-14 00:03] Guard #947 begins shift
+[1518-03-22 00:57] wakes up
+[1518-07-15 00:37] falls asleep
+[1518-06-11 00:48] wakes up
+[1518-04-14 00:01] Guard #557 begins shift
+[1518-07-24 00:49] wakes up
+[1518-09-01 00:56] wakes up
+[1518-08-26 00:59] wakes up
+[1518-08-25 00:15] falls asleep
+[1518-07-06 00:04] falls asleep
+[1518-07-03 00:03] Guard #557 begins shift
+[1518-10-20 00:45] falls asleep
+[1518-10-18 00:53] falls asleep
+[1518-06-19 00:53] wakes up
+[1518-03-27 00:51] falls asleep
+[1518-07-11 00:43] falls asleep
+[1518-05-03 00:55] falls asleep
+[1518-09-21 00:49] falls asleep
+[1518-09-20 00:54] wakes up
+[1518-06-01 00:04] falls asleep
+[1518-05-13 00:37] wakes up
+[1518-06-27 00:46] wakes up
+[1518-04-03 00:01] Guard #601 begins shift
+[1518-03-13 00:55] falls asleep
+[1518-10-10 00:13] falls asleep
+[1518-10-31 00:21] falls asleep
+[1518-03-14 00:54] falls asleep
+[1518-04-06 00:02] Guard #1237 begins shift
+[1518-10-15 00:48] wakes up
+[1518-03-27 00:02] Guard #1559 begins shift
+[1518-10-12 00:14] falls asleep
+[1518-07-11 00:25] falls asleep
+[1518-03-04 00:43] falls asleep
+[1518-04-16 00:53] falls asleep
+[1518-06-11 00:54] falls asleep
+[1518-06-16 00:15] falls asleep
+[1518-10-18 00:46] falls asleep
+[1518-07-24 00:02] Guard #389 begins shift
+[1518-04-04 00:26] wakes up
+[1518-04-07 00:21] falls asleep
+[1518-04-12 23:56] Guard #2647 begins shift
+[1518-07-18 00:49] wakes up
+[1518-05-07 00:04] falls asleep
+[1518-10-06 00:04] Guard #947 begins shift
+[1518-09-18 00:43] wakes up
+[1518-04-29 00:33] wakes up
+[1518-07-29 00:57] falls asleep
+[1518-08-27 00:42] wakes up
+[1518-03-16 23:46] Guard #739 begins shift
+[1518-05-20 00:23] falls asleep
+[1518-07-27 00:09] falls asleep
+[1518-08-18 00:37] falls asleep
+[1518-06-26 00:01] Guard #1307 begins shift
+[1518-09-30 00:20] falls asleep
+[1518-04-11 00:44] falls asleep
+[1518-04-09 00:12] falls asleep
+[1518-03-31 00:03] Guard #1559 begins shift
+[1518-06-08 00:00] Guard #449 begins shift
+[1518-11-07 00:46] wakes up
+[1518-04-11 00:04] Guard #409 begins shift
+[1518-03-04 00:56] wakes up
+[1518-07-24 00:47] falls asleep
+[1518-08-25 00:21] wakes up
+[1518-05-24 00:06] falls asleep
+[1518-05-08 00:52] falls asleep
+[1518-08-29 23:57] Guard #3067 begins shift
+[1518-05-18 00:00] falls asleep
+[1518-08-19 23:59] Guard #1459 begins shift
+[1518-05-31 00:58] wakes up
+[1518-06-13 00:00] Guard #947 begins shift
+[1518-10-28 00:48] falls asleep
+[1518-05-20 23:58] Guard #877 begins shift
+[1518-08-20 00:28] falls asleep
+[1518-06-17 00:12] falls asleep
+[1518-08-19 00:51] falls asleep
+[1518-03-03 23:48] Guard #557 begins shift
+[1518-10-28 00:30] falls asleep
+[1518-03-30 00:11] falls asleep
+[1518-06-07 00:53] wakes up
+[1518-07-22 00:01] Guard #557 begins shift
+[1518-11-11 00:58] wakes up
+[1518-08-27 00:00] Guard #3067 begins shift
+[1518-06-06 00:19] wakes up
+[1518-10-24 00:59] wakes up
+[1518-11-03 00:26] falls asleep
+[1518-08-19 00:41] wakes up
+[1518-03-19 00:33] falls asleep
+[1518-10-02 00:53] wakes up
+[1518-07-31 23:58] Guard #1723 begins shift
+[1518-08-23 00:53] wakes up
+[1518-03-13 00:59] wakes up
+[1518-10-20 23:59] Guard #449 begins shift
+[1518-05-12 00:09] falls asleep
+[1518-05-17 23:54] Guard #1811 begins shift
+[1518-06-25 00:53] wakes up
+[1518-06-17 00:55] wakes up
+[1518-05-09 00:24] falls asleep
+[1518-08-14 00:01] Guard #739 begins shift
+[1518-03-20 00:06] falls asleep
+[1518-11-20 00:28] falls asleep
+[1518-04-15 00:58] wakes up
+[1518-05-22 00:36] wakes up
+[1518-04-12 00:04] Guard #877 begins shift
+[1518-06-04 23:52] Guard #877 begins shift
+[1518-10-09 00:07] falls asleep
+[1518-06-05 00:15] falls asleep
+[1518-06-28 00:34] wakes up
+[1518-11-13 00:37] wakes up
+[1518-09-24 00:48] wakes up
+[1518-05-15 00:02] Guard #557 begins shift
+[1518-05-27 00:21] falls asleep
+[1518-11-12 00:34] wakes up
+[1518-06-06 00:51] falls asleep
+[1518-11-21 00:43] wakes up
+[1518-09-01 00:28] falls asleep
+[1518-10-13 00:00] Guard #947 begins shift
+[1518-11-20 00:46] wakes up
+[1518-05-22 00:01] Guard #1559 begins shift
+[1518-04-05 00:07] falls asleep
+[1518-06-11 23:56] Guard #3209 begins shift
+[1518-07-11 00:51] wakes up
+[1518-08-30 00:17] falls asleep
+[1518-05-12 23:57] Guard #3271 begins shift
+[1518-03-15 00:24] falls asleep
+[1518-04-26 23:59] Guard #3067 begins shift
+[1518-03-09 00:06] falls asleep
+[1518-03-09 00:57] wakes up
+[1518-03-08 00:58] wakes up
+[1518-04-13 00:22] falls asleep
+[1518-04-14 23:46] Guard #1033 begins shift
+[1518-07-28 00:54] falls asleep
+[1518-09-20 00:00] Guard #3067 begins shift
+[1518-05-09 00:43] wakes up
+[1518-11-01 00:03] Guard #3067 begins shift
+[1518-05-12 00:55] wakes up
+[1518-03-08 00:09] falls asleep
+[1518-03-10 00:40] wakes up
+[1518-03-28 00:00] Guard #1459 begins shift
+[1518-10-14 00:34] falls asleep
+[1518-09-22 00:26] falls asleep
+[1518-10-30 00:26] falls asleep
+[1518-09-12 00:07] falls asleep
+[1518-03-26 00:58] wakes up
+[1518-07-20 00:20] falls asleep
+[1518-06-28 00:25] falls asleep
+[1518-09-12 00:24] wakes up
+[1518-05-22 00:13] falls asleep
+[1518-08-13 00:42] wakes up
+[1518-08-22 00:04] falls asleep
+[1518-07-28 23:59] Guard #1559 begins shift
+[1518-08-24 23:59] Guard #2647 begins shift
+[1518-10-24 00:05] falls asleep
+[1518-06-22 00:47] wakes up
+[1518-10-26 00:35] falls asleep
+[1518-08-10 00:58] wakes up
+[1518-03-14 00:57] wakes up
+[1518-07-09 00:32] falls asleep
+[1518-04-28 00:55] falls asleep
+[1518-10-13 00:41] wakes up
+[1518-07-02 00:17] falls asleep
+[1518-04-17 00:58] wakes up
+[1518-05-22 00:58] wakes up
+[1518-09-01 00:48] wakes up
+[1518-04-01 00:48] falls asleep
+[1518-07-01 00:00] Guard #557 begins shift
+[1518-04-18 00:40] falls asleep
+[1518-03-13 23:57] Guard #449 begins shift
+[1518-04-08 00:00] Guard #877 begins shift
+[1518-09-16 23:57] Guard #1459 begins shift
+[1518-11-06 00:57] wakes up
+[1518-07-19 23:56] Guard #1459 begins shift
+[1518-03-07 00:42] falls asleep
+[1518-06-10 00:02] Guard #1559 begins shift
+[1518-06-20 00:25] wakes up
+[1518-04-08 00:44] falls asleep
+[1518-06-22 00:01] Guard #113 begins shift
+[1518-07-08 23:46] Guard #1811 begins shift
+[1518-07-23 00:03] falls asleep
+[1518-04-23 00:31] falls asleep
+[1518-08-20 00:58] wakes up
+[1518-09-30 23:57] Guard #3217 begins shift
+[1518-10-28 00:00] Guard #449 begins shift
+[1518-06-02 00:30] falls asleep
+[1518-09-04 00:36] falls asleep
+[1518-07-24 00:56] falls asleep
+[1518-04-16 00:04] Guard #601 begins shift
+[1518-05-20 00:38] wakes up
+[1518-10-29 00:33] falls asleep
+[1518-07-17 00:42] wakes up
+[1518-04-07 00:01] Guard #449 begins shift
+[1518-08-29 00:54] wakes up
+[1518-04-08 00:54] wakes up
+[1518-03-12 00:32] falls asleep
+[1518-05-06 00:43] wakes up
+[1518-03-05 00:00] Guard #3271 begins shift
+[1518-07-30 00:04] Guard #389 begins shift
+[1518-07-26 00:00] falls asleep
+[1518-10-17 00:23] falls asleep
+[1518-09-06 23:53] Guard #389 begins shift
+[1518-03-08 00:56] falls asleep
+[1518-09-13 00:55] wakes up
+[1518-07-20 00:31] wakes up
+[1518-10-14 00:02] Guard #557 begins shift
+[1518-05-26 00:01] Guard #1811 begins shift
+[1518-05-29 00:29] wakes up
+[1518-07-08 00:57] falls asleep
+[1518-07-10 00:21] falls asleep
+[1518-08-24 00:50] wakes up
+[1518-03-09 00:09] wakes up
+[1518-08-16 00:22] falls asleep
+[1518-05-01 00:52] wakes up
+[1518-06-01 00:25] falls asleep
+[1518-07-01 00:26] wakes up
+[1518-09-08 23:52] Guard #389 begins shift
+[1518-09-17 00:35] falls asleep
+[1518-05-30 00:58] wakes up
+[1518-11-11 00:54] wakes up
+[1518-04-30 00:37] wakes up
+[1518-05-06 23:54] Guard #1033 begins shift
+[1518-11-08 00:25] falls asleep
+[1518-11-15 23:58] Guard #3217 begins shift
+[1518-11-01 00:14] falls asleep
+[1518-10-08 00:57] wakes up
+[1518-08-18 00:56] falls asleep
+[1518-11-10 23:57] Guard #2647 begins shift
+[1518-03-21 23:57] Guard #389 begins shift
+[1518-09-22 23:59] Guard #3209 begins shift
+[1518-08-24 00:58] wakes up
+[1518-10-19 23:57] Guard #389 begins shift
+[1518-09-07 23:48] Guard #3209 begins shift
+[1518-08-10 23:57] Guard #1033 begins shift
+[1518-03-13 00:03] Guard #3271 begins shift
+[1518-03-19 00:37] wakes up
+[1518-06-18 23:59] Guard #877 begins shift
+[1518-10-04 00:51] falls asleep
+[1518-09-28 00:42] falls asleep
+[1518-05-06 00:00] Guard #1459 begins shift
+[1518-05-03 00:26] wakes up
+[1518-06-26 00:55] wakes up
+[1518-09-15 00:59] wakes up
+[1518-07-22 00:35] wakes up
+[1518-09-03 00:51] wakes up
+[1518-07-22 00:58] wakes up
+[1518-04-29 00:15] falls asleep
+[1518-10-29 00:58] wakes up
+[1518-07-27 00:46] falls asleep
+[1518-07-29 00:54] wakes up
+[1518-11-23 00:54] wakes up
+[1518-04-25 23:48] Guard #877 begins shift
+[1518-08-16 23:57] Guard #1559 begins shift
+[1518-09-25 00:47] falls asleep
+[1518-03-06 00:18] wakes up
+[1518-10-18 00:00] falls asleep
+[1518-10-01 00:48] wakes up
+[1518-04-12 00:59] wakes up
+[1518-11-13 00:50] falls asleep
+[1518-09-10 23:58] Guard #3209 begins shift
+[1518-09-27 00:00] Guard #409 begins shift
+[1518-09-21 23:51] Guard #3209 begins shift
+[1518-11-03 00:11] falls asleep
+[1518-11-18 00:06] falls asleep
+[1518-03-06 00:56] falls asleep
+[1518-07-14 00:17] falls asleep
+[1518-08-05 00:40] falls asleep
+[1518-04-23 00:43] falls asleep
+[1518-09-18 00:00] falls asleep
+[1518-08-02 23:56] Guard #2647 begins shift
+[1518-09-22 00:34] wakes up
+[1518-06-19 00:08] falls asleep
+[1518-06-01 00:41] wakes up
+[1518-09-08 00:11] wakes up
+[1518-04-17 00:54] falls asleep
+[1518-05-27 00:02] Guard #3271 begins shift
+[1518-08-07 00:53] wakes up
+[1518-07-20 00:39] falls asleep
+[1518-11-07 23:58] Guard #449 begins shift
+[1518-09-24 23:57] Guard #1459 begins shift
+[1518-04-28 00:57] wakes up
+[1518-08-28 00:53] wakes up
+[1518-04-16 00:29] falls asleep
+[1518-07-12 00:42] wakes up
+[1518-06-22 23:56] Guard #3067 begins shift
+[1518-03-20 00:46] wakes up
+[1518-05-07 23:50] Guard #409 begins shift
+[1518-08-25 00:48] wakes up
+[1518-04-06 00:56] falls asleep
+[1518-09-03 00:06] falls asleep
+[1518-09-10 00:01] falls asleep
+[1518-07-17 00:11] falls asleep
+[1518-10-23 00:49] wakes up
+[1518-05-30 00:03] falls asleep
+[1518-10-12 00:51] falls asleep
+[1518-11-17 00:00] Guard #1307 begins shift
+[1518-03-23 00:28] wakes up
+[1518-08-02 00:54] falls asleep
+[1518-08-16 00:53] wakes up
+[1518-06-09 00:43] wakes up
+[1518-04-23 00:50] wakes up
+[1518-11-02 00:51] wakes up
+[1518-08-25 00:46] falls asleep
+[1518-06-27 00:36] wakes up
+[1518-04-08 23:57] Guard #1559 begins shift
+[1518-07-09 00:58] wakes up
+[1518-10-28 23:56] Guard #449 begins shift
+[1518-04-02 00:53] wakes up
+[1518-05-17 00:45] falls asleep
+[1518-03-15 00:04] Guard #601 begins shift
+[1518-03-17 00:15] wakes up
+[1518-05-05 00:59] wakes up
+[1518-05-25 00:03] wakes up
+[1518-10-18 23:57] Guard #1559 begins shift
+[1518-10-21 00:27] falls asleep
+[1518-05-12 00:40] wakes up
+[1518-04-06 00:58] wakes up
+[1518-05-23 00:20] falls asleep
+[1518-07-16 23:56] Guard #1459 begins shift
+[1518-06-12 00:51] wakes up
+[1518-04-19 00:34] falls asleep
+[1518-06-14 00:09] falls asleep
+[1518-08-08 00:19] falls asleep
+[1518-09-04 00:02] falls asleep
+[1518-05-23 00:57] wakes up
+[1518-03-27 00:17] falls asleep
+[1518-04-15 00:28] falls asleep
+[1518-09-23 00:30] falls asleep
+[1518-10-08 00:44] wakes up
+[1518-08-29 00:29] falls asleep
+[1518-08-03 00:52] falls asleep
+[1518-10-24 00:45] wakes up
+[1518-05-12 00:45] falls asleep
+[1518-09-12 00:29] falls asleep
+[1518-04-16 00:59] wakes up
+[1518-07-11 00:31] wakes up
+[1518-07-04 00:39] wakes up
+[1518-05-16 00:44] wakes up
+[1518-06-21 00:45] wakes up
+[1518-07-26 23:58] Guard #3209 begins shift
+[1518-05-08 23:58] Guard #877 begins shift
+[1518-11-07 00:20] falls asleep
+[1518-08-26 00:04] Guard #389 begins shift
+[1518-03-11 00:16] falls asleep
+[1518-11-17 00:20] falls asleep
+[1518-09-10 00:49] wakes up
+[1518-05-10 00:36] falls asleep
+[1518-05-16 00:55] wakes up
+[1518-08-04 00:01] Guard #409 begins shift
+[1518-04-26 00:45] wakes up
+[1518-09-07 00:46] wakes up
+[1518-10-21 00:47] wakes up
+[1518-05-15 00:46] wakes up
+[1518-08-21 00:50] wakes up
+[1518-08-08 00:58] wakes up
+[1518-08-26 00:57] falls asleep
+[1518-07-02 00:51] wakes up
+[1518-03-25 00:16] falls asleep
+[1518-08-11 00:59] wakes up
+[1518-04-19 00:58] wakes up
+[1518-10-15 00:56] falls asleep
+[1518-06-15 00:14] falls asleep
+[1518-04-03 00:42] wakes up
+[1518-11-14 00:18] falls asleep
+[1518-05-12 00:02] Guard #947 begins shift
+[1518-04-15 00:05] falls asleep
+[1518-04-23 00:39] wakes up
+[1518-07-22 00:19] falls asleep
+[1518-07-31 00:44] wakes up
+[1518-10-27 00:43] wakes up
+[1518-09-22 00:03] falls asleep
+[1518-03-07 00:02] Guard #3067 begins shift
+[1518-03-03 00:55] wakes up
+[1518-06-02 00:56] wakes up
+[1518-03-04 00:23] wakes up
+[1518-08-06 00:37] falls asleep
+[1518-06-23 23:50] Guard #1559 begins shift
+[1518-09-27 00:50] wakes up
+[1518-07-08 00:19] falls asleep
+[1518-05-09 00:52] wakes up
+[1518-03-06 00:02] falls asleep
+[1518-06-05 00:01] falls asleep
+[1518-05-03 00:47] wakes up
+[1518-05-29 00:41] falls asleep
+[1518-10-25 23:58] Guard #947 begins shift
+[1518-10-14 23:59] Guard #3209 begins shift
+[1518-03-04 00:02] falls asleep
+[1518-07-28 00:03] Guard #3217 begins shift
+[1518-09-12 00:09] wakes up
+[1518-03-09 00:35] wakes up
+[1518-10-27 00:00] Guard #739 begins shift
+[1518-07-29 00:59] wakes up
+[1518-11-10 00:34] wakes up
+[1518-05-25 00:02] falls asleep
+[1518-03-10 00:30] falls asleep
+[1518-07-08 00:48] wakes up
+[1518-05-19 23:57] Guard #3217 begins shift
+[1518-03-31 00:40] wakes up
+[1518-08-02 00:28] falls asleep
+[1518-11-11 00:57] falls asleep
+[1518-06-27 00:45] falls asleep
+[1518-07-05 23:53] Guard #1559 begins shift
+[1518-10-02 00:17] falls asleep
+[1518-06-13 00:45] falls asleep
+[1518-10-04 00:18] falls asleep
+[1518-06-03 00:59] wakes up
+[1518-06-11 00:57] wakes up
+[1518-04-04 00:02] Guard #947 begins shift
+[1518-04-24 00:45] falls asleep
+[1518-03-20 00:00] Guard #1307 begins shift
+[1518-11-16 00:58] wakes up
+[1518-05-01 23:58] Guard #389 begins shift
+[1518-08-06 00:00] Guard #1559 begins shift
+[1518-03-05 23:49] Guard #113 begins shift
+[1518-06-23 00:56] wakes up
+[1518-09-28 00:48] wakes up
+[1518-07-19 00:49] wakes up
+[1518-07-08 00:58] wakes up
+[1518-04-03 00:41] falls asleep
+[1518-09-14 00:57] wakes up
+[1518-07-25 00:05] falls asleep
+[1518-11-12 23:57] Guard #1811 begins shift
+[1518-06-10 00:29] falls asleep
+[1518-08-21 00:58] wakes up
+[1518-03-17 00:43] falls asleep
+[1518-03-06 00:59] wakes up
+[1518-08-06 00:44] wakes up
+[1518-07-04 23:56] Guard #2389 begins shift
+[1518-06-21 00:03] falls asleep
+[1518-04-10 00:27] falls asleep
+[1518-03-30 00:59] wakes up
+[1518-03-31 23:57] Guard #449 begins shift
+[1518-09-08 00:01] falls asleep
+[1518-04-10 00:58] wakes up
+[1518-05-30 00:45] falls asleep
+[1518-09-26 00:51] falls asleep
+[1518-09-20 00:16] falls asleep
+[1518-05-08 00:05] falls asleep
+[1518-09-13 00:23] falls asleep
+[1518-09-12 00:23] falls asleep
+[1518-03-31 00:39] falls asleep
+[1518-06-08 00:40] falls asleep
+[1518-08-23 23:59] Guard #409 begins shift
+[1518-09-03 00:35] falls asleep
+[1518-06-04 00:00] Guard #1237 begins shift
+[1518-11-05 00:01] Guard #3209 begins shift
+[1518-07-21 00:36] falls asleep
+[1518-10-11 23:59] Guard #601 begins shift
+[1518-11-19 00:59] wakes up
+[1518-11-17 23:57] Guard #1559 begins shift
+[1518-06-07 00:04] Guard #3209 begins shift
+[1518-10-15 00:21] falls asleep
+[1518-04-07 00:58] wakes up
+[1518-07-09 00:19] wakes up
+[1518-08-05 00:51] wakes up
+[1518-05-01 00:22] wakes up
+[1518-03-07 00:59] wakes up
+[1518-08-12 00:33] wakes up
+[1518-05-03 00:18] falls asleep
+[1518-03-10 00:04] Guard #3271 begins shift
+[1518-10-31 00:55] wakes up
+[1518-07-03 00:48] falls asleep
+[1518-05-31 23:52] Guard #3271 begins shift
+[1518-05-23 00:37] wakes up
+[1518-06-13 00:59] wakes up
+[1518-11-06 00:29] falls asleep
+[1518-10-27 00:09] falls asleep
+[1518-05-07 00:50] falls asleep
+[1518-06-28 23:53] Guard #1459 begins shift
+[1518-04-04 00:37] falls asleep
+[1518-10-09 23:56] Guard #3209 begins shift
+[1518-06-29 00:02] falls asleep
+[1518-09-16 00:56] wakes up
+[1518-05-08 00:31] wakes up
+[1518-10-08 00:20] falls asleep
+[1518-04-21 00:58] wakes up
+[1518-03-09 00:56] falls asleep
+[1518-06-13 23:58] Guard #1033 begins shift
+[1518-07-22 00:42] wakes up
+[1518-05-28 00:11] falls asleep
+[1518-06-17 00:00] Guard #3271 begins shift
+[1518-09-27 00:56] falls asleep
+[1518-04-18 00:00] Guard #947 begins shift
+[1518-09-19 00:04] Guard #3209 begins shift
+[1518-11-18 00:49] falls asleep
+[1518-08-25 00:42] wakes up
+[1518-04-20 00:56] wakes up
+[1518-08-22 00:47] wakes up
+[1518-10-07 00:59] wakes up
+[1518-04-18 23:59] Guard #389 begins shift
+[1518-07-16 00:23] falls asleep
+[1518-07-30 00:17] falls asleep
+[1518-04-24 00:03] Guard #877 begins shift
+[1518-05-06 00:38] falls asleep
+[1518-05-28 00:44] falls asleep
+[1518-05-02 23:56] Guard #557 begins shift
+[1518-11-17 00:47] falls asleep
+[1518-06-18 00:44] falls asleep
+[1518-11-04 00:14] wakes up
+[1518-06-16 00:30] wakes up
+[1518-11-02 00:22] wakes up
+[1518-04-22 23:57] Guard #601 begins shift
+[1518-06-20 23:50] Guard #3067 begins shift
+[1518-07-28 00:06] falls asleep
+[1518-08-25 00:28] falls asleep
+[1518-11-06 00:47] falls asleep
+[1518-05-16 00:49] falls asleep
+[1518-09-15 00:40] falls asleep
+[1518-09-25 00:44] wakes up
+[1518-06-04 00:58] wakes up
+[1518-03-08 00:50] wakes up
+[1518-10-30 00:58] wakes up
+[1518-05-01 00:25] falls asleep
+[1518-11-13 00:51] wakes up
+[1518-10-06 00:54] wakes up
+[1518-04-28 00:51] wakes up
+[1518-04-24 00:33] wakes up
+[1518-03-25 00:51] wakes up
+[1518-11-02 23:58] Guard #877 begins shift
+[1518-07-12 00:00] Guard #1459 begins shift
+[1518-09-12 00:45] wakes up
+[1518-11-11 00:47] falls asleep
+[1518-10-08 23:57] Guard #947 begins shift
+[1518-06-08 00:59] wakes up
+[1518-07-10 00:04] Guard #3217 begins shift
+[1518-09-03 23:50] Guard #1459 begins shift
+[1518-09-01 23:50] Guard #3271 begins shift
+[1518-11-19 23:56] Guard #113 begins shift
+[1518-04-22 00:00] Guard #3217 begins shift
+[1518-07-20 23:58] Guard #877 begins shift
+[1518-09-28 00:03] Guard #3217 begins shift
+[1518-03-04 00:18] falls asleep
+[1518-09-03 00:03] Guard #1307 begins shift
+[1518-09-14 00:48] falls asleep
+[1518-09-02 00:49] falls asleep
+[1518-03-24 00:46] wakes up
+[1518-07-24 00:59] wakes up
+[1518-09-01 00:02] Guard #449 begins shift
+[1518-04-25 00:24] falls asleep
+[1518-06-11 00:28] falls asleep
+[1518-07-09 00:49] falls asleep
+[1518-08-31 00:02] Guard #409 begins shift
+[1518-08-05 00:02] Guard #389 begins shift
+[1518-08-22 00:58] wakes up
+[1518-09-29 00:52] wakes up
+[1518-09-07 00:01] falls asleep
+[1518-10-19 00:15] falls asleep
+[1518-07-18 00:39] falls asleep
+[1518-07-06 23:58] Guard #113 begins shift
+[1518-11-10 00:04] Guard #1033 begins shift
+[1518-08-15 00:01] Guard #1559 begins shift
+[1518-04-12 00:13] falls asleep
+[1518-06-05 00:56] wakes up
+[1518-10-17 00:54] falls asleep
+[1518-10-10 23:58] Guard #1459 begins shift
+[1518-08-13 00:14] falls asleep
+[1518-10-16 00:02] Guard #2389 begins shift
+[1518-07-11 00:01] Guard #557 begins shift
+[1518-10-02 00:42] falls asleep
+[1518-07-15 23:57] Guard #449 begins shift
+[1518-03-07 00:45] wakes up
+[1518-11-19 00:02] Guard #389 begins shift
+[1518-11-03 00:51] wakes up
+[1518-10-22 23:59] Guard #1459 begins shift
+[1518-07-08 00:02] Guard #3271 begins shift
+[1518-09-16 00:18] wakes up
+[1518-05-05 00:00] falls asleep
+[1518-09-15 00:01] Guard #2647 begins shift
+[1518-05-19 00:46] falls asleep
+[1518-10-17 00:48] wakes up
+[1518-03-07 00:57] falls asleep
+[1518-09-11 00:52] wakes up
+[1518-10-13 00:53] falls asleep
+[1518-07-13 00:43] falls asleep
+[1518-06-26 00:30] falls asleep
+[1518-07-28 00:59] wakes up
+[1518-08-12 00:15] falls asleep
+[1518-06-25 00:21] falls asleep
+[1518-05-26 00:38] falls asleep
+[1518-07-12 23:59] Guard #1811 begins shift
+[1518-05-28 00:47] wakes up
+[1518-10-02 23:56] Guard #1307 begins shift
+[1518-09-22 00:47] wakes up
+[1518-05-07 00:35] wakes up
+[1518-08-09 00:17] falls asleep
+[1518-10-30 00:42] falls asleep
+[1518-04-04 00:18] falls asleep
+[1518-03-22 00:44] falls asleep
+[1518-06-13 00:57] falls asleep
+[1518-05-02 00:29] falls asleep
+[1518-08-15 00:55] wakes up
+[1518-04-19 00:57] falls asleep
+[1518-04-19 23:59] Guard #947 begins shift
+[1518-05-02 00:46] falls asleep
+[1518-11-15 00:00] Guard #3209 begins shift
+[1518-10-13 00:57] wakes up
+[1518-04-03 00:07] falls asleep
+[1518-08-15 00:20] falls asleep
+[1518-03-13 00:47] wakes up
+[1518-09-19 00:09] falls asleep
+[1518-11-17 00:21] wakes up
+[1518-10-19 00:35] wakes up
+[1518-05-15 00:40] falls asleep
+[1518-11-03 23:48] Guard #1307 begins shift
+[1518-04-10 00:04] Guard #1307 begins shift
+[1518-06-20 00:04] Guard #3217 begins shift
+[1518-05-16 00:04] falls asleep
+[1518-07-19 00:12] falls asleep
+[1518-10-12 00:23] wakes up
+[1518-03-11 00:56] wakes up
+[1518-05-23 00:56] falls asleep
+[1518-06-28 00:32] falls asleep
+[1518-05-11 00:45] wakes up
+[1518-04-09 00:33] falls asleep
+[1518-10-05 00:10] falls asleep
+[1518-06-30 00:37] wakes up
+[1518-07-04 00:06] falls asleep
+[1518-05-02 00:53] wakes up
+[1518-10-06 23:54] Guard #557 begins shift
+[1518-08-23 00:17] falls asleep
+[1518-09-11 00:19] falls asleep
+[1518-03-27 00:58] wakes up
+[1518-09-06 00:01] Guard #1237 begins shift
+[1518-07-06 00:45] wakes up
+[1518-08-04 00:48] wakes up
+[1518-09-19 00:25] falls asleep
+[1518-04-11 00:31] wakes up
+[1518-04-21 00:20] falls asleep
+[1518-10-30 00:57] falls asleep
+[1518-08-03 00:58] wakes up
+[1518-04-27 00:58] wakes up
+[1518-10-15 00:58] wakes up
+[1518-11-23 00:42] falls asleep
+[1518-06-15 00:01] Guard #1559 begins shift
+[1518-04-24 00:49] wakes up
+[1518-09-21 00:31] wakes up
+[1518-05-26 00:41] wakes up
+[1518-07-28 00:51] wakes up
+[1518-11-22 23:58] Guard #2647 begins shift
+[1518-10-28 00:39] wakes up
+[1518-09-14 00:37] wakes up
+[1518-05-15 23:51] Guard #3217 begins shift
+[1518-07-01 00:33] falls asleep
+[1518-03-29 00:44] wakes up
+[1518-05-22 00:51] wakes up
+[1518-10-14 00:54] wakes up
+[1518-07-15 00:45] wakes up
+[1518-06-14 00:27] wakes up
+[1518-07-13 00:55] wakes up
+[1518-09-28 00:54] falls asleep
+[1518-10-18 00:50] wakes up
+[1518-08-26 00:27] falls asleep
+[1518-11-04 00:53] falls asleep
+[1518-05-01 00:10] falls asleep
+[1518-08-02 00:47] wakes up
+[1518-04-30 00:05] falls asleep
+[1518-09-05 00:56] wakes up
+[1518-09-01 00:55] falls asleep
+[1518-06-15 23:56] Guard #1559 begins shift
+[1518-09-09 23:46] Guard #947 begins shift
+[1518-06-06 00:36] falls asleep
+[1518-07-24 23:48] Guard #1237 begins shift
+[1518-07-01 00:08] falls asleep
+[1518-07-12 00:37] falls asleep
+[1518-03-30 00:54] wakes up
+[1518-06-17 00:48] falls asleep
+[1518-11-07 00:03] Guard #1459 begins shift
+[1518-03-28 00:58] wakes up
+[1518-08-03 00:48] wakes up
+[1518-06-09 00:32] falls asleep
+[1518-11-05 00:11] falls asleep
+[1518-11-21 23:52] Guard #409 begins shift
+[1518-11-22 00:04] falls asleep
+[1518-08-22 23:59] Guard #113 begins shift
+[1518-11-06 00:41] wakes up
+[1518-10-03 00:40] falls asleep
+[1518-06-25 00:00] Guard #877 begins shift
+[1518-05-17 00:00] Guard #449 begins shift
+[1518-06-28 00:03] Guard #3271 begins shift
+[1518-09-29 00:03] Guard #2647 begins shift
+[1518-05-21 00:19] wakes up
+[1518-03-30 00:53] falls asleep
+[1518-08-14 00:49] wakes up
+[1518-06-23 00:37] falls asleep
+[1518-07-31 00:00] Guard #3217 begins shift
+[1518-06-09 00:29] wakes up
+[1518-03-11 00:00] Guard #389 begins shift
+[1518-11-11 00:27] wakes up
+[1518-08-21 00:57] falls asleep
+[1518-08-09 23:56] Guard #1811 begins shift
+[1518-04-25 00:04] Guard #2647 begins shift
+[1518-07-09 00:03] falls asleep
+[1518-09-25 23:58] Guard #1033 begins shift
+[1518-07-17 23:58] Guard #409 begins shift
+[1518-05-22 00:47] falls asleep
+[1518-08-30 00:32] wakes up
+[1518-10-14 00:23] wakes up
+[1518-10-17 00:56] wakes up
+[1518-08-12 00:59] wakes up
+[1518-09-21 00:58] wakes up
+[1518-09-22 00:22] wakes up
+[1518-05-29 00:52] wakes up
+[1518-09-05 00:51] falls asleep
+[1518-10-05 00:52] falls asleep
+[1518-03-09 00:29] falls asleep
+[1518-04-09 00:50] wakes up
+[1518-10-04 00:59] wakes up
+[1518-07-27 00:33] wakes up
+[1518-07-13 00:51] falls asleep
+[1518-06-28 00:29] wakes up
+[1518-07-23 00:44] wakes up
+[1518-05-24 00:58] wakes up
+[1518-09-24 00:07] falls asleep
+[1518-08-19 00:55] wakes up
+[1518-04-15 00:53] wakes up
+[1518-08-29 00:04] falls asleep
+[1518-07-21 00:59] wakes up
+[1518-05-03 00:45] falls asleep
+[1518-03-17 00:01] falls asleep
+[1518-03-05 00:51] wakes up
+[1518-07-22 00:46] falls asleep
+[1518-06-30 00:14] falls asleep
+[1518-08-03 00:32] falls asleep
+[1518-11-22 00:08] wakes up
+[1518-05-21 00:58] wakes up
+[1518-03-23 23:46] Guard #3209 begins shift
diff --git a/2018/inputs/5.txt b/2018/inputs/5.txt
new file mode 100644
index 0000000..4d4b703
--- /dev/null
+++ b/2018/inputs/5.txt
@@ -0,0 +1 @@
+XxSsdDIijNnJACszZScZfFhHQyYrRqzdXTtxDEeNnGgOaAcCMcCLlMmogQeEqGgFfGyYuUOIiYyhHlLmUulAUKkudDOoDdaLGRrgoDdDdGgRruUhJLljQqdwWDZzHXxppPTwWCcZzDmfFlLPpdDSsgGtFfTEeTOotyYMOGgkJjKZUuQdNnDhHvVntKkTNqTjJeEVkZzttTYyTDdIiRrqQyYYyxbBXLlKHhvtYyzoKMmiIkaAUvVuvEejoOJUuQoOLlLloOxoOXaAqYYXxyzMmZyoOVhHIiIKfFkiIKAaUukRrKQqASsakLgGlGgLxXhHmcCzZxXMWdUulLJjDwnNYkKFfZzpPVuUvHhbQqIiLRrlEeVvBQJjlLGgjYyJoAalxXuUqgGQLQqOqNJjzZnyOusSUeEFfodcLuUlCcCIiNnGgaADVwWGgvZtTewWENnSszBKkDdeEYytTzpPsSjJpPZkNnIiPpDIideEcCKCcNABbKnpPGgtTNqQGgklLtTuUgGQqaNnnVveEgjJJEejGkKziIAaZmMbopPOgDdGubBIiUZGgzuUoOkMYymvBbVPpmMqQKDdCiDdIcpDjHhIiqQJLlFCcfqxXwWQdsSKkPgdqQDGjcFfCCceEsSkKjJkKKlcuUCsaUuASLAaEekmYqyXxkKYBbeEQuUZzpPeEdeEDKkNnuUQsSTtqufFUNIGginpAXZiJjJjhOWwkKBbogGHsSRNnqQrIzZxXhEeHKlLtTrpPsbBSbBDdlkSsKZXxnwTtWCrRcNfMmPpFzNbBneFfVYyvuUBjJbEzKkZuUkCcKTPptehHfJjEeBbuUioOIIiqQFDdFfvLUVDZaAkKHhEeAaHRrOohVxXHhvNnzQqdoOaAOxsSXogiEeIGvhWwHROoruVtTvaAUDdPpuImMVePCcpEUuFfptFMmfTVvhaAHUuoQwWlLqmMKkONnhNnIisSgGHPwWQVvroDOodgGORqvGgZRrEeMeEkKBbRyYrrzZREepPCcmJSstTNntTjvOoyyxXYzZIiYVUuUunzZBbNWvVPwnNWeVvLnNlpxvVXjJPDdZOozItTiYzRrKkZngGNiIyXiIxYyCcSsEOmMUeEqQAaINCcxXniuOeAamMmMmMRFfoOHhaArMmpPRGgrVVvvIiUudwPpWDuVvspPSbBUzrJmMjjJnNRAamVvfFMaCTTVYyvXxGRrgttkJjYmkKPpMyTtkKHoOhJnNjifFIKTmMuLFftTlwWUtAyYajJyZzmMhHhrRsSHGtTiIgBmEeXxMnNpKkSsDdbBpPPZJjHRrhKQquUkzvQdDVaAWwveEqAaVSAasBbFftQqCcTuuUOVvoUccAaIiCnNCHhXxpPWfybBYOoFwarPptTRRrArRrRusScOoCUMqpPLlfFMmjJHhDdpDOpPoAabBwWdQqfFPDdeCHSHRrhlLszqQZhVvnNodDQqOPVvpcAnNLlfFSoOsiIOoSsJvOoNnVJjxXjkKuEsSEeWbBnNEewpPbBANnakKkKHhMNnrXxjJREyYemoOqQeTbgGBtIWwiIFfHhiCcEKkeHZzhhHRshzkAajlLJKZVvEeCgGdDhHSPpEQqOoescCuUcPYypJaQqFfGgPpAPpeEjZzXxbBNqQfFRPTIRraAFJjsSfibBZztJjrRprlLiIycCBbYKknrvVHNmMneEhSshHGgSbnNgGBqQDwWdUutxXxFfXGNngaYyGgHSshfFrRjAaJAVTKktzMuviJjIVUmbTtgGBzZmMFfwlwWtHhTLfFWYycXxCrEeNsHhSrECceRTJjtyYRrGgrRZsSiIzpjJgGPeEhHWNnwSsZmOoRrMzxSsQqaAzZKtTkWsSyuvVbBVvUYChHOCcoeEciIwZzWlqQLnNpnNmMPwIiTbNnBLaAlJPpSaAsjGTtyYMZzfFmiaOBboAOAalLEejIikKqQSsXxAaJJpzZwBbBbnEearRAmMNDSsdyxqJjlLQHhpSsPEqQeAauUJKkmkKLlMjvVoOPpPpCBbGgoORrtTXuUxfaIwWiAsIKkpPifFSQqZpPAXxazEpKkPtTqQeaAnLdKOokLlDlpNngGcCmhHMrRiIqWwqQVabBARrcCUuviIvpPbBwnNWHONnIioGgOoIiVvAuUaoMrZzRugGUmMmxXMmaANLAalnOhbZBbzMmZzmMuWwnNUJjdDBqQHjJqQaAbBhNdDnzZZztThHeTtDUTtQquaAkCcGgKkjdDJKZzbcCBwWjBacCAYygGiILtTfdDEeLlFkKiQqItkKDAaKkaloOLARraApFfzZtTYkKcJjdDGgDdfFCPpQzZqvVcCgGfTtJjbBCLlAgGacYyFFfyqQYyPVvvCcrRQqVwWkEeFfpPKBcEeCnBbAarRNnNnCcTtNbYyhHGgPOGZzgopHMmNnIdDihyYHhEeLplLPieENnfFXxAavVIJjJLlAavVJjBHqQmMhbiImMbBEejrRQBbjJKkwiIWqKnpYyPVvNbCcZzBrGgRPpiISszZAazZBbzGgZUuyYbBKkoQXxIiTtOolLfFNnUuqjKRLlbBrNnMmkyOoyYWgOozZlLBbYyOojJDaAkKmMtOoXxqQAaTncCBCcaAevVEeMIQqiQqXxsSmEDdWIiwWIiqYyQwhHXJjxxMmXNwWFfnxRrXXtoOTxzZpPrmMsSRpPbefFEkBbKtTMmYyXgGVvWOowRWwreExUuyYFpPfztTGgNoOFfMmnXoEeOBbxRrUuZzxZCczrdDRxMmZzWOowTtJjanfkZzwWoOfFKuoOUFUuHhFfKLlkyHOovVrvVRHhRrSsJTAPiIpjJoSsOQnNqaQxXLlfnNhHnNlLFiIsSqtVvltcPOozSsjJHhLbBlZrLifFIhBbkKHldDsvVcCSMmtTlLBbumMOovVUWyYcCNnRQqrKkwRpmMBUuASsoOqQabAayuUFfEeVvUuTtJjxXmcYyFfCEeUuPzdDZDdpOWwZyVvQqYfWwNnFzWVvwaAARrkKaoiIcCsWFfbQqBGgnNZzyYcjGgJCrkKFfRZFfzZHhzvVUbBumEkaAlLKsEeVvSIiezZhHisSsSeLlEIxXcLlCMFQqfGgmsLlaAMmaACctTAaYySENoODdEeutHhTKFfTtkkgVvWfiIDdLllSSssLbIhHmMeEgRrGiiIufCZzcFUBFMmdDHhqpOoNnWWwKYySseEKkxZKkzXiIdGgzZMmDhyYHsMmIiCcnbHSXxsTTtthRjJhXxJXxjBbUuPQqUTtupLNnVvtTlHjJqQrBJhHHbBkKhyuUYKknNoOcvVTtyYeESsCqQQKkqQqQRrqHmMZfFnNXVvCcXxgGxzmaAMjJvVTtTtRzZjJrPVpPkaAzZnCtTLlTMmtuUAazXJtgGTjRrSsrRqQqWJnQuUjfGHbBRQqhrRHrtTdyAaKkOoSsYQarRxVqkKngQqGpPHfYyPoOvJvVjVrRpMmFcCkwWaAYfQqtDdNMbBmVvqQpSMdDmgGsPEeyHgBbPZDdGgrPsSsGgrRCcSequTtUQoOKkSsfFflPpLFILliWwEkKcCxnNXYeErRyZztTpHhSBbsmMgXxGRrmMReNnEHheGWwgvVgGEzhHRrlHhhRrhHqQHLwtYwQqWbBjJeQqRZzrEfMmKoOXXxxkYObBoqaAQRrCcLlyhNnEOoebNnKrRTaAtuUkbBbBNuAaoOUnbDdGgZzYyKkbBuCXrRxcAaPfFpGFNZznkBboOsSggGiItXxEeTgGGKsSfrRvbcqQCBVbBqWvVbBIiAaRryYTOotHhwMmSqQjaJVJjvcaACrTjJcCSsQqDUTtucCdtIiHhQVxXdDvVkKvLlqPgYdmMDKrRjrRTKktQqOoAawBbDivVIdWnqFBbfZoOzQOoDRrdYLlhHxNhHnGghsSHVUuvsvuUuoOlEefNnFfWwCclLYyYyZzRroOTtFNnhkKiIHKkqMmwWYyMmPGTpIiwWzZTtpPhnNHmToOTttfFYKkPplPpOoLVUBbuRrVfFFJjffSTtsVvJjFcCgCUueEcoQqyYNnqIeEiTtQpCcWtTpPYyycaACYSyYsJiGgrRIGGgDNGgxyuUYXXxhvVHqQnDDsSukKiIEeUeJjmMGgLlGgtTKwWkxXxEeXEHNTtnhSXDbLlBddLlDzZNyYKYDRrXxGgzZdVvSgaAGsWwlbBIWwzZiiIXxLYyuUllLlXxSsvVLVvQqIgOoGeehzwWdDyiICpPIgGNnanNJjWDdwOoiIAicCxXWYEDbBavuUQQqUbBuuiIUHhWzZZzmMwKkqiiIIhYTtyvwPpTtKksSmMnGgDdNRrHhKhxXOXxpIiPzTteEZVWwvRaArCSIixXFfTtQqsclLmMPpCmxmMBbXMQYfYyPCczpPZqvFlLlyHhYHhjlLlLJOkKdsSDXxovMCcmmCcMqQLlVHLlFfhwWADdREerBbpVmlLMJjIiqQvPbeEBqQJjNnvdDVxZzXYVOFTiImkJjKNnDdMkKqQFfUueWwEhHSsxXKkmnVoOrWAawRvglLPpZCcpPYASstTGyLlSsYCcqQeEgIiVvauZzUnZcCzKkNFfTtWstTSWwzZlrRLMmEwWBRrPpbsSCgcWwJcCIAaijCRrmMdBLlrffFFBbdaAkpPKDRPpBwWbuUGgMmpsSPCcQKvVyYwCcSsuIiLlUHHhDTtlLvVkKIidYyhiIXxxXuLlUzwWiITteEmMiINFfnNnZNDnNcGgdDCveEVdjJnYyBbVvhHyYrRwAKkaChHIiMmcCcICcuKkUjNnJyZzYyYoOrRrRWwefFaAHhPpNvfdeEgGdDbFfBbmMJEejAwWaDnNvVdpPRrMrmIBvVbSsiaJjqmCcMQudDfxXPpIihrRkYylLRruRrUaAKoOyYbvVHuuxXUUxGgXSAPpNnKicCXWuUYyweEuaAUlLOgaAGXxtOoTgBbGCczIiZUuXKkXClLeErUVaAvwWlLXcCxnoQPpqFfOecCjJLlEoOzDdZSzZiuUFUuIifbBiISSlLsQoOqEeBqQbrRxXaAIiOojjJJVzqSsrRwWBqQYybQUCeFfclLCspPSEPGgYyfFpGgnNNtTnQqeKkUuMxXvVmRrhQDdCZzcCCUuccoOeEJjxXMmqHDtnNAvVEezfFAaZUuLlDdcIiZzZzCrTtdDRVdDvLsSlTmMGnNfFeEvVqyfaAFQqBbehHELyjFfJGgNyYTtxSsXkKOoSsJjKkQEebsSGQqNnFfYygmMUbBKggOohHWhHXzburReEUyYRroOnNpPBtfRZzrMEemWwFTklLZzZOozSseESYysszZSqHhQRrnNKpPfFDqBCxXcmMgGbQdsSAadDEAoOoOGeObBoLlEgaUDdVvOooOrUaAOouXhHRrdDUHhudDLlPpsVvSxRrUrNBbTtTwWtCyYcqQrRJTtJjWwXxFfHhseEzEemEkKxXtTerRiIHhamaAbcCTtBteETzZINXxniiRrIMYaAyxKkWwzbcCwuUWBMfRruUFVvvVXxmBbCcpfFOoPQcMmMmBbLljJwWVcCSsPpsSvCMoODdYDeEdyPqQplLlFfxXLmJSsVnNvTtIiUuOoFRHRrhwAXxukCcwWfFQuUcgpPGCqWTkYyjWwJKmMAZvVzaBbaQqACmMcnIiNweEWSoOstTBvcCVouqQUkKdzZNqQnHDwnNNnhHuVvJoOcCskKSPpXWVvxyYXwCBPpIibcesSExqbBqmFRxXrhZYCckUAaaXUrlnNLJxXUUvUMmPiQqZkZztTJWwyMmKkSMSaJjNnpPAQfWTtKKkoOBWwbhDDddQAaqHWwBbhrYyRNnAaNRIireEoObBWUuwnoOBbPlLpwyRrYDdTthHNrRnUTEetWwSbBnMmNgHhGsKkdDErRHbBoraAROpvVVvPGEegrRrdDNRrNndLywWYpTtKkPpTILliAatPlDLvVlFsSfKYTcCIxXVvnfFRrWwWwmmMMmMbRrBVvDdRrsSeiIEUpGtVvTCXxcbPpBjbBJBAVvaDqPpcgGCQOoPjJXxpftNXxVvRAaeEKkpPMHhdDbBiImkKKcCsFVvfvVkKSDdQqAafFAaZxXwWNnzlLnMbBmmMqAaQwTKnkMdDdlLzZDCcmuIcCGgzZiWwGRCcrgUiILUAWwaeEXxFfCciXeEfbBlqaAEBbVQqIYyifZzsSFItTDdanEeNsSlLldDoOeEHhMqSsQaAsmRrMjCcJXRrxScCkKJjfvFbBfVvVlXlgGLbBiQiEyzZYyYehtrRTHiIGpOaAokKkGgKTtVvCtUuTfFcCcuUEmMixXITsSwWgExXYBbBvVbaAfJjLdDSsKkDdAaVRrvpPBbZzjJQqSAaNnsyHhsdDzZlLSYbBdxXetTEgGSsYymlauUeYyEfFaNnAALiIXlJjLxjwWPCcoEecCOJjhpwWPbWKFfIizTeEMmlLteEtTRrCcGgrWCcYgGTHhtydNgAaGnDwTiItYWwUhHwLFKksSflWnXxNaABLTtAaMmlPaAheEHpnNOAaSRrCGDdxKkXlKknNIDdiqQqQoOuTJjtUTtXxUUumMtNnTYmMoWWGgwCcYUumMmMPpvnXxnJjjJNNDdXiBbIxVwWTtFfWwLIiSslqLQqNnXxwfFWyYGgDdQevVARryVoKWCcNnwkGgOMmvVwOocCXkKEehHtBhHbICsSciYytTZaAUGgbBuZbBzzsSTDdPpJXxlLNnzZwygpzZwWtTsAaQqvUpiIiIiIPRrgFMmJjWESseEbBewTtfWwrjJYVSanNhHAfFsVvzZbFfzZBhFKgGKoOkcBEeWwoeEObCpnNPpPlEOCczMmGgZoewNnJjUPkKpkPpRrZzAQqaumMqrXtOoTcCNoFfOnNTtnAaPUuEeesSEwWVvpAaeENhbBHnJjNnZvaAAaVQqQqPpgbBGlukAiIaRFpPfrxXaMsBcCaAbBIiPpbOojUutTbhHXcCrZzoOZzRJjmgGMeGgeNnyYmyYdwWDMVklLKrRvVvjJrtTuUWbBUcCuDdlLyoOYyYmMjRrsVcCPpjniSsOoCcgXCcfNnwWFFVvfnWzZkLlgGwWKdDSsGEhHWsAaSZEUXxLlyYMmdDMmrRupPeAaCcWwzwDQqiIqQfVvQHhwWbTobBsSZXUuXxbsSyFtTjGgSkBbnNKGgtWyYEwWevAaEeVMmDdQqOUuiIbBhHqvVQHAgJjGaAjJbBonHwYyUpPnNuJgGjSsTmImMZuFfmPpsSTccCCiIpfiIFPHhTtPpKkUTlwWLtnNSsdRrXxKkAMqQoOrZYywWzOoqQNFfYyjJnNjJZYyvEeVzfjJZzVVvFdDYQqysSfNwkKWrRdTiAWwahHqcCQRrrbTtJNXxnZmmMJjJjgwFmRrRrAaquUKkXTUuDdbtTBkKmMqQlLEeSsGtlTtoOHhSdDKMmsLlPpgjJGvVSoOPpGggGwWhJaASszZaAPpUqeEVacCAfQqiqpPSstEDdxkKaAxXXenleGguflLRDdrqQwWDdVdeEjRrqHhQuAaOoUgBzZAFfajyJjJXxvVvKrNnplGgpPXiIHhxBlHhHtThLNnnNzZbLCYycSdDsCceuzEIielLCcZiUuEqQtTqQiIIioODXxxXdUlLUiIPZhXFfqQzTtZaomMeEvVDBboOdOxXaAWzsRkyYgSqatTAQsOoGCQqcEedDKMNtXxmuUMgdDGpPTgGWwuUmMncCmslCaUuAcLSrMSwAakZzpzZMmeXQlLwLlWAaBqQNnhoOrCcxXLlRMRrKOorQiwWIlOAaoBBbsSTtbqnMmYcChHUYlRkKqQHkaxpPriIoOPpXvhiYyRrqQqQIHUxXjMmmMrRxcnNeAXUpNnPIipoQqOZWweEXQqDvVSsdtOZzogaAaAUqjAaJhFFYykeEKXWwxQJjfFWzGgugGTJXGgKkgpPGSWwSsPiFpMmPvVfIwHhWpelXxLdDqQwWxXiIVrqyYLOfYyFtOoWHhwDJjGgqkZzKPpsyIQqHXxhNniQUuqcCzZzyaJjvVqgGnDVvnGgKkEevVIxXNniVvTndDQhHpPqmpPMqdpdDWwRrPeEiEeOBboZzZZiIVvzzzZhHIDAaMmXxNnQNRrhHtiLsSCDMjJqQmfFPplIiRreEMPKkpNnzZGgPRrQqpBbDdWtHdDqQhzSLlsZMffSsFFmukKbsSQRrqadDXUuxAXYiIyWwpuUgGHpGgAaPHhXxKklLhfFKzZIikPLlxXjJHhtjJTHhNnNnxMfexkKqQsStpEehJjhvVIRrTtkKNvqQVfFAKdvkCuUKkcOJmTtUqQlLtRKkrXjJoOxLKaAhHTttTkYgsSGyBbXxQqpjdjxFfYyXJDFfVvadkSuUmqSshHQqAaBbAaUxXuXxtNnEeaoOyXxYbBkCcgGFNnPhnNHTnNYyoOxXFBuOowWUbCaAthxfFXjJhHHCcYdQvVOkCLlLlcoOEpPGgLleqfwWFQTTtNRluULrntNdyYJDdyYDdaYpPjrvMoOpIitTPaAqQssaUuLlAkKCcSRHcefCSsOoevVrREvVcdwWwWabBADkKgdTIgGiteTtWtbBTwCeEJkIQkKlLMIlLiGgpTiInaAvOkLDvAaFAdDaXzZxwWuUOnzZlLEcCemzZwVvyEePpYWuUbIitOoeETyNndDYOoyiIYmMIoOeFfEVviWyYwUutQqQzQYyYypuQqkKrRLlDrZKkXOLsSeMmrRFfipPJjnfFLfFSLqQCcwMmKkWuUmSarRAsruXpSsPJMmDdPTtpTtpcCcZzCmMVbBlLXxAamMmjuABbauUddfFmMWUiIfEhHEeseETjpPOoHJZruAaUtLrRlgMmodLlyYOoVvuUDdnNSkuUgGwIKKkYyjsPpmJKJjCcFHhfUYyFfeyfRrJmMjFTthqvBfFdocCnFfRcCgGYyBbrRrEqaAsUulLSKMRrOokKRrKkKlLJWIjJiwdDWwcCGgIixGJrRRrAGgaqOogghHGrRKIcEegdJjDGVKWwfFkxQqmeEMCcXIivmMtYyTGuWtTlRyJjYrXxRrZtTFfzLKHhCAacgGuRrAajbpPBTBbtQqrTtOoeEJjXLmMyYeElbBZzlMwIAaOoUuKkiXGghHxWUiVuvVUvvVrwVaEeOghHGEeHhoAwBIUpAagUuuUGfFqQRNnjJhPeEjKkGDdgIZzKpLlaoOKgGALlaFfLDCcLeECOUubBotgGiINnTjJcEBbelIiTlLeEXmAaMxuUtMzZmYyuRrpPOojJcPxIiXEeaAYKkyEeeEBjJwWExfFXejtTJNVqQoOtTfFvRSsrQEjCDdgGcSsgGJXUuxhHlqQthxXkuytTYUKVsIiwWSNPpnBbZHhzFQqflzZMmGgkcOcCGYyEeWwhHDdgANVvNnBbVLeEmMiFpPfLlKksIMRrmUIiKQqkIiZzuTXeExQqSrFqQPpFbByYTuUlMmThHrEFLZzlZnNzfIsdYhJjHWcCRxXEeSueXpPjyYmMnrRNxXrZzmMPpIiiInNRIhHDpPQqdVxXutTUJLYOodrRDxXmlLEgGeMyDVvdikGgbBRriRrdOouvVdXxRvIlLPpwKsSMmHlLhfvVJmMOiRxXjJaAjJrxAaYyEezZDznSssSQqjlsSWwCMAamiIcqKzEzZZzeBbTESsTnqfFprRPZnNGuUmSfFIkQPqQHhjJpqqQQRfyoLLllnPkcKkSXxTtsxXCgPPsSppNnPdAeQqBbvVcZDdOiMmyqJBiIQTklLKPpsbBGgMntTLlNfFTtWwtPsSppzZSjJsnNTAZOxHRrkKvHUutIsEeJjSiBETCctyvVrUrRRAUuXxarNnuIQqYJjwVsSIiZzdTsnmCcQNnTAHhatHhnkKcYDdyCKbByYkGgYywWuuUQLlqxmIZziJJjLAlgGLacXxYyCKwfFxXxXWCchHkKkpPdDgaALlOqUuFfLlcSsqUuPTtEeMWwMnNmJjNnvKkAaiIKhtjJIaAFfrjJQqrRtTRxvVxXWuUPIiTtpAwWeEaKkwlgGLuUIuUjMgGlwWtTFCdDcxXIbdFCcIwEeWjJiCxXTNzZvVdbvVbBBkKCWwFgGfcRAarmuUNRrGgfVbmEeMHhyLlsOefFEQDaAxXXZmMztKqQlLktTYyLlnNrlLVvRTuUPiIHhXuUagGulVvoVeZztbBUuAKTzZtjJkgZxqQXOqQoFrRzaAGgBbPpVsScCMDdpPGgmEeGIWKkrRnNXxwVoOvPpCcbBZziaAEFfEuUeERreYqeEYgyYQBbqGKknNLzOopPCtcCRrAulLhTtuqQnNtTaAFkWdDMmEepPdDJjssfXtTzwaAZiIzYnlLZzvHhbBUpOEXxeyYyYvVIiwWITgjLlJNnXxfFdEeKbBUuZztTRAafFrkPtfFcCTtTdDhHNEzxXZeeurDdRMzZQqmrvVLlRvKkQaApPlLWwLDdEeOoEZtKkTWYSsFfypPbBqnNmnnNNUuMeEGaAgKEekFfEBbGZzvVmMEegKPpkYyzJjRsAaSoqFcCjFxyAajJYRrCYyXIicCXxvqQVEJKqQBbkYpPyjeEhrrRYEeJwpPWlVvLwWRrAzTKzQqxjJPNsSMmYybqQiUXuUhHFyYfbBKCcksSiIxucCvzYGVvjSPpnzYuuUAaUWwYyuEeUFfzFcqSsjYyBbgmqQMWwkKeEdDsyCgCcGWwRrZzIgGiLrVvtYyDXgNfGgPpnNbBDIiqjJQdzZgMJaMJsSGgjVviINuPIZzJCcooOlLqnNQTtOXxrRyTgGkKABbRrUukKrRsdDSGdPEsSepDoceAaEgwWWwhfVvoSsOeEtZiIMkKpPYqQVDoOdvEetTyMmnNjJwVPbytXxjJTyYFTXxtzKzZkbBhIZOnEeYyywWEeYeESUusudDpQqNiInPAlDdkJlOBbaAqQMFfbZzGgTtBieZpPQqEeoQMMhAakSsKHAakKWUuGoOGgKkgoEehHeEQqlLOVvWwPkHNEBOVLpPAamRTtDdrSswWMWwEeqQxRrXeEPLgLQeZyYzERlHhPqmMQOtIvVwaNncJjuUnNzZOqQWRrQqsgGRrSOmCSEOKSHhseHcHhKkCzLXpRrPrIKHhtmQKHnNVxXOMlFdDkcCKTtQVHhyjJUVZNFflLngGgGuUpPkKkrMXxXnerREhbHhpGFyudwvzaAZKkBbALDYpPSHhsjXwqOodDwfFWQWrtWoMmOwKyYiVqQvPpPubHfFUuYcKYyiIqOSsPpovQQSsoEAwWUuvekKueEAAaUuKXxNEeWgGwcbBCKXxhHQAaFQqWmgrUAJjlNAtTanIZbBDdiIzZggTDdnNJjtCtTIpzQqgMFfCcaAmcChiFfUuHhMYBbymMnuMmUqrRFROEeoEeJjhZzahHJjlFYygGAPtmmMnNdDRrZEzOoZaAaFYpHhPzZyAavbBzZPtrFKtJyYjnYyXWwxZzNdDTNOohHFfquzDdZhkKHUCchsSJYQMmDJjuMmCZzbBcoiwWIiIHJjtTtFfSsHxXhTVvIiaUuhAadyOOeEoWDdeXxoOpSsPEZzCcsSipmSLyKksuUSJTonNOXxGVpPczEebQqkKoKOoXdDxKOnaAECcAxXAGgsWwSaZUwWxcCXuKkwehHXxUuUadDAFHORrohfuaMmASsEjcKTDdDdKNgGksYylLsmMnqeXxPxXceEPpCIlLANqQyYEensSTZiImMzSVJBhHBBbBbKktTJIJMmYyGgSsayJYJxkqdDFfQKPpMmWwXjSprRkKDdnIcCbgGBikgUucCGnSCcsfFJLEDKlAagaJjAjrqQRJZzTGlTtjJfFrHWwhRfqRwXxAaPpWcMmZuULZhHzpPmureEjSsJSJjnNnNcoOCOnNdDEeJjBEHwWcCEzwEkhHAPpnNjPpAYykxVlLlLvWwXXPpxGgmMxXOoFfyYPpPpzgGiBuUYgjYyJVvVvtSMYhAJcgGZXemdRCgmXxMFdDpPzZIvQqBYybVxIiXtVPvHxXBGCcuUgbbeERbBPriIWwRYyMEepPmJAawkKaRyoIiOfZGncCrIifqQKkJOojfHbBlLhFyVvPaGgwyYBFXxpPnNuUNnhSsbBlLpPEMmFffFeHPmdDNnMpwWfjpPLyNnqcuWXzOoZtTzZxjJLlUuXxGgQqVEeFBJjoxfFXeLlMmHCcLGbBqvswbnaZoOzCcVvCGXABBbziITmMUutwWKjJfUuuUMwWaAlLiNsSnAaCcEhHmMHhJOoKkjeIrIEUuyFbiaAIWUuwDeEFrRTtFfLoFTtDSsjUuWwWuUcykKTdvBbFyYfVuBSsbUaAdbBDrYBWwbyVNnGNneEgYONnrRIdmVbOxhWhBbuUoOaBAsbhbBvFfVzLlhOLloZzuMmomtTMiSsiZuUoOBkKbPJYyjISsSshHgxXkaAAaKBDdfbBFfFKfuUsYyiqQXxItEeBFdDhHnNyEevHHFPpvVZzLDdlDHhkKnNqgXwWbBZzPJLlKkMJjjJWDdmMWwwKkFDdjSsoEeRzZeBZzNuHhdOoDJdDDWwqIfFiSsXxKxWmMwXqQjJNpjXRMmsnaArJjCcsSpPlLCclXxdpmMmMbBwPpMbBteCcDTeljbfiIGKkbtcVvCTrRfFrnNmrRHTtXxLVFnTtCcCUTKVcCpPVvwWvxXoXxOvaUAagCcTtQzZFcRrAaAxpPxXhHkKJSsugGlgGLbgVvVKkYRrJjlCQqaHKkeEhHIyixUuMmkKqnNczOgyYexbcCBIibBRWkBbKoXDFPcSseaAKkfbBEeAEeHhqQylLCcHhPpEJxXRrSHhUZzzYyTtnNZzEBxmtTtdtTIiDgoORgGuBbDgeksSzbBPsSPWMmITtFfiKkmjUujJlLJMEcsnNNnIwWJYyxWPpSCcsGgCgMbWrRwRrOdDwWHcChGgoIiBDxFfzFAafnuUzmMjJmMgGInNievVEKMmIGgiuwWUhcAaOeGnCcLUulaAXMmxCctKXxkXRrUowVrYyRlLzlpPyYZUojMYyqhkKHzeMmEMdDmrRAJjDdRYlKkPpaREehHxHhtTLjJIilcJjoZzOEIWwrRDdimoOMsSRJCwWMmMmmIiMmMNNnnSNgGThHtnnNmWwvNMOWOdDonjcCcROoOoFPxUPpHhsSuXSvVsMmVvtTJZWGJjDHIkJZzzZoOTNnaCghyYxgZfnNJDdKUNnBPbBplwNeXxbFfcYPRjJrtTpLXxebBEhNnhHzFUEeriXxZZAogGVvzhbBHIECcBbVvZzDMmKgcCDcCdLxDdcCXlwQqjJWVaknNmMdDLJjlIHhLnsSaAJjrrSpbBPwIMZzYeuUUuBHhbwGQqHhZvfFVvVgGsCUuuHhweNRrqipDIidWbBwDddDZYhHlxKfQwUugVLMDdxXfFPpmhiVeWwrlJLlYyvzPpzVfFvZOogmYXpaAPruUAfoPOomFfRXxjtqnfFNOSsoXBXxLlNnaANnbylLxZkRXvgGZziIZyYpmMPxXaAuOoTtVgaAEeGPGgLlzzGgHhSnNsYxtpPTpvxXkHUuoOVjuUJvMmLlbraglLfFqEezWZzuUfFwkhJjBbhgWwewZzWECWREdDmOoJjwWJjxaAXkTQLlqOofCqQetTOgWxXwvVGtAaesSETyFfYxXoxtkKwxXWCcTdKiIkYyDlFEefFyYMPaPpPCcklLXkKnNoOlAdJOSUuYyrRrThHBbqLMxbBhfFOoHCUucmMeXxdDjnuJcCgiInNrfFvVQsSpPAaAmbBMdadRidDYyRrfZzdbBDLlSopPJjXyRiIMCIMojJXxIxeGtiyYKkioldDdDFTbutTUSsKlLmMXxksSLlrJIaKkOoSNnoOUbucyAjeCcXCctTanNnNAWDjJDNndGgVFsCuUcSwWfBpJjxXBbWYyzZvyhUuHYvhHuUftTFCDRSXyYxseEMmnNZQqOYymXxEeyYbRzaIywWxXSsgsSGtaLlNrRDzwWZdAanZzqQpMmJrqPFElTUutJjwzZlwSaAmzZZrRzoSbBsOCpmMPccnNuUOocMYMnNOTtcLlCPpwWyqQeNGgnMmEEPAaKkZRhHrsSjYyJgiIUtLGgTpgTSQGgqZlowWOLzvzkcCrDjIXxkdDKaAEeElIiCTtcIGMmbBVvIjJJeSkuoBPpzZbphHTxXtoGqScBbElLheXxrREeromMORGgyALXxqjkKJnNSDdNnKlLLlkotgLEelPpmSsMqmDdTtVeEvWLFfloOJiIiTtzWwJkiIKrRrRrlLQqOUxsSXxoOlLoOTvbBVBUulLPLlAxIiqQFzZPpDmMdVvoqdDqQNjJnQwlLFfTtWkIZziKfFhgYueEUjJuZlOrRrHhoOxlLOoXpPRooqxXrRQSsOvzZjhHdyYDWwJTYytwWuUXxMbBmAiInNFQqQKtXxRKUuBkgTtGKxoOcCEsctTCPwWpHhbBfiXDpPIiTtdyYFfwWxdnpPqFTPFfpGQZzJetTPUuplLTtwlLtKkaxMiIfMmOoPrLlfFVJFfPCcloOLSsrRejBbSjJsJUuEHLluvVrHAAadiIgIiaAGqTtxDJfoTBbtCcVvbnmMNPpBSsaeUSLhHjSsEvlLVvVjAaLzZYywUDdWNnwcCKkSyYKuULUDdnsRrSrRNuoTtdDSsprRtTTuUPxNCcBbzZrXVMmQqbBkJjMMmmKCTcmwWpPQhHetTjJUucCUHoPpRLlhHrkIWwWRrhbBftzZTmMFPGgnNuVvrFfxXRciqESsYkKyYymPpMeZzucbBSgGwWvVeLlBbzFfhbiILPpxrRrRQqVdGgjJGxXGgmMLlnNJjqnTtNYyvQrxXRZzOVusGCcPmMpgSDdkuoOxcBbChvrSsYfHcChDdFPUzZnNiWeqQvVkcCKEwzZIbIeELlqWDdPtgGjMmPpFfVLlvZzGFfMOmJjIiykcCFfdRrdDDEOTtoDeWwHhdFfDpsSPzZlawWAVvjNEeyHsSRzzJRUurjPpFiWwnfFsoeETbYbBRiIrOoIiOEqQKSwJhHhHEwWncCPpntMmQKkqmccCwvcCcRBcCzNyMmvOoVvjJLYyloOVNnMjGgyAVpPxXqQgrvVxsCbdDBcGQIipPNDdspQNnqPaARrpnsScCTrRXZKsVbBeDkKdZQtTqhpGvVLDidDEnNeydTVcfLlFImWYQZhhawojJjJQORrousSVwfFPenAaAaPpkgGUuKMmAaNpceEVGKkXxXePjTUgLnNlGGgLNnqpNimMvVOtkAlLayYkUuKrRxTBbAatBkKdDknNKkMmnUgOBbooOMmMeEpjvLlSsIqxLlJjZzUKkTtYyAawuUNEJuUjfLkINVuCArRQqkKJZKTRDhkpPIiBtTCvVHAahcLJjaxBbeEBFYSQqxHhdCUlLAmiaAjLlaAJgLlimMITtFfjZYzuDdoPlLIwWaAIipqsxXBAaVvbjJuUGgFXYyadsBbSYXeIYyeEvVijYAQIiOozZcgGBbcvkBLluURVvAdfzWhHwPbRrvVjKkBdrRDguHkKoOAZVPUDdIYrTLlQPpqsSNZcSsdAWziFfLlqQwWmaAMmMQBZzbUpMVvmoiIsyNeGgkKeEFvVrRMVBhHCcMcljMQkPbLzZwJASMmHpPtTHcBbYPpgGsxXZzUuZlkBbKjJgYyDPpSXxghHCuUGpPggfyYOoLnBVvzTIrGchotThHJRlFBvgghHGXxzPLlpHeLgiIiIVgNnGnYWwySDdpSsMglLzZGkavMPDdBbGUrKkaARuqjJQJwWjbBgPpqQQuoaAOnAduDqHhQdUtOoGsSYynEpLlQqbBMmgyrUDMmnKpPkNdTtLacDgGAaxZqQNnOoAKdFfFHTVBafFAbptTFfOoRLihKkccLEiPLAZFCcYfFyImQLlqZcEVveHMDddnMTwWsKwxRnNYWwyugQqGwWPpIKbBPpkjRrSOoExVvJjNPBodDUukKTwhfFpNnWXxIilyHhzxBGOoYPpDdDayXxzRrZkbaPAhqQzZHfgkkKQBrhJjroHfSsCcNiIcCFjUwWPpsSjJVGMhaALVvlHEeyYuUNnLwWDEeIPfFpvVAPpagGJIihGgaCcFfAzZIZDeNnEdzMmUkyVvWcCGwQEYygKkGNukwWymMYcWqQSrRWEIEeYyEJjMmRreZctbAavVECphHXUuxYtoOTHDdhIiWcCrMmRwvVDdAirRCTVsUuSDvVJwWjMmdkKFfwWuoOYduBdaLVyYbfoLyYlEPpFjCmOoMlLMwWmyJjmMVOafFDIBbLoDdbBLlIiUwWuLxvVXlnNkDzZnNcZhHrRMmzllzNnqTeEmvpPCcWBklLDdrqQoUXxZmMxDfeicCUNqmVvGDoOevBUWwusVyRhGgOocCLQDdqhzgNuUwWaAyqFFLLzZZfbBNnFzISjyYQqWwWwhiIHIiJOoYyskQDpPtTBAaMbRbYyBuUrBSZzJYbqCtpAaPTcAqQawDdZcyOxXzHhzZSssbBdPdRUuBeEbrsRarzkLBQqIYoOpPNnbhfFHcGvVgSsShHYynYyKkiIwWHhNGNPtBkKWbyzlIZzoVvwWiIVvbBRrOPVvNnwWpurIyHYHhPpyfHCMmIiJrrRRjNnSstmRXOoOoSBlJjlrIivNrRngPpGNEVvSLpUvVhHXxfFnNPpzpPZtNAoOYyIOoJjQpJjPiIhcCmMXDdYyYgFkZEIidoOdDmNnJlXiIhnDdQqtWjAIiIbBIiiIgGWLlGoOKruFfUTtTtutTUdQqXOAaMQqmEeGsTKkaArTZoWwOsPwWpVvJjFiumhHAaNSsbBzZblLIfFVviBUMmYskCsSMeEbsGgGYyQqgSgGrsSSmMshKkHRKkVvvzwBwjcCJEPqNvsSCRwuCcUHhcSsOMGPJNCcnMmjHhNnRrtTiQqnNZqtmzZMiNNNnnoHCcuZzgogxXgNnGGgBbUuGPpYpHhnNPsDhCcTNqcCKGhPqQSjkgxFfXwUlCcDdozZCXasRuUQGArgOxXGTtznNZxXgoGRFqQmMKkxjJAwMcTtCUkyYKQPpSspUnNAazZLlnNyWwYKkueMBoOmxUuiISsdDbBDVMwWmnRroiqQBIzjCZDdSsVviNIsQqMmHcRrMzpHhCcPdbDXsuFTPjPpqYuUkKsSfFtTUuuicCiIIULAaiFVBsSmQqDkBHhbUdIiBjyWwDtJjcMwWzbBZhgGrvVMJjJfnNenNulLByaAYcZzgGpkXeZziSQqEnsSGgnNNCgYyPqQvWwOoVcCTiuUrROZEkJjGvVkDdzZbaUWnLppPKyYTtkPRrgYYLfiJZNnzYTbroXKbFwWfXGgUnNJpmMPvoOmMbZzbBkNyvmMVtkKTxXEyOBrEeRbMsSmIiMmdDpgFfGPDbBdmMWwpPPVBzZbKfdlLQqrRlHnoXEeVvaAxXJjxPvOtTwWiWxNrRnXYGgyYzZUxLtTIVTtHsiUmaMmeEAaRluiIUfFvpPvhMXxRrVBMmhHblLtiKDKkgaApPcCNwzWvfFeEeHhWMmwvjAaWwoeLlEgbXxQZAFsxXSfHfFkrLDAaIjJvGuUgBbVEffFjnkwLFjxgGcCVTOotjJeEnVvZRrzkIeEaAIiVBbvLewmMWEcRxXaAtyYtcCyYNRrwWBwWbCchsSzZtbBlLhHhLBblbBemOdCVmMvTtWwcCDdBSXGsOvVZoFNtrRuCbBKkfFcUfxkVvVOalvbBVLduULlpnNhgUMmPpRrulLlLHWoYwWLkVbBHfFKUuAaqhwBIibhHIiOpgGkDDdqQZEscxoOfFXCSiIezZPUMmPMtTebqQMHhzujJtTBnNKjogGsyszcMPIoOvAaSTcORXOTtoOhQaqZzWlWwNzZIiPEfYmRIiUuDdbMsSpPDIwWjJeyYEryYzekKEGgsjUxXuYbTtYVIVJFfojkYDdyaAxoOusYkKErmxaWzCzhHZcLkXAlCjJcRrJAZGgzaeEfPyYQTWbBwuUSXOoFfuSVBbcCviUuxitTSokKuUHXYKGZzPpjHhbXECbBVvcDyVlIqnCcEeyfIoOiHYzSWwqSWwsMztHWwbQcCnbBoKuDlyYPpgRVUayYAFWwfbKnNkrRUukIruuYyyYsSoOUbaABCJjZbDdBbnuzzZgmzAaWfrFLiISVvsCNQNjaAUEKkegGuDyYdgGWwJWnxWJtlBLqQlJCOodNnQCVsTNyYpPJjntetlMmBbkvVcCDdQyjJqQHknTtNsxXWKkoIiOfTXyYvoOVprXWifFIwWwWwLrKEeksZztTOHHhZMKbBZmMJjuTqNwRrWohHOzrBbXxHjZzJhMFpwpAaAahLluUlLHRTtDrcCRbZzmeELrRiIldDEmeEIuUjYjJtTtTIrOoRisSIqQpclLOdDoOoftTrxWlMLtzszUuZPpMIiQqrRmgGgWXnNVvFAUNKhHkWCcAFAtTucCRCrRZPOoYOTOhDJjVvhrRkTtKHzjEQfMKScLlYyWsSwfQFZzfspPVgGbTZKUunNIlRoMmDZbBiManLlIHhibrCsHKeElqKkXrmMCJFUrRcCgNMaTDRNnNVCTjcGgCHeytNnSPlPKkpwshXTbFhZzJKAjMmJgwTfpPkkKKxXRrZzRfzZzZvVflLqQLFfBoObgSsUumMUZzdDormXRrpPiaOFUunZoxsSWwXOQTthHkVBxhHttTCchBmgLlGTpPsbhKDgWRrwGnsGgQqnIixjQqOoJlLlmtTkKmGfFlLtHtTZzhHMmiSeERfGpchHhHYyXrnJAnaALeEEeyTgGdbxXGPpmMCMgPqsSVvphfSNnsFAfCckKDvVDddtTkKZTwhmLBbhHNnlWgVrpSEeNjHhChzZmxPpUuubBUPpEeZzoclVvuApPaCMmQQGgYyVvQSoObrbVvTSCcOoHtTgaMQWnNPcFfteGCOCcgGocSBABbSswWtqwLLloEeDdQoOkDdKpPxFfFzZIiDTtfLlQZzvqQViWthVaFYyDzcsSUuNAaqQeKXoAAYVIiBmfFZSubBUgXyWdYyweEeGgevsgEeGMgKiIMMmIimVirRxXUuaQleRrpWwmCMPFBbvNpZzjnNJVvTADyylErReLZzfrcxNnXebCcEeiIRrxroORPcHdDQexXwRVvrzZrRqQTtAWwaZzMmWmCcFIsSAzQFfyEkkKeYicCPpWwIfFkKSXzvbNBbwWvVOonPpBNnLlRIYQqWAwvWwVWZzatkKxmJPpsZqQLXvKkViQqzZApPCcMCcRroOxXXiIUTtuxOEeoEwWYRbBTtwjINvlLcyYCVXHuUhvJkLIilzGllWgbBWgBmMpHCcVpwWPsKLlUuOiIFcCfowoepsetTaXxmMFfNnNuvEXrRlLHpCjSCnoOJjLcClXvdLnXxHWTtKGrxXbBlvpPVriIxmMcGgrQoONnnIYxGbBVRrOooOvyzWwdyGgPpMHfiIRrFtaASrRsYYsSJHhjUulGsFSgGaAdDsQqiIfSDxvVXdXxXxgTIPyYeNAwjvVhbBHNSsAanzMmZFfcCnXxJzZjCUUuJxISeTyYaAthUuOkquTtrHFfcXjxYygtTWzNnZuGgAZVUYNXxnAaFfBbxKkgwWuUqQGWwzIiBrRqQMmEjgUZRryvKkVFkltTLJjlOEeFfXNwWnLYytJjTXxkpPrBttiIYyIYsSdDmMtTKrfofFOyUuLllhUuHqIQiHhImXxaAHzZJlcQxXqxGQnFOofzZNxXdtTFfwKZBbVNAnXxNEekeqQPcjxkhHgTtXxQmGgmGrPCKjJUuxDLlNuspIUVWJJjLgfYsPokKOIWwcCbWKkqgFsSBcCKavVooFpLlPxXpgkPEStTsFxLlHhXnBbErSsqQRHpMvVmbDprsgtTGSZzRIihPZhHzZdbwpPDDddEkeELlKsNnudTTQqnrqUumFZNUIiDsKdikKIFLWnapPGmUHBbWKkjJHOohhHCnNcdDdQqIJjigRVifPtyYnfLlqQFNLlDFMJJjjVtOQtTUuGgqoqXxQWzkmscIwbBNnocZYyYWmMqQZTNCcnSsfwZzaImMhTOocGgCtvcwWXBuQquFCbZeEJjqQVdDsSerLhZzRJjyOoYDdWKkVvBgQqGhGgbBcCZAUupxOSuAPcCypPYpgGavYEfFlDHeXugrrBTrnOoNqQBNFiRrHhmHgQyrRhHDdYrlsSKNnnHhNxWwumgRTwWtMmgqQjiqQBIQqVvirKUgryMmYCLloiarLOxJTSuSsTgjJGfAdyCcwCFzLcMfFCcxTtIXhyYQqHxauCeEcUWFikIiOLDdlGdQNnqDoOywWdDYYyVvThHJjHhLhlLBbsRrPxhTYpPmMmMyMmlWfWoWWsAkmMNnkNyYoWSCYAWwEJdHOoGsVRfFOoqJEejQiIVvrlzzZhwgGWTPxUuEyYOoIRAariPpXTMIFlLiiIWJjEkcCKejZzJZYwUuwFfWhEQHuWwGHhKgyoOkFYybyYBfjJGBbgTcjOGZRrzgoBMeWNlIFNGbPptvVTruvJJoOQEeIiAzLhHyYmGgMIiCctTODtTdaLZdDZsIiSSsaEzNjmjouTVDVUuvmiWwkYyuUPIEeHTtrOJjYtTutfTtiITBEupPSsUNnZzkOUTtZzeUuvVVvExZRHhahKkgGcCcCtCNnTZzzQdUkjJRfFiIrKVVvvHVvfFcngiVKkiSsSTmRQfFwPpRrgIpgOoGGLdOoDlwWLlLEGbSsqykKzYyRLlIintpPcCYaAkPHwWhpvzKdBKOTzZDdyrRpPVvWwbcdhuKqFKGgkKkHpPGSsgsMmgiIIaACcERAaBbkoyWwnLvchHfeoUNeRrMeScCFhBLFZzcCfcwwWXmMDwYztHdDUuWwYzuUHmYzrXMurRYBarRFdDvvUVSdyYBkgGdDkemMgGJPilLlGoqRrRrLWwOowLOAJhROozHhZNitTtTkKITsQXtnXxRMmooFIWlAiTtkwzkNngRGxXvVXwWABGgnAaNBbqQJgbGSsbEGVvgSsfFvVBXeEIGtRlLrGIiKvvoOtklaAfjdDxogMmxXTNTvxAauiIUzsSqQOEejNvVnjJkcCSjtTBeZdDfFKicYukKqQJjUyWgXXxZSOThHtdDuQtezXxTGfiIFfEcmiIHhMfVkXeEgGgAaGgeUUuAyYzZaaYfFylETvVtHheLsFpPfGgSaOnNYHhNnyYsbAnNjWRCcrcGQnQqYuvHgGJgaABNTSNuUdyYMximDahuTdDwWQXxVxyYUIWMtApCczxIAlLOwKpPTtJXAavfFiZbBnrqnNhHqjJmUEHfFFYyJPySQEQVvwWhqQEmMewJNbnzQNlVvLPQHpwLwWlJWShFasowWdFtCDduiIaAizEJWwKpPHhFkKKoVvVDSsYytAeEtjUpJXmdkhHKceBbWXopxSJLaOomQWmMlZIizNEeEpPeGuhHoKcrleTZQquOoUmMqknNKkdDRfFfdDmMFtJbJjfSgGhHGBLeEJjlvlcCLVrhqVvBvVbzqPpyYxWwHJZwdDdXxOBtZtgGTzTgGaqJXsSVIimWFfmKNMOphpPHShlDBjsSsVouBBVFcGeEzRrRSsrZFBvVMpSRUYCjJjmGuUbOfuzyHhkbBGgkfFcdXZHmMWBbRgNmTbBnleEkdfFwAzzMkEguUuUXrtYgGNnyxbBylLYwbBEjDduUJEeSHYyXLxRIsSVMxXmtJqOozbVxgUEeAmMHhasmxXelNqQQqCuPygHtssoDdCcAsSTaBbqPYyEBbeqQnqQNYewzZpOJTaAtTvoXFaYytTAQYIdqQgbpdDDZFFUmevRKkQqraJjxZkKZjKWwlLQqAkKLliIeCxXcfFIizZEjhHGsiKtMpWiIwPQwbJWvVxmVGgvWwfFWeEaAEeDdDankdeEDJaAjSscChHrRLAsNBfMmFYLllovDNZJluUCcAmMMmTDdtvVvXxIiFavNnozzNOocChHnFpkAZCfAcdNgAMnIiNoGoGKqyYPpsQkeEEkYmMLlWZzkMmdOoKHyYYvVUCobYhcCwEeUuOoWVvTtqdDciKktTILHKGLQMmIHhCVwHhFCcjGocpbcCuqQUTtqQDsoBXxLJevKkCZHYcMqfFrMhHYynolQbBVFfvEeUuAbNEendwfFUrUHhiIKkAiIyYRrauRqtsGmMcPIGjEecpPODWVddWSswKZzNAINyYyYpCTrbRGEfhOtZXuUxlLMmzTsHhiImMqQopTtKkVPLEyWwNnAoOQJTPpgniVpJUumMNIntorHhnNacXxeezEqHTPpUrOfapExqBlFdGzNnkKVVXxKWInNLfHzZXSyHhvqDJzbTkKPQehLpxKlLJOooTtuaAUOjCcNcCPUuztDzYyZyHlsSYHnkykzZKlsBbrMSnieBbEXSbCUQtetBbTVlQqLtoJjQqTtHeEcsViIkpjYLnfFwWyYkKwvVkBGaHVedAWwXoCKPpIpBsxaAXSTEezZvputBSPpSQqzDdaYDiGKnNiaoqQayYQZzEQPVnNKpPSsXmbfwOsDPxUuuRgBmMDdsxbcCcCoOGZdhHffrRFFniXSCcFfsxrRAweMDEiIhHULXpxXMmfroaWwAWwUugGCfaYLqIidDdDKePpqgJItuQqUVSOoYdDPhVRDdrwWxWwAaPSzOoTmUaMKkBHGgdppmMpztLlLFUuRyfaAZAipMhHmJwqQYmkKMvaALnYyAIKMseESmdtyYFquUwWcCkxpuddOmBbwWMOnnKkAzLuUlHeyVdpJjPDdcZqmEUugsRrIcTTpRrzZPjJjJjtKVskDMmCcGgPpoSsBHeEjIYOoCcwLlcCDdBbWWBIefhHrRHFfOoeEhDdRBKbBWwkjFIiIlPnqfwFPjDdJgAztTsmhHGyaUuTtGYfAStcjWwkXGkLlKjxAJiMmGgmHbjJbyYyTyYttTYewWSKTtNnuUoYyKzZsqAFIiIXBRqSDbBdKkxBckKHTtYjocCOSGgsDqfyYiIJjFhHlLQKLGaAeWwsAHqvxPuXnNekKsWVaAVeIiLlccZtTzcCzCErPoHOohOdmMeElOYyNnvVpauWVvwfbBdTAUuCcLEyyWlLeucwFeLIRrffXxdDrRLRrpPSFfxgGOogGiIYGSqtKVQqpPkYitCHqIibBEbWwBDdEeoOLleAaCLlcjSvJOoDFODrRdsQVvqBEMmrmYqFLlXxKfMUbapScjPpbuvlLrAahXgGVvViKkepPosAxXLSsXcWyYSVxRXxreEXowZDzXxUJjLUOeyQMmzZAHhMAamNjyYXIixJUrRkKbeOnOGDAXfoOhQqzKfQqFjzPPJUWYNqWCBbckkuuHoSswxXWkOouMmUPNEXwxOxXJXwNbQqOoBkBbvzZMmuUUuBbqVulLCmytsgGaASkdFfDToQqOsLlMWwZCcHheiIuUkRWgpMvVmMgGYyLLkeBxOoaAEgcCqnNQYyQkkKTtySsYfFtxXbjlNsSoOpItBlBblgFfOoxrPdeyzOXsGgplLbBMfhtTeCcEMHhmMmAayYjJfFmMdIisRUGPpHDdhqoZzMjdDwVYNnDdGTtgyxyNnppPPkKJsUuYSTrRhfFHFfzxMTnnlLunKurRUVvwOoWCtTmfFwsLYUhHQquyaQTtFfrnFYWbckSqQsYklJKkjULBRzZrblEgrmMQdaCSxPwOzgmUhSmjJMcEZdlUpRgdLlCcXxewWlTtLEXIYoOyyYiddamchnGspRxtaANnPEpFfxoDmMoIiRymYkvVWwKyTtMVQRrgGRUDduyRGtTFuEYckVvaAsSmFfMxdDXvBedDdCHuMmRkiGHHMmhhhjlUuJtTEUuYQqUOnOMaasSdniILOorsSTQpPqugxICdpaCezBzJoOUujnNeQqwtlGPpHhKkgDAPfYyDDQvvVeEHjrOoRVOcCmuNnUGEeEeoZztjBbgKQqXxDAadTtIiJTtjhpUNaDeGsGbBsCChiIoOVqQLlzPOomMwFkKfrRYftmMTRnqQYsSyySjjWbzxqPsRrSNtqQaUtIiugGUTlLPMPLlqTqwpPWbGHrRTtAaGKkEeMDWRCBRrRrFaAfjGqCqQRrcQgoUuOJjOogTbKkGgdJvVaAjDyTtCIXZzxrIPQlMRrSeEBeEbhHsAaJRmWwMEeViiIXxYIRUuriGseDoldvcNoXfOSsslkTexBbniIcBpXmLWqbFqQCzNmMnZXuglWwvAUrWwffFUuFOUuIVhvbLxTYgzJjdkZnrRDClUpQqNZzYKkRjuLvVNwlkMKSIfjJejsFjuZWwIgTYHHhgqYyIbBuVbGszvyYVfCcIRtlLvVqQDdIgwjIGXxbyiKBbXkMzothtkKYyCcEuPEeLlmIiCcdOvHCPxXpjJzhHsJapSTauUJjfLSgsSrjhHhfjjJdDezAabmYyhHTkuOTkWhMmloSBaoYyYNEmtTHgUtpRrgCRxhcyYoOgGdzcBhiIiVekdYkUbqsXLiekmgnLODwPpwhwMmwfoWXxvvVAbCCciHdDHBbDerveysGHFvfFVhopPykoOjHIErKvrKCCDdLCizZIlLchLYnJKZsSxyYeEoPHhglLSQqQKkqsoOOokZzKVhtcCTUcLlCEaBQocjhEQwWqzZtWTtUpQqPjsSMfpjJAHfFhToOoOqtCBbJSdFdDlLfSsSsmemMaAXVIIiSLlqQOdMSXHhuUMbBIsgVvGcCzhHnNJjhZHgownefCXmMRrpEPTfWwOvLdDvUunNKpmFfiIMslEgPCcEjJeOoHTtYDZpPzAtTLeEJjlBVvpIXzpYyPuUajLXRmLWWLUFfrtQqFFUwlLNndcUNjhQkUZdnNgQlAaLyYkFFqoEdgwWDzZdbKsMYDlxXMpVEXuUFfsPpGgKARQFeEYzZnMEPOYyjJCcGPkKGfFjUOmMoHrWwwWqtTkKtTEePHNvMmVdTyYjJyJjsceuUNJEegFVrRvvLkvVxXEEstTwUuwgGwPdwsMYGoAcMqfTjqwUKbMxYyXFRNGgnrfmBkuWUuQJtwWFQmsJjSCaOgylLmSEMmgGeWDpWnGXxgNaAWtTWtTSeDCcdYyeKUulNniGgIVDpWwPdfGjNnKkqQnuUECSYtDPLkKlcCpnhpKkDdQRhuJgcCpgpPoTfFtpemeENykKMmfqrakVvLvVWVvwIilSyYxevPmLdymjCcJGXxgSqTtQkBGgGDeOQfIiwWfKTyfFYtqsSGDzuPpKqHJnAaudAaDCDdDWuCcCcfdDfTRulcCwvWwVwlqUuQMrxlJSsAVyYvJjZxiPnNbadyqQkVZzvKhphHGpPeLSPkVRcCrBblVoDdFRFfyYrtpePZzxcFECcNWOGhzEeHmMZSstTaASimxsWwmDoWwsAarRivxAaCcEMFfDsjylLYcTQDdtaPFmHheEKktToOJuUuIdDiwTeHJuUCOqbAbBvVeHhusSHxXvoOmMGpOXQqzkjqdDQNylHvVlvVcMmckOoRVpHhkKPkReihJKYDdbBOHfkKhgQBbqSYEVREdoOrRhhPpIcBjJacCmMsSVxXOowOFWWHWWdolcCNGMKEIlxSQBuKyDRrAaKSsEvIHbCZDCHXrcGPTuGwWhHhMenyOAbsbBOdDlLLvVHwKtoUKtMBTtZEuUgGRrJFHJRGslFAtnNsPAjSGgZXxchVgGoDZzMpUelLaATHTOcCZmKxkIYQqBgiJWGiTriFmMZSgBvUiQGhytIgaAFfGiGiBbzUJfjJSJdDMmEiIFiskmKzZLWnvVlUJrynPuGgLcdNzKDZIiGytXlBVXxHvjJinNxXoyYSEesRuaVLGUoOlLkKxzLlZDdcqQfBQiIwlMxbBPbCNLlXEtKLSHhoBNwWFfVvnuUbFyYxBbvVOnUuCVDSsLOdiIESgsSKkyIvkKkEeKrwWVvjRrmfFLqpikKRicDdCcYLlEeBaiIAdDuUtGJbeEEecrwdmKkgTSstNxXUunoOhgBQthtbBTHgGQpmpFftTuVvATnpJjQXTtnjJxvVXyYFiIfcRgGrCNZBwJsSJsYNrFjJYyyoOAaWSspZvHcvVcSgSgEdAnuPHkGJTDdMFfjJmOfFtWwTgMovPpAaJGghVNnqddFpUuadLqQhvKkVHTbMmBWEZbZEcAPDciXnNGoOUtRlNDbBVvGgAAKkmoNLlkKouyejZzLJHOogEeIhHYyKrUhcDOoEbVQqKCyeUIifgiJjIEerYrqkKBsSsSbvgGgGQqWwVvYrOdOXPepTXeErPSgNHCMANnDDxeUsfFSuZzEHhjJDGrPuLjJDzeCkKsHuMGZoWpOoXscADqRGeuLWwaAKyKCBwJjyjJfNRqAMmlSRrWMcMmkNUcCeENrRNGgtmXZsSzrRZJNsvVhOoaAHSnjtsySjYXYiIyvSsWuUJmOQgBburQqSIinNoODAUuayEqQWwCcRJjfBYyMpPmbFrlgGkvVaAKLeYHFmPSxoZYEDGgpCcRXGLLvvVVbTiDWwPyjJNnYsSnLJBTMmfFvVtIiTvVKqGevVrBwIFfiWbRXbEKlcClmPKSskEeGwDdrQqKEzmStKTYMciuUIUvQVKnWxjfFoXWxenpnNfFKWwNnOhUlLUKKwQnywUwWuujpPppZJkZHFjJUuxadgoNoYyEBunakKEeqpyYPYuUEYqQqQyouCcluZdnNzjJWOnNRrvswCdDxlaSOECcIZzvxRrHRAaaAVUsSBJlLCsPABuSRrsmFQqUugGkqZzQfQyMRDdFbHhBfebBbYySDPpdoRreEfdjVsEoOeJQhCcgGcTIIiyvVKpPvkTQPpsgyXsclLBgcCGbCrRlFFiIFfRrijQuUqJnNBbgGlcCEfFfWCRrUxXnswPhHpWSQqNEwIiYYelatDFUuUjJAKkPKkoPHhpCGgBbcLfFDpRecZkKCCbtTBEvvwSExUpXeEeEVCcOoQhaSEglkqUuQdJyhCbuyYUXsQrbLlxiJjfaQSkOksJjEyYXMmxjJBBhMXxIjzZaUGguXJgxoOKJCSZzsTsoOdDaFyOogAYgVvMqQSZaIiGpRrfWtTFQNpLiCcIkDdKifJKkbrCcAaHGTtGgsSfFghMKkjJmFfPiLlIpFfFEiaAbwRrycCiJhLlbOdKFfSvkyYTAacCVvJtcYyUuCZztCiSGGmMNngpPeMTtQzCDvYEhrRZPpaNNooDkKDQqUPXKEQqeQfTDkiaNlVNnyqQWjPIazFYXxrlLiIfvVlTZBbPPqHhuUQPZzDCcsTtSsShbRrmAuMfWWwDrRdRrwFtZspXvHpqcCQyIiDdFfsvTijGQEktTRrQlyAFcXqCcQBbxzZTcCtORFPeECcwWxluedmFfEWaINhHDzIigEeuUBXSbGrUUudDXpdSoiIWFqQBMxkvpUuqeqkKAqtTQOgGAIyYkgIdyXxAIPpifFZsmMsblLTUmMfFJjPVIitbPikcRrOxXxaDEvhAgbfFKWmMNQqeUuElyJPKvSTtChBbOeETNnvETzZqaAucBsxIaANuuUUsuUmRoIvRrDdiIViRDdrOSLiIkuUKYKNhyLhYkKLldmMGZzMbBmcfFCvXxJjVAaNngTZpRzZrZznJFffFjkXkBzZbKtTPlLbBlHEqptBZjdQVIiCcJjYsxhhHSsFlifFwkvvcCZggGZzDfLgGBbbQXePAFoRDduthQePpZdDEECnNAWwROTNinjaAPvINGXxdDYytjqFfaYTtelpvPKkOrRZzSoHwWFiIegmMrBRhHtcPniankXxDdPpDDvZlLzvVuUwsSdopPCJgipvVsSEeCdDgSTQfiSueEUsIFuWPpDunNUiIBafFbBkKbBqLONrXxRmRCcXxfFcCDdQmCyhzEeRrcxQqIiLlXWwVEjlbOPpSdZLlzVvTtBPCOgJCcfWqQvcPpQqihJjHPpMViIQqvrjXxJRmqxXlgLlkJjhlCQHOoyBLlOcuyQqjUuJhksGAaHhgSNnDyYKEewMmeEkKyKePpKqXxSySsYQLlrRLlKXkxXKkKKkxkkrRgOgOqQmaGnDCaFczvVaKPfZcCmFfYyMoeEwWOZNnlLDdqQnNyRPprJjXxYgGahHAOVAfVYyaLjzndVOLybnSoOmMalcCKNkKAdPpwMQqXwCcjBVvWcCqmTkKkIwWSgQqvMmVwWbBBGgbJazdDZBbqQkTtJzCcUuzXuUAVLlEMuffzHhdJjdDIZzivVPBGDiQqyqGgYyfxOVtjoPWEyCcpDdxXGghPpHQAtaOBPpbHhSSThGYpUcnLEYyMSuZzGXvBZzZQGgjTvvVsSirXlxhspPeqQWwsSWXOoTRxuycCYmVKkKkvMAaWDdwUfKkzZFGMmeKmZZaWDKLNtMnGKtTkrwmFmMfMGgOohzZzxDCKmMKYZUFoBgMJNncyursPZzmbAafgfFRrCfhYyyYHgfFGbBxXvbbWwUqdDlLQOvBbSJpuUPbdLHsFfPaAomEenkMwmMUuMZzqQvfUufFFEexjBGUugbQAboxXDWzjhXQCcZjJAuUaEelLQHRbOogvyYVsFBjTdDrKQztELVvRUuCkOvVTtUgnLwrRqMAljrcClLRHhsXPOcCxwECLlDPpMxjvVfFPpPuJHhTaTpPkKvVWwdjJvYyTHhgbBGtOkfRrkjeZIUDdcTfuUIiDOSAfGgHswjBbLlxXIiWPBoObhqpWwnRrqZNBnjWHqeqsMTtmTJjtYpjfwWheuMmSsZzMsSQEeuUQRNzIzZVxjkWoNnaiXZPJjaTmwiuoOIiuUXvqLKklBbtUHwWAdMIXUuJjmAaDUunstYynbGjhUuEeVUyNqgsSZzkquUQKCAawJaQgGqBSyoAdDZzgGAKMmkuEHhGtzZTxfFUYhHyoPeEpOlQqLuKvFCWweoiIOeEFgtZETqYUXxuyESsgGeUoszkKmZzMxGwSsCIkzEeEuUbJsKxuUfTtFBbJjXLlJoZmMaAXxXsjJSVtntMmGOXJDdFeELPpKtTTVNnmMVhkKnNHkFfsSgTgixdCcDWwbQWwsSqeBgPOoPppBGjKkbaFfxblLBgyqQYpqQPrGKZyYWeEUuKIaIiLwifOuwWUOrNTxkKqStnrHjaolWlQiIOgZdDzhHLIiIpjEsRrSXxMmWwKKbDsvOouVdDVflrRLAbyUmLloOMmsSxRZyMhZyBbhTZMmfHhFyWdBbxWClbHoOdfFyYzZIiDfeEsWpPqQKkwoOEmERdDrnyYLluOEFIsSiCVlpPNJjYSsOKreyYimMOoGyYShfQknNUHDCBlLsSNnYzZSskKUutyYoBbsSkbDkZVjJKwWyaATVvNrZYQBgelWyYiHNnhMmIwgPiGWiAgGaIqrMtsIvOoIpSsPGXMmxTtpuUfErzBbZyYReFPNChHhMrVvRLlmuDdpPDqZtTtVvcTcCHArzXMmuoKebtTtFTNnUyowWRhiprRXxKiITaAtIMdvtUOJkKHuUhMJnkKZeAzKkzlzZPpAofFTtlwWZaXxAaqjjVUuURSsFRrfBiIgqGgaAHhQHhnfiLoOnwEmqQbPpwWJCtZzWwKYGkQqgUAaWwhqAaeHWyIiOozWCcwwxXIHhfimtxrReKkFfSsXptFfFfGRrgHZLvSghzZDjkPpKepPaysScswOnYyKmMKaSwwOwFfFlLwLZzYmrRMyttTHXpSHEelyuUYzgGZtKkoOxXgDdoKIfHgGhwOoAkBJjbKRWcCEewoOriqQrRXmClZfcWYDaFsStUdDstjXoCclRgGAIOcRGukRbImMJBbGvyYVrbBGRrKoOPpkSsMwWUXkLRIiqnNOogGjJWwGhMIfnbRtbRRGwWJjVvUxEhdLeyVxXUsvVoXtTPazcCHWwbwKkrHleERKkEvzoOBcfWVvwUUboOvVxCVHzZdDibrRBALlQqIiWwWFtzwyFfeEzMmCONnWEeiCSMKqQZwIiTvmtDdQqTjJfHhjJZzdWwTpuUFmMIyYvAarGDOopPwhHhuMgANwljJfAazqQEeZDCckpPSdunzfMQZzRNttDtTUxXAmMauUQqNnpPSEqQFuGgUfeecCrReEbBWBDLlGBbguUzWwpHPdBCcPhUubBeNtTpPfbBiILlepKWwGUuPJjfOOAktTbyyTtYYfWtTwGdjJDQKkwiIBHdrRDhirRpSyFGljyYbHhBwvzuUZuiPSUndXgKeEPpmMrRkWwpPoORyYrzZGkcpRIigMMqGKXOoOoJCpfFEKanOovzdDkWDqdFfFfDMmgDdQqDSsBbdXCLjlLhAaGgMqiQeEhrRHLYFwWRkyZzXxiLldwWDTTbCcRKtKkcCMmmMjJmMFeEfTlxoYyVvLKfYxXkKRrzuGJebZtTsSXyBbuvzuUaUwtTGvVXJxCmMhRTtUQXxmMdXxPpDKorRzZxXHDdwqKAakQWVvEsiXxXjucNJWanEpkpVNnvDjKkJrcCRdLlKksSPKityWwYSsaAGgLyyaATqHhQhmYDZAaYRrSsgXkKpPGgyigpPGNNcJjCnkKqbQqBlLRCXRLnNRgkYyaAvVwbBwWwWhNluCFfJjcCcpPUDVVvxNchHsJhHcPhxeTCcaAQqtlLVRrLDdlmJjixXQqEeIMUneEAESPtTGgHhEOWHhkzbBZnHhNSvhDsSdPbBbuUGwFfGRvVrsSwLLcCgZKXxyYjZzVxUuniLlJWryeKIhHrnNRikTpPtvWeyYEEewVbBqQkKSsKkmaIRrvVxlzZzKkgGSsSjMmMXHhTdDlLwynNirFfOooOTtHhVZWwxsyEJjFkKfKeYqZaifMwBbDdWEqqQhCpXRLlrBEeECeERFXxYYdatQqPnVfpmzZcMPELqioOIAIvwKlLWwkvVWbYylBbLBSgGsFfksMsSYymCcSGmSmoOMqQVkKEjJKkEfFWDwwWYxJjGszJjMbvyMmayYeaOxnNkKWwTtkUuEAanCZuUdfAyYDdvuUHTwIYZzgnrRNGMmVvzZHhyqFFfdRrgGfXqQqOlWQTaxXbsbBnLlXxNgETGgCpwqmkwWKgGAGULlpBbPuPphtTsMmtBRlLBAasMmqtTIiVvqqJjYycfFULCOQqokKOSsaAWwgiIGXMgGBbNnkrgGRKHCccJnkKTtstTPRuUvGwMHPpLlWtzFfFaHSsPdDQpGmcVvgBDnNtYlNajNRxHhvVhHCiIPgFrsIozcCZOtTVvCchTRraARrCcgMMLXNKkSNdkHBmMStEeMWwGgbHSsTXbcCvKGgRrqzNXxwWfBboAIpPxMqYyfFXqQxQROaAuLjJiIlwWVgGvHhKSTiItnNsZSszkGBblFwWZsSzaAFrnVvNGhHgFTttLlWiIpPXxGgGaOouUVvkjHfBtSsxVvHSWAaLpCcjJfsSFsWwTHhYEhJtcvcCncCrdtAmnGcCBbuIifjJjcmMJjRxQLXxkzZhSAaczZRBzZNAmGgSSssIUuzHhdOcCrLmMaAikztBvpjJGgPwaAWSkKqFCsKkkLlZzmnUuNCcJjOoFqOoeJZTtdHotAaocCzZypzoOYycrUMmafaylQqLxXYwKkJnNjmjJRrMnuaKkfxwEeGSZYyTlmLwRrUuXhDdHRFCPiIiPpyJiBbMekKMGgBgUusSGsSdrcCPWPfmRZfFnJjzhHZQsStUiLlPpIzuQqUaAkmQqzhbBoeESqEeQxXDdgGfFGnNghPKkpHbBRuUlWIiwsSxTtRPxtFyYwSAapPKhaAXxZzYsSqKkKLuUdDTEWwCcSWwfkKtAaTXxFvcqDcHhjbxXLTjIiwXNwjJpRrBbPjJjOoJnJjqeEnIiuQqUcoOtTlfRRrFAawZkKMGZUNBzcURiKoOsSKkBdDuvrGLZAazdUkOvJjuUVNqhHBhTYyZSsmUuSsQoOrBbRsWwhHZyhWwIijJFYNyiIYQieELbkKBdDnaANvYJjdRrCcQqJjeEexBJQqnNgFiuHhUIfkKrRkCcyxhwWnNOiIxXZzsIXVkKvUuIlQlLmMqtTtTLsUxYystTpPGgtqpFjCiIcLaxKlcCZFfwAJjXUuMQOoaRrkKAqReLlySzZUXKJOFWwfjNnviIivyxXFfBcCyHhJSZynNeEZzYRidmBHhrMycCeEZzFVvegGPpHhkuUcCdDKpNnUunLwCcQAqHoxroCtLlsVYSsyipmHhCZSHhYSTtaAOJlLkmjvVJZzlLMbTtyYUuUnNZmSsLlBEmXxBbUupGgupCczYydKPovVsStAaTWIiHQkhvKlyDdOtTwhKkGHAkKaszZJjSPDTtDdAovKXFTnfGyYgZzOzoSuUgxsaAbjJcGgWwDwWojJMMmEbBHHhTfFHnTThuUrRHrClpNnPwWiKBHNGgnhbNvXJfldDWKuPpUtTfFNJFeidlLlRKAhHagGhaSsGDdgrReEzqBUuGVvOnNyYJAapZzPVEVwZWncCFyYfvVGdkrRITNnvmHVaAVLqQkKoOrAMuQqSsIShvigaAGlXgGuuUrHhRnNeEywISsoVpONhLDaAFkXnNxHhEeviRrtTIDdpGgKkRroYxXuURretCcvlLVTHhsYySbBYnKBVwpVvTtKkrRFfPWBbKkjCcuxqQBkxORBtyjIFlyySsAmMwWTtaUuGlYyNwurRiIAaAcCBKgKezoFfqfuUnNvVjJVvpPUuFQItpGceabBAszZQqIVJjvVvvVEAaxKtTtuUTMmPmMpPXIixCbUEFPpxXjPpEemRHVvMmmCaADdTdYoOJUubDuKQHhqVvdOoMbKkvaAmDdsSYyMfIlxGgXflLFfsCcSFZzjJuxXeEUdDFwWfyQPBbSsMmVPpvpJptfUSxIidBDZmChMmSyYDdinPpIwWLRrlzTWwsStrRuUcqQJjJZibEeIAavVGgFfOlsZzpPSLNRrNnoXxOvdXMbmiIEQqICcixXPVvFfqeEumFfWaaBxXiFfIbAOoXyYZzfwWboOBzZayYgJnNjqrSRrMmjJAxDdcOLyYNnuWeKkrREGKiIVvJWwoOsWwoOpHgkQntbBHdSIiyOgGRrNnGUhVvCcOnITdDQNnzfFvMmVImMpMmgdyYDmoCZkKzYykKDdYyWrcVvdDVnQpehHWRrbhHWZLlVELleKkBzZmoOiIciIKIOoiFfStTyunEXxeMUIiIfSFfztRtSkKgeEoxwWDRkgwiBbaJwMmTXxNHxUuLjmOoCgGdUuDcMMzWwZDezKflZzvVLvVGKkyxXujJoOrGgRUxdDKUVvukHqiaBbgGqQnTumRraABbkKMPluUsOonNKkeOoGgeEAanCcVIiRLLbstTetiITEeExrMTcvVhFjJhTtYutTUiRURKkriLCcBbQCcqZYBwbHVvRrHhhcWwCoOTuGgQqhHxXUpkKnWwgCiIcsCBybBcCiEeblBbKZujJURAxXrSDpDRrNnSZoYzhHbBZCwRrWwWzWSsQByzCcZjiIDdMmsqQVvKIiDrRrRdkmMmbhHBbdMmqKJjVviZqQplLzZVvoOPzliXqQxIlrRWwffAaQYFfnGZnaANHFfYdDylHoOrRhDdHrYIivSFfZzTtbbBcCVMFfmEdWwgANnaMQnOdDCcoLlhHCcuIBbIiEFdIimMXzuaAcJjSsCORKxXbwVjJMtQDdLlhHAaZLLZzCdKOlidAovYiImMVvcYyJfezZOFBvlADbUlLXxsSoODuUyXxuUrRaAUXfFxvtcILVeEvcClqQaRrnNyPcJjeBTCQuUqPfSsFpziUuewswCKUneqWgwYygGrRDdhHYKrrRRuiatlLTHhAHRrjidlmgvuYyJfnnNFsShORHUuRbqKGlLiISsFxAasSXapAvVBKsSbBYkKAjGgJjJdygbnNXNnZaAUuHhYwWLlLtTlEeTtLmEeMjJwPHWtOkKzZbpnXesJtTiUuUrXWkSfFkKGgttTmUujJNEeDpPmhEoOlLdDCcWweCYyPvVWwpzMtTiQFfqfzalpEeMmIiIuUeDvVQqqQdllLCCHIlrOlLoFffFIiPQqBWCcwbvthDdpywWYPEefDkacoOCDdzuUKkXdoOkKCAlqQXxuRYfFnNGPexXCcNgwWTDaAaNUwWqRrpmfFVUuGgOovrReEVAyYKcCmPsSsNtTacCANQqnvuYyUwDkKdFfWGQqlmMhDdHELloOhQqjPpoOJZGVDdbfFfLrjFfOHCahHrTtRAgrRRiIiNnEetZbsSNoOmrRMlFGsSLlCcoOlGGSsggLcGqQzZsdMmYybBGjJLzfZzZhHzFbBcCEefFaAlLSSvIiVsyCNnhhsTQRjwWJvAaVrqtTtaeEzZjWlBpKoOeVvEqmhHvVvVJLCVdpPmMDvcCSsmbvmfqQoOEnYDdSOPHpPALQqlahuqFMmfIZwaDCznzZeAaEuUvVuULlvVtaNnAtTXdcCVvDxVvRTtyiupvTtzavtTVhfLIvVFfpPilFUGqQfFbJOoVvwGgUuWBkKpZFDvVjJarbUuKVCCqoOHcChayJgGExRriIqPpxXQPpyiIcCpPDAxfPpxMmXSQUuPNnRriNnlLpOUSsZySszvVJGIMOhHoamMmMucuUDMReEwWYujJUeEymMrVvYbBypPmXsBbyfevVEbXAlbBhHhIihHnNxYyXHhNnHbKmMHdCDdDdlLDdcrtkzjVvbBacUvfFniwHhuUmtTMWKpkKrTtFfBbRPlFuUJjJjjJTthHenWuXGgQiHhAxXaVJxXPIimGLlNEnuTtVvNNnyYkKKbXdwqCcQzZcCkKoOWKTovrRIieVvEVVvInPQDdZzlgGutKwWkJpPpExgvCPuUEpWvvVfFsSUhHqptTPOyybBYYBbWyYAHHzqywMkKKRrkiCvtQYyqDDdYPpKkIdDlLdgIiGlgPLlHOocCzEvSkgGzxtJSsBbjNPSngGpPqiIgSuUMmXHgGhRSFfssSGvaNnYJmQqvVvVvVrYzZyYeEyooOYyORYnqQZbnNrCVWCwWMBbTNhIiqQTtHIiiIzZZzNfEcCooOOFfgGeFejWskeYyoyBAatiIOSsSsSNIfZVUuvZqQoOrhYnzFtNfFnTaAfZJLxXEdOoCcfNnFDdxXeDdKYIIiWPpwiSwWVvsMoKkmgFkKaAfCcJTpIWwiHhwQkWwKHhiBLlvMmPbBVTtvTtuUpeEhHVuHhpyvQqVRnNEaAeVHXUXDdxfFfyYnNmGgLliIIiMdiIDFdDKWwAaDCcdUvVvoqjJAaVQgmMjwWJfFDoOvVvXfFVvlEeBbRrBHZEsCUoOVvQICIiUpAajJHwbBiEeKOzGgKkbBUxXzZYyjJxXuZhuRrEvVqnNnNqQMCivIiEDdeVNnItcdDvxRrMmRnXVvKkOopttTSsRrPPpRrOlkZfFznuUniINPBbpNsYyuWRZzrlJhHzZenNJliIgGsrRCctTaAZzuEAkKPxXpXUfFuHhQqxOVUVvuvBbFrRqQjRYyrdeEeEZzcCXbBwWapPAQsSDMnNmahRUhFiIfbxrRXBivVIQqHhpzZRrjGgvRpFtTmXcCPprRATWwcCWEjqgtfQNDIFhHBbtTEebLlBSeRrwWXbkUurTkqfiIaOoVXxLzUyWwGHkDdSrHUuhRdKkDsCclLhHKgGOfhHmMXaLlpbtXxXxXuoDsSdsFflLSRGOogrRjYyfFrnEeDdNnNaoOPpHhARtTRrZfRrXxGnNgFITHxXhtXxjMmwyYJjJjWwMQGTYyOsQlagGAaYEHezZCPKkpsQgIiOfFPOqQEeUKsjJEVvMmuUjigiGgjJFfjJLAMmaQSsqbBFfEonNOBbcCxXoURruVvjJNnPpOqQoTgGtOebBelLiZzJdRKZqQVHhstGsSXxPtkKjJlRHhrTsSvVusSGiIzpeYKkcFhHcCfPpiICxXyYomysQWwqZnNpOyYogGPEezUuSmlLCZzFfVWwvCLlMsXxlLWLWwWcCLelLaAfsSYyRreEUuNnpQRjPARrdDTYiAnNfFZrBoOMHhozOoAardctcCTcCuUCcVVEeSGgswvVPbvdwxEJiIaYCUJjBusMmAijRJjBCcHhtjcCJfLePpzZXxEjJCcyYODdIHvVhITgWwEeEXiOiILlmsSnIiNCcZziFfcBbBbTtmrYdDXxrRxwUujJWwWOsZzfarRAFIiFJjIrDyYnIiNADmhHMaqRgGGUujUNJEAabBLlRrXKkmlQQqtRsCciIJjoeEHhjDPpeEaQqxXLxKldDiIiILpkXxKApTtcCmDEeTtdfLoQqOXoOZzOoYyLlEcFNnztTXxrpPRZTEetQOoqtxXCcKUusSJjMerwceEGFfHHKikKIaVvLlPpAIiloPpOuULZQLlIiOoGgGAqQRBUuMmAsSavVeEhKVSsPXydDGgZZpvUzVCMmcxrKmMzXYWEewWwxrRhHQBbTJKkpDdKkiIPcqQCdDNnrMpPXsSsSEexUCcjJRrDduLlpOFZzSscvVUuBbiOoIyYkKCcFfCoOjJaRYyxyMNnGHhAahHFZzdjJDfUUNCcnuBbuUfFuIiZVaTtAjiILRvVEsSEeAavCCccIrRHPplvGWqFkzJjAaMmZtoOwWTKkXLuUyzPIwWwWvBbVLlYwWyQlLjJeEnEfFWUcVOfFdDOoYyxXovShRwWrHzzZJjgWCcPpnNEymcXxPpCLliWsDdRRjbBWMmzLlVvkKZUGguwJcdDstTSCNliXxKAvmMGkdeilLZKkOoOazrwWRNnzRrIRcCzYyZufZDdUuaCcAHlyCBEnaAZzIimMWhHqQyYLtTbDCcdukuxXUjFzWwUuARraGXxXHrVvlAaLRGgGTtcKkAteEjBbKAaiQqhdeEJSsjgwzrRHhcDdCjLlMmWwpfvVrCJNwocEeCoOmnRrVMjJscjraAtJjlLTeAaoFfOCgGuUqHvVhVvQoOhHuUMmmMXrALpPKkyraZXvVxQmdDJObBFfeExXuUuIiVntTNyYvgGwCcWuUzxXLZVuUvfFvnNKkBbcCWGguUmMBbSsOuxTLlVSsvHsSBbsShNmMAagFfaAETtoCHoEemMOkZNZtTqQdDFfXdNcCnJjmOoqQBnNbGFfFfCcgiIGSsxXcvVwrcCRsSoOXUiIujUuibBSCekKwpWwpcCEeZXxKEsSGsSEedlLUrJjfCchoOHuUFAMmDdaGAakKTjJMyYkpPKXbjJesoOKkSZuBbsWwjMmeZzYMmazZFEMmCpfJwhvVHWjmMyYSKksdxSsNnSsOwrdDXEGebBoOXxXxEnNuUCJjcoOskVvmMBbKSoXBbxZCQBbFfXIYhHqOovVQiXxiIvaArtJjTdDMmRVqQiIKkpPXcCnNxhGgAcLyphHPiMmITsSHhAaLltyCcYKkvlLaAGGgiTtvVIIiBURrjXxNnqfkKFQXaCVvfBbqGuAVkttTujJrmMpPzZRcNfvlhfFMRBgFtEeTBJNnyYLEFTtftdETLTtlmqQWHhPmMfFFRrzZfDyiIYUujJwWLRNSEeWwrBbBbOhHMmoxeEJPfFnoAaWidDIwOkQdoOjUnUubEJjUuEeVveEtTrOJJjfCcmjphHGqQgxFgGfqPpQGAaQnNkKdUufUunNlLhyYhVzsSZYYyfbOuUpPoTSzZFBbkDCcdCcbYyYykKgxXGGiJxXBbxXjrREepbBzGgIzZIEeOoOUtTHIiZHBSabAyLlYHwHkKIiEeJjXoreERBUcCnNuLxXlvMDirRoyPpvxXRtTDtjJvVYCdDwlLJdxXfPpOVvoOPplfBbsSdBhHfAaYYMYyRrzZmdDyeiXxREeZzmrRFqQkKkIHhibBYyZbanNyYxgcfFALlNuUBWpQqPeESVvWvVdDFfwDdkKxrRXXKkEerRaAxVhAuUaHQglhEqQOWuUwLlSsblLpPfJjvfEeFHhycCYcCqQdDfyYFIiwUCFUAajJufQYlJPpbPpCcLvVlAauUWEebBAphHBbhHYFRgGNgrRzgGRrFYrUuAWNndDjtTpoOtyYTrxXzZBYypPmMBbhVQqpQGaAgAxXaYycCqvTizLlZfGcrePmMpkKEDMJjBeiIEuEedDUuDdAaUbzIiZEDdxzmLlLlMCjgGaHymsTgGGenNEjJyLlbIZaMmAAamZzzZMKaJHhjCcsSJaduUDKeuUUuWZehebossSaAjzZJsSRQqUMlzpEepPHhPLlCLRrlzZrQNnHhEpPkyYKegGFoOmzZMLgtnNGcCLkdelpPiIjomMoOOwWNEexXGgKpqQPNlLKzZkPXxskKJMmYyjyeEjCfFcxXEjJnFfNWjDdJOoweYAjiMAdCcDZYyzlLavVtTmjlLbCcuUbmMjvoOYDdIZziysyYuUkKeIRriEgQqGtaipmMQqOtTpPoEVmMXxxXvQNEeLZdDzlJjbBroOsdHhkKDSRVvdxXDSDdSKnfFkWNnwtkCcCQqKkJjJuULlWeEzpPYyaeEeNuUoKkuILliUkkYyOBEGWwLlVYyvgeZRrCmMdogGOxXDvgMmtmMFfjYlVvzZulLbBAaUPpsMbBPIwhHfFoKkrPpRzZaAYDHAhOJjUFfeEuUoOdqVvpPEeyjMmHQnKkMmQqyYmMtTkjWwJEexXVHhvfRTGjcCJksSKgpVDuwWUdlLOXxoBbKkLRZLlzrlfAeWuUxXPsSpqQWzZwpPnNaAZzZzSsFeXxEfwzjCcxXJMTpaftTaAXxGgLgGHDtTvVhHdmMhlLAHrOofQTtNmIlLHGZPiuUcDdGGRrCIicziLatTUuubBbBzZFfjJRGMwfqoOknLlkaOoUBbEakKlLAVabBkKexXOqQqqVhHgGQMmJjkOoCdDaNnAyiPpIHZzhhXxBchHCUpPpIMmkuUXjJxtThyoOYHTRBlLwoJjOtsqQQqOoiISTdDWvXUuGuUgrRxLlVbxrRFfJiCcIqQSsyLldlyoOIifFYaVWDjJgGYyUYfiIgPBUuHNxmJjCccCLlcCMdDmRKbBZzzvujJYiIvGgMmpPZkKzbBAaWwqkbBBmMuUqQbYyKfLmovTtWwtUuThkqMhFeCcEnNfbBHMygjJGYmbBTkiRlLxlZSJjshEzZQqkALlkKIiaoNnCcdDeWwDvVlkKLJdDjdcCcCscMiIoHRrhsEzZeSmMwNnomDdMEeCAWiToAapLrXxqllLBbuUGlJjplvDdobenhKdzZDpyUuYwmDdmqOySsYWwzEIfbBFbAaBpPmZnpPtyYTNzhOoHoLjbBKLqQanNRaArUrgGLlJjRNozWwiZvBbVUusSzHsSBbjJwWsSZfYBpbBSsvWhHbBoMmCcpfFPWwOWsjJnNOoSTtfFwmzTFHVNZznvXxSTtsmMGCOjgpgYyGeEPGuUtiITJTBbFftgSsTtatYjoOipUnmLlGgAqQjyYRrJIFfpTtaAPxXSsiqQjzpIiPsSZTyYtudDdDUmVvLlNnKUTtukXhHsSxGFIiGiIgfeEFnuUlLGxdZzTRldDWwcYSGRtTKkcCjJrBbJQCfWpPpPwZjJyMmdDmgGMReELlHhrZNLldDsCcdDoOJgyZNnVHhBDdbIBnHhZFZzfzeEDxXbBfFdpXZlLktZaZXxzvOkQZzqhHEeEecCKUuaAdKkcCDoVWwGNnKkKkNngpwiIWPjqQRFfryRjJAaHrRegGoxXOxkoOKczZJnNqQbsJjSBjvVXfdDfFJfnNQfFIkKipPOZziIrZeEevVeEPpQyiIYwiIzmpPMMmmiIMqQeTtZzWGgwlxXqIrRiHhVUPpKkEOoEMmewWDdplLPpPnpwWKjJkvVAtTaqQWwpmMOoPDnNGtioIinNPuVNNnoOaiIAyWDDdGgHhRrdZVvxFqQnNPpkWwKSSkNaAdDnKwKfMyYbBmnNUHUaTOoIgNnGyDdYpPitTcZlyQyeiIRrSsZzEeNniwWIgvZiIfxXzGasZzaASTEIipEeERrHbBlLbBhrRePvOWwVvLpVDDMBbmddvPUAGgxpxdJbUuBjSsRLlrqzZwXxsSWoSwBbzZWrRVvYBvFnMFpbBiIPfGgrRNnmMDNXxSsnOonwWZzKkJjDdLGgltcSsfzZvVDGMmgBiWwfLlLmJiCcVvVgpPGvYtOoTyWwXMuUmLliznNZPpgGTsSaAHkVWjJIcCiwrhHRmpKTtkQCVvQoGmMbBIiuUuUdDhHvMmVljDdMkKcCXUsIiSNqBbMoAYyabrRBOIiNuEeULtTlbBNGgnQqStDvFOofWwWiIyiHhiIRYebTzZhVvEHUuheULlOmMmMobBMvVZzEelLmucCVrRhXozaKklLXxtPXxYyvVLlDdbBTnNqQiIXoOxmStqbjQyYYIozGgyYmMCndDeSsENjJEaBYyaAbzZDlLpCcoOQqSsGKCcNnpNvVYblLBygGlLosQqSdDOKFfkOJjYFrtTaAqKVvEeiMZzmsFfFfMgzQNbBRrtfFCcfhHFTtgGetZiqQIkQLJNXCcxKpUuPPTtpkUutTsSXxfFZOodnSsNXIoVvjBbbBBbWjJzZxyYXwFaAkWlVvbBLhHSsiVaxXAQqJjNnXxfFQqrRrDUDAaIKICclYygGjlxXLvjJyYiJxEUuUmMgGnNsrrRkuUKwZqQzheEHyDqQSioOIimMvrRVPpnNFfeAaRtHhLtGgwWMmRrwWfrlLEIieYyIiRfRstUukKHhHZzhoOGWwgDuUrRdjJoLldmMyYDFfOUuiSdDyYIlgyYGQqQXxuPpHPpBbhUfFqvQqnHOohaoCGgKLvHTKEhHekPpZzLGgCcdFhHfDeqnbNRXxrnnNCcJjjJBDduUKkYybpCUmMWwYyddDGqQfFgWXDdxpPTtDWgqLlQGwdwlDrRHhEepPdOXxokZJcHhCjGEegzAJjzZmMSsPkiJsSSoOsSsYypHGuUgRrrPuibcCOoISsiWXxvdDWRINhHnYyuUQqVvnCcNTdDtuSsmLLrRlgjMmJgGGxRdgGQCcRrqlxMmXLNnDWpPwxXJyYBbUkhHCchGgbBHlBbLOowKkMmUgEeCiaAkcCDWwddPpPpFfDxXZzGaAjJQjgXvVXcCxqQGVvnNgqQnlLNjaAPppPkmBxYyzZuHdDhUXbkJjypPYQIiIiddDDBbSwWsegYyJjGYyFmMfBCcbXxNQqLlbbBBODBgGwWFfoOXlLxhPpHMmbyYbnXxNWgGwutTUVkeEKQHYrREukjMSJiJjIBbkiRrWxTtXKsDOlLGTRmMDXxdPqQpzjhWwJWwUutuUXxJjJBbjStTeyYgGQqFGguBbSBbsJjwDDUJMvDbBGjJxXgfGgqQFdzZPjxQqUmMzZQqpPnNOoOoOpPZzOooKkNnCcaARUCcuhHMLOPpollWwcCskKlQqNtTLlIwWEzXxJoOjZloRrxzRdfFUEePGgMmqZRrqeETtTJfFjmMBVvzZcCIiWwZhbBHFfzMPpLlcwWuUCcHKkhVvbgGBCNofVTwvVWtdlgGksSGgKKUuoVNkKtRrWwPmfFCcWwqwWiIzXxZifFKjQqiIfVvFiDdIcufFUiIZzlLEGgbBDbBTteEGFEzZCcboaAqQAajJoKkzZOOrReEBCheErIsSiZzdDSmiIVvVRkKEUuesSGbBgJyAtWwTjDnKkkKWwPpKJjofQqFvVqEwWyYeDvqQVyTZzcftJjqFeEfQbBphXxYfFZDdsStTziIydDHlLXKkxWwXxvVeMoOmEvVyYOzZyYoNnmMflVqQvUuSsywWBbFfbNnhHdDBhlLeEHzZvMmbBVYLKpPATQMscCKDjFfJAJPciIYyKkCcCJjlTGguMaAjoKNnVDkanDdMnNmGgiCcWwmMHyYsSLlnNHLlPSsTdDEMmSCMmcsCceetTEKkOqQAaoDdRoOHaAhrztTaUKYypPkuAvVZgGqQXEFmDyYdHhEeBUeElLSJjsTwPpwWmCOocpvSsVzdDZLlPLteEILlmFwWfHhMiXxTdFfcljpPJZaVvAXxzcCkKIdyYDNLlxXVWwiIzZCckKvdxXKkNQAaNnIFfiAYZYLlSQjJTtfyYFItKkTeEevMLlmkKVESsiMmZzdxXKkqQTMmlLoyNLlnYlQRhHvaAEsxjtnNUZwqdDffkoQqOKCcnNtThHHQYyhHBbeSsEJjuGBbTxzzZwWoOdDPKlLkTtuKlLkrRHhyYLlxaSUusDAadjJaAEHhVvkKYyCsSXrRJFdDfunNqQVxJjzZRXAtROoZzmMrGgCcgGTKhqQrtTSsMTtprOoRjJfNnFPmLkKyaWwAuEPpePSspOoyiWwIJeEfFjmOooOHhMNzZQLVvqTtRCckwWmOWwogGuUHbqaKkAxYaAyiIEWwPKHhWsKkmSeEZwjJkKDFfdKkAaWwYyAgGinNDdIxHWwrrTtRmMRDqQYydeEOoFfuUzVqaAQwWvpEeulLuTwWtUAEeKONnokWwyUuYtjJTauJYyjNnFfmMepPyYIJjUbBEPXxyYVvRkutTUVMmjYzZgGZzFOYyBbofJtTgNnGuUbrRGJWbqGgQBwDdDSsnuUNHhoxXjvVJQBbqOUuvstTShHzZSsvhHVFwWFgGfUljJtTLEVhHvEeGgLNFfexXEGIigTkKQvVIfFHhVvrRFlAaKwWkLvQuEeMGxXtTeEgmQCcaAqXnNxwWcCjJjGggGHjJsSkIisKkLHhowWQqOTgtnNxvVmxXMsSQxXFfMXxzZTtfEKgGMmkjDdJeWslLSlLGMzjrhHRgjJGPpBzZIiRaUoOuAItDJvVjVCcyYjJYyvlLvYyVnGgAakKSsbBAavTtFRzZrDdMIAqQlLWwKkapPimpPnkKRmbFfBiILlaLlDudDrRlLtMQFfVeEvquUulLfVvFPxXppPUUaAzPAabBLEtTewWlpcCcCilhHLPpfFfKkFMtQqEehFfEepPHTtvKkVWLlhNOyTtYahozTtjJZGSsgwyqWwocYDdyCOQYxlLXTsgGdDBbFUuUufUBbtBbTuUuYyDdRrgGZBbzZzJdDfYyJjYqQpOoPviIVhHAaArROoXxsuUSaicCIBxvVzZzOtgJjGBeEUuIyKkYbBixXJjWxXLlsSeEaAsOomMMmLlphHMsSwWUumDdPSrRwqFvVyYqgGQdhUmclLxXCMhHPpuNnaGgAvsShHVHSgGsQHhqegpbBfFPwNHqQhlLxDnNdGxrDdRDdGgowWOUSspPuvVXnNJjaoOYyAtTINXxJvaBbjJxXASJjJFMmfwRKXxQqakKAVvkEExOeEMvSsFfVmoBJSJjmAKIikWOoWIiwwWwKIiULfIiFzxRpPpqQPQUlLIiKjZzJudDyYIiaAiIWEezZLYSAasdDybBcCxYyRrZnNzpPcCgGwLlLlTtWGgvVYyXiIuUkfOoXxCZzcOuoOUoHWwvyRoOEeHhFfNnwWGCcQhHKkquAaVZzZDZzdYyCckKjJCcoOzIiqQSNhHnyaAlnNLYcqQBbMYynNqQkKmsSCnIiiIcCYFfyyYYyQqNPMmLaASsiIlGYoYyOdDnDdhHeENTtWjMmSsFWwMmfFMmfxJjfFFfWsiQqISDXxPpZzdMmFfMmlLvIiCUuceEYaEZPpzdBbgGDPpqzZQGIigGgoODMmMmdmJxXjMBbAayQqIjtTJJjiQqwMmyFfYOyuIhHiUuLgwWWiIwcMmqVvQCNnwWdDcsoOorRbuSsSsySCcsRZkVvwyYBPpHkmMKUuRriPpUuICLNnlcGgAFfaLlpfmMYyFJMfFuUZzEewrOYyoRhHLlYyxXGghHWxNnXnNcCwWRrZpPPpzLlyYbBDdDyeEtTYWhHwXNnxKkVvHhZzlfFFYyyeyYGtAKkaekEoOeKPgtwWTIqIwAaWmMKCckSbBqQSsoOVvsLJjlxuUHhVvhAaHLFmLAUqQuiLlolLOtTveVvdDQUucCpPLDdZzFGgrnNgxXGkKfFUuHhcCwjJWZzRHhKkxIKkulIiKNwuUvVWHhPpEekNhHndoODDdDderREtIiWbAafFniINSQqsBFfGgNPdDBbuWwvVqQUuUlLYJjypKkRrkrRQqLlpPTfFtAaKkrsSEzkKZowWOiIuUGglLQktTKqGgaANhHsSpPaAnenwzZWnNTyYxmnNMXNnBbFepPEFfCdDcdbdDKtTkYyzZrzZRTtGgGgJoMmOBbjXbBmZzMxgEePuZzNxOoXaAsSTXxtiFfOaAotykhHAiIOoPpaWrRmMwDdyYGgnNnRcChHblLxXBSsTthVLIaAilQqOoUuveuGgJjTtwWbBWolLsAaSOOoKPpwWqQkDLfFlzZdKknNfFPpSsPpkSsHhTvVtHhzZKXCcnNMmcCxxXHdDkTtxXiIwFXxqOorRsSzZgCeEcGoOsNnMmmmMXCcyjZMKkmzIiJYlFfhzZAdDwWaZzHJjLfFSsEetTxdXRrxDQqdDsVvCdDcAaYtbBXxyfFBbYfFOoqRrQTUuSsjjJKbBVvBbAaztTnNIxsFfSXpuFfVuujXxRyYulLVvsdDSxABbuRrEeKzZhpvVPAaHydUupPDgGeEJjDdztTHfBbgGVvMCyYvKkuFfUVfFcQQzZeEjiIUWdhDOjMmJzZbaAUuaAEeVSaAsvteEwKkDdKUpPHhaWzZcTDNndtCrCZzmgGMcfSsPpFWwlSsLfjqQQHhoOsSYrRfTteEFyYcCykKsbBgGSLUulqiNnIdDqgyYGHluULYyhIiZXAlXKkLyYkKlJjmMVvXrRxSwWsxTYWciICwytfFLMkKZMmyjfFJhHRrWwYdDfzZFSjnRTXxtnNeOhHoYybBEHhTtnNZzunNRZzVvrFoOfRziIbBYyZrRuevVAZzqQeEBbQNnqawWHoOhFftTaADyYFBbfaAdZxwGMmSsdDZzGCclDdLxXOokuTtuUBqTtHhOoUunYqQlYYVvUuKkyBbQgLhHgGlAWwsSGNngaBFfbtFfkSsKISsiNnTtjQqJaTdwvVWjJCcErREeUucuZvNnEGgeIigGqQsIsqOqQoQoTtbBBbObBuUNwWkKrReEegGEhHuSsyYtUuAjJakKfRrCcFdvVHtThDPpkLMmlKTRcVtTvxxJjoGgQuhHUUuglLGnLlORrcaACaAoNnNbBHhWkKZrRzAawxXsSyYhHqxvtTVPpIcEeCBbBbkTFftashHACcPpKklLuUabmMBhMmBbBcCHcCFeIiLlEVvqfFeEkKeEQRrEeIiUkKOQqoAyYYydDMRUuXOvVoxmNhHniIBDJjPMmppPFWwVmQeEqMqQBboOnEaAoaAOiWWEzZekYhHyoOdbBDqlLbGgXPpxDWwsIiRrEeTtbBiISyYGAXxBbdDacqQFbBfiIGjJdDDdgZzxXUcCaJzZLljAuewAaWwyVvzGNMtDdRcCrfiOoOyIiYoDdyIiYIovyaMmfVfFQAaVSsvpFluULKklLyqQJjuUvVqdDopJjEePOcFfzYyYysSZLlqQfFoHqjJQkYLlyuUWlfFLVMdDmtTLlHVuUAdTtfujJUFcIiCwPpWrRdDvVeYyexXEgGyMmwcsxXTtDdQQqsSqnNzZSsSMIimFfYZiIUuHhHEDYydEaAqQitYyTHhrRLcIiWbBwChHQMmqyXxnqQNEekyYCiIcdDeBbaYyAEcCncCoUuvVOeEoObBxnNsIiPAaplLXEJjiIehHxddcCdaAJjhHgSsFfjJjHWwTvVtAagGJjhiIIiSswHhYyrbBRPOosSvVhHOEeGEeDdvnNfycCYFvAabBqQyMWwPDdtBbgpQLTtvVTwWtlLlLUVOHhoOoOonNSxXGgwWVvEeWwNnGgFfNnCcQqnQqwgyYGWGwWgDduUKkhuUMmNnHNXZzOoRrXxrvVqQaAuUNdVviIDcCIfFiZImMizkKnBbBOobRFfyNbSsaABbAaGgBJkOhAavVFfHoybBcCGiIpoOxXVvXxWuUoOwRjAJwWlRrLsyTtEeYCcBbQpPqjJMmQgbOsLYylSoCcqQBgGUBLlDdiwWfFZWwzfFIqwWQbTHhtBwWlmMFfLgBbGLlDdKkhHBWwWwHhHCcBbFwWPhHMmJOorRTtjpbUBbujJWwBymMSsFfKkjJgGTzZWMmppPLUulGNnhzZYdDEeLlGCOocgnTyWwDdYLlNnFEONxXJgGjnHhRroeyyYPpsSlLBbFyYLlzZfKmMhNPaZzpPARrpRrRyYkKMmUwWurAaaALlyYVvfFOXxoUuDdmMQsSvaAYyFVGgsSvumMrIiRzBbZUfiWoOwIoOpfFCcPTGghHXxotTOtBYybMmfFwWQqdDSLlzZsXAPpqLldgGrRHrosBbSOtTRhwWDkKDnNhgGWjJVvwFfDdFfVPpvTtoOgFQqYQqzZOoCcyJjJxlLXLlqRvDdVRrrtTbBCcfFYyPpXxWwtTxXvVUuAabBNKtTMmkvVxXEHhzZTtRregWwYyGjKXxhHkJjwfFKkQBbsxXryYHhfFRyYSFfmMxvVHhKktTjJCcYyZcpPNKfFUugGMmvpPMmVvEvVewWpxeEBbbhHdDDdDdBXtjJTeEZzPNCctTadDFfAnjAaJUurzZRHhphHtThjtHhhHtTTNvcCVlmMLnNbBSkZaAHhzwlLGgFfnNJYyyYjJjJjgKkGzZPQVvwLlVvXxjJZteETgAaGDdWwzGKUuYyUneEehHMVMmvmQqMOoNmMIiUDCcjJoOdhHunwSFfaLlSsVzZvACcuUMiIPoWEewHhWIiwVvOgGyYYXxOnNoyTtpnNZOaAxKkTtMzZmIvVmMstTSWwPpBbgGiXLoOlBbosSzWbtTBwyncCNJhHcCjjEeSsHfjJbBFhJZzIiTtvgNnGeEVpZzthYyhBbHkKxXHKkrRTmnNxEeOokKbmmMTtMgGBXMTtpPWwKwWkJjLlPBOoiIbYGgXrRxrRmewWEMCcTRrpPPptMPpmXxYFaTtAfQJOsSoZzjqSsmhQqHMSschHeECylLxXYdLAadDvVlqQqQqQDMsSmRrEKkekOomMhHsZzpPUuUuonNXxjJOSAPpasdDSKJtTRrjhHKkCdPpsSPlKkLpDTLMmYyCcIAaicCeplLsSnpPNPEtFfTLlJjYkIiKyjPphPpXxuUyYYNEeMmmWwhHZzMvYydBbDVkKZzAHpPhnNPpXJjHvVHhKqQOcCotTMmhHkhkmMjJCNnczNnpaADdUuPZIiKaAXZBVjJvbpPvVRryYSsNdGrfNnezTtZEFRwjJduuxXUjJUXZLlzWwxKXxWpPbkKsSBwkiIlLDSsgleEWwuULEMEemsmyYMfkTtKFroTtORkKsSSrRfFeGoOxbBXSsYazbBeEZASnNsXotTOYyxnNSsJOBYybZztTNnyYYykXxXVvxNnmMOBbTASyYINnisauHhUtoxpPXNnxTtnNzZcHhCcCLlXIATtabBAaYyYyqQilkKWCcEFfewsXxSdnUlLuRrNZzqQDOpPoMEexXEesScCWwBiiidDIdDIHhpPHhIyqNnsSQFEeHnNhBbfYbmDdnNuUaAvrRsSVvVaDdRsSrcDdIiCAtTdmMOombBLlMwgGWqQTnoOwWsSaAWFSsfwNyYijQqSsJvVrROokKIlajJAyYkjJOoKbFmMfDdqQJRrztTLBblPpqQZTaQqZCczAXxclLOMmoHHXxhjJoOhnNMmLcCcfyYFCgGlNfFnCHsxXczZCShpPVKkvtdXxYySspPYyEEejJSsNzZkMmKwWnVUukiIKvEeVGSsZzdDwGWwgWgpPXSsZzxRPprQlNnLiIMmPqWCcwTtnNQNvRrVGkKgcCQgBbGysSYqCcpvVPDbBWwuUeAgGDdanhHgGRrNEHbEZSAaszeCcBhcCdlOoadDAWSswLZWwzFSsjJcXvVYmQqGgfFsSxiIXJjoOMlSsLwEeRrJjkKrIiuURWWQqPjTtCcBbodDJrRjIQrRqXxtTxcCXcCjRrpgGPJJlLjNiIgGaAuUqgGQfFcumMPhHpUCZzpPlLYyvVaAAarRgGWwukKBbUwWiItcCNnTvVmeEMMmuzDdpPZWwaAsUuSUngKktbXxBKkqQkKXQqGEegAyYAakKwWanVxXvTQqtHhwWRFoOlLLlgGXxoOfZvBbsxXovsSVJoOLljOoOlLRrSJNypYyPHhyzZYYWBbdDoOraAqQRwqKkQVvnjeEOoSPtQqTNnpIisbOoBJjTLlwWJjYSXxsGgyOosRNnNnndDNsSIqQkeEKiHhIiPphPpHrRkQqKTtuUcCVvkGSUupPsSXGgmMZzYyxIGdDgiEesHhgKxXFpPfhaARrPpEKkQqeHQWwqTgGdDtHjvVJKTtsqoJjOnNbBQiIuUSHhzZkDdSGgJjwOoWqQCsScMmVJjrRaASBbZzdDsvrEqQtLlTeGLlQqDiAloOnNLaoiIOfFYyIfFdgUfjWwTzMmZtJMmFJKkHhdDNzZnjJjbwJmMYyjTrRtWlLOoXXxnMmDSeEHhsdNmMVvDdxBvVyYPVUuvBbLleEOofFNnrRgGMmlLgGpgGjNgGvVwWnzZtTeJjXFWJjHhwfgGXxxzZVTtzvVZwWLlWwvVsSvWwgGrRpPtrRoOTEZzpFwWfPvVISwWsiTaAtYGgoDdLlOyQPHhdDCcpBjXxJbPZgGzpZzqtTOokKOoSsJiBbAaIgGssmMmMSSYyaNNnwWnEQVFfeWwEvpPAavVHhmXxbyYiIfrRFYANnGZzKkgLOolsSaVAIiaYysOouUPpxXQQqqwWQqrcCRMmPVvxXpSbWwOoAaBvPpsjJdDSgKkRrSGjpPJgJjSssGgSsUhHwWuMmAazZzZQzZlSsAaNnuFfUaALqbpPmMYyWwMmBvhHzZVXxXqyYQyYdDqQPpdDxZzhHRLxXlxXEemqQMIirRAaHhTGVFfvgvBbAaFflLvVVHhrRHhRQqsSrRrEYyUXxueVNxXnGgKpPkPpvCcttTPpryYoOGNTtUuQqIiTtEVvIieXxYyxXEiIvCcKkTbBtlaALniIzZNVvVeDdWNnziIZgzZGjGgTtJwHpfyYPpFPGghdhHSsJAajPrvVSsRpDKbzZBknwWyYiLlqQwUcCuWWKkwzZiIITtDdApPacAPRruUyqfFVvQYpcCZiUuAaIpPEqQoySsNnmMYfjJwWFZdDNnLlAalLOnNozoIOovVwWiUjhHJuVvXxlLCcJaAjCcOoVvCciGgIpqlbBLZDdzzZQgpPGwqaXxKkAjBbJmMQUukYJjaZznpPlLNrRALHhaAlBbbBPpywWiIQqsSKIioTtoOOzbdDvDdVBiFfSsjeEGUugzZJEeHhuUmMlfFSsBbRrvVyyYoOYdavVCUucWwADvVtTeEuUJjJHlLhjJrRjVEeYyRKkrFfWwDdRriIAQsSqHhaLMgGmYySszZsgcCGKoOkSBbljJFUufbBbBbBJjHhXxyYEeERKkBbIivVoOeErAaUuJjGgQqFfxXtTRwWwWrxXOoLVwHhWvGgYynNvJjSsmMhHjabBAJYyQqdxXpPDmrGgJlLjRMRwWrVxUEeuXDdDdRYyxXcCTthZzHUukoBbOiIVyFfYvgUuHhsSGvVjuUJVFfvzpPqgGQjJUuxEejJJsSFfUtTujqQkSsKhBrRbNyYZznjiIEcRrQnNqZzNnCeBbJHPpaSiIsATtaPZPpgGzyYlLyyrRvgGVLhHXxzZlYKVvhPpHpPIikMfFFLlfJLRrHWwGjJgegGCrRcEPLlNaAnpPpCsSdbBDIvVluUSsLiJuUSDdsjcGgMmuUvasSbBaAAIiUuTfFnNtHnNhNxXnFfRroOVniINhRqQrwWWwvqQvmMDdLlCcuFfUzZVVBboXxRrOlIimdDYyMtTUuJKktNNnnbBsmMEeSTwelLEWjVvWzZLlwobBpPIijJdDYyKkOWUuwJjyYAaxXxXIfFizZnNEVnNpPvQRrqeQnNMmqghHcXxXxCWwlLGTIAaUuTttTitltiIvVWwIiTAarRZzQNnoOqxXlLsSmMiOosSEegGQqdeEjJKkuUKkCaAKkCcbBcHfFeEhSseEPVvKklLYyGgpDdcCtSsglLrTtRGPphHNnuUfFeAaEnNWwNnPPpOokKcCCcmtTsSGPpgMa
diff --git a/2018/inputs/6.txt b/2018/inputs/6.txt
new file mode 100644
index 0000000..e544bbd
--- /dev/null
+++ b/2018/inputs/6.txt
@@ -0,0 +1,50 @@
+195, 221
+132, 132
+333, 192
+75, 354
+162, 227
+150, 108
+46, 40
+209, 92
+153, 341
+83, 128
+256, 295
+311, 114
+310, 237
+99, 240
+180, 337
+332, 176
+212, 183
+84, 61
+275, 341
+155, 89
+169, 208
+105, 78
+151, 318
+92, 74
+146, 303
+184, 224
+285, 348
+138, 163
+216, 61
+277, 270
+130, 155
+297, 102
+197, 217
+72, 276
+299, 89
+357, 234
+136, 342
+346, 221
+110, 188
+82, 183
+271, 210
+46, 198
+240, 286
+128, 95
+111, 309
+108, 54
+258, 305
+241, 157
+117, 162
+96, 301
diff --git a/2018/inputs/7.txt b/2018/inputs/7.txt
new file mode 100644
index 0000000..3fe80cb
--- /dev/null
+++ b/2018/inputs/7.txt
@@ -0,0 +1,101 @@
+Step E must be finished before step Y can begin.
+Step Y must be finished before step T can begin.
+Step I must be finished before step C can begin.
+Step G must be finished before step F can begin.
+Step C must be finished before step P can begin.
+Step B must be finished before step Q can begin.
+Step Z must be finished before step N can begin.
+Step J must be finished before step W can begin.
+Step W must be finished before step P can begin.
+Step K must be finished before step D can begin.
+Step Q must be finished before step L can begin.
+Step V must be finished before step D can begin.
+Step O must be finished before step M can begin.
+Step A must be finished before step P can begin.
+Step M must be finished before step L can begin.
+Step R must be finished before step S can begin.
+Step D must be finished before step X can begin.
+Step X must be finished before step N can begin.
+Step P must be finished before step T can begin.
+Step F must be finished before step N can begin.
+Step S must be finished before step L can begin.
+Step U must be finished before step N can begin.
+Step T must be finished before step L can begin.
+Step N must be finished before step H can begin.
+Step L must be finished before step H can begin.
+Step N must be finished before step L can begin.
+Step X must be finished before step F can begin.
+Step P must be finished before step F can begin.
+Step P must be finished before step H can begin.
+Step B must be finished before step D can begin.
+Step V must be finished before step H can begin.
+Step X must be finished before step S can begin.
+Step Q must be finished before step O can begin.
+Step Z must be finished before step T can begin.
+Step K must be finished before step N can begin.
+Step S must be finished before step H can begin.
+Step M must be finished before step P can begin.
+Step Q must be finished before step D can begin.
+Step R must be finished before step U can begin.
+Step J must be finished before step P can begin.
+Step P must be finished before step S can begin.
+Step V must be finished before step U can begin.
+Step R must be finished before step T can begin.
+Step F must be finished before step S can begin.
+Step D must be finished before step T can begin.
+Step E must be finished before step N can begin.
+Step J must be finished before step N can begin.
+Step J must be finished before step A can begin.
+Step K must be finished before step U can begin.
+Step V must be finished before step N can begin.
+Step V must be finished before step S can begin.
+Step U must be finished before step L can begin.
+Step F must be finished before step U can begin.
+Step I must be finished before step T can begin.
+Step J must be finished before step L can begin.
+Step E must be finished before step T can begin.
+Step T must be finished before step N can begin.
+Step I must be finished before step G can begin.
+Step R must be finished before step D can begin.
+Step E must be finished before step B can begin.
+Step X must be finished before step H can begin.
+Step P must be finished before step L can begin.
+Step Z must be finished before step J can begin.
+Step O must be finished before step L can begin.
+Step E must be finished before step H can begin.
+Step F must be finished before step T can begin.
+Step A must be finished before step F can begin.
+Step U must be finished before step H can begin.
+Step F must be finished before step H can begin.
+Step C must be finished before step W can begin.
+Step A must be finished before step L can begin.
+Step V must be finished before step M can begin.
+Step U must be finished before step T can begin.
+Step E must be finished before step P can begin.
+Step Y must be finished before step U can begin.
+Step W must be finished before step R can begin.
+Step E must be finished before step X can begin.
+Step Q must be finished before step U can begin.
+Step I must be finished before step F can begin.
+Step V must be finished before step F can begin.
+Step V must be finished before step T can begin.
+Step R must be finished before step P can begin.
+Step B must be finished before step A can begin.
+Step S must be finished before step T can begin.
+Step M must be finished before step F can begin.
+Step Y must be finished before step F can begin.
+Step C must be finished before step K can begin.
+Step D must be finished before step S can begin.
+Step O must be finished before step S can begin.
+Step M must be finished before step U can begin.
+Step Z must be finished before step S can begin.
+Step R must be finished before step H can begin.
+Step C must be finished before step O can begin.
+Step G must be finished before step Q can begin.
+Step Z must be finished before step D can begin.
+Step B must be finished before step N can begin.
+Step I must be finished before step H can begin.
+Step I must be finished before step P can begin.
+Step E must be finished before step J can begin.
+Step V must be finished before step L can begin.
+Step B must be finished before step U can begin.
diff --git a/2018/inputs/8.txt b/2018/inputs/8.txt
new file mode 100644
index 0000000..ecb2263
--- /dev/null
+++ b/2018/inputs/8.txt
@@ -0,0 +1 @@
+8 11 7 2 4 4 3 6 1 5 0 8 1 6 1 1 5 4 7 3 1 2 3 1 1 1 5 0 9 9 5 2 8 7 5 7 1 4 2 2 1 1 3 1 6 0 8 6 1 8 1 1 5 4 1 3 3 3 1 3 3 1 4 1 2 2 3 3 4 1 9 0 10 1 9 5 2 6 5 6 5 7 1 2 3 1 3 3 2 3 1 1 1 7 0 11 2 5 1 1 8 4 9 1 5 4 7 3 1 3 3 1 1 3 1 7 0 8 5 2 7 8 5 4 1 1 1 1 3 2 1 3 2 3 3 3 2 3 7 1 8 0 9 2 5 4 6 7 2 9 2 1 3 1 3 3 2 1 2 2 1 5 0 9 1 1 6 1 4 2 9 4 3 1 1 2 1 3 1 6 0 9 7 2 9 4 4 5 1 8 6 1 3 1 3 1 1 5 3 3 4 4 3 4 3 7 1 6 0 11 1 3 1 1 1 7 3 8 2 1 6 1 2 1 3 1 1 1 9 0 7 7 2 1 8 1 9 8 2 1 1 3 1 1 3 1 2 1 7 0 8 5 7 1 9 7 6 5 3 1 1 1 2 2 2 2 2 2 1 2 3 2 4 1 4 1 2 5 5 3 4 1 8 0 9 1 3 7 1 2 1 3 9 8 3 1 1 3 3 2 3 1 1 6 0 7 2 4 2 6 8 1 6 2 1 1 3 3 2 1 5 0 10 1 6 6 9 7 8 4 4 9 7 1 2 1 2 3 1 1 4 4 3 6 1 6 0 10 1 7 2 8 1 6 9 3 6 7 2 2 1 3 1 3 1 8 0 8 1 8 9 7 6 1 3 4 1 1 3 2 2 3 2 2 1 6 0 8 1 8 2 3 9 5 1 6 2 1 2 1 2 1 4 2 3 5 5 5 3 4 1 6 0 10 5 7 6 5 7 1 7 4 1 5 1 1 3 2 2 3 1 8 0 7 7 1 8 1 6 4 3 3 3 2 1 3 2 1 1 1 7 0 10 6 1 1 5 9 3 2 3 3 9 3 3 3 1 1 1 1 1 2 1 1 3 5 1 8 0 11 1 3 1 6 6 6 5 1 5 1 6 2 1 3 1 3 2 1 2 1 8 0 6 1 1 2 1 9 9 1 3 1 2 2 3 1 2 1 6 0 9 8 4 2 8 8 7 1 8 1 1 2 2 1 1 2 5 1 1 4 2 3 6 1 8 0 8 4 1 8 1 3 6 9 8 3 1 2 1 3 2 3 1 1 6 0 7 9 1 6 4 9 4 6 1 3 1 1 1 3 1 8 0 7 5 4 1 5 7 1 8 2 1 1 2 2 2 1 2 1 2 1 1 4 4 2 2 3 3 2 4 4 3 7 1 9 0 8 3 3 7 1 1 5 3 3 2 2 1 1 2 1 2 3 1 1 9 0 8 5 9 8 9 4 4 8 1 1 3 2 3 2 1 1 1 1 1 9 0 8 3 6 5 1 8 4 5 2 1 1 3 2 2 1 1 1 3 1 1 5 5 5 5 1 3 4 1 8 0 8 8 5 8 6 7 1 3 5 1 2 3 1 2 3 2 1 1 8 0 9 4 2 8 6 6 2 2 1 2 3 1 1 1 1 3 1 3 1 6 0 7 5 4 4 2 2 2 1 1 1 2 3 1 1 5 5 2 3 3 6 1 8 0 6 1 5 6 4 3 8 1 3 2 1 2 3 2 1 1 6 0 11 7 1 3 7 3 5 3 9 1 5 6 3 2 1 1 1 1 1 7 0 8 7 6 2 8 5 1 3 4 3 2 1 3 2 2 2 1 4 5 4 2 1 3 4 1 6 0 11 7 4 1 1 8 4 6 3 9 2 8 1 1 3 3 3 1 1 8 0 7 1 4 9 2 1 4 6 1 2 2 3 1 3 3 3 1 6 0 8 7 6 2 1 8 4 8 7 2 1 3 1 3 2 2 1 5 3 4 4 4 4 5 4 3 4 1 7 0 10 1 3 1 7 1 1 7 9 5 7 1 2 1 1 3 3 1 1 6 0 11 4 1 7 7 2 4 6 1 7 8 3 1 1 2 1 3 2 1 9 0 9 6 2 9 1 9 9 5 6 1 2 2 1 2 3 3 3 1 3 2 2 2 1 3 5 1 8 0 11 4 8 7 1 3 2 3 6 1 3 9 2 1 2 3 3 2 1 3 1 8 0 6 4 4 3 6 1 2 1 3 3 1 3 2 2 1 1 9 0 10 7 5 1 7 6 1 3 6 6 6 3 3 2 1 1 2 1 1 2 3 1 2 5 5 3 6 1 9 0 10 9 9 2 1 6 4 4 4 1 2 1 2 1 1 3 3 1 1 1 1 6 0 8 1 4 6 1 4 5 8 6 2 1 2 1 1 1 1 7 0 7 3 9 1 1 1 1 1 1 3 1 3 1 3 3 3 3 5 4 2 2 3 5 1 5 0 8 7 6 5 7 1 9 4 5 1 2 1 2 1 1 8 0 10 5 3 2 8 3 6 1 7 9 1 1 3 1 1 2 1 3 2 1 6 0 10 2 6 1 6 9 9 7 6 1 4 2 1 2 3 2 1 5 4 3 1 2 3 4 1 5 0 10 6 2 1 7 1 1 7 5 1 8 1 1 1 1 1 1 7 0 6 1 3 7 4 7 1 3 2 3 1 1 1 1 1 5 0 8 6 5 1 4 4 1 7 2 2 1 2 3 1 3 4 2 5 2 4 6 5 5 4 3 7 1 9 0 6 4 4 1 8 4 1 1 3 1 2 2 2 1 3 1 1 5 0 8 1 3 2 8 1 5 5 5 3 2 3 3 1 1 6 0 7 2 1 8 7 2 7 8 1 2 2 2 3 3 3 5 4 2 5 5 4 3 7 1 6 0 10 6 7 5 1 7 7 5 1 9 1 2 3 1 3 2 2 1 6 0 7 8 6 4 5 6 5 1 2 3 1 1 3 2 1 7 0 7 9 1 1 1 6 3 9 2 1 3 2 2 1 2 2 5 1 4 3 5 1 3 7 1 6 0 7 4 6 1 5 3 1 3 1 3 2 1 1 1 1 9 0 9 1 3 8 4 5 7 9 2 5 3 3 2 1 3 1 2 3 1 1 9 0 8 2 5 6 1 5 5 1 8 2 3 1 2 1 1 2 3 1 3 4 1 2 4 3 2 3 7 1 5 0 9 4 8 1 8 7 1 1 7 6 1 2 1 3 2 1 8 0 8 8 3 5 4 1 3 3 3 1 1 2 1 2 1 1 2 1 5 0 8 1 5 7 8 5 7 3 5 3 3 1 2 1 2 2 5 4 3 5 1 3 6 1 5 0 10 8 6 1 6 7 3 4 2 1 7 2 2 1 2 3 1 5 0 7 4 2 9 1 3 5 1 3 3 3 1 1 1 5 0 11 7 8 2 5 9 5 2 2 5 1 7 1 3 1 1 1 2 4 1 3 4 2 7 3 5 2 5 3 3 5 1 9 0 11 6 2 2 1 7 8 4 6 8 9 1 2 3 1 1 1 1 3 3 3 1 5 0 11 3 4 8 3 9 1 2 5 4 1 2 2 1 1 3 3 1 8 0 6 2 1 2 8 1 1 3 2 1 2 3 2 1 2 1 3 3 3 4 3 4 1 8 0 9 9 8 4 1 3 6 4 1 3 1 2 2 1 2 2 2 1 1 8 0 8 1 9 1 1 7 2 1 5 1 3 2 1 1 2 1 3 1 7 0 6 1 8 7 8 5 4 1 3 2 2 2 1 2 3 5 1 2 3 4 1 9 0 6 1 1 2 7 2 8 2 3 3 3 2 1 3 1 3 1 6 0 9 9 7 7 3 8 5 2 6 1 1 3 1 1 3 2 1 7 0 8 5 4 5 1 7 3 8 1 2 3 1 3 1 3 3 2 3 3 3 3 6 1 6 0 6 1 1 1 6 6 3 2 3 3 2 3 1 1 9 0 10 6 6 9 5 9 2 9 7 6 1 1 1 2 2 3 1 1 1 2 1 5 0 10 4 1 7 4 2 8 3 3 7 3 3 1 3 1 2 2 3 5 2 3 3 3 4 1 6 0 8 4 3 7 7 5 2 4 1 1 1 3 3 1 1 1 8 0 10 5 9 8 3 9 1 1 8 4 7 1 1 3 3 1 2 3 3 1 8 0 8 4 9 1 1 9 4 6 3 1 1 1 1 1 1 3 1 3 2 2 3 3 7 5 4 5 3 5 1 8 0 7 1 6 1 8 5 9 2 2 1 3 3 3 1 3 1 1 5 0 9 3 6 2 2 4 1 4 1 7 1 2 2 1 2 1 9 0 6 4 7 1 1 1 8 2 1 1 1 2 1 2 2 1 4 3 2 4 5 3 6 1 7 0 10 3 2 6 2 1 5 7 8 9 5 1 2 1 3 2 2 3 1 7 0 6 3 6 6 1 4 6 1 1 1 3 2 1 3 1 7 0 9 6 1 3 1 3 8 5 9 4 1 2 2 2 1 1 3 2 3 2 1 2 3 3 4 1 5 0 11 1 3 8 7 7 7 7 2 2 3 1 3 1 1 1 2 1 9 0 10 4 5 1 3 2 8 8 8 3 9 3 1 1 2 3 1 2 2 3 1 7 0 6 6 3 1 3 2 4 3 1 3 1 3 3 2 2 1 3 4 3 5 1 5 0 10 7 8 5 2 3 3 7 1 6 6 1 1 3 1 1 1 9 0 8 5 1 6 1 2 7 4 3 1 3 2 2 1 3 2 2 3 1 9 0 8 9 8 1 4 4 9 3 8 3 2 3 2 1 1 1 1 1 4 4 4 3 1 4 4 6 5 3 5 5 6 3 5 5 3 5 1 6 0 11 8 3 8 1 1 1 6 6 7 5 6 2 3 1 1 3 2 1 9 0 7 4 1 2 1 8 1 2 1 1 1 2 3 3 3 2 2 1 7 0 7 5 6 4 7 3 1 1 1 2 1 2 1 2 2 4 4 1 3 2 3 5 1 9 0 8 5 8 2 3 6 1 9 9 3 1 3 1 3 1 2 3 2 1 8 0 10 2 7 5 2 2 1 5 1 7 9 1 1 3 2 3 1 2 2 1 8 0 8 8 7 5 9 9 8 1 1 1 1 2 1 1 1 2 2 2 2 2 2 2 3 5 1 7 0 11 7 2 2 5 7 1 4 9 4 6 4 2 3 3 2 3 2 1 1 9 0 7 1 3 3 5 2 1 9 3 1 1 2 3 1 3 3 2 1 7 0 10 1 7 6 1 9 3 6 2 4 4 1 1 1 2 2 3 3 2 2 1 2 1 3 4 1 9 0 7 3 6 9 6 7 1 3 1 2 1 2 1 1 1 2 1 1 8 0 10 1 3 9 1 3 8 7 6 6 4 2 2 1 3 2 1 1 1 1 5 0 6 9 8 1 3 5 4 2 2 3 1 3 5 2 3 5 3 4 1 7 0 9 2 9 6 9 1 2 9 2 2 3 1 1 3 3 2 2 1 6 0 11 9 7 3 4 2 9 5 1 6 5 4 3 1 2 3 1 3 1 6 0 7 5 9 3 9 1 1 6 1 1 3 2 3 3 2 3 3 4 6 5 3 5 4 5 3 3 5 1 7 0 6 9 1 6 2 1 6 1 1 3 2 3 3 1 1 7 0 10 6 1 2 9 7 1 8 5 9 1 1 3 2 3 1 2 2 1 7 0 11 2 6 4 4 1 2 2 5 6 2 8 1 3 3 1 3 2 3 4 1 1 5 4 3 4 1 8 0 7 1 6 5 8 5 8 9 1 2 3 3 3 1 2 1 1 5 0 8 3 5 2 4 1 9 4 5 3 1 2 3 3 1 9 0 9 9 2 1 7 2 9 8 5 1 3 1 3 2 2 1 2 1 2 4 3 4 1 3 5 1 9 0 10 5 5 6 1 5 5 6 1 3 7 2 1 1 1 1 1 2 1 2 1 5 0 6 1 5 7 2 3 9 1 2 3 2 3 1 7 0 10 7 8 4 8 9 8 2 1 2 5 1 2 2 1 2 3 3 3 4 4 1 3 3 4 1 8 0 6 3 4 7 1 3 1 3 3 1 3 2 3 3 3 1 5 0 7 6 2 7 4 3 1 1 1 2 3 2 1 1 5 0 8 1 1 4 5 6 3 5 7 3 1 1 3 2 3 1 5 2 3 6 1 6 0 10 1 8 1 1 2 2 5 5 1 3 2 1 1 1 3 1 1 6 0 8 4 2 1 7 7 8 8 5 1 3 1 2 1 1 1 9 0 7 5 8 3 6 1 7 5 3 3 1 2 1 2 3 3 2 5 5 5 2 1 1 2 4 5 4 4 3 5 1 9 0 8 2 1 8 2 4 1 3 4 1 3 2 1 2 1 1 2 2 1 9 0 6 8 8 1 8 8 6 1 1 1 2 1 3 2 2 1 1 7 0 7 7 8 1 8 7 7 8 1 1 1 1 1 3 3 3 5 2 5 2 3 6 1 9 0 8 9 2 8 3 4 7 1 1 1 3 3 3 2 1 2 3 1 1 6 0 7 2 1 9 4 1 3 1 1 2 3 1 2 2 1 5 0 9 8 2 2 7 3 4 1 6 3 1 2 2 1 2 4 3 1 2 1 5 3 7 1 8 0 7 1 6 2 5 3 8 3 2 1 1 1 1 2 3 1 1 8 0 10 5 2 1 1 1 5 7 1 4 9 2 1 1 2 2 2 1 3 1 6 0 10 5 4 8 1 6 2 7 1 6 1 1 3 3 1 3 3 5 3 5 1 5 1 5 3 7 1 8 0 9 6 5 9 1 1 8 5 5 7 2 1 2 1 2 1 3 3 1 6 0 7 9 8 1 2 1 2 5 1 2 1 2 3 1 1 8 0 6 5 3 1 5 3 7 1 3 3 1 1 1 1 1 4 1 1 2 1 3 1 1 2 2 6 5 4 3 6 1 6 0 6 9 5 7 8 1 4 3 1 2 1 2 1 1 8 0 8 4 6 3 1 9 7 1 6 1 1 3 1 3 3 2 3 1 7 0 6 1 1 8 2 3 3 3 1 1 2 2 1 1 4 1 1 2 2 2 3 4 1 6 0 8 8 5 1 1 5 1 7 9 3 1 3 1 1 3 1 5 0 10 6 9 5 9 3 5 2 8 1 1 1 1 2 1 1 1 5 0 10 3 6 7 9 9 1 6 4 2 8 2 1 3 1 1 2 1 2 4 3 7 1 8 0 8 1 3 7 9 5 8 8 3 1 1 1 1 3 1 3 2 1 5 0 10 8 1 9 9 1 5 9 8 4 3 1 2 3 2 3 1 6 0 6 9 9 5 1 7 9 1 2 1 1 3 3 2 3 2 4 1 3 1 3 4 1 7 0 10 3 5 8 9 6 4 1 8 9 1 3 3 1 1 2 3 1 1 6 0 6 3 8 2 1 2 5 3 2 2 1 1 1 1 6 0 10 3 2 6 6 1 2 1 6 4 4 1 1 3 1 3 1 1 5 2 2 3 6 1 5 0 6 2 6 6 1 1 9 1 2 3 2 1 1 8 0 6 6 3 3 6 1 1 3 2 3 2 1 3 2 1 1 8 0 9 1 1 6 8 4 6 2 9 9 3 3 2 2 1 1 3 1 2 1 5 1 3 3 1 5 6 6 5 4 3 4 1 7 0 7 3 5 1 9 7 3 3 1 1 1 2 1 1 3 1 6 0 9 8 7 7 2 1 1 4 5 7 1 1 1 1 2 1 1 8 0 11 8 7 9 1 1 2 9 7 1 8 1 1 2 2 2 3 2 2 2 5 4 2 2 3 6 1 9 0 10 5 4 3 9 1 1 6 9 4 5 1 1 1 3 1 1 3 1 1 1 5 0 6 1 2 1 6 4 8 2 2 3 2 1 1 7 0 6 5 4 5 5 1 1 3 1 2 3 1 3 3 1 1 3 2 1 1 3 4 1 7 0 10 4 4 9 1 5 8 1 2 7 8 2 3 1 1 3 3 2 1 7 0 7 4 9 4 4 1 4 4 3 3 1 2 1 1 1 1 5 0 11 5 3 6 6 4 8 6 5 6 1 3 1 1 1 1 1 4 1 3 3 3 4 1 8 0 8 9 8 1 6 9 8 5 6 1 2 1 1 1 1 1 2 1 8 0 9 1 3 3 5 9 1 1 3 6 1 1 3 2 2 1 1 3 1 8 0 10 8 3 5 6 2 5 7 4 1 4 1 2 1 3 3 1 2 1 2 3 5 3 3 5 1 8 0 11 5 4 9 9 7 9 4 2 7 5 1 3 1 2 1 1 1 2 1 1 5 0 6 1 1 9 9 1 8 2 2 3 2 1 1 7 0 7 3 1 4 2 2 5 5 1 2 3 3 1 3 1 3 1 3 5 1 2 2 7 6 5 3 3 5 1 9 0 10 1 2 7 9 6 4 5 6 9 1 2 2 2 1 2 1 3 2 3 1 5 0 6 8 7 5 1 2 5 3 2 1 2 3 1 6 0 7 9 4 2 9 2 3 1 1 1 3 3 1 1 4 5 3 2 3 3 5 1 8 0 9 3 4 3 1 9 9 3 1 4 1 3 1 2 3 2 2 3 1 9 0 9 7 7 3 8 9 9 1 5 8 2 1 2 2 1 3 2 3 3 1 7 0 9 4 1 6 4 5 4 3 9 1 3 3 1 2 2 2 3 5 5 2 2 2 3 5 1 7 0 7 1 5 7 1 5 1 4 3 1 1 1 2 1 3 1 6 0 6 1 3 2 1 4 5 1 1 3 3 2 1 1 9 0 10 9 4 5 3 8 5 1 3 3 5 2 3 3 1 2 1 1 3 1 1 1 3 5 1 3 7 1 8 0 7 7 3 4 5 1 1 1 1 2 2 1 1 2 1 3 1 9 0 10 9 1 5 3 7 2 2 1 1 7 3 3 1 2 3 3 1 2 1 1 5 0 11 1 1 3 3 3 4 5 2 6 5 1 1 2 2 2 3 1 4 1 2 5 2 4 3 4 1 7 0 8 7 1 8 1 4 2 5 8 1 2 2 2 1 3 2 1 6 0 7 3 5 9 4 1 6 1 1 3 2 3 2 2 1 5 0 6 5 8 6 3 9 1 3 3 1 2 1 3 4 4 2 5 3 2 6 4 2 7 3 5 4 3 5 1 6 0 10 3 5 9 1 1 3 7 1 1 2 1 1 2 3 3 2 1 9 0 7 8 2 9 2 4 1 1 1 1 2 3 2 2 2 1 2 1 7 0 7 6 1 1 8 6 8 6 1 3 1 3 2 2 3 5 3 1 2 3 3 7 1 6 0 11 4 2 7 6 1 2 8 8 1 7 1 2 3 2 1 2 1 1 5 0 9 1 9 1 3 6 7 6 4 4 2 1 3 2 2 1 9 0 8 2 9 1 5 7 2 4 6 2 2 3 2 1 3 1 3 1 5 3 1 4 3 3 4 3 4 1 9 0 8 3 5 3 2 1 2 3 7 1 1 3 1 2 1 3 1 2 1 6 0 8 1 5 7 9 3 7 4 7 1 3 3 2 3 3 1 9 0 8 8 2 9 7 1 6 7 2 1 2 1 2 3 3 3 1 3 5 2 3 2 3 6 1 5 0 6 5 3 2 1 5 7 1 1 3 3 1 1 8 0 10 7 1 7 1 4 5 9 7 9 8 3 3 1 2 1 1 3 1 1 6 0 7 7 1 3 8 1 7 4 1 1 3 3 2 2 2 3 2 2 3 2 3 4 1 8 0 6 2 4 4 6 9 1 3 3 1 3 1 3 3 1 1 8 0 6 9 1 2 9 8 3 1 2 2 1 2 1 1 2 1 7 0 6 1 5 1 9 1 2 3 1 1 3 3 2 1 1 3 2 5 1 3 4 3 5 3 3 4 1 6 0 11 9 5 9 6 3 9 9 4 4 1 2 1 3 1 1 3 3 1 9 0 7 8 8 1 3 5 4 7 2 3 3 2 1 3 2 2 1 1 7 0 10 9 9 1 7 7 4 7 8 1 7 3 1 3 3 1 3 3 3 1 4 2 3 5 1 7 0 11 2 9 9 1 5 7 1 1 5 6 8 3 3 3 1 3 2 2 1 6 0 7 5 7 1 2 6 9 5 1 1 3 1 3 1 1 7 0 8 1 3 2 2 2 5 4 8 3 1 3 3 3 1 2 2 5 5 1 2 3 4 1 7 0 10 4 3 3 5 1 4 9 9 3 1 1 2 2 1 1 2 3 1 8 0 7 8 5 8 7 2 2 1 1 2 1 1 3 3 2 1 1 9 0 7 3 7 5 1 1 5 3 3 1 1 2 2 1 1 1 1 4 2 1 2 3 4 1 5 0 7 4 4 1 6 8 6 1 2 2 1 3 1 1 8 0 6 1 5 9 9 1 2 2 3 2 2 1 3 3 1 1 6 0 9 6 5 4 2 3 1 5 2 1 3 3 1 1 1 2 2 4 5 2 3 5 1 7 0 10 1 7 1 4 1 1 1 1 1 2 2 2 3 3 2 2 1 1 5 0 8 7 6 3 1 1 9 4 1 1 1 2 1 1 1 8 0 9 1 9 1 8 3 1 2 9 5 3 1 2 2 2 1 1 2 3 2 3 5 2 4 5 5 4 3 3 6 1 5 0 6 3 1 5 1 1 9 1 2 1 1 1 1 8 0 9 6 1 3 9 4 4 4 8 6 1 2 2 2 1 3 1 1 1 8 0 7 2 8 1 7 3 3 1 2 1 1 3 3 2 1 3 5 3 3 1 4 5 3 7 1 5 0 6 4 2 5 5 1 1 1 1 2 1 2 1 6 0 6 8 9 9 3 1 7 1 3 3 2 1 1 1 7 0 6 9 3 6 9 1 3 1 1 1 2 1 1 2 1 4 2 2 1 5 5 3 4 1 6 0 6 2 3 9 1 5 3 3 3 1 3 1 1 1 5 0 9 1 1 7 2 8 1 6 2 7 1 3 1 3 2 1 8 0 7 1 9 1 5 2 5 9 2 1 1 1 3 2 2 3 2 1 3 4 3 7 1 8 0 8 8 1 2 7 6 1 9 2 1 3 2 3 2 3 3 2 1 5 0 6 9 8 9 8 6 1 1 3 2 3 1 1 6 0 6 5 1 3 7 1 1 1 2 2 1 1 1 3 1 3 2 2 3 1 2 4 4 5 3 3 7 1 8 0 8 8 2 1 2 3 4 5 2 2 2 1 1 2 3 2 3 1 9 0 11 2 8 2 9 6 1 5 9 9 7 5 3 2 2 3 2 2 1 3 1 1 9 0 9 5 1 1 9 2 1 6 5 4 2 1 3 3 2 2 1 3 1 3 3 3 5 2 2 2 3 5 1 8 0 6 7 7 1 5 9 1 3 1 2 2 3 2 1 3 1 9 0 7 2 9 1 2 4 5 3 2 2 1 3 2 1 2 2 2 1 9 0 7 9 1 1 3 1 4 9 1 3 3 2 1 2 1 3 2 4 2 2 1 4 3 7 1 5 0 11 9 9 5 6 3 1 9 5 7 5 3 1 2 3 1 2 1 7 0 7 5 9 1 3 7 2 1 1 3 3 1 1 1 3 1 5 0 9 3 3 1 5 4 4 2 8 1 1 1 1 2 1 4 4 2 2 5 2 2 3 5 1 9 0 10 2 4 2 1 5 6 2 3 9 6 1 1 1 3 2 1 2 3 3 1 8 0 8 1 7 7 5 7 5 5 9 2 2 1 1 2 1 1 3 1 7 0 9 9 4 4 6 1 5 1 4 1 3 2 1 3 1 2 2 5 2 2 3 3 3 7 1 9 0 10 3 1 9 6 4 7 1 8 8 2 1 2 3 2 2 3 1 2 3 1 6 0 11 9 6 5 3 8 1 8 1 7 5 7 1 2 3 2 1 1 1 8 0 9 3 5 2 1 6 8 9 5 3 3 3 1 2 1 1 3 3 3 3 5 4 3 2 3 2 5 5 5 3 3 6 1 7 0 6 1 8 1 1 8 1 1 2 3 1 1 2 2 1 9 0 10 2 3 6 9 9 7 3 5 1 3 2 2 3 2 2 3 1 2 1 1 8 0 6 9 1 7 1 4 8 1 3 3 2 2 2 1 2 2 2 5 4 1 1 3 4 1 9 0 9 2 2 2 4 9 1 2 8 7 2 3 1 1 3 1 2 1 1 1 8 0 7 4 7 5 4 1 1 7 2 2 1 2 1 1 3 3 1 9 0 10 8 5 1 9 4 5 8 7 2 1 2 2 3 2 2 1 1 3 2 5 3 1 1 3 7 1 6 0 10 8 1 6 8 3 4 6 6 3 7 1 1 3 3 3 1 1 8 0 8 3 1 7 5 1 4 2 2 1 3 1 3 3 3 1 3 1 7 0 9 1 9 8 7 3 3 6 3 6 1 1 1 3 2 3 1 1 3 5 3 2 4 4 3 4 1 8 0 6 8 7 8 4 9 1 1 3 2 1 1 3 3 1 1 8 0 9 8 4 1 9 2 2 7 4 1 3 1 2 3 2 1 2 3 1 8 0 11 2 7 8 5 1 3 1 8 3 7 5 2 3 3 2 3 1 1 3 4 5 5 1 3 7 1 5 0 10 7 8 9 5 9 6 4 3 2 1 3 1 1 3 1 1 7 0 8 4 4 3 5 3 7 9 1 3 1 1 1 1 1 2 1 5 0 8 2 3 5 8 4 8 1 2 2 3 1 3 3 3 3 5 3 2 4 4 6 5 1 5 3 3 5 1 8 0 8 6 1 6 6 6 1 9 7 3 1 3 3 2 2 1 3 1 9 0 9 3 6 3 1 1 1 2 9 2 1 3 2 3 3 1 3 3 3 1 7 0 9 1 2 5 2 1 7 9 9 6 2 3 1 2 2 3 2 4 1 1 1 1 3 4 1 6 0 6 1 6 9 9 2 4 1 2 3 1 1 2 1 5 0 7 1 1 5 2 9 8 9 1 1 1 3 2 1 8 0 9 9 5 1 1 6 9 6 6 9 1 1 2 1 1 3 3 1 2 3 2 2 3 6 1 8 0 6 1 8 4 4 6 9 3 1 3 2 2 1 2 1 1 7 0 7 1 3 5 3 1 7 1 2 3 3 2 2 2 1 1 7 0 8 2 6 8 6 1 1 5 6 2 1 2 1 3 1 2 4 4 3 2 2 3 3 6 1 8 0 10 5 8 3 9 1 9 8 3 5 6 1 1 2 1 1 2 2 2 1 8 0 8 4 1 2 7 1 7 5 9 2 1 1 2 3 2 2 3 1 7 0 8 4 1 8 2 5 6 4 8 3 1 1 1 2 1 3 3 2 3 3 4 5 3 6 1 9 0 6 2 4 1 9 1 2 3 2 2 1 1 3 2 1 1 1 8 0 10 4 2 8 8 5 5 9 5 1 5 2 3 2 3 1 3 2 1 1 6 0 10 7 6 1 2 1 6 1 2 5 3 3 3 3 1 3 1 4 2 1 1 3 3 7 4 1 5 4 3 4 1 5 0 9 8 8 7 5 3 3 4 1 5 2 3 1 3 2 1 8 0 7 8 9 6 6 1 1 1 3 2 3 1 1 1 2 3 1 8 0 8 8 4 1 2 7 1 5 8 3 3 3 1 2 2 2 2 1 5 2 4 3 7 1 6 0 11 3 6 9 1 6 9 5 1 6 4 2 1 2 1 3 3 1 1 8 0 7 1 1 6 4 7 9 7 3 2 1 1 3 1 1 2 1 8 0 6 1 1 3 9 1 9 3 1 3 1 3 2 2 2 3 3 3 1 3 5 1 3 5 1 8 0 8 7 2 6 8 1 1 2 9 1 3 3 3 1 2 3 1 1 7 0 11 9 5 3 3 4 9 8 7 9 4 1 1 1 3 3 2 3 2 1 9 0 9 9 3 1 6 1 6 8 4 1 3 3 3 3 1 2 1 1 2 4 5 1 5 4 3 4 1 7 0 8 1 2 2 4 9 6 1 1 3 1 3 1 2 1 3 1 6 0 7 3 4 5 9 7 1 5 3 2 2 1 1 2 1 9 0 6 5 3 1 4 5 1 1 1 3 1 3 1 1 3 1 1 4 1 2 3 6 1 5 0 6 7 1 6 8 3 1 1 1 3 1 3 1 7 0 9 1 2 2 9 8 7 7 1 9 1 2 3 1 2 3 1 1 8 0 11 7 5 6 5 1 4 4 4 7 1 4 2 3 3 3 1 1 3 2 5 5 3 5 2 3 5 1 7 5 8 8 1 6 2 4 5 3 4 1 9 0 8 3 8 1 3 6 9 4 1 1 2 3 3 1 3 2 3 1 1 7 0 10 8 5 2 1 3 4 7 2 3 5 3 1 3 1 3 1 3 1 8 0 7 2 1 4 3 9 1 6 1 1 3 2 3 2 3 2 3 4 5 4 3 7 1 6 0 6 1 1 7 9 9 5 1 1 1 2 3 3 1 7 0 10 8 7 4 5 6 4 1 1 3 7 1 2 2 3 3 3 3 1 6 0 7 4 3 7 1 3 8 2 3 2 1 1 1 1 2 3 1 4 4 2 1 3 7 1 7 0 6 7 3 6 3 7 1 3 1 1 3 2 2 1 1 8 0 6 4 5 6 9 1 5 3 1 1 1 3 2 1 2 1 6 0 10 7 6 5 6 4 2 3 3 1 6 3 1 2 3 1 3 3 3 4 5 2 2 4 3 5 1 9 0 9 8 1 3 7 4 9 9 1 1 2 1 1 1 1 2 2 1 3 1 6 0 9 3 7 4 2 1 6 8 4 9 1 3 3 3 1 1 1 7 0 6 4 6 8 7 3 1 2 2 3 2 2 1 2 1 4 2 5 4 6 6 2 5 1 5 4 3 4 1 6 0 9 1 2 7 3 3 9 1 6 9 1 2 3 2 1 3 1 5 0 8 3 8 8 9 9 2 5 1 3 1 1 3 1 1 9 0 6 7 4 1 4 1 9 1 3 1 2 1 1 2 1 1 3 1 3 1 3 4 1 9 0 9 4 1 1 4 3 7 6 4 6 3 1 2 1 3 2 1 1 1 1 6 0 7 8 1 6 5 8 3 1 3 2 3 3 2 1 1 6 0 11 2 3 3 6 1 3 7 1 7 7 1 2 3 2 1 1 3 4 3 4 1 3 4 1 5 0 9 1 5 4 7 6 1 1 5 3 3 2 1 1 2 1 6 0 10 6 9 1 5 5 5 9 8 6 3 1 1 3 3 1 1 1 6 0 11 1 9 3 2 3 1 4 9 2 4 4 2 2 1 1 3 3 2 3 3 4 3 6 1 9 0 6 1 9 9 6 6 2 1 3 3 1 3 2 3 3 1 1 6 0 9 7 5 1 1 4 4 9 4 1 3 3 2 1 1 1 1 6 0 7 5 7 1 8 7 3 9 3 1 2 2 2 1 3 1 4 3 3 2 3 5 1 7 0 10 6 1 1 6 1 9 4 9 2 3 1 2 3 3 2 3 3 1 7 0 8 1 6 1 2 4 1 2 8 1 1 1 2 3 1 2 1 7 0 6 2 3 1 4 2 6 3 1 1 1 1 3 1 3 2 3 3 1 7 3 4 3 5 3 3 4 1 9 0 8 1 4 6 6 4 9 1 2 2 2 2 2 2 1 3 3 2 1 6 0 7 6 1 1 5 9 5 7 1 3 3 3 1 1 1 8 0 10 6 1 3 3 1 7 2 8 9 9 1 1 2 3 2 2 3 1 1 3 3 2 3 6 1 7 0 6 8 2 2 7 1 6 2 1 3 2 1 2 3 1 6 0 8 2 5 1 8 1 7 6 6 2 3 1 2 1 2 1 7 0 9 6 3 9 1 7 3 5 2 8 1 3 1 1 1 1 2 4 1 5 3 5 3 3 4 1 6 0 8 3 1 1 9 2 8 2 1 2 3 3 1 2 1 1 7 0 6 1 9 4 4 8 1 3 1 2 1 3 1 1 1 9 0 10 5 2 5 9 4 2 1 8 1 5 3 3 1 3 1 1 3 3 2 2 3 4 5 3 7 1 8 0 11 7 6 3 6 2 1 6 3 5 3 1 3 1 3 3 1 3 3 2 1 9 0 8 5 4 3 4 7 1 4 2 3 3 2 1 3 1 3 1 3 1 8 0 6 1 9 1 5 2 4 1 1 3 1 3 2 2 2 5 5 4 4 4 3 1 3 4 1 8 0 9 3 2 1 6 5 9 6 5 7 2 3 1 2 3 2 3 2 1 5 0 11 7 6 8 6 4 3 1 8 2 1 6 1 1 3 1 1 1 5 0 9 3 1 8 3 9 4 8 8 9 2 3 2 2 1 5 1 4 1 3 5 2 5 3 3 5 1 5 0 9 7 8 2 2 2 2 5 1 5 1 3 1 2 1 1 5 0 7 1 4 2 8 1 6 1 1 3 1 3 2 1 5 0 8 2 7 2 9 1 6 1 8 3 3 1 2 2 3 5 1 3 4 3 5 1 6 0 6 9 7 1 2 3 8 2 2 2 3 1 1 1 6 0 8 1 4 8 8 9 8 6 2 1 3 1 1 2 1 1 9 0 11 7 2 1 1 7 6 3 2 6 7 2 1 1 1 1 3 2 3 3 2 1 4 3 4 4 3 6 1 5 0 10 2 9 1 1 7 1 3 9 2 6 1 3 1 3 2 1 7 0 6 1 7 8 2 8 2 2 1 1 3 3 2 1 1 9 0 10 8 5 7 3 1 2 7 1 6 1 1 2 2 3 1 2 1 1 3 4 2 5 3 4 4 3 7 1 5 0 11 1 8 2 3 7 8 2 1 3 7 4 1 2 2 1 1 1 9 0 9 6 2 7 6 9 3 6 2 1 2 1 2 2 2 1 1 1 1 1 7 0 7 3 9 8 1 4 1 6 3 1 2 2 2 1 3 2 1 2 5 4 1 3 3 6 1 8 0 11 4 6 2 5 2 5 5 5 1 3 1 3 1 1 3 1 1 2 1 1 9 0 8 2 5 7 9 1 3 5 1 1 2 1 2 1 1 1 2 3 1 6 0 11 7 1 3 2 8 9 7 8 5 1 1 2 3 3 1 2 2 3 5 3 1 3 2 1 4 4 5 4 3 4 1 9 0 7 4 9 7 2 7 1 8 3 3 3 1 2 1 1 1 3 1 5 0 7 8 1 2 8 5 3 7 1 2 3 1 2 1 5 0 6 1 5 7 6 1 8 2 3 3 2 1 3 2 4 2 3 4 1 9 0 7 1 5 4 7 8 1 3 3 1 1 3 1 3 2 1 1 1 7 0 11 6 6 3 2 2 3 1 3 9 6 3 1 1 1 2 3 2 2 1 9 0 6 1 1 3 3 4 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 7 1 5 0 9 9 1 5 5 4 8 2 5 4 1 1 2 2 2 1 7 0 9 5 1 6 8 5 3 7 4 1 1 2 1 3 2 1 2 1 9 0 8 7 8 3 7 5 4 1 5 2 3 2 1 1 1 1 1 3 5 3 1 2 1 3 1 3 4 1 9 0 6 1 6 5 6 8 4 3 3 1 1 3 2 2 1 1 1 9 0 7 9 5 3 1 5 2 1 3 2 3 2 1 1 3 1 3 1 5 0 9 3 1 8 1 4 4 5 9 6 1 2 1 1 2 1 2 1 1 3 7 1 5 0 11 7 4 4 6 1 7 6 1 1 6 2 2 1 1 3 2 1 9 0 6 1 9 9 1 3 6 3 1 1 2 1 1 1 2 1 1 8 0 7 8 7 2 2 1 6 3 2 3 1 1 2 2 3 1 4 5 5 1 4 5 2 3 4 1 5 4 5 3 4 1 6 0 10 6 9 8 8 5 5 8 1 4 7 2 1 1 1 2 3 1 8 0 7 6 3 2 4 7 4 1 1 3 2 1 3 3 2 3 1 9 0 11 6 9 3 7 8 6 5 6 4 1 7 2 2 2 1 1 1 2 1 3 3 3 3 3 3 6 1 5 0 7 3 8 6 2 7 1 9 1 1 1 2 1 1 6 0 8 8 9 7 1 1 7 2 6 1 1 2 3 1 3 1 8 0 8 1 6 9 2 6 6 3 6 3 1 3 2 1 3 2 1 3 4 1 4 2 1 3 5 1 9 0 6 2 6 7 3 1 2 2 2 1 2 3 2 1 2 3 1 9 0 7 7 5 7 6 1 8 1 1 1 2 1 1 3 3 3 2 1 9 0 7 6 8 4 1 2 1 3 3 3 3 3 1 2 3 1 2 2 1 5 2 3 3 6 1 8 0 7 1 1 5 7 9 1 3 3 1 3 3 1 1 2 1 1 7 0 11 5 9 1 3 5 8 5 8 2 2 8 3 2 3 1 2 1 3 1 5 0 9 6 9 4 2 1 1 3 6 2 1 3 3 1 1 3 3 4 3 5 5 2 3 6 1 1 2 8 7 3 5 3 3 6 1 6 0 6 1 1 1 8 7 6 1 2 3 3 1 3 1 8 0 9 1 3 7 5 6 7 5 1 6 3 3 1 1 1 1 3 2 1 7 0 7 2 1 8 9 3 8 1 3 2 1 3 2 2 1 2 2 2 1 3 4 3 7 1 5 0 9 2 2 9 6 7 9 7 1 7 3 2 1 1 1 1 8 0 7 7 6 8 1 2 6 8 3 3 1 1 3 2 2 1 1 9 0 9 1 1 7 1 3 2 5 5 5 3 1 1 2 1 3 2 1 3 5 4 1 5 3 1 1 3 7 1 9 0 7 2 1 1 7 5 5 3 1 3 1 3 1 2 1 3 3 1 7 0 10 2 3 7 7 3 6 2 3 1 7 3 2 3 1 2 2 3 1 9 0 8 9 7 7 3 9 3 1 4 3 1 1 1 1 3 3 1 1 3 4 1 1 3 4 3 3 5 1 9 0 9 1 2 3 9 6 3 7 6 1 1 1 2 1 1 3 2 3 1 1 9 0 6 1 9 1 4 3 3 2 1 1 3 3 1 3 1 3 1 8 0 11 3 3 1 3 6 7 1 8 6 4 3 3 3 1 2 1 1 1 1 1 5 4 1 1 3 5 1 8 0 8 4 8 1 6 3 1 6 3 3 2 2 3 1 3 3 3 1 5 0 10 1 1 8 1 1 7 1 5 4 6 3 3 1 1 3 1 6 0 7 1 9 5 1 3 2 6 1 3 3 2 2 1 3 4 1 2 4 2 3 2 5 3 3 6 1 6 0 10 3 7 9 5 6 1 7 2 3 1 2 2 3 1 1 2 1 7 0 7 1 7 5 6 2 6 7 1 1 1 2 1 1 2 1 9 0 11 3 6 7 9 8 8 8 7 3 1 3 3 1 2 1 1 1 3 2 3 3 3 3 1 4 3 3 7 1 5 0 7 8 3 6 1 3 6 4 2 1 2 1 3 1 6 0 10 7 4 6 9 1 6 5 5 2 8 1 1 1 1 2 2 1 8 0 6 2 6 8 7 1 2 3 2 2 1 3 1 1 2 2 2 2 5 3 1 4 3 4 1 5 0 6 2 1 7 4 4 5 3 2 1 3 1 1 8 0 10 4 4 5 1 1 7 2 2 8 6 2 1 3 3 1 2 1 1 1 6 0 6 6 6 1 3 6 3 2 1 2 1 1 1 1 4 1 2 3 6 1 5 0 7 1 8 5 2 7 3 4 1 1 2 2 2 1 6 0 8 7 8 1 7 7 4 1 1 2 3 3 2 3 1 1 6 0 8 8 1 1 4 8 4 4 4 1 3 2 3 1 1 4 3 5 2 1 2 3 5 1 8 0 6 1 3 8 5 2 1 2 1 1 2 2 1 2 1 1 7 0 10 9 6 9 8 4 8 1 2 2 4 1 1 1 1 2 2 1 1 5 0 7 1 7 3 9 6 1 3 2 1 2 2 2 5 3 5 1 1 3 7 4 5 4 3 5 1 5 0 6 5 1 5 2 4 6 1 3 1 2 3 1 7 0 7 1 8 4 1 5 1 3 3 1 2 1 1 1 1 1 5 0 9 5 1 1 4 8 1 4 6 8 2 2 2 3 1 4 2 2 2 4 3 4 1 6 0 10 8 2 9 4 6 2 1 7 9 3 2 2 1 2 2 2 1 5 0 7 1 4 9 4 7 9 6 1 1 2 2 3 1 6 0 10 1 1 3 5 6 2 4 5 4 3 3 1 3 1 1 1 5 3 5 3 3 4 1 5 0 7 1 1 5 3 4 7 9 1 2 1 3 1 1 6 0 10 7 6 7 8 2 2 5 8 3 1 2 2 1 1 3 3 1 8 0 11 2 1 3 8 9 1 5 4 7 3 4 1 1 3 1 2 2 3 2 1 1 4 2 3 6 1 9 0 8 2 9 1 1 7 4 8 7 1 3 2 1 2 3 2 1 2 1 8 0 10 1 7 3 6 1 6 1 9 3 3 2 3 1 1 2 2 1 2 1 6 0 9 2 4 2 1 6 6 8 4 1 2 1 3 1 1 1 2 1 3 2 4 2 3 7 1 7 0 11 7 7 9 6 3 3 4 5 5 1 5 1 2 1 3 3 1 1 1 6 0 8 6 6 7 2 9 1 6 5 2 3 2 2 2 1 1 5 0 6 3 1 1 2 4 2 1 2 2 1 2 3 3 4 2 5 5 2 4 2 4 3 5 5 3 7 1 7 0 6 1 9 3 8 7 1 3 3 3 2 3 1 2 1 5 0 9 3 7 1 6 1 2 7 4 3 3 1 1 1 3 1 5 0 11 1 8 9 9 9 6 1 8 6 8 3 3 1 1 1 1 2 3 5 2 2 1 4 3 5 1 5 0 8 8 3 5 4 1 1 9 5 1 3 1 3 1 1 8 0 7 1 7 5 1 6 4 8 2 1 3 2 1 1 3 2 1 9 0 11 9 3 1 4 9 8 6 9 3 8 8 3 3 3 3 2 1 1 1 2 3 2 3 2 1 3 4 1 5 0 8 1 7 5 3 9 3 3 9 2 1 2 2 1 1 5 0 7 3 1 9 3 9 3 6 3 3 3 2 1 1 5 0 9 5 6 4 8 3 1 1 7 6 3 1 3 3 1 3 5 5 3 3 4 1 8 0 8 1 3 1 6 1 5 9 8 3 3 1 1 2 3 1 1 1 8 0 8 1 7 8 1 9 6 9 6 1 1 2 1 1 2 2 3 1 6 0 7 4 8 2 4 7 7 1 1 2 1 1 2 1 2 3 3 5 3 7 1 5 0 10 9 2 9 7 1 2 1 1 4 2 3 1 2 1 1 1 8 0 10 4 1 1 2 1 5 7 3 7 5 2 1 1 2 1 2 2 1 1 7 0 7 4 4 5 1 4 2 1 1 2 1 3 3 3 3 1 1 1 2 2 1 4 1 3 6 1 6 5 4 3 7 1 7 0 6 7 3 3 5 8 1 1 1 2 2 3 3 1 1 5 0 8 8 1 8 8 4 9 1 1 2 3 1 3 3 1 5 0 7 8 8 8 1 5 5 1 3 1 2 1 1 1 4 3 1 5 5 3 3 5 1 5 0 10 3 9 5 9 5 9 8 3 1 2 1 1 1 1 1 1 9 0 7 6 2 1 3 3 7 2 2 2 2 3 1 2 3 1 2 1 5 0 9 3 7 3 7 1 9 7 3 7 3 2 2 1 2 2 1 4 1 5 3 7 1 5 0 7 1 8 6 6 9 5 5 2 3 2 1 1 1 8 0 9 5 3 2 1 5 3 7 3 9 3 2 3 3 1 2 1 3 1 6 0 10 1 6 5 8 9 5 3 1 2 6 1 2 3 2 1 1 4 5 3 4 3 2 3 3 5 1 5 0 11 7 5 2 1 4 7 4 9 4 3 6 1 1 2 1 2 1 7 0 8 6 8 6 6 1 3 3 1 1 1 1 2 3 1 3 1 8 0 7 3 1 9 4 8 7 4 1 1 3 1 3 3 2 1 2 4 3 4 1 3 6 1 6 0 8 9 1 3 7 2 1 1 1 2 3 1 2 2 1 1 6 0 8 3 5 4 6 6 3 7 1 1 1 1 2 2 1 1 7 0 10 3 6 4 1 1 7 1 6 1 8 1 2 2 2 1 1 1 2 2 3 3 3 3 1 7 2 5 5 5 3 4 1 6 0 9 1 7 1 1 8 6 2 5 1 1 1 2 1 1 1 1 5 0 11 9 2 1 2 7 5 5 8 6 1 7 1 3 1 1 2 1 7 0 7 4 7 8 4 7 1 8 3 3 3 2 2 1 1 1 3 1 2 3 6 1 7 0 9 7 5 1 2 7 9 8 3 7 3 3 1 3 1 1 1 1 6 0 9 6 6 1 3 9 3 8 4 7 1 1 1 1 3 2 1 6 0 7 8 5 6 6 1 5 5 1 2 3 1 3 1 1 2 3 3 5 5 3 6 1 5 0 6 3 4 1 1 7 9 3 2 2 2 1 1 9 0 11 7 1 2 6 7 2 8 5 4 5 7 2 2 3 1 1 2 2 3 1 1 6 0 9 6 6 2 9 5 7 2 1 6 1 1 2 3 3 3 4 2 3 1 2 2 3 7 1 7 0 11 2 9 8 1 1 7 7 4 6 7 5 3 1 2 1 2 3 3 1 6 0 7 9 2 1 3 2 7 8 3 3 2 2 1 1 1 5 0 10 5 5 3 1 8 5 2 2 3 6 1 2 1 2 2 1 4 2 3 2 2 2 3 4 1 5 0 7 1 3 7 2 9 2 9 1 3 3 2 1 1 9 0 7 5 1 4 4 3 3 1 1 1 1 2 1 2 3 1 2 1 8 0 11 3 6 1 3 3 2 8 6 2 6 7 3 1 1 1 2 1 1 3 5 3 5 3 3 3 4 7 4 5 5 3 5 1 6 0 8 3 2 8 1 9 6 1 9 3 1 1 2 2 1 1 9 0 8 1 9 4 6 1 9 9 8 1 3 2 3 1 2 2 3 3 1 8 0 9 5 3 1 9 6 6 7 7 4 1 1 1 1 2 3 1 1 1 1 1 5 4 3 6 1 9 0 11 1 7 4 2 7 4 8 9 3 5 4 1 1 3 3 1 1 2 1 3 1 7 0 9 1 2 2 7 5 5 9 5 3 2 2 3 1 3 3 3 1 8 0 6 1 6 1 2 4 1 3 1 1 2 1 3 1 1 2 2 3 2 3 4 3 7 1 7 0 8 5 9 7 1 5 1 7 7 2 1 1 1 2 1 1 1 9 0 8 3 4 9 3 6 1 2 3 3 2 2 1 2 3 2 1 1 1 8 0 6 2 4 5 5 7 1 3 2 3 1 2 2 2 2 1 1 5 5 3 4 1 3 7 1 8 0 9 1 6 3 9 4 1 9 4 8 2 3 2 3 2 1 1 1 1 9 0 10 4 1 4 5 2 6 1 6 2 2 1 3 3 1 3 2 3 2 2 1 5 0 6 1 9 9 6 5 1 3 1 2 1 1 1 1 2 4 3 3 4 3 7 1 9 0 7 5 5 5 5 1 3 3 3 2 1 3 2 1 2 3 1 1 7 0 6 6 9 7 9 1 5 1 2 3 1 1 3 1 1 9 0 11 5 3 7 6 7 4 8 1 1 8 3 2 1 2 3 2 1 3 1 1 2 3 3 1 4 4 2 4 1 7 5 3 9 7 8 7 2 5 4 3 7 1 6 0 8 9 1 1 7 4 1 1 2 3 2 1 3 2 2 1 8 0 7 8 4 5 4 4 1 2 1 2 2 1 3 3 2 1 1 6 0 10 7 8 4 1 1 7 5 9 5 2 1 1 1 3 1 1 1 2 2 1 5 4 4 3 5 1 8 0 10 3 1 2 1 8 1 5 4 2 7 2 1 3 2 3 2 1 3 1 8 0 10 4 1 8 6 8 6 4 2 5 1 1 2 2 3 2 2 1 1 1 5 0 9 1 5 8 4 1 7 6 7 1 1 1 2 2 2 4 1 3 3 1 3 7 1 8 0 8 1 6 3 2 6 7 2 7 2 2 3 3 1 1 2 1 1 7 0 9 7 1 3 4 5 8 9 1 6 3 1 2 2 2 1 2 1 5 0 7 8 1 8 4 2 5 6 3 1 3 2 2 2 5 3 1 4 2 1 3 5 1 8 0 10 1 1 5 7 3 7 5 1 3 7 1 2 3 1 3 1 2 1 1 8 0 9 3 1 2 1 1 7 8 1 6 3 3 2 1 2 1 1 1 1 5 0 11 5 4 1 5 2 1 6 2 2 6 9 3 3 3 2 1 4 1 1 3 2 3 4 1 7 0 7 5 9 1 2 7 3 9 1 2 3 2 3 2 3 1 5 0 7 4 7 5 8 1 5 3 2 3 3 1 1 1 6 0 9 2 2 8 5 3 1 2 1 6 3 2 2 1 1 3 4 1 3 5 5 1 4 3 4 4 3 5 1 8 0 10 9 5 8 8 3 3 3 1 8 1 2 3 2 1 2 1 3 2 1 6 0 11 4 9 1 2 8 6 7 7 9 6 4 2 1 1 1 3 2 1 6 0 8 2 3 1 3 6 4 8 8 2 1 3 2 3 1 1 2 4 3 2 3 4 1 9 0 10 5 6 5 8 4 1 5 8 1 5 1 3 1 2 1 1 1 2 1 1 8 0 7 6 2 8 3 9 6 1 2 1 1 3 2 3 2 2 1 7 0 6 9 9 2 5 6 1 1 2 3 1 2 3 2 1 5 4 2 3 5 1 6 0 6 1 4 4 1 9 1 1 1 2 1 3 2 1 5 0 10 9 9 4 1 6 5 3 8 3 9 3 1 3 3 1 1 8 0 9 6 8 1 3 8 6 1 4 5 3 1 2 3 3 1 3 2 3 5 2 4 3 3 6 1 7 0 6 8 1 2 4 5 9 1 3 2 3 3 2 1 1 6 0 6 6 1 8 7 5 1 2 3 1 2 1 1 1 5 0 8 9 1 7 5 3 9 5 5 2 1 2 2 1 1 2 2 2 4 1 4 1 6 5 4 3 3 5 1 9 0 10 3 6 1 2 9 6 8 2 9 5 1 2 1 1 3 3 2 1 3 1 9 0 9 6 3 4 7 5 1 6 4 9 1 2 2 1 3 1 1 2 1 1 8 0 8 7 2 6 6 1 3 8 1 1 3 3 1 1 1 1 1 2 3 1 2 5 3 5 1 7 0 10 8 8 8 1 8 5 4 6 1 3 2 2 2 3 1 3 1 1 8 0 10 1 2 1 8 7 3 2 2 6 3 1 3 2 2 3 3 1 1 1 5 0 11 1 9 6 7 1 8 8 8 2 6 6 2 2 2 1 2 4 3 2 1 4 3 6 1 7 0 10 3 6 1 7 9 3 3 1 8 9 3 3 2 3 2 1 3 1 9 0 7 2 2 2 4 5 9 1 2 2 2 2 2 1 1 3 2 1 7 0 7 1 1 3 9 5 3 4 1 1 1 2 1 3 1 3 2 3 1 4 3 3 7 1 6 0 10 6 7 4 3 1 1 8 4 3 6 2 1 1 3 1 3 1 7 0 6 1 1 4 2 8 3 1 2 1 1 1 2 2 1 9 0 10 6 9 1 8 5 5 4 8 5 1 2 3 3 2 1 2 1 3 3 4 2 2 5 3 3 1 4 2 3 5 5 3 6 1 7 0 9 9 9 8 1 7 5 1 3 3 2 3 2 1 3 1 1 1 7 0 7 4 1 9 9 3 1 8 1 1 3 1 2 1 1 1 9 0 9 9 9 8 5 2 7 2 5 1 2 1 1 1 2 2 3 1 3 1 4 1 2 3 5 3 4 1 7 0 6 7 4 4 3 6 1 1 3 2 1 1 2 3 1 6 0 6 3 1 9 5 5 5 3 3 1 1 2 1 1 9 0 8 8 8 4 5 4 1 5 7 1 3 2 3 1 3 2 2 2 1 4 3 5 3 6 1 9 0 10 7 7 2 9 5 1 4 2 1 4 3 2 3 3 2 1 2 3 1 1 9 0 8 1 6 4 7 1 4 9 1 1 3 2 3 3 2 2 2 3 1 6 0 9 9 8 6 6 6 1 6 4 9 3 2 1 3 3 1 1 2 4 1 3 4 3 5 1 6 0 10 3 1 7 3 9 7 5 6 7 8 2 1 1 1 2 2 1 5 0 8 1 9 1 4 8 1 2 5 1 2 1 3 2 1 7 0 9 4 6 9 6 1 6 8 5 6 1 3 1 1 1 1 2 3 2 1 3 1 3 5 1 7 0 6 9 8 8 1 3 5 1 2 1 1 3 2 3 1 9 0 8 4 8 7 9 3 7 1 7 2 2 1 3 1 1 2 3 2 1 9 0 7 3 2 8 1 8 3 2 3 3 1 1 3 1 1 1 1 1 2 3 3 4 5 5 5 2 2 5 3 3 5 1 7 0 8 1 1 1 5 1 8 5 3 3 2 1 2 1 2 2 1 7 0 9 5 1 8 1 5 4 8 6 5 1 1 2 3 1 2 3 1 6 0 10 1 9 8 4 5 7 1 7 5 1 3 1 2 2 1 1 2 2 1 2 5 3 5 1 6 0 9 8 3 3 1 2 5 1 3 6 1 2 2 3 1 2 1 6 0 8 5 2 5 1 4 4 4 1 3 1 2 2 1 1 1 5 0 10 6 3 3 1 3 7 5 3 8 8 1 3 2 2 1 1 3 4 2 5 3 6 1 9 0 8 6 8 1 4 8 1 6 8 1 3 2 3 1 3 3 1 3 1 7 0 7 7 1 1 1 3 4 9 2 1 3 2 2 1 2 1 8 0 8 3 6 2 8 5 1 6 1 2 2 2 3 1 1 2 1 4 1 1 3 1 3 3 6 1 8 0 10 3 2 9 1 3 1 6 8 4 3 1 1 2 1 2 2 2 2 1 8 0 10 4 1 3 7 4 4 2 3 6 1 1 1 3 1 2 1 3 1 1 5 0 8 8 9 1 3 1 6 5 2 2 1 1 2 3 2 5 2 2 3 1 3 6 1 7 0 6 6 6 1 1 2 3 2 1 3 1 2 2 3 1 5 0 11 9 3 2 7 4 7 6 3 1 6 6 3 3 1 2 1 1 8 0 11 9 1 5 8 7 1 2 1 1 9 2 1 2 1 2 2 1 1 1 2 4 3 5 2 3 3 2 1 5 3 3 4 1 9 0 6 8 8 5 6 1 2 2 3 3 1 2 2 2 2 1 1 7 0 6 9 7 9 1 3 9 3 3 1 1 2 1 2 1 5 0 6 2 5 1 5 9 5 1 2 1 2 1 3 5 5 2 3 7 1 7 0 7 2 2 2 1 3 5 1 1 3 1 2 2 3 3 1 9 0 10 4 1 3 9 5 4 4 1 5 1 3 2 2 3 2 1 1 2 3 1 8 0 11 2 9 6 8 3 6 1 1 1 4 4 3 1 3 1 3 1 2 3 2 1 4 5 4 4 1 3 6 1 7 0 8 1 3 6 4 1 5 7 7 1 2 1 3 3 1 2 1 5 0 10 9 1 4 1 3 3 8 4 5 6 3 2 1 1 2 1 9 0 9 2 6 9 1 5 9 6 4 4 3 1 1 1 2 2 2 2 3 2 2 1 2 5 1 3 7 1 6 0 8 9 1 4 4 1 2 6 8 1 1 1 3 3 3 1 5 0 8 1 6 7 1 4 4 8 3 2 2 3 3 1 1 6 0 10 1 4 8 7 1 2 9 8 9 7 1 2 2 3 1 3 5 5 2 4 2 2 3 3 4 1 5 0 8 1 5 8 2 7 9 8 1 3 3 3 1 1 1 5 0 9 5 1 2 4 6 8 2 4 1 3 3 3 1 1 1 7 0 7 7 4 9 4 1 7 1 3 1 3 3 3 3 1 5 5 2 1 3 1 4 5 5 3 4 1 8 0 10 7 1 9 2 7 1 6 9 6 8 1 1 2 3 3 2 3 1 1 7 0 7 3 1 9 8 1 4 2 1 3 3 2 2 3 2 1 7 0 10 5 6 5 7 8 1 6 6 8 4 2 1 1 3 2 3 3 2 2 5 3 3 6 1 9 0 9 7 9 4 5 1 1 5 7 2 1 1 1 2 3 3 1 1 1 1 6 0 9 9 2 5 3 7 1 1 8 3 1 1 3 3 3 1 1 6 0 9 5 2 7 2 1 8 1 8 1 1 1 1 2 1 3 3 5 1 1 2 4 3 4 1 8 0 10 3 6 3 8 4 5 1 6 8 2 1 1 1 2 1 2 1 2 1 7 0 7 1 5 6 1 4 5 9 1 3 2 2 1 3 1 1 8 0 8 9 2 9 9 6 8 1 1 3 3 3 2 1 1 1 3 1 4 3 4 3 4 1 6 0 10 3 9 2 3 9 1 1 4 2 1 2 2 1 1 3 3 1 7 0 10 1 5 1 7 2 1 2 2 8 3 1 1 1 1 2 1 3 1 8 0 6 9 8 1 3 4 6 1 1 3 2 3 2 2 3 3 5 5 4 3 6 1 5 0 11 1 8 8 4 9 1 3 4 3 7 5 2 1 1 2 3 1 8 0 7 1 3 5 6 7 6 4 1 1 1 3 2 1 1 1 1 7 0 11 3 3 7 3 7 7 8 3 3 5 1 3 3 1 3 3 2 2 2 5 5 4 2 5 6 1 6 5 3 4 5 6 3 5 3 3 6 1 6 0 8 1 1 3 4 2 1 1 7 3 1 1 3 1 1 1 8 0 8 4 1 1 9 2 9 9 4 1 1 3 1 1 3 3 1 1 5 0 10 1 2 9 3 8 5 9 3 4 8 3 2 3 1 2 3 5 2 5 3 4 3 5 1 9 0 6 2 3 7 1 6 7 2 1 2 3 2 2 2 3 1 1 6 0 9 8 1 8 9 5 7 4 1 4 2 1 1 3 1 2 1 6 0 9 6 8 6 1 5 2 1 3 6 1 3 1 2 1 1 3 3 3 2 5 3 5 1 9 0 7 6 3 3 3 1 3 3 1 3 1 1 2 1 2 2 2 1 9 0 10 3 6 8 7 4 4 9 1 1 3 3 2 2 3 2 1 2 1 1 1 6 0 6 1 8 4 3 8 8 1 2 1 3 3 3 3 3 2 4 1 3 6 1 8 0 11 8 9 6 2 1 1 1 9 8 2 5 2 1 3 2 1 1 1 1 1 9 0 10 9 5 8 1 1 4 4 1 7 7 2 3 1 1 2 2 3 2 3 1 6 0 11 1 5 8 9 5 7 6 8 6 1 6 1 1 1 1 2 3 4 1 1 4 2 3 3 4 1 9 0 9 4 1 9 6 6 9 8 1 2 2 3 1 2 1 3 2 2 1 1 6 0 9 3 7 1 2 2 5 4 2 2 1 2 2 1 3 2 1 7 0 9 5 5 1 6 1 5 1 6 6 2 3 1 1 1 1 1 1 5 4 5 3 4 5 4 4 3 5 1 7 0 7 5 6 5 7 1 4 9 3 3 1 3 1 1 3 1 5 0 9 1 1 9 9 2 9 9 5 9 2 1 3 1 1 1 8 0 8 8 1 4 6 4 7 8 4 1 3 3 1 3 2 3 3 3 3 5 1 4 3 7 1 9 0 7 6 8 2 1 8 3 9 3 1 3 3 2 3 1 1 3 1 7 0 8 1 5 9 4 2 7 2 9 1 1 1 1 2 1 1 1 5 0 11 8 5 1 4 2 6 1 1 4 9 4 1 1 1 2 1 3 2 5 3 1 4 4 3 4 1 7 0 11 9 5 7 1 8 1 2 7 9 7 5 1 1 2 3 2 3 1 1 6 0 10 2 1 9 3 8 3 1 5 4 5 3 2 1 3 1 1 1 9 0 10 3 5 8 9 4 3 1 6 3 3 3 3 2 3 1 2 3 3 2 3 1 1 4 3 7 1 9 0 8 1 1 8 5 2 6 8 7 2 3 3 2 1 1 1 1 3 1 6 0 7 7 5 8 3 1 1 1 1 2 1 3 1 1 1 6 0 7 1 8 3 8 2 5 5 3 2 2 2 3 1 3 2 5 3 3 5 2 2 6 4 5 5 5 3 6 1 9 0 10 8 9 6 9 9 6 1 1 7 3 3 2 2 1 1 3 1 2 1 1 6 0 11 1 4 7 8 9 5 4 2 1 6 1 1 2 1 1 3 3 1 8 0 8 8 1 7 6 7 5 7 9 2 2 3 2 1 3 3 3 1 3 5 2 1 3 3 5 1 5 0 9 3 7 2 1 2 7 5 1 1 3 2 2 1 1 1 8 0 6 7 1 6 9 1 8 3 2 3 2 2 1 1 1 1 7 0 9 7 2 9 4 1 8 1 1 1 2 1 2 3 1 1 3 2 1 4 4 3 3 4 1 7 0 7 9 7 1 6 2 6 1 2 3 1 1 2 1 2 1 9 0 8 9 9 3 3 5 3 1 1 2 1 1 1 2 1 3 1 3 1 5 0 6 1 1 6 6 2 5 1 2 3 3 1 4 2 3 5 3 4 1 5 0 10 2 6 1 4 1 7 4 2 3 2 1 2 2 3 2 1 7 0 11 1 3 5 1 3 3 7 1 5 1 5 2 1 3 2 1 2 1 1 8 0 8 4 1 8 2 8 4 3 1 2 3 1 2 2 1 2 2 2 2 1 3 3 4 1 8 0 8 5 6 9 5 7 4 1 4 1 3 3 2 2 3 2 1 1 5 0 10 4 5 5 2 7 6 3 1 9 5 1 2 2 2 1 1 8 0 7 2 9 5 1 2 5 6 3 1 1 3 1 1 1 3 2 3 1 4 2 2 4 2 3 5 3 3 4 1 6 0 11 1 8 7 7 1 6 6 5 3 1 2 1 2 3 3 1 1 1 5 0 9 5 1 1 8 1 9 3 3 6 3 1 1 2 3 1 5 0 11 9 5 6 8 6 2 1 8 7 4 1 1 3 2 1 1 2 4 1 1 3 6 1 9 0 6 9 3 3 4 1 7 1 3 2 1 1 1 2 3 1 1 6 0 10 1 3 8 2 8 5 4 8 2 8 1 2 3 2 3 2 1 5 0 7 7 4 4 7 1 7 8 1 3 3 1 3 2 4 1 3 2 3 3 6 1 5 0 9 4 5 7 7 3 2 2 1 5 1 3 3 3 1 1 6 0 11 3 5 1 5 4 9 9 4 2 9 7 3 3 1 1 3 2 1 7 0 10 9 7 8 1 9 3 2 2 9 6 2 3 1 2 2 1 3 3 3 3 1 2 1 3 7 1 6 0 7 7 6 4 7 8 5 1 2 3 1 2 3 1 1 9 0 7 7 4 1 5 5 7 8 3 1 1 1 3 3 1 2 2 1 8 0 6 3 1 8 2 4 3 1 2 3 1 1 2 2 2 5 4 1 2 4 1 1 3 6 1 5 0 6 3 7 1 6 4 6 2 3 1 1 1 1 8 0 10 1 8 3 1 5 1 4 1 3 6 1 2 1 2 2 1 2 1 1 5 0 11 8 5 2 3 4 4 4 5 1 1 8 3 1 3 3 2 3 1 2 1 2 1 4 2 1 5 3 3 4 1 7 0 9 1 1 9 6 3 9 2 5 5 3 3 1 2 2 1 3 1 8 0 9 6 9 8 4 8 1 6 2 4 1 1 1 2 1 1 2 3 1 7 0 9 6 8 4 4 1 1 3 1 2 1 3 2 2 3 1 3 3 5 1 2 3 6 1 9 0 7 7 5 1 9 9 3 6 3 1 3 2 1 2 3 1 1 1 6 0 6 7 1 6 9 2 3 2 3 2 3 3 1 1 6 0 8 3 6 5 9 1 7 9 7 2 1 3 2 1 1 3 5 1 3 1 3 3 4 1 5 0 8 1 2 9 1 9 7 7 5 3 3 2 1 1 1 5 0 11 5 5 8 3 1 7 5 8 4 1 1 1 1 3 3 2 1 7 0 10 8 3 2 1 7 2 8 7 9 7 1 2 1 3 3 1 3 1 2 2 1 3 6 1 6 0 10 2 8 7 5 1 7 1 8 4 1 3 1 1 2 2 2 1 6 0 9 8 9 8 1 9 1 1 1 3 2 1 2 2 1 1 1 5 0 8 1 5 1 5 8 6 4 6 3 3 2 1 2 4 2 3 2 2 2 3 4 1 8 0 6 4 4 6 5 1 9 2 1 2 1 3 1 2 1 1 8 0 10 2 1 1 8 1 3 2 1 2 1 2 1 3 3 3 1 2 2 1 6 0 8 2 4 1 1 3 4 7 1 2 1 3 1 1 1 1 1 3 3 3 5 2 4 3 3 7 1 6 0 10 1 2 4 5 3 5 9 7 8 1 1 1 3 1 3 2 1 5 0 8 7 1 4 1 2 7 4 1 3 1 3 3 2 1 9 0 11 9 9 7 4 3 4 4 9 1 2 3 1 2 1 3 1 2 1 3 1 2 3 4 3 2 2 1 3 6 1 9 0 10 3 4 6 5 8 1 1 9 2 2 3 3 2 2 2 2 1 2 3 1 5 0 9 4 1 3 9 9 5 5 1 1 1 3 2 1 3 1 9 0 9 1 6 2 6 9 2 1 9 9 1 1 1 3 3 1 1 2 1 3 3 1 1 1 3 3 6 1 5 0 11 2 7 7 3 1 1 3 8 1 9 6 1 1 1 1 3 1 9 0 8 7 3 1 7 9 5 1 8 2 1 1 1 1 2 2 3 3 1 9 0 11 9 1 7 1 8 1 1 3 4 6 3 2 1 2 2 3 2 3 1 1 3 5 4 4 5 5 3 4 1 7 0 6 9 2 6 1 1 1 3 3 3 1 3 1 1 1 6 0 11 9 2 2 1 2 5 7 7 4 5 7 1 3 3 1 1 2 1 6 0 7 6 1 9 9 1 3 5 2 1 1 1 3 2 4 4 3 1 1 2 1 8 7 5 7 2 4 5 3 6 1 7 0 8 1 6 7 2 5 2 1 1 2 2 2 1 2 1 2 1 9 0 9 9 4 3 4 5 9 1 2 8 3 1 1 2 2 1 3 1 1 1 7 0 7 6 4 8 2 1 4 8 3 3 1 1 2 2 2 5 2 5 4 1 3 3 7 1 8 0 9 8 7 3 3 6 1 5 1 9 3 3 3 1 3 2 1 3 1 6 0 11 4 7 4 3 8 7 1 7 1 2 8 1 1 3 2 1 3 1 5 0 8 9 1 1 8 7 2 2 1 1 1 1 1 2 4 5 1 5 3 5 3 3 4 1 5 0 6 8 7 2 1 1 1 3 1 2 3 2 1 5 0 6 9 5 1 5 7 3 2 2 1 1 3 1 5 0 6 9 4 1 3 1 5 1 2 1 3 1 3 4 2 3 3 7 1 6 0 9 9 8 3 1 7 6 8 7 8 3 3 2 1 1 1 1 7 0 10 2 7 5 2 8 7 6 1 3 2 2 1 3 1 1 1 2 1 6 0 7 1 1 8 9 2 7 2 2 3 1 1 3 2 5 5 5 3 4 2 4 4 2 2 3 1 5 4 3 6 1 9 0 8 7 5 1 9 3 4 7 6 3 2 1 2 1 1 3 2 2 1 5 0 6 9 8 7 3 8 1 1 1 3 1 2 1 9 0 10 8 5 5 3 1 3 5 4 1 7 2 1 2 3 1 1 1 2 1 4 1 1 1 5 2 3 6 1 6 0 6 9 9 1 2 4 1 1 1 1 2 2 3 1 5 0 6 8 2 4 5 6 1 2 1 1 1 2 1 9 0 7 4 1 2 2 2 4 5 2 2 1 3 3 2 2 2 1 2 1 2 5 1 1 3 5 1 7 0 11 5 3 1 7 1 8 8 8 4 9 9 3 3 1 1 3 1 3 1 5 0 10 6 5 1 3 8 8 7 2 1 5 3 2 3 1 1 1 8 0 11 1 1 3 7 8 3 5 9 5 2 3 1 1 3 3 2 1 1 3 3 5 3 3 1 3 5 1 5 0 8 9 1 6 5 1 4 8 1 3 1 3 1 2 1 5 0 6 1 6 2 9 9 4 3 2 3 1 1 1 5 0 11 3 5 4 2 4 1 1 1 3 4 6 2 1 3 2 2 3 4 4 1 5 3 7 1 9 0 8 1 5 9 2 6 8 4 1 3 3 1 1 3 3 3 3 3 1 7 0 8 4 1 1 1 7 2 5 5 1 2 1 3 1 1 1 1 8 0 8 8 5 9 2 5 7 4 1 2 1 1 1 1 1 2 2 1 4 2 2 5 3 5 4 2 1 7 5 3 3 6 1 9 0 9 5 1 7 6 2 1 9 3 1 1 2 1 3 2 3 1 1 1 1 7 0 9 6 1 5 4 4 1 3 5 4 1 1 3 3 1 2 3 1 6 0 7 5 3 8 3 7 7 1 2 3 2 3 2 1 4 1 5 2 5 2 3 7 1 8 0 8 2 3 6 6 4 1 1 4 3 2 3 3 2 2 1 2 1 9 0 10 4 2 5 3 6 3 9 2 1 1 1 2 3 2 2 1 3 1 3 1 6 0 9 5 4 8 8 3 1 1 3 6 3 2 3 3 1 1 4 3 2 5 3 5 3 3 5 1 5 0 11 1 6 8 1 2 3 5 7 7 3 8 1 3 2 1 3 1 6 0 10 6 9 3 7 5 5 1 1 5 6 1 3 2 1 1 2 1 5 0 10 3 7 3 1 5 1 7 6 2 9 2 2 1 2 1 5 2 2 1 2 3 7 1 8 0 6 6 5 1 1 3 7 2 1 3 2 1 2 1 2 1 7 0 7 7 5 4 3 8 1 3 1 2 3 1 1 1 3 1 7 0 11 4 4 6 7 6 1 5 7 2 8 1 2 3 3 1 2 3 1 1 4 1 1 5 5 1 3 6 1 5 0 9 6 2 4 3 5 1 5 1 7 3 3 2 1 2 1 9 0 10 6 1 3 1 8 9 3 8 5 4 1 1 2 3 1 3 3 1 2 1 7 0 9 5 3 7 5 4 1 1 1 6 1 2 1 3 2 2 1 2 1 2 3 1 5 6 1 6 5 3 3 7 1 6 0 9 8 1 9 8 7 1 5 3 2 1 3 1 3 3 1 1 5 0 8 8 3 8 5 1 1 5 4 1 3 1 2 3 1 6 0 9 6 7 2 3 1 5 5 7 5 1 1 2 1 3 3 5 3 1 1 5 4 5 3 4 1 8 0 6 8 6 7 1 5 8 1 1 1 1 2 1 1 2 1 7 0 9 1 5 7 9 1 9 9 1 4 1 3 2 2 1 2 1 1 5 0 11 6 7 1 2 8 3 2 7 4 6 5 1 1 1 3 3 3 3 1 4 3 6 1 8 0 9 8 2 2 1 6 6 9 2 1 3 2 3 3 2 2 1 2 1 7 0 7 4 7 1 1 2 8 3 2 1 1 3 2 3 3 1 9 0 6 8 1 1 1 7 2 1 1 2 3 2 1 1 3 2 1 5 3 5 3 1 3 5 1 5 0 7 8 3 3 1 7 7 1 2 3 3 3 1 1 8 0 11 3 1 6 8 7 1 5 2 9 5 6 1 1 2 1 2 2 3 1 1 6 0 7 1 6 2 6 9 1 1 2 1 1 1 1 2 2 4 2 5 4 3 5 1 7 0 9 3 9 3 8 8 1 2 2 8 3 1 2 1 3 2 3 1 5 0 7 1 8 4 7 7 2 6 2 3 1 3 1 1 7 0 9 9 1 4 8 7 8 9 9 1 3 2 3 2 3 2 1 2 5 4 2 5 5 5 6 5 4 3 4 1 8 0 11 2 5 5 4 1 6 4 1 4 1 4 2 2 3 1 2 2 2 1 1 6 0 9 1 8 3 5 6 1 2 3 2 1 2 2 2 1 3 1 5 0 8 8 1 5 8 1 5 2 7 2 2 1 3 1 4 3 2 3 3 7 1 5 0 7 7 6 9 1 6 1 7 3 1 3 1 1 1 5 0 6 7 8 3 1 2 8 1 3 3 2 3 1 9 0 9 7 9 3 1 7 1 9 9 4 1 1 1 2 1 1 3 3 2 2 1 3 3 3 1 5 3 6 1 7 0 11 7 1 3 2 1 1 6 5 4 5 5 1 2 1 3 1 3 3 1 6 0 6 1 2 9 7 7 1 2 1 2 3 1 3 1 8 0 10 6 9 1 9 8 9 3 4 1 5 1 1 1 1 2 1 1 1 3 3 3 5 1 4 3 7 1 5 0 8 8 3 4 8 7 1 7 9 1 3 1 2 1 1 6 0 11 9 1 7 1 6 8 8 9 3 5 5 3 2 1 2 1 1 1 5 0 9 9 9 7 1 7 1 2 1 4 2 2 2 1 2 3 3 1 5 1 1 3 3 6 1 7 0 10 3 4 8 6 8 6 1 9 3 3 1 2 3 3 1 2 3 1 9 0 9 1 9 8 3 9 1 8 7 2 1 3 1 3 1 3 3 2 3 1 7 0 8 9 1 4 8 7 5 5 6 1 2 3 3 3 3 2 4 5 4 2 4 1 4 5 5 7 5 4 3 4 1 5 0 8 8 1 6 6 6 8 8 1 1 1 1 2 2 1 6 0 10 5 9 1 3 8 8 9 7 2 9 3 1 3 2 2 1 1 6 0 8 5 7 2 1 3 3 6 1 3 1 1 1 2 1 2 1 2 4 3 4 1 7 0 10 1 2 2 5 9 1 1 7 1 6 3 2 2 3 3 1 2 1 8 0 10 1 9 4 7 7 8 3 3 9 4 2 1 2 3 1 2 2 1 1 7 0 8 7 4 6 4 1 2 6 7 1 2 1 2 1 1 2 1 5 5 3 3 5 1 5 0 10 6 7 2 1 5 1 9 8 8 9 2 1 1 1 1 1 8 0 10 2 1 9 6 1 1 4 7 9 5 1 3 3 2 3 1 3 1 1 5 0 11 5 4 7 7 5 9 5 5 7 1 7 1 1 1 1 3 4 3 1 1 2 3 7 1 8 0 9 9 5 1 7 6 5 7 4 8 1 1 3 3 3 1 1 2 1 5 0 9 1 8 5 3 4 8 5 1 6 1 2 3 1 3 1 5 0 7 1 6 6 8 7 3 7 3 1 3 1 3 1 2 5 2 3 5 3 3 4 1 6 0 10 1 4 2 2 6 8 6 6 3 6 1 3 1 2 1 2 1 7 0 11 3 3 2 1 1 9 1 1 4 7 7 1 3 1 1 1 2 3 1 8 0 11 6 2 1 4 3 9 8 4 4 6 2 2 2 1 1 1 2 2 2 3 3 3 5 1 4 4 6 5 5 3 7 1 7 0 7 6 6 3 2 7 1 5 3 3 1 3 1 3 1 1 6 0 11 5 7 1 2 5 5 1 5 5 9 4 1 1 1 3 1 2 1 6 0 7 5 5 6 5 4 1 8 1 1 2 2 1 2 3 3 5 5 2 3 2 3 5 1 6 0 9 4 6 5 8 4 5 1 1 5 1 3 1 1 3 3 1 7 0 10 3 2 1 9 3 2 3 4 9 1 1 3 1 2 1 1 2 1 8 0 9 9 1 3 1 1 4 4 9 9 3 3 1 3 1 3 2 2 1 3 3 2 2 3 7 1 8 0 6 1 7 2 7 1 5 1 3 3 1 1 3 2 3 1 9 0 9 3 2 4 1 9 1 8 1 9 3 1 3 1 3 3 1 1 1 1 6 0 9 5 5 1 6 4 7 2 8 6 1 2 3 1 1 2 2 4 2 1 4 1 2 3 6 1 9 0 10 1 5 1 3 7 4 6 3 7 2 3 1 1 1 2 1 1 3 2 1 9 0 6 7 4 1 1 1 8 2 2 1 2 3 2 3 1 2 1 8 0 6 8 1 5 2 8 4 1 3 2 2 3 2 1 1 1 2 5 1 4 2 3 4 1 8 0 11 1 5 8 3 4 7 8 5 6 5 8 3 3 3 2 3 1 2 3 1 5 0 6 1 7 9 6 1 1 2 2 1 2 1 1 5 0 11 4 1 4 1 7 4 3 3 2 2 3 1 3 2 1 1 4 2 3 3 4 7 4 3 2 7 5 7 6 10 3 1 4 3 1 4 6 2
diff --git a/2018/inputs/9.txt b/2018/inputs/9.txt
new file mode 100644
index 0000000..eaf3e92
--- /dev/null
+++ b/2018/inputs/9.txt
@@ -0,0 +1 @@
+438 players; last marble is worth 71626 points
diff --git a/2018/license.org b/2018/license.org
new file mode 100644
index 0000000..8d31e87
--- /dev/null
+++ b/2018/license.org
@@ -0,0 +1,21 @@
+* The MIT License
+
+Copyright (c) 2018 Justin Worthe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/2018/readme.org b/2018/readme.org
new file mode 100644
index 0000000..7fe82e4
--- /dev/null
+++ b/2018/readme.org
@@ -0,0 +1,38 @@
+* Advent of Code 2018
+
+** What is Advent of Code?
+
+Advent of Code is a programming advent calendar. On the 25 days of
+December leading up to Christmas, each morning a new programming
+challenge is unlocked. The race is then on to see who can solve the
+challenge and get the answer to their particular input first.
+
+It's a lot of fun. I have my solutions posted here so that I can share
+them with my friends, as well as the broader community if they're
+interested.
+
+** A note on error handling and code quality
+
+The only important metric to consider in terms of taking the Advent of
+Code challenges seriously from a competitive point of view is how
+quickly you arrive at an answer for your particular input.
+
+These solutions should not in any way be seen as an example of good
+coding standards in Rust. The error handling in particular is
+appalling. The reason for this is that I can look at the input data
+and be certain that some error cases won't come up, like empty
+lists. I can also assume that things like file system access will
+always work because I'm only running it on my machine under my
+supervision.
+
+When my assumptions are wrong, the program panics and dies, but I'm
+currently there programming it when it's running so that isn't really
+a big deal.
+
+The short version of what I'm trying to say is that even though I use
+~unwrap~ all over the place in this particular repo, I still think
+it's a really bad idea to use it in a real project.
+
+** License
+
+See [[./license.org]].
diff --git a/2018/src/bin/day_1.rs b/2018/src/bin/day_1.rs
new file mode 100644
index 0000000..4693579
--- /dev/null
+++ b/2018/src/bin/day_1.rs
@@ -0,0 +1,32 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+extern crate im_rc;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use im_rc::HashSet;
+
+// cargo watch -cs "cargo run --release --bin day_1"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/1.txt"))?;
+ let input_ints: Vec<i32> = input.iter().map(|str| str.parse::<i32>().unwrap()).collect();
+
+ println!("Input: {:?}", input_ints);
+
+ let sum: i32 = input_ints.iter().sum();
+ println!("Sum: {}", sum);
+
+ let first_repeat = input_ints.iter().cycle().try_fold((0, HashSet::new()), |(acc, seen), &i| {
+ if seen.contains(&acc) {
+ Err(acc)
+ } else {
+ Ok((acc + i, seen.update(acc)))
+ }
+ }).err().unwrap();
+ println!("First repeat: {}", first_repeat);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_10.rs b/2018/src/bin/day_10.rs
new file mode 100644
index 0000000..082be7c
--- /dev/null
+++ b/2018/src/bin/day_10.rs
@@ -0,0 +1,82 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::i32;
+
+// cargo watch -cs "cargo run --release --bin day_10"
+
+
+
+#[derive(Debug, Clone)]
+struct Star {
+ x: i32,
+ y: i32,
+ dx: i32,
+ dy: i32
+}
+
+impl FromStr for Star {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let split = s
+ .split(|c: char| c != '-' && !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse())
+ .collect::<Result<Vec<i32>, _>>()?;
+
+ Ok(Star {
+ x: split[0],
+ y: split[1],
+ dx: split[2],
+ dy: split[3]
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/10.txt"))?;
+ let mut stars = input.iter().map(|line| line.parse::<Star>().unwrap()).collect::<Vec<_>>();
+
+ //debug!(input);
+ //debug!(stars);
+
+ let screen_width = 80;
+ let screen_height = 80;
+
+ for seconds in 0..1000000 {
+ let min_x = stars.iter().map(|s| s.x).min().unwrap();
+ let max_x = stars.iter().map(|s| s.x).max().unwrap();
+ let min_y = stars.iter().map(|s| s.y).min().unwrap();
+ let max_y = stars.iter().map(|s| s.y).max().unwrap();
+
+ if max_x - min_x < screen_width && max_y - min_y < screen_height {
+ debug!(seconds);
+ for y in min_y..max_y+1 {
+ for x in min_x..max_x+1 {
+ let star_at_point = stars.iter().any(|s| s.x == x && s.y == y);
+ if star_at_point {
+ print!("#");
+ } else {
+ print!(" ");
+ }
+ }
+ println!();
+ }
+ println!();
+ println!();
+ }
+
+ for star in &mut stars {
+ star.x += star.dx;
+ star.y += star.dy;
+ }
+ }
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_11.rs b/2018/src/bin/day_11.rs
new file mode 100644
index 0000000..0e458a3
--- /dev/null
+++ b/2018/src/bin/day_11.rs
@@ -0,0 +1,66 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::i32;
+
+// cargo watch -cs "cargo run --release --bin day_11"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = 1723;
+
+ println!("Input: {:?}", input);
+
+ let powers = precompute_powers(input);
+
+ let power_per_size = (1..300).map(|size| {
+ (1..302-size).map(|left| {
+ (1..302-size).map(|top| {
+ (power_for_block(left, top, size, &powers), (left, top, size))
+ }).max_by_key(|(p, _)| *p).unwrap()
+ }).max_by_key(|(p, _)| *p).unwrap()
+ }).collect::<Vec<_>>();
+
+ let (max_power_at_size_3, coordinate_at_size_3) = power_per_size[2]; // index from 0 vs 1
+ debug!(max_power_at_size_3);
+ debug!(coordinate_at_size_3);
+
+ let (max_power, coordinate) = power_per_size.iter().max_by_key(|(p, _)| p).unwrap();
+
+ debug!(max_power);
+ debug!(coordinate);
+
+ Ok(())
+}
+
+fn power_for_block(left: i32, top: i32, size: i32, powers: &[[i32;300];300]) -> i32 {
+ (left..left+size).map(|x| {
+ (top..top+size).map(|y| {
+ powers[x as usize - 1][y as usize - 1]
+ }).sum::<i32>()
+ }).sum()
+}
+
+fn precompute_powers(input: i32) -> [[i32;300];300] {
+ let mut powers: [[i32;300];300] = [[0;300];300];
+ for x in 1..301 {
+ for y in 1..301 {
+ powers[x as usize - 1][y as usize - 1] = power_from_coordinates(x, y, input);
+ }
+ }
+ powers
+}
+
+fn power_from_coordinates(x: i32, y: i32, input: i32) -> i32 {
+ let rack_id = x + 10;
+ ((((rack_id * y) + input) * rack_id / 100) % 10) - 5
+}
+
+
+#[test]
+fn power_from_coord_example() {
+ assert_eq!(power_from_coordinates(3, 5, 8), 4);
+ assert_eq!(power_from_coordinates(122, 79, 57), -5);
+ assert_eq!(power_from_coordinates(217,196, 39), 0);
+ assert_eq!(power_from_coordinates(101, 153, 71), 4);
+}
diff --git a/2018/src/bin/day_12.rs b/2018/src/bin/day_12.rs
new file mode 100644
index 0000000..65a966d
--- /dev/null
+++ b/2018/src/bin/day_12.rs
@@ -0,0 +1,102 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::str::FromStr;
+
+// cargo watch -cs "cargo run --release --bin day_12"
+
+use std::collections::HashSet;
+
+#[derive(Debug)]
+struct Rule {
+ input: [bool; 5],
+ output: bool
+}
+
+impl FromStr for Rule {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ //##..# => #
+ let mut input = [false; 5];
+ let mut iter = s.chars().filter(|c| *c == '#' || *c == '.');
+ for (i, c) in iter.by_ref().take(5).enumerate() {
+ if c == '#' {
+ input[i] = true;
+ }
+ }
+ Ok(Rule {
+ input,
+ output: iter.next() == Some('#')
+ })
+ }
+}
+
+impl Rule {
+ fn matches(&self, state: &HashSet<i64>, index: i64) -> bool {
+ self.input.iter().enumerate().all(|(i, expected)| {
+ let pot_index = index - 2 + i as i64;
+ *expected == state.contains(&pot_index)
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/12.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let mut initial_state: HashSet<i64> = HashSet::new();
+ for (i, c) in input[0].chars().filter(|c| *c == '#' || *c == '.').enumerate() {
+ if c == '#' {
+ initial_state.insert(i as i64);
+ }
+ }
+ let rules = input.iter().skip(1).map(|line| line.parse()).collect::<Result<Vec<Rule>, Box<Error>>>()?;
+
+ debug!(initial_state);
+ debug!(rules);
+
+ let part1_time = 20;
+ let part2_time = 50000000000;
+
+ let part1_final_state = iterate_states(&initial_state, &rules, part1_time);
+ let sum_of_part1_pot_numbers: i64 = part1_final_state.iter().sum();
+ debug!(sum_of_part1_pot_numbers);
+
+ let part2_final_state = iterate_states(&initial_state, &rules, part2_time);
+ let sum_of_part2_pot_numbers: i64 = part2_final_state.iter().sum();
+ debug!(sum_of_part2_pot_numbers);
+
+ Ok(())
+}
+
+fn iterate_states(initial_state: &HashSet<i64>, rules: &[Rule], time: i64) -> HashSet<i64> {
+ let mut current_state = initial_state.clone();
+ for current_time in 0..time {
+ let mut new_state = HashSet::new();
+ let min = current_state.iter().min().cloned().unwrap_or(-1) - 2;
+ let max = current_state.iter().max().cloned().unwrap_or(-1) + 2;
+
+ for i in min..max+1 {
+ if rules.iter().find(|r| r.matches(&current_state, i)).expect("No matching rule").output {
+ new_state.insert(i as i64);
+ }
+ }
+
+ if current_state.iter().map(|v| v + 1).collect::<HashSet<i64>>() == new_state {
+ // Iterations are just shifting 1 to the right at this
+ // point. Found by inspecting a debugging log of the
+ // generations.
+
+ let remaining_iterations = time-current_time;
+ return current_state.iter().map(|v| v + remaining_iterations).collect::<HashSet<i64>>();
+ }
+
+ current_state = new_state;
+ }
+ current_state
+}
diff --git a/2018/src/bin/day_13.rs b/2018/src/bin/day_13.rs
new file mode 100644
index 0000000..005f216
--- /dev/null
+++ b/2018/src/bin/day_13.rs
@@ -0,0 +1,249 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_13"
+
+#[derive(Debug)]
+enum Road {
+ LeftRight,
+ UpDown,
+ LeftUpRightDown,
+ RightUpLeftDown,
+ Intersection,
+ None
+}
+
+#[derive(Debug)]
+struct Cart {
+ next_turn: TurnDirection,
+ facing: FacingDirection,
+ x: usize,
+ y: usize,
+ crashed: bool
+
+}
+
+#[derive(Debug, Clone, Copy)]
+enum FacingDirection {
+ Up,
+ Down,
+ Left,
+ Right
+}
+
+#[derive(Debug, Clone, Copy)]
+enum TurnDirection {
+ Left,
+ Straight,
+ Right
+}
+
+impl TurnDirection {
+ fn next(&self) -> TurnDirection {
+ use TurnDirection::*;
+
+ match *self {
+ Left => Straight,
+ Straight => Right,
+ Right => Left
+ }
+ }
+
+ fn rotate(&self, facing: &FacingDirection) -> FacingDirection {
+ match *self {
+ TurnDirection::Left => match *facing {
+ FacingDirection::Up => FacingDirection::Left,
+ FacingDirection::Left => FacingDirection::Down,
+ FacingDirection::Down => FacingDirection::Right,
+ FacingDirection::Right => FacingDirection::Up
+ },
+ TurnDirection::Right => match *facing {
+ FacingDirection::Up => FacingDirection::Right,
+ FacingDirection::Left => FacingDirection::Up,
+ FacingDirection::Down => FacingDirection::Left,
+ FacingDirection::Right => FacingDirection::Down
+ },
+ TurnDirection::Straight => facing.clone()
+ }
+ }
+}
+
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/13.txt"))?;
+
+// for i in &input {
+// println!("{}", i);
+// }
+
+ let mut map: Vec<Vec<Road>> = Vec::new();
+ let mut carts: Vec<Cart> = Vec::new();
+
+ for (y, line) in input.iter().enumerate() {
+ let mut map_row = Vec::new();
+ for (x, c) in line.chars().enumerate() {
+ let tile = match c {
+ ' ' => Road::None,
+ '-' => Road::LeftRight,
+ '|' => Road::UpDown,
+ '/' => Road::LeftUpRightDown,
+ '\\' => Road::RightUpLeftDown,
+ '+' => Road::Intersection,
+ '^' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Up,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::UpDown
+ },
+ '<' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Left,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::LeftRight
+ },
+ 'v' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Down,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::UpDown
+ },
+ '>' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Right,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::LeftRight
+ },
+
+ _ => {
+ panic!("Unknown character {}", c);
+ }
+ };
+ map_row.push(tile);
+ }
+ map.push(map_row);
+ }
+
+ while carts.len() > 1 {
+ carts.sort_unstable_by(|a, b| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+
+ for i in 0..carts.len() {
+ {
+ let mut cart = &mut carts[i];
+ let road = &map[cart.y][cart.x];
+
+ match (road, cart.facing, cart.next_turn) {
+ (Road::LeftRight, FacingDirection::Left, _) => {
+ cart.x -= 1;
+ },
+ (Road::LeftRight, FacingDirection::Right, _) => {
+ cart.x += 1;
+ },
+ (Road::LeftRight, _, _) => {
+ panic!("Sideways cart heading left-right");
+ },
+
+ (Road::UpDown, FacingDirection::Up, _) => {
+ cart.y -= 1;
+ },
+ (Road::UpDown, FacingDirection::Down, _) => {
+ cart.y += 1;
+ },
+ (Road::UpDown, _, _) => {
+ panic!("Sideways cart heading up-down");
+ },
+
+ // /
+ (Road::LeftUpRightDown, FacingDirection::Down, _) => {
+ cart.x -= 1;
+ cart.facing = FacingDirection::Left;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Right, _) => {
+ cart.y -= 1;
+ cart.facing = FacingDirection::Up;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Left, _) => {
+ cart.y += 1;
+ cart.facing = FacingDirection::Down;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Up, _) => {
+ cart.x += 1;
+ cart.facing = FacingDirection::Right;
+ },
+
+ // \
+ (Road::RightUpLeftDown, FacingDirection::Up, _) => {
+ cart.x -= 1;
+ cart.facing = FacingDirection::Left;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Left, _) => {
+ cart.y -= 1;
+ cart.facing = FacingDirection::Up;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Right, _) => {
+ cart.y += 1;
+ cart.facing = FacingDirection::Down;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Down, _) => {
+ cart.x += 1;
+ cart.facing = FacingDirection::Right;
+ },
+
+ (Road::Intersection, f, d) => {
+ cart.facing = d.rotate(&f);
+ cart.next_turn = d.next();
+ match cart.facing {
+ FacingDirection::Up => { cart.y -= 1 },
+ FacingDirection::Down => { cart.y += 1 },
+ FacingDirection::Left => { cart.x -= 1 },
+ FacingDirection::Right => { cart.x += 1 },
+ }
+ },
+
+ (Road::None, _, _) => {
+ panic!("Offroad cart!");
+ }
+
+ }
+
+ }
+
+ let collisions = carts.iter()
+ .enumerate()
+ .filter(|(other_i, other)| *other_i != i && other.x == carts[i].x && other.y == carts[i].y)
+ .map(|(other_i, _)| other_i)
+ .collect::<Vec<_>>();
+ for other_i in collisions {
+ let crash_location = (carts[i].x, carts[i].y);
+ debug!(crash_location);
+ carts[i].crashed = true;
+ carts[other_i].crashed = true;
+ }
+ }
+
+ carts.retain(|cart| !cart.crashed);
+ }
+
+ debug!(carts);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_14.rs b/2018/src/bin/day_14.rs
new file mode 100644
index 0000000..cb16623
--- /dev/null
+++ b/2018/src/bin/day_14.rs
@@ -0,0 +1,111 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_14"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = 540561;
+
+ let scoreboard = find_ten_scoreboard_after(input);
+
+ println!("Result: ");
+ scoreboard.iter().for_each(|s| {
+ print!("{}", s);
+ });
+ println!();
+
+ let first_occurence = find_first_occurence_of(input);
+ debug!(first_occurence);
+
+ Ok(())
+}
+
+fn find_ten_scoreboard_after(input: usize) -> Vec<usize> {
+ let mut scoreboard = vec!(3,7);
+ let mut elf1_pos = 0;
+ let mut elf2_pos = 1;
+
+ while scoreboard.len() < (input + 10) {
+ let next = scoreboard[elf1_pos] + scoreboard[elf2_pos];
+ for digit in number_to_digits_vec(next) {
+ scoreboard.push(digit);
+ }
+
+ elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len();
+ elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len();
+ }
+
+ scoreboard.iter().skip(input).take(10).cloned().collect()
+}
+
+fn find_first_occurence_of(input: usize) -> usize {
+ let target_sequence = number_to_digits_vec(input);
+ debug!(target_sequence);
+
+ let mut scoreboard = vec!(3,7);
+ let mut elf1_pos = 0;
+ let mut elf2_pos = 1;
+ let mut target_index = None;
+
+ while target_index.is_none() {
+ let next = scoreboard[elf1_pos] + scoreboard[elf2_pos];
+ for digit in number_to_digits_vec(next) {
+ scoreboard.push(digit);
+ }
+
+ elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len();
+ elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len();
+
+ if scoreboard.len() >= target_sequence.len() + 2 {
+ for potential_target_index in scoreboard.len()-target_sequence.len()-2..scoreboard.len()-target_sequence.len()+1 {
+ let found = scoreboard.iter()
+ .skip(potential_target_index)
+ .take(target_sequence.len())
+ .zip(target_sequence.iter())
+ .all(|(a, b)| a == b);
+ if found {
+ target_index = Some(potential_target_index);
+ }
+ }
+ }
+ }
+
+ target_index.unwrap()
+}
+
+fn number_to_digits_vec(input: usize) -> Vec<usize> {
+ if input == 0 {
+ return vec!(0);
+ }
+
+ let mut result = Vec::new();
+ let mut acc = input;
+ while acc > 0 {
+ result.push(acc % 10);
+ acc /= 10;
+ }
+ result.reverse();
+ result
+}
+
+#[test]
+fn vectorification() {
+ assert_eq!(number_to_digits_vec(10), vec!(1, 0));
+ assert_eq!(number_to_digits_vec(1), vec!(1));
+ assert_eq!(number_to_digits_vec(0), vec!(0));
+}
+
+#[test]
+fn part1_examples() {
+ assert_eq!(find_ten_scoreboard_after(9), vec!(5,1,5,8,9,1,6,7,7,9));
+ assert_eq!(find_ten_scoreboard_after(2018), vec!(5,9,4,1,4,2,9,8,8,2));
+}
+
+#[test]
+fn part2_examples() {
+ assert_eq!(find_first_occurence_of(51589), 9);
+ assert_eq!(find_first_occurence_of(59414), 2018);
+}
diff --git a/2018/src/bin/day_15.rs b/2018/src/bin/day_15.rs
new file mode 100644
index 0000000..c6f3cf2
--- /dev/null
+++ b/2018/src/bin/day_15.rs
@@ -0,0 +1,272 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_15"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/15.txt"))?;
+
+ let (round_hp_product, _) = calculate_round_hp_product(&input, 3);
+ debug!(round_hp_product);
+
+ for power in 3.. {
+ let (round_hp_product_without_losses, elf_losses) = calculate_round_hp_product(&input, power);
+ if (elf_losses == 0) {
+ debug!(round_hp_product_without_losses);
+ break;
+ }
+ }
+
+ Ok(())
+}
+
+fn calculate_round_hp_product(input: &[String], elf_power: i32) -> (i32, usize) {
+ let goblin_power = 3;
+ let initial_hp = 200;
+
+ let mut map = Vec::new();
+ let mut units = Vec::new();
+
+ for (y, line) in input.iter().enumerate() {
+ let mut map_row = Vec::new();
+ for (x, c) in line.chars().enumerate() {
+ map_row.push(c == '#');
+
+ let maybe_unit = match c {
+ 'G' => Some(Unit {
+ team: false,
+ x: x as i32,
+ y: y as i32,
+ hp: initial_hp
+ }),
+ 'E' => Some(Unit {
+ team: true,
+ x: x as i32,
+ y: y as i32,
+ hp: initial_hp
+ }),
+ _ => None
+ };
+ if let Some(unit) = maybe_unit {
+ units.push(unit);
+ }
+ }
+
+ map.push(map_row);
+ }
+ let start_elves = units.iter().filter(|u| u.team).count();
+
+ for round in 0.. {
+ // debug!(round);
+ // debug!(units);
+ // debug_print(&units, &map);
+ units.sort_unstable_by(|a, b| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+
+ for i in 0..units.len() {
+ if units[i].hp > 0 {
+ let battle_over = !units.iter().any(|other| other.hp > 0 && other.team != units[i].team);
+ if battle_over {
+ println!("Battle over");
+ let hp_sum = units.iter().filter(|u| u.hp > 0).map(|u| u.hp).sum::<i32>();
+ debug!(round);
+ debug!(hp_sum);
+
+ let elf_losses = start_elves - units.iter().filter(|u| u.team).count();
+ debug!(elf_losses);
+ return (round * hp_sum, elf_losses);
+ }
+
+ let is_next_to_opponent = unit_at_point(!units[i].team, units[i].x-1, units[i].y, &units)
+ .or_else(|| unit_at_point(!units[i].team, units[i].x+1, units[i].y, &units))
+ .or_else(|| unit_at_point(!units[i].team, units[i].x, units[i].y-1, &units))
+ .or_else(|| unit_at_point(!units[i].team, units[i].x, units[i].y+1, &units)).is_some();
+ if !is_next_to_opponent {
+ if let Some((next_x, next_y)) = find_next_step(i, &units, &map) {
+ units[i].x = next_x;
+ units[i].y = next_y;
+ }
+ }
+
+ let mut attack_candidates = adjacent_units(!units[i].team, units[i].x, units[i].y, &units);
+ attack_candidates.sort_by(|&a, &b| units[a].hp.cmp(&units[b].hp));
+ if let Some(&to_attack) = attack_candidates.first() {
+ let attack_power = if units[i].team { elf_power } else { goblin_power };
+ units[to_attack].hp -= attack_power;
+ }
+ }
+ }
+
+ units.retain(|u| u.hp > 0);
+ }
+
+ panic!("Match ended unexpectedly");
+}
+
+fn find_next_step(i: usize, units: &[Unit], map: &Vec<Vec<bool>>) -> Option<(i32, i32)> {
+ let mut explored = vec!(Explored {
+ x: units[i].x,
+ y: units[i].y,
+ distance: 0,
+ parent: 0
+ });
+
+ let mut explored_index = 0;
+ let mut distance_found = None;
+ while explored_index < explored.len() && distance_found.map_or(true, |distance| explored[explored_index].distance < distance) {
+ let distance = explored[explored_index].distance;
+ for (new_x, new_y) in adjacent_empty_spaces(explored[explored_index].x, explored[explored_index].y, &map, &units, &explored) {
+ explored.push(Explored {
+ x: new_x,
+ y: new_y,
+ distance: distance + 1,
+ parent: explored_index
+ });
+
+ if adjacent_units(!units[i].team, new_x, new_y, &units).len() > 0 {
+ distance_found = Some(distance + 1);
+ }
+ }
+ explored_index += 1;
+ }
+
+ if let Some(distance) = distance_found {
+ let mut candidates = explored.iter().enumerate()
+ .filter(|(_,e)| e.distance == distance)
+ .filter(|(_,e)| adjacent_units(!units[i].team, e.x, e.y, &units).len() > 0)
+ .collect::<Vec<_>>();
+ candidates.sort_by(|(_,a), (_,b)| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+ let (best_index, _) = candidates[0];
+
+ let mut result_index = best_index;
+ let mut next_index = best_index;
+ while next_index != 0 {
+ result_index = next_index;
+ next_index = explored[result_index].parent;
+ }
+ return Some((explored[result_index].x, explored[result_index].y));
+ }
+ None
+}
+
+fn adjacent_empty_spaces(x: i32, y: i32, map: &Vec<Vec<bool>>, units: &[Unit], explored: &[Explored]) -> Vec<(i32, i32)> {
+ [(x, y-1), (x-1, y), (x+1, y), (x, y+1)].iter()
+ .filter(|(x, y)| *x >= 0 && *y >= 0)
+ .filter(|(x, y)| !explored.iter().any(|e| e.x == *x && e.y == *y))
+ .filter(|(x, y)| !units.iter().any(|e| e.hp > 0 && e.x == *x && e.y == *y))
+ .filter(|(x, y)| !map[*y as usize][*x as usize])
+ .cloned()
+ .collect()
+}
+
+fn adjacent_units(team: bool, x: i32, y: i32, units: &[Unit]) -> Vec<usize> {
+ [(x, y-1), (x-1, y), (x+1, y), (x, y+1)].iter()
+ .filter_map(|(x, y)| unit_at_point(team, *x, *y, units))
+ .collect()
+}
+
+fn unit_at_point(team: bool, x: i32, y: i32, units: &[Unit]) -> Option<usize> {
+ units.iter().enumerate()
+ .find(|(_, u)| u.hp > 0 && u.team == team && u.x == x && u.y == y)
+ .map(|(i, _)| i)
+}
+
+#[derive(Debug, Clone)]
+struct Unit {
+ team: bool,
+ x: i32,
+ y: i32,
+ hp: i32
+}
+
+#[derive(Debug)]
+struct Explored {
+ x: i32,
+ y: i32,
+ distance: u32,
+ parent: usize
+}
+
+
+fn debug_print(units: &[Unit], map: &Vec<Vec<bool>>) {
+ for (y, line) in map.iter().enumerate() {
+ for (x, wall) in line.iter().enumerate() {
+ let unit = units.iter().find(|u| u.hp > 0 && u.x == x as i32 && u.y == y as i32);
+ print!("{}", match (wall, unit) {
+ (true, _) => '#',
+ (false, Some(unit)) if unit.team => 'E',
+ (false, Some(_)) => 'G',
+ (false, None) => '.'
+ });
+ }
+ println!();
+ }
+ println!();
+ println!();
+}
+
+fn part_1_test(input: &[&str]) -> i32 {
+ let owned_input = input.iter()
+ .map(|&line| line.to_owned())
+ .collect::<Vec<String>>();
+ let (product, _) = calculate_round_hp_product(&owned_input, 3);
+ product
+}
+
+#[test]
+fn example_1() {
+ let input = vec!(
+ "#######",
+ "#.G...#",
+ "#...EG#",
+ "#.#.#G#",
+ "#..G#E#",
+ "#.....#",
+ "#######");
+ assert_eq!(part_1_test(&input), 27730);
+}
+
+#[test]
+fn example_2() {
+ let input = vec!(
+ "#######",
+ "#G..#E#",
+ "#E#E.E#",
+ "#G.##.#",
+ "#...#E#",
+ "#...E.#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 36334);
+}
+
+#[test]
+fn example_3() {
+ let input = vec!(
+ "#######",
+ "#E.G#.#",
+ "#.#G..#",
+ "#G.#.G#",
+ "#G..#.#",
+ "#...E.#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 27755);
+}
+
+#[test]
+fn example_4() {
+ let input = vec!(
+ "#######",
+ "#.E...#",
+ "#.#..G#",
+ "#.###.#",
+ "#E#G#G#",
+ "#...#G#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 28944);
+}
+
diff --git a/2018/src/bin/day_16.rs b/2018/src/bin/day_16.rs
new file mode 100644
index 0000000..275ec45
--- /dev/null
+++ b/2018/src/bin/day_16.rs
@@ -0,0 +1,205 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_16"
+
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, registers: &[i32; 4]) -> [i32; 4] {
+ use Op::*;
+
+ let mut result_registers = registers.clone();
+
+ result_registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize] + registers[self.b as usize],
+ Addi => registers[self.a as usize] + self.b,
+ Mulr => registers[self.a as usize] * registers[self.b as usize],
+ Muli => registers[self.a as usize] * self.b,
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 }
+ };
+
+ result_registers
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+impl Op {
+ fn all() -> [Op; 16] {
+ use Op::*;
+ [
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+ ]
+ }
+}
+
+struct UnknownInstruction {
+ before: [i32; 4],
+ after: [i32; 4],
+ opcode: i32,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl UnknownInstruction {
+ fn possible_matches(&self) -> HashSet<Op> {
+ Op::all()
+ .iter()
+ .filter(|&&op| {
+ let instruction = Instruction {
+ op: op,
+ a: self.a,
+ b: self.b,
+ c: self.c
+ };
+ let result = instruction.execute(&self.before);
+ result == self.after
+ })
+ .cloned()
+ .collect()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input_part_1 = read_file(&PathBuf::from("inputs/16_1.txt"))?;
+
+ let unknown_instructions: Vec<UnknownInstruction> = input_part_1.chunks(3)
+ .map(|chunk| {
+ let mut before_iter = chunk[0].trim_matches(|c: char| !c.is_numeric()).split(", ").map(|c| c.parse::<i32>().unwrap());
+ let before = [
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ ];
+ let mut after_iter = chunk[2].trim_matches(|c: char| !c.is_numeric()).split(", ").map(|c| c.parse::<i32>().unwrap());
+ let after = [
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ ];
+ let mut instruction_iter = chunk[1].split_whitespace().map(|c| c.parse::<i32>().unwrap());
+ UnknownInstruction {
+ before, after,
+ opcode: instruction_iter.next().unwrap(),
+ a: instruction_iter.next().unwrap(),
+ b: instruction_iter.next().unwrap(),
+ c: instruction_iter.next().unwrap(),
+ }
+ })
+ .collect();
+
+ let matches_more_then_3 = unknown_instructions.iter()
+ .filter(|unknown| {
+ unknown.possible_matches().len() >= 3
+ })
+ .count();
+
+ debug!(matches_more_then_3);
+
+
+ let mut opcodes: HashMap<i32, HashSet<Op>> = HashMap::new();
+ for unknown in unknown_instructions {
+ let matches = unknown.possible_matches();
+ let to_insert = match opcodes.get(&unknown.opcode) {
+ None => matches,
+ Some(existing) => existing.intersection(&matches).cloned().collect()
+ };
+ opcodes.insert(unknown.opcode, to_insert);
+ }
+ debug!(opcodes);
+
+ let mut known_opcodes: HashMap<i32, Op> = HashMap::new();
+
+ while known_opcodes.len() < 16 {
+ let (opcode, op) = {
+ let (opcode, opset) = opcodes.iter().find(|(_,set)| set.len() == 1).unwrap();
+ let op = opset.iter().next().unwrap().clone();
+ (opcode.clone(), op)
+ };
+ known_opcodes.insert(opcode, op);
+ opcodes.iter_mut().for_each(|(_, set)| {
+ set.remove(&op);
+ });
+ }
+ debug!(known_opcodes);
+
+
+ let input_part_2 = read_file(&PathBuf::from("inputs/16_2.txt"))?;
+ let instructions: Vec<Instruction> = input_part_2.iter()
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace().map(|c| c.parse::<i32>().unwrap());
+ Instruction {
+ op: known_opcodes.get(&instruction_iter.next().unwrap()).unwrap().clone(),
+ a: instruction_iter.next().unwrap(),
+ b: instruction_iter.next().unwrap(),
+ c: instruction_iter.next().unwrap(),
+ }
+ })
+ .collect();
+
+ let mut registers = [0; 4];
+ for instruction in instructions {
+ registers = instruction.execute(&registers);
+ }
+ debug!(registers);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_17.rs b/2018/src/bin/day_17.rs
new file mode 100644
index 0000000..f479c3a
--- /dev/null
+++ b/2018/src/bin/day_17.rs
@@ -0,0 +1,175 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_17"
+
+struct CoordBuilder {
+ xmin: Option<usize>,
+ xmax: Option<usize>,
+ ymin: Option<usize>,
+ ymax: Option<usize>
+}
+
+#[derive(Debug)]
+struct Coord {
+ xmin: usize,
+ xmax: usize,
+ ymin: usize,
+ ymax: usize
+}
+
+impl CoordBuilder {
+ fn new() -> CoordBuilder {
+ CoordBuilder {
+ xmin: None,
+ xmax: None,
+ ymin: None,
+ ymax: None
+ }
+ }
+
+ fn build(&self) -> Coord {
+ Coord {
+ xmin: self.xmin.unwrap(),
+ xmax: self.xmax.unwrap(),
+ ymin: self.ymin.unwrap(),
+ ymax: self.ymax.unwrap(),
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum Tile {
+ Clay,
+ RunningWater,
+ HalfSettledWater,
+ SettledWater,
+ Sand
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/17.txt"))?;
+
+ let clay_coords = input.iter().map(|line| {
+ let mut builder = CoordBuilder::new();
+ for split in line.split(", ") {
+ if split.starts_with("x=") {
+ let mut range_split = split
+ .trim_matches(|c: char| !c.is_numeric())
+ .split("..")
+ .map(|s| s.parse().unwrap());
+ if let Some(min) = range_split.next() {
+ builder.xmin = Some(min);
+ builder.xmax = Some(min+1);
+ }
+ if let Some(max) = range_split.next() {
+ builder.xmax = Some(max+1);
+ }
+ } else {
+ let mut range_split = split
+ .trim_matches(|c: char| !c.is_numeric())
+ .split("..")
+ .map(|s| s.parse().unwrap());
+ if let Some(min) = range_split.next() {
+ builder.ymin = Some(min);
+ builder.ymax = Some(min+1);
+ }
+ if let Some(max) = range_split.next() {
+ builder.ymax = Some(max+1);
+ }
+ }
+ }
+ builder.build()
+ }).collect::<Vec<_>>();
+
+ let range = CoordinateSystem {
+ xmin: clay_coords.iter().min_by_key(|coord| coord.xmin).unwrap().xmin-2,
+ xmax: clay_coords.iter().max_by_key(|coord| coord.xmax).unwrap().xmax+2,
+ ymin: clay_coords.iter().min_by_key(|coord| coord.ymin).unwrap().ymin,
+ ymax: clay_coords.iter().max_by_key(|coord| coord.ymax).unwrap().ymax
+ };
+
+ debug!(range);
+
+
+ let mut map = vec!(Tile::Sand; range.vector_size());
+ for coord in clay_coords {
+ for y in coord.ymin..coord.ymax {
+ for x in coord.xmin..coord.xmax {
+ map[range.to_vec(x, y)] = Tile::Clay;
+ }
+ }
+ }
+
+ debug!(map[range.to_vec(500, range.ymin)]);
+ map[range.to_vec(500, range.ymin)] = Tile::RunningWater;
+
+ let mut last_iter = Vec::new();
+ while last_iter != map {
+ last_iter = map.clone();
+ for y in range.ymin..range.ymax-1 {
+ for x in range.xmin..range.xmax {
+ match map[range.to_vec(x, y)] {
+ Tile::RunningWater => {
+ if map[range.to_vec(x, y+1)] == Tile::Sand {
+ map[range.to_vec(x, y+1)] = Tile::RunningWater;
+ }
+ if map[range.to_vec(x-1, y)] == Tile::Sand && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x-1, y)] = Tile::RunningWater;
+ }
+ if map[range.to_vec(x+1, y)] == Tile::Sand && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x+1, y)] = Tile::RunningWater;
+ }
+ if (map[range.to_vec(x-1, y)] == Tile::Clay || map[range.to_vec(x-1, y)] == Tile::HalfSettledWater) && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x, y)] = Tile::HalfSettledWater;
+ }
+ },
+ Tile::HalfSettledWater => {
+ if map[range.to_vec(x+1, y)] == Tile::Clay {
+ for xleft in 0.. {
+ if map[range.to_vec(x-xleft, y)] == Tile::HalfSettledWater {
+ map[range.to_vec(x-xleft, y)] = Tile::SettledWater;
+ } else {
+ break;
+ }
+ }
+ }
+ },
+ _ => {}
+ }
+ }
+ }
+ }
+
+ let water_tiles = map.iter()
+ .filter(|&&t| t == Tile::RunningWater || t == Tile::SettledWater || t == Tile::HalfSettledWater)
+ .count();
+ debug!(water_tiles);
+
+ let settled_water_tiles = map.iter()
+ .filter(|&&t| t == Tile::SettledWater)
+ .count();
+ debug!(settled_water_tiles);
+
+ Ok(())
+}
+
+#[derive(Debug)]
+struct CoordinateSystem {
+ xmin: usize,
+ xmax: usize,
+ ymin: usize,
+ ymax: usize
+}
+
+impl CoordinateSystem {
+ fn vector_size(&self) -> usize {
+ (self.xmax - self.xmin) * (self.ymax - self.ymin)
+ }
+ fn to_vec(&self, x: usize, y: usize) -> usize {
+ ((y - self.ymin) * (self.xmax - self.xmin)) + (x - self.xmin)
+ }
+}
diff --git a/2018/src/bin/day_18.rs b/2018/src/bin/day_18.rs
new file mode 100644
index 0000000..3908ea7
--- /dev/null
+++ b/2018/src/bin/day_18.rs
@@ -0,0 +1,123 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+extern crate arrayvec;
+use arrayvec::ArrayVec;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_18"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+enum State {
+ Open,
+ Trees,
+ Lumber
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/18.txt"))?;
+
+// println!("Input: {:?}", input);
+
+ let map = input.iter().map(|line| {
+ line.chars().map(|c| match c {
+ '.' => State::Open,
+ '|' => State::Trees,
+ '#' => State::Lumber,
+ _ => panic!("Unknown character {}", c)
+ }).collect::<Vec<_>>()
+ }).collect::<Vec<_>>();
+// debug!(map);
+
+ let after_10 = simulate(&map, 10);
+ let trees_count_10: usize = after_10.iter().map(|row| row.iter().filter(|&&x| x == State::Trees).count()).sum();
+ let lumber_count_10: usize = after_10.iter().map(|row| row.iter().filter(|&&x| x == State::Lumber).count()).sum();
+ debug!(trees_count_10);
+ debug!(lumber_count_10);
+ debug!(trees_count_10 * lumber_count_10);
+
+ let after_many = simulate(&map, 1000000000);
+ let trees_count_many: usize = after_many.iter().map(|row| row.iter().filter(|&&x| x == State::Trees).count()).sum();
+ let lumber_count_many: usize = after_many.iter().map(|row| row.iter().filter(|&&x| x == State::Lumber).count()).sum();
+ debug!(trees_count_many);
+ debug!(lumber_count_many);
+ debug!(trees_count_many * lumber_count_many);
+
+
+ Ok(())
+}
+
+
+fn simulate(start_map: &Vec<Vec<State>>, duration: u32) -> Vec<Vec<State>> {
+ let mut previous_maps = HashMap::new();
+
+ let mut map = start_map.clone();
+
+ let mut t = 0;
+ while t < duration {
+ let map0 = map.clone();
+ for y in 0..map.len() {
+ for x in 0..map[y].len() {
+ let adjacent = [
+ (x.wrapping_sub(1), y.wrapping_sub(1)),
+ (x, y.wrapping_sub(1)),
+ (x+1, y.wrapping_sub(1)),
+ (x.wrapping_sub(1), y),
+ (x+1, y),
+ (x.wrapping_sub(1), y+1),
+ (x, y+1),
+ (x+1, y+1)
+ ].iter().map(|&(other_x,other_y)| {
+ if other_y >= map0.len() || other_x >= map0[other_y].len() {
+ State::Open
+ } else {
+ map0[other_y][other_x]
+ }
+ }).collect::<ArrayVec<[State; 8]>>();
+
+ let adjacent_trees = adjacent.iter().filter(|&&x| x == State::Trees).count();
+ let adjacent_lumber = adjacent.iter().filter(|&&x| x == State::Lumber).count();
+
+ map[y][x] = match (map0[y][x], adjacent_trees, adjacent_lumber) {
+ (State::Open, trees, _) if trees >= 3 => State::Trees,
+ (State::Open, _, _) => State::Open,
+ (State::Trees, _, lumber) if lumber >= 3 => State::Lumber,
+ (State::Trees, _, _) => State::Trees,
+ (State::Lumber, trees, lumber) if trees >= 1 && lumber >= 1 => State::Lumber,
+ (State::Lumber, _, _) => State::Open
+ }
+ }
+ }
+
+ t += match previous_maps.get(&map) {
+ Some(previous_t) => {
+ let period = t + 1 - previous_t;
+ let whole_periods = (duration - t - 1) / period;
+ (period * whole_periods) + 1
+ },
+ None => 1
+ };
+ previous_maps.insert(map.clone(), t);
+ }
+
+ map
+}
+
+fn debug_print(map: &Vec<Vec<State>>) {
+ for row in map {
+ for c in row {
+ print!("{}", match c {
+ State::Open => '.',
+ State::Trees => '|',
+ State::Lumber => '#'
+ });
+ }
+ println!();
+ }
+ println!();
+ println!();
+}
diff --git a/2018/src/bin/day_19.rs b/2018/src/bin/day_19.rs
new file mode 100644
index 0000000..37ffef1
--- /dev/null
+++ b/2018/src/bin/day_19.rs
@@ -0,0 +1,139 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_19"
+
+#[derive(Debug)]
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, counter_register: usize, registers: &mut [i32; 6]) -> i32{
+ use Op::*;
+
+ registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize] + registers[self.b as usize],
+ Addi => registers[self.a as usize] + self.b,
+ Mulr => registers[self.a as usize] * registers[self.b as usize],
+ Muli => registers[self.a as usize] * self.b,
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 },
+ };
+
+ registers[counter_register]+1
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/19.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let mut input_iter = input.iter();
+ let counter_register: usize = input_iter.next()
+ .map(|line| line.split_whitespace().nth(1).unwrap().parse().unwrap())
+ .unwrap();
+
+ let instructions: Vec<Instruction> = input_iter
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace();
+ Instruction {
+ op: match instruction_iter.next().unwrap() {
+ "addr" => Op::Addr,
+ "addi" => Op::Addi,
+ "mulr" => Op::Mulr,
+ "muli" => Op::Muli,
+ "banr" => Op::Banr,
+ "bani" => Op::Bani,
+ "borr" => Op::Borr,
+ "bori" => Op::Bori,
+ "setr" => Op::Setr,
+ "seti" => Op::Seti,
+ "gtir" => Op::Gtir,
+ "gtri" => Op::Gtri,
+ "gtrr" => Op::Gtrr,
+ "eqir" => Op::Eqir,
+ "eqri" => Op::Eqri,
+ "eqrr" => Op::Eqrr,
+ _ => panic!("unknown instruction")
+ },
+ a: instruction_iter.next().unwrap().parse().unwrap(),
+ b: instruction_iter.next().unwrap().parse().unwrap(),
+ c: instruction_iter.next().unwrap().parse().unwrap(),
+ }
+ })
+ .collect();
+
+ debug!(counter_register);
+ debug!(instructions);
+
+ let part1_registers = execute_program(&instructions, counter_register, [0; 6]);
+ debug!(part1_registers);
+
+ //let part2_registers = execute_program(&instructions, counter_register, [1, 0, 0, 0, 0, 0]);
+ //debug!(part2_registers);
+ part2();
+
+ Ok(())
+}
+
+fn execute_program(instructions: &Vec<Instruction>, counter_register: usize, registers: [i32; 6]) -> [i32; 6] {
+ let mut counter_val: i32 = 0;
+ let mut registers = registers.clone();
+ while counter_val >= 0 && counter_val < instructions.len() as i32 {
+ registers[counter_register] = counter_val;
+ counter_val = instructions[counter_val as usize].execute(counter_register, &mut registers);
+ }
+
+ registers
+}
+
+
+
+fn part2() {
+ let r1 = ((27*28)+29)*30*14*32 + (11 * 19 * 2 * 2) + (3 * 22) + 9;
+ let mut r0 = 0;
+ for r5 in 1..r1+1 {
+ if r1 % r5 == 0 {
+ r0 += r1 / r5;
+ }
+ }
+ debug!(r0);
+}
diff --git a/2018/src/bin/day_2.rs b/2018/src/bin/day_2.rs
new file mode 100644
index 0000000..7700871
--- /dev/null
+++ b/2018/src/bin/day_2.rs
@@ -0,0 +1,53 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+extern crate im_rc;
+use im_rc::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_2"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/2.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let (twice, thrice) = input.iter().fold((0,0), |(twice, thrice), next| {
+ let occurances = next.chars().fold(HashMap::new(), |occurances, c| {
+ let counter = occurances.get(&c).cloned().unwrap_or(0);
+ occurances.update(c, counter + 1)
+ });
+ let has_twice = occurances.values().any(|count| *count == 2);
+ let has_thrice = occurances.values().any(|count| *count == 3);
+
+ (
+ twice + if has_twice { 1 } else { 0 },
+ thrice + if has_thrice { 1 } else { 0 },
+ )
+ });
+
+ println!("Twice: {}", twice);
+ println!("Thrice: {}", thrice);
+
+ let checksum = twice * thrice;
+ println!("Checksum: {}", checksum);
+
+ for i in &input {
+ for j in &input {
+ let diff = i.chars().zip(j.chars()).fold(0, |diff, (x, y)| {
+ if x != y {
+ diff + 1
+ } else {
+ diff
+ }
+ });
+ if diff == 1 {
+ println!("Diff of 1: {} + {}", i, j);
+ }
+ }
+ }
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_20.rs b/2018/src/bin/day_20.rs
new file mode 100644
index 0000000..6486d72
--- /dev/null
+++ b/2018/src/bin/day_20.rs
@@ -0,0 +1,137 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashSet, HashMap};
+
+// cargo watch -cs "cargo run --release --bin day_20"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+enum Dir {
+ N, S, E, W
+}
+
+#[derive(Debug)]
+struct Room {
+ doors: HashSet<Dir>
+}
+
+impl Room {
+ fn new() -> Room {
+ Room {
+ doors: HashSet::new()
+ }
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = &read_file(&PathBuf::from("inputs/20.txt"))?[0];
+
+ println!("Input: {:?}", input);
+
+ let rooms = populate_rooms(input);
+ let distances = distance_map(&rooms);
+
+ debug!(distance_to_furthest_room(&distances));
+ debug!(distances_more_than_1000(&distances));
+
+ Ok(())
+}
+
+fn populate_rooms(input: &str) -> HashMap<(i32, i32), Room> {
+ let mut rooms: HashMap<(i32, i32), Room> = HashMap::new();
+ rooms.insert((0,0), Room::new());
+
+ let mut coords = vec!((0, 0));
+
+ let mut coord_stack: Vec<(Vec<(i32, i32)>, Vec<(i32, i32)>)> = Vec::new();
+
+ for c in input.chars() {
+ match c {
+ '^' | '$' => {},
+ 'E' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::E);
+ coord.0 += 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'W' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::W);
+ coord.0 -= 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'N' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::N);
+ coord.1 -= 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'S' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::S);
+ coord.1 += 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ '(' => {
+ coord_stack.push((coords.clone(), Vec::new()));
+ },
+ '|' => {
+ coord_stack.last_mut().unwrap().1.append(&mut coords);
+ coords = coord_stack.last().unwrap().0.clone();
+ },
+ ')' => {
+ coord_stack.last_mut().unwrap().1.append(&mut coords);
+ coords = coord_stack.pop().unwrap().1;
+ coords.sort();
+ coords.dedup();
+ },
+ c => {
+ panic!("Unknown character {}", c);
+ }
+ }
+ }
+
+ debug!(rooms.len());
+
+ rooms
+}
+
+fn distance_map(rooms: &HashMap<(i32, i32), Room>) -> HashMap<(i32, i32), u32> {
+ let mut distances: HashMap<(i32, i32), u32> = HashMap::new();
+ distances.insert((0,0), 0);
+
+ while distances.len() < rooms.len() {
+ let current_max = *distances.values().max().unwrap();
+ let new_distances = distances.iter()
+ .filter(|(_, &d)| d == current_max)
+ .flat_map(|(&coord, _)| {
+ let room = rooms.get(&coord).unwrap();
+ room.doors.iter().map(|dir| match dir {
+ Dir::N => (coord.0, coord.1-1),
+ Dir::S => (coord.0, coord.1+1),
+ Dir::W => (coord.0-1, coord.1),
+ Dir::E => (coord.0+1, coord.1)
+ }).collect::<Vec<_>>()
+ })
+ .collect::<Vec<_>>();
+ for coord in new_distances {
+ distances.entry(coord).or_insert(current_max + 1);
+ }
+ }
+ distances
+}
+
+fn distance_to_furthest_room(distances: &HashMap<(i32, i32), u32>) -> u32 {
+ distances.values().max().unwrap().clone()
+}
+
+fn distances_more_than_1000(distances: &HashMap<(i32, i32), u32>) -> u32 {
+ distances.values().filter(|&&x| x >= 1000).count() as u32
+}
diff --git a/2018/src/bin/day_21.rs b/2018/src/bin/day_21.rs
new file mode 100644
index 0000000..0d9a97c
--- /dev/null
+++ b/2018/src/bin/day_21.rs
@@ -0,0 +1,137 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::u32;
+
+use std::collections::HashMap;
+// cargo watch -cs "cargo run --release --bin day_21"
+
+use std::i32;
+
+#[derive(Debug)]
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, counter_register: usize, registers: &mut [i32; 6]) -> i32{
+ use Op::*;
+
+ registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize].wrapping_add(registers[self.b as usize]),
+ Addi => registers[self.a as usize].wrapping_add(self.b),
+ Mulr => registers[self.a as usize].wrapping_mul(registers[self.b as usize]),
+ Muli => registers[self.a as usize].wrapping_mul(self.b),
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 },
+ };
+
+ registers[counter_register]+1
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/21.txt"))?;
+
+ let mut input_iter = input.iter();
+ let counter_register: usize = input_iter.next()
+ .map(|line| line.split_whitespace().nth(1).unwrap().parse().unwrap())
+ .unwrap();
+
+ let instructions: Vec<Instruction> = input_iter
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace();
+ Instruction {
+ op: match instruction_iter.next().unwrap() {
+ "addr" => Op::Addr,
+ "addi" => Op::Addi,
+ "mulr" => Op::Mulr,
+ "muli" => Op::Muli,
+ "banr" => Op::Banr,
+ "bani" => Op::Bani,
+ "borr" => Op::Borr,
+ "bori" => Op::Bori,
+ "setr" => Op::Setr,
+ "seti" => Op::Seti,
+ "gtir" => Op::Gtir,
+ "gtri" => Op::Gtri,
+ "gtrr" => Op::Gtrr,
+ "eqir" => Op::Eqir,
+ "eqri" => Op::Eqri,
+ "eqrr" => Op::Eqrr,
+ _ => panic!("unknown instruction")
+ },
+ a: instruction_iter.next().unwrap().parse().unwrap(),
+ b: instruction_iter.next().unwrap().parse().unwrap(),
+ c: instruction_iter.next().unwrap().parse().unwrap(),
+ }
+ })
+ .collect();
+
+ execute_program(&instructions, counter_register, [0, 0, 0, 0, 0, 0]);
+
+ Ok(())
+}
+
+fn execute_program(instructions: &Vec<Instruction>, counter_register: usize, registers: [i32; 6]) {
+ let mut instructions_executed: u64 = 0;
+ let mut counter_val: i32 = 0;
+ let mut registers = registers.clone();
+ let mut halting_values = HashMap::new();
+
+ while counter_val >= 0 && counter_val < instructions.len() as i32 {
+ if counter_val == 28 {
+ if halting_values.contains_key(&registers[4]) {
+ break;
+ }
+ halting_values.entry(registers[4]).or_insert(instructions_executed+2);
+ }
+ registers[counter_register] = counter_val;
+ counter_val = instructions[counter_val as usize].execute(counter_register, &mut registers);
+ instructions_executed += 1;
+ }
+
+ let (min_halting, min_halting_time) = halting_values.iter().min_by_key(|&(_, v)| v).unwrap();
+ debug!(min_halting);
+ debug!(min_halting_time);
+ let (max_halting, max_halting_time) = halting_values.iter().max_by_key(|&(_, v)| v).unwrap();
+ debug!(max_halting);
+ debug!(max_halting_time);
+
+}
diff --git a/2018/src/bin/day_22.rs b/2018/src/bin/day_22.rs
new file mode 100644
index 0000000..f9013cf
--- /dev/null
+++ b/2018/src/bin/day_22.rs
@@ -0,0 +1,165 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::u32;
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_22"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+struct Position {
+ x: u32,
+ y: u32,
+ equipment: u32 // 0 = nothing, 1 = torch, 2 = climbing
+}
+
+impl Position {
+ fn adjacent(&self, map: &Vec<Vec<u32>>) -> Vec<(Position, u32)> {
+ let all_adjacent = [
+ (Position {
+ x: self.x.saturating_sub(1),
+ ..*self
+ }, 1),
+ (Position {
+ y: self.y.saturating_sub(1),
+ ..*self
+ }, 1),
+ (Position {
+ x: self.x+1,
+ ..*self
+ }, 1),
+ (Position {
+ y: self.y+1,
+ ..*self
+ }, 1),
+ (Position {
+ equipment: (self.equipment+1)%3,
+ ..*self
+ }, 7),
+ (Position {
+ equipment: (self.equipment+2)%3,
+ ..*self
+ }, 7)
+ ];
+ all_adjacent.iter()
+ .filter(|(p, _)| {
+ let region = map[p.y as usize][p.x as usize];
+ let out_of_bounds = self == p;
+ let invalid_equipment = (region == 0 && p.equipment == 0) ||
+ (region == 1 && p.equipment == 1) ||
+ (region == 2 && p.equipment == 2);
+ !out_of_bounds && !invalid_equipment
+ })
+ .cloned()
+ .collect()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = &read_file(&PathBuf::from("inputs/22.txt"))?;
+
+ let depth: u32 = input[0].trim_matches(|c: char| !c.is_numeric()).parse().unwrap();
+ debug!(depth);
+ let mut input_target_iter = input[1]
+ .split(|c: char| !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse::<u32>().unwrap());
+
+ let target_x = input_target_iter.next().unwrap();
+ let target_y = input_target_iter.next().unwrap();
+
+ debug!((target_x, target_y));
+
+ let mut map_width = target_x;
+ let mut map_height = target_y;
+ let mut map = build_map(map_width, map_height, depth, target_x, target_y);
+
+ let risk: u32 = map.iter().take((target_y+1) as usize).map(|row| row.iter().take((target_x+1) as usize).sum::<u32>()).sum();
+ debug!(risk);
+
+
+ let mut distances = HashMap::new();
+ let mut unexplored = HashSet::new();
+ let initial = Position {
+ x: 0,
+ y: 0,
+ equipment: 1
+ };
+ let target = Position {
+ x: target_x,
+ y: target_y,
+ equipment: 1
+ };
+ distances.insert(initial, 0);
+ unexplored.insert(initial);
+
+ while !distances.contains_key(&target) || unexplored.contains(&target) {
+ let (current, current_distance) = unexplored.iter()
+ .map(|unexp| (unexp.clone(), distances.get(unexp).cloned().unwrap()))
+ .min_by_key(|(_, d)| *d)
+ .unwrap();
+
+ if current.y+1 >= map_height {
+ map_height *= 2;
+ map = build_map(map_width, map_height, depth, target_x, target_y);
+ debug!(map_height);
+ }
+ if current.x+1 >= map_width {
+ map_width *= 2;
+ map = build_map(map_width, map_height, depth, target_x, target_y);
+ debug!(map_width);
+ }
+
+ for (adjacent, further) in current.adjacent(&map) {
+ let distance = current_distance + further;
+ let best_previous_distance = distances.get(&adjacent).cloned().unwrap_or(u32::MAX);
+ if best_previous_distance > distance {
+ distances.insert(adjacent, distance);
+ unexplored.insert(adjacent);
+ }
+
+ }
+ unexplored.remove(&current);
+ }
+
+ debug!(distances.get(&target));
+
+ Ok(())
+}
+
+
+fn build_map(max_x: u32, max_y: u32, depth: u32, target_x: u32, target_y: u32) -> Vec<Vec<u32>> {
+ let mut geologic_index: Vec<Vec<u32>> = Vec::new();
+ let mut erosion_level: Vec<Vec<u32>> = Vec::new();
+ let mut region_type: Vec<Vec<u32>> = Vec::new();
+
+ for y in 0..max_y {
+ let mut geologic_row = Vec::new();
+ let mut erosion_row = Vec::new();
+ let mut type_row = Vec::new();
+
+ for x in 0..max_x {
+ let index = match (x, y) {
+ (0, 0) => 0,
+ (x, y) if x == target_x && y == target_y => 0,
+ (x, 0) => x*16807,
+ (0, y) => y*48271,
+ (x, y) => erosion_row[(x-1) as usize] * erosion_level[(y-1) as usize][x as usize]
+ };
+ let erosion = (index + depth) % 20183;
+ let block_type = erosion % 3;
+
+ geologic_row.push(index);
+ erosion_row.push(erosion);
+ type_row.push(block_type);
+ }
+
+ geologic_index.push(geologic_row);
+ erosion_level.push(erosion_row);
+ region_type.push(type_row);
+ }
+ region_type
+}
diff --git a/2018/src/bin/day_23.rs b/2018/src/bin/day_23.rs
new file mode 100644
index 0000000..463f3d3
--- /dev/null
+++ b/2018/src/bin/day_23.rs
@@ -0,0 +1,114 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::cmp;
+
+// cargo watch -cs "cargo run --release --bin day_23"
+
+#[derive(Debug, Clone)]
+struct Bot {
+ radius: i64,
+ position: Position
+}
+
+#[derive(Debug, Clone)]
+struct Position {
+ x: i64,
+ y: i64,
+ z: i64
+}
+
+impl Position {
+ fn distance(&self, other: &Position) -> i64 {
+ (other.z - self.z).abs() +
+ (other.y - self.y).abs() +
+ (other.x - self.x).abs()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/23.txt"))?;
+
+ let mut bots: Vec<Bot> = input.iter().map(|line| {
+ let mut line_iter = line.split(|c: char| c != '-' && !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse::<i64>().unwrap());
+ Bot {
+ position: Position {
+ x: line_iter.next().unwrap(),
+ y: line_iter.next().unwrap(),
+ z: line_iter.next().unwrap()
+ },
+ radius: line_iter.next().unwrap()
+ }
+ }).collect();
+
+ let biggest_radius = bots.iter().max_by_key(|bot| bot.radius).unwrap();
+ let biggest_radius_in_range_count = bots.iter()
+ .filter(|bot| biggest_radius.position.distance(&bot.position) <= biggest_radius.radius)
+ .count();
+ debug!(biggest_radius);
+ debug!(biggest_radius_in_range_count);
+
+
+ let min_x = bots.iter().min_by_key(|bot| bot.position.x).unwrap().position.x;
+ let max_x = bots.iter().max_by_key(|bot| bot.position.x).unwrap().position.x;
+ debug!(min_x);
+ debug!(max_x);
+ let min_y = bots.iter().min_by_key(|bot| bot.position.y).unwrap().position.y;
+ let max_y = bots.iter().max_by_key(|bot| bot.position.y).unwrap().position.y;
+ debug!(min_y);
+ debug!(max_y);
+ let min_z = bots.iter().min_by_key(|bot| bot.position.z).unwrap().position.z;
+ let max_z = bots.iter().max_by_key(|bot| bot.position.z).unwrap().position.z;
+ debug!(min_z);
+ debug!(max_z);
+
+ let origin = Position { x: 0, y: 0, z: 0 };
+
+ let mut radius = cmp::max(max_x - min_x, cmp::max(max_y-min_y, max_z-min_z));
+ let mut center = origin.clone();
+
+ while radius > 0 {
+ let delta = 0.8;
+ let new_radius = if radius == 1 { 0 } else { (radius as f32 * delta) as i64 };
+ let deltas = [-1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0];
+ let subs: Vec<Position> = deltas.iter().flat_map(|&dx| {
+ deltas.iter().flat_map(|&dy| {
+ deltas.iter().map(|&dz| {
+ Position {
+ x: center.x + (radius as f32 * dx) as i64,
+ y: center.y + (radius as f32 * dy) as i64,
+ z: center.z + (radius as f32 * dz) as i64
+ }
+ }).collect::<Vec<_>>()
+ }).collect::<Vec<_>>()
+ }).collect();
+
+ center = subs.iter()
+ .map(|new_center| {
+ (new_center, bots.iter()
+ .filter(|bot| bot.position.distance(&new_center) <= bot.radius + new_radius)
+ .count())
+ })
+ .max_by(|(a_center, a_bots), (b_center, b_bots)| {
+ a_bots.cmp(&b_bots).then(b_center.distance(&origin).cmp(&a_center.distance(&origin)))
+ })
+ .map(|(center, _)| center)
+ .unwrap().clone();
+
+ radius = new_radius;
+ }
+
+ let connected_in_radius = bots.iter()
+ .filter(|bot| bot.position.distance(&center) <= bot.radius)
+ .count();
+ debug!(connected_in_radius);
+ debug!(center);
+ let distance_to_origin = center.distance(&origin);
+ debug!(distance_to_origin);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_24.rs b/2018/src/bin/day_24.rs
new file mode 100644
index 0000000..d52f7d0
--- /dev/null
+++ b/2018/src/bin/day_24.rs
@@ -0,0 +1,217 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::str::FromStr;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_24"
+
+#[derive(Debug, Clone)]
+struct Army {
+ units: u32,
+ hp: u32,
+ weaknesses: Vec<String>,
+ immunities: Vec<String>,
+ damage_type: String,
+ damage: u32,
+ initiative: u32
+}
+
+impl Army {
+ fn effective_power(&self) -> u32 {
+ self.units * self.damage
+ }
+
+ fn actual_damage(&self, other: &Army) -> u32 {
+ let modifier = if other.weaknesses.contains(&self.damage_type) {
+ 2
+ } else if other.immunities.contains(&self.damage_type) {
+ 0
+ } else {
+ 1
+ };
+ self.effective_power() * modifier
+ }
+}
+
+impl FromStr for Army {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ // 2991 units each with 8084 hit points (weak to fire) with an attack that does 19 radiation damage at initiative 11
+ let mut words = s.split_whitespace();
+ let units = words.next().unwrap().parse()?;
+ let hp = words.nth(3).unwrap().parse()?;
+ let _ = words.nth(1);
+
+ let mut weaknesses = Vec::new();
+ let mut immunities = Vec::new();
+
+ let mut bracket_handled = false;
+ while !bracket_handled {
+ let maybe_weak_or_immune = words.next().unwrap().trim_matches(|c: char| !c.is_alphabetic());
+ if maybe_weak_or_immune == "weak" {
+ let mut weakness = words.nth(1).unwrap();
+ weaknesses.push(weakness.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ while weakness.ends_with(',') {
+ weakness = words.next().unwrap();
+ weaknesses.push(weakness.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ }
+ }
+ else if maybe_weak_or_immune == "immune" {
+ let mut immunity = words.nth(1).unwrap();
+ immunities.push(immunity.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ while immunity.ends_with(',') {
+ immunity = words.next().unwrap();
+ immunities.push(immunity.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ }
+ }
+ else {
+ bracket_handled = true;
+ }
+ }
+ let damage = words.nth(4).unwrap().parse()?;
+ let damage_type = words.next().unwrap().to_string();
+ let initiative = words.nth(3).unwrap().parse()?;
+
+ Ok(Army {
+ units, hp, weaknesses, immunities, damage_type, damage, initiative
+ })
+ }
+}
+
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/24.txt"))?;
+
+ let mut input_iter = input.iter();
+ let _ = input_iter.next();
+ let immune_army: Vec<Army> = input_iter.by_ref()
+ .take_while(|&line| line != "Infection:")
+ .map(|line| line.parse().unwrap())
+ .collect();
+ let infection_army: Vec<Army> = input_iter
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ let (unboosted_immune_army_size, unboosted_infection_army_size) = simulate(&immune_army, &infection_army, 0);
+ debug!(unboosted_immune_army_size);
+ debug!(unboosted_infection_army_size);
+
+ for boost in 0.. {
+ debug!(boost);
+ let (immune_army_size, infection_army_size) = simulate(&immune_army, &infection_army, boost);
+ debug!(immune_army_size);
+ debug!(infection_army_size);
+ if immune_army_size > 0 {
+ break;
+ }
+ }
+
+ Ok(())
+}
+
+
+fn target_selection(targeting_army: &Vec<Army>, targeted_army: &Vec<Army>) -> HashMap<usize, usize> {
+ let mut targets = HashMap::new();
+ for (i, army) in targeting_army.iter().enumerate() {
+ let best_target = (0..targeted_army.len())
+ .filter(|potential_target| !targets.values().any(|targeted| targeted == potential_target))
+ .fold(None, |best_target, next| {
+ let next_actual_damage = army.actual_damage(&targeted_army[next]);
+ let last_best_actual_damage = best_target.map(|best_target| army.actual_damage(&targeted_army[best_target])).unwrap_or(0);
+ let next_effective_power = targeted_army[next].effective_power();
+ let last_best_effective_power = best_target.map(|best_target: usize| targeted_army[best_target].effective_power()).unwrap_or(0);
+ let next_initiative = targeted_army[next].initiative;
+ let last_best_initiative = best_target.map(|best_target| targeted_army[best_target].initiative).unwrap_or(0);
+ if next_actual_damage == 0 && last_best_actual_damage == 0 {
+ None
+ } else if next_actual_damage > last_best_actual_damage {
+ Some(next)
+ } else if next_actual_damage == last_best_actual_damage && next_effective_power > last_best_effective_power {
+ Some(next)
+ } else if next_actual_damage == last_best_actual_damage && next_effective_power == last_best_effective_power && next_initiative > last_best_initiative {
+ Some(next)
+ } else {
+ best_target
+ }
+ });
+
+ if let Some(best_target) = best_target {
+ targets.insert(i, best_target);
+ }
+ }
+
+ targets
+}
+
+fn attack(aggressor: &Army, target: &mut Army) {
+ let damage = aggressor.actual_damage(target);
+ let units_destroyed = damage / target.hp;
+ target.units = target.units.saturating_sub(units_destroyed);
+}
+
+
+fn simulate(immune_army: &[Army], infection_army: &[Army], boost: u32) -> (u32, u32) {
+ let mut infection_army = Vec::from(infection_army);
+
+ let mut immune_army: Vec<Army> = immune_army.iter().map(|army| Army {
+ damage: army.damage + boost,
+ ..army.clone()
+ }).collect();
+
+ let mut watchdog_sum = immune_army.iter().map(|a| a.units).sum::<u32>() + infection_army.iter().map(|a| a.units).sum::<u32>();
+ while immune_army.len() > 0 && infection_army.len() > 0 {
+ immune_army.sort_by(|a, b| b.effective_power().cmp(&a.effective_power()).then(b.initiative.cmp(&a.initiative)));
+ infection_army.sort_by(|a, b| b.effective_power().cmp(&a.effective_power()).then(b.initiative.cmp(&a.initiative)));
+
+ let mut immune_targets = target_selection(&immune_army, &infection_army);
+ let mut infection_targets = target_selection(&infection_army, &immune_army);
+
+ while immune_targets.len() > 0 || infection_targets.len() > 0 {
+ let next_immune = immune_targets.keys()
+ .map(|&k| (k, immune_army[k].initiative.clone()))
+ .max_by_key(|(_, initiative)| *initiative);
+ let next_infection = infection_targets.keys()
+ .map(|&k| (k, infection_army[k].initiative.clone()))
+ .max_by_key(|(_, initiative)| *initiative);
+ match (next_immune, next_infection) {
+ (None, None) => {
+ panic!("No targets left")
+ },
+ (Some((immune_key, immune_init)), Some((_infect_key, infect_init))) if immune_init > infect_init => {
+ attack(&immune_army[immune_key], &mut infection_army[*immune_targets.get(&immune_key).unwrap()]);
+ immune_targets.remove(&immune_key);
+ },
+ (Some((_immune_key, _immune_init)), Some((infect_key, _infect_init))) => {
+ attack(&infection_army[infect_key], &mut immune_army[*infection_targets.get(&infect_key).unwrap()]);
+ infection_targets.remove(&infect_key);
+ },
+ (Some((immune_key, _immune_init)), None) => {
+ attack(&immune_army[immune_key], &mut infection_army[*immune_targets.get(&immune_key).unwrap()]);
+ immune_targets.remove(&immune_key);
+ },
+ (None, Some((infect_key, _infect_init))) => {
+ attack(&infection_army[infect_key], &mut immune_army[*infection_targets.get(&infect_key).unwrap()]);
+ infection_targets.remove(&infect_key);
+ }
+ };
+ }
+
+ immune_army.retain(|a| a.units > 0);
+ infection_army.retain(|a| a.units > 0);
+
+ let new_watchdog_sum = immune_army.iter().map(|a| a.units).sum::<u32>() + infection_army.iter().map(|a| a.units).sum::<u32>();
+ if watchdog_sum == new_watchdog_sum {
+ // Stalemate! Everyone loses.
+ return (0, 0);
+ }
+ watchdog_sum = new_watchdog_sum;
+ }
+
+ (immune_army.iter().map(|a| a.units).sum(), infection_army.iter().map(|a| a.units).sum())
+}
diff --git a/2018/src/bin/day_25.rs b/2018/src/bin/day_25.rs
new file mode 100644
index 0000000..9e74f49
--- /dev/null
+++ b/2018/src/bin/day_25.rs
@@ -0,0 +1,47 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_25"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/25.txt"))?;
+
+ let mut constellations: Vec<Vec<Vec<i32>>> = input.iter()
+ .map(|line| line.split(',').map(|x| x.parse().unwrap()).collect::<Vec<_>>())
+ .map(|points| vec!(points))
+ .collect();
+
+ // debug!(constellations);
+
+ while join_constellations(&mut constellations) {
+ }
+
+ debug!(constellations.len());
+
+ Ok(())
+}
+
+fn distance(xs: &[i32], ys: &[i32]) -> i32 {
+ xs.iter().zip(ys.iter()).map(|(x,y)| (x - y).abs()).sum()
+}
+
+fn join_constellations(constellations: &mut Vec<Vec<Vec<i32>>>) -> bool {
+ for i in 0..constellations.len()-1 {
+ for j in i+1..constellations.len() {
+ let connected = constellations[i].iter().any(|ci| {
+ constellations[j].iter().any(|cj| {
+ distance(&ci, &cj) <= 3
+ })
+ });
+ if connected {
+ let mut to_join = constellations.remove(j);
+ constellations[i].append(&mut to_join);
+ return true;
+ }
+ }
+ }
+ false
+}
diff --git a/2018/src/bin/day_3.rs b/2018/src/bin/day_3.rs
new file mode 100644
index 0000000..685e288
--- /dev/null
+++ b/2018/src/bin/day_3.rs
@@ -0,0 +1,76 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_3"
+
+#[derive(Debug)]
+struct Claim {
+ id: u32,
+ x: u32,
+ y: u32,
+ w: u32,
+ h: u32
+}
+
+impl FromStr for Claim {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ //#123 @ 3,2: 5x4
+ let split = s
+ .split(|c: char| !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse())
+ .collect::<Result<Vec<u32>, _>>()?;
+
+ Ok(Claim {
+ id: split[0],
+ x: split[1],
+ y: split[2],
+ w: split[3],
+ h: split[4]
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/3.txt"))?;
+ let claims = input.iter().map(|line| line.parse::<Claim>()).collect::<Result<Vec<_>, _>>()?;
+
+ let mut claimed = HashMap::new();
+ for claim in &claims {
+ for x in claim.x..claim.x+claim.w {
+ for y in claim.y..claim.y+claim.h {
+ *claimed.entry((x,y)).or_insert(0) += 1;
+ }
+ }
+ }
+
+ let conflicts = claimed.values().filter(|&x| *x > 1).count();
+ println!("Conflicts: {}", conflicts);
+
+ let conflict_free = claims.iter().filter(|c| check_for_conflicts(c, &claimed)).collect::<Vec<_>>();
+
+ println!("Conflict free: {:?}", conflict_free);
+
+ Ok(())
+}
+
+
+fn check_for_conflicts(claim: &Claim, claimed: &HashMap<(u32, u32), u32>) -> bool {
+ for x in claim.x..claim.x+claim.w {
+ for y in claim.y..claim.y+claim.h {
+ if claimed.get(&(x,y)).map_or(false, |c| *c > 1) {
+ return false;
+ }
+ }
+ }
+ true
+}
diff --git a/2018/src/bin/day_4.rs b/2018/src/bin/day_4.rs
new file mode 100644
index 0000000..2010cf8
--- /dev/null
+++ b/2018/src/bin/day_4.rs
@@ -0,0 +1,116 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_4"
+
+#[derive(Debug, PartialOrd, Ord, PartialEq, Eq)]
+struct Event {
+ date: String,
+ hour: u32,
+ minute: u32,
+ what: EventType
+}
+
+#[derive(Debug, PartialOrd, Ord, PartialEq, Eq)]
+enum EventType {
+ BeginShift(u32),
+ Asleep,
+ Awake
+}
+
+impl FromStr for Event {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let date = s.split_whitespace().nth(0).unwrap().trim_matches('[').to_string();
+ let time = s.split_whitespace().nth(1).unwrap().trim_matches(']');
+ let hour = time.split(':').nth(0).unwrap().parse().unwrap();
+ let minute = time.split(':').nth(1).unwrap().parse().unwrap();
+ let guard = s.split_whitespace().nth(3).and_then(|x| x.trim_matches('#').parse().ok());
+
+ let what = match s.split_whitespace().nth(2).unwrap() {
+ "Guard" => EventType::BeginShift(guard.unwrap()),
+ "falls" => EventType::Asleep,
+ "wakes" => EventType::Awake,
+ _ => panic!("Unknown event")
+ };
+
+ Ok(Event {
+ date,
+ hour,
+ minute,
+ what
+ })
+ }
+}
+
+#[derive(Debug)]
+struct GuardSleepStats {
+ per_minute: HashMap<u32, u32>
+}
+
+impl GuardSleepStats {
+ fn new() -> GuardSleepStats {
+ GuardSleepStats {
+ per_minute: HashMap::new()
+ }
+ }
+ fn total(&self) -> u32 {
+ self.per_minute.values().sum()
+ }
+}
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/4.txt"))?;
+
+ //println!("Input: {:?}", input);
+
+ let mut events: Vec<Event> = input.iter().map(|line| line.parse().unwrap()).collect();
+ events.sort();
+ //println!("Events: {:?}", events);
+
+
+ let mut sleep = HashMap::new();
+ let mut current_guard = 0;
+ let mut last_asleep = 0;
+ for event in events {
+ match event.what {
+ EventType::BeginShift(guard) => current_guard = guard,
+ EventType::Asleep => last_asleep = event.minute,
+ EventType::Awake => {
+ for i in last_asleep..event.minute {
+ *sleep
+ .entry(current_guard)
+ .or_insert(GuardSleepStats::new())
+ .per_minute
+ .entry(i)
+ .or_insert(0) += 1
+ }
+ }
+ }
+ }
+
+ println!("Stats: {:?}", sleep);
+
+ let (sleepiest_guard, sleepiest_stats) = sleep.iter().max_by_key(|(_,v)| v.total()).unwrap().clone();
+ println!("Sleepiest guard: {:?}", sleepiest_guard);
+ let (sleepiest_minute, sleepiest_occurances) = sleepiest_stats.per_minute.iter().max_by_key(|(_,v)| *v).unwrap().clone();
+ println!("Sleepiest minute: {:?}", sleepiest_minute);
+ println!("Part 1 answer: {}", sleepiest_guard * sleepiest_minute);
+
+
+ let (specific_minute_offender, specific_minute_stats) = sleep.iter().max_by_key(|(_,v)| v.per_minute.values().max().unwrap()).unwrap().clone();
+ println!("Specific minute: {:?}", specific_minute_offender);
+ let (specific_minute_minute, specific_minute_occurances) = specific_minute_stats.per_minute.iter().max_by_key(|(_,v)| *v).unwrap().clone();
+ println!("Specific Minute minute: {:?}", specific_minute_minute);
+ println!("Part 2 answer: {}", specific_minute_offender * specific_minute_minute);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_5.rs b/2018/src/bin/day_5.rs
new file mode 100644
index 0000000..2b24d4c
--- /dev/null
+++ b/2018/src/bin/day_5.rs
@@ -0,0 +1,53 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::cmp;
+
+// cargo watch -cs "cargo run --release --bin day_5"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/5.txt"))?;
+
+ //println!("Input: {:?}", input);
+ let polymer = {
+ let mut polymer: Vec<char> = input[0].chars().collect();
+ reduce(&mut polymer);
+ polymer
+ };
+
+ debug!(polymer.len());
+
+
+ let mut min_length = polymer.len();
+ for c in "abcdefghijklmnopqrstuvwxyz".chars() {
+ let mut polymer_without_char = polymer.clone();
+ polymer_without_char.retain(|x| x.to_ascii_lowercase() != c);
+ reduce(&mut polymer_without_char);
+ min_length = cmp::min(min_length, polymer_without_char.len());
+ }
+
+ debug!(min_length);
+
+ Ok(())
+}
+
+
+fn reduce(polymer: &mut Vec<char>) {
+ let mut had_reductions = true;
+ while had_reductions {
+ had_reductions = false;
+
+ for i in 0..polymer.len()-1 {
+ if polymer[i].to_ascii_lowercase() == polymer[i+1].to_ascii_lowercase() && polymer[i] != polymer[i+1] {
+ had_reductions = true;
+ polymer.remove(i+1);
+ polymer.remove(i);
+
+ // break isn't efficient, but does prevent indexing issues after removing
+ break;
+ }
+ }
+ }
+}
diff --git a/2018/src/bin/day_6.rs b/2018/src/bin/day_6.rs
new file mode 100644
index 0000000..16c8782
--- /dev/null
+++ b/2018/src/bin/day_6.rs
@@ -0,0 +1,103 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashSet, HashMap};
+
+// cargo watch -cs "cargo run --release --bin day_6"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/6.txt"))?;
+ let coordinates = input.iter().map(|line| {
+ let mut split = line.split(|c: char| !c.is_numeric());
+ let x: i32 = split.next().unwrap().parse().unwrap();
+ let _ = split.next();
+ let y: i32 = split.next().unwrap().parse().unwrap();
+ (x, y)
+ }).collect::<Vec<_>>();
+ debug!(coordinates);
+
+ let min_x = coordinates.iter().map(|(x, _)| x).min().unwrap().clone();
+ let max_x = coordinates.iter().map(|(x, _)| x).max().unwrap().clone();
+ let min_y = coordinates.iter().map(|(_, y)| y).min().unwrap().clone();
+ let max_y = coordinates.iter().map(|(_, y)| y).max().unwrap().clone();
+
+ debug!(min_x);
+ debug!(max_x);
+ debug!(min_y);
+ debug!(max_y);
+
+ let mut infinite = HashSet::new();
+ for x in min_x..max_x+1 {
+ for y in &[0, max_y] {
+ if let Some(coord) = find_closest(&coordinates, x, *y) {
+ infinite.insert(coord);
+ }
+ }
+ }
+ for y in min_y..max_y+1 {
+ for x in &[0, max_x] {
+ if let Some(coord) = find_closest(&coordinates, *x, y) {
+ infinite.insert(coord);
+ }
+ }
+ }
+
+ debug!(infinite);
+
+
+ let mut areas = HashMap::new();
+ for x in min_x..max_x+1 {
+ for y in min_y..max_y+1 {
+ if let Some(coord) = find_closest(&coordinates, x, y) {
+ *areas.entry(coord).or_insert(0) += 1;
+ }
+ }
+ }
+
+ debug!(areas);
+
+ let biggest_non_infinite = areas.iter()
+ .filter(|(k,_)| !infinite.contains(&k))
+ .max_by_key(|(_,v)| *v);
+ debug!(biggest_non_infinite);
+
+
+
+ let safe_distance = 10000;
+ let mut safe_size = 0;
+ for x in min_x..max_x+1 {
+ for y in min_y..max_y+1 {
+ let distance_sum: i32 = coordinates.iter()
+ .map(|(x1, y1)| manhattan_distance(*x1, *y1, x, y))
+ .sum();
+ if distance_sum < safe_distance {
+ safe_size += 1;
+ }
+ }
+ }
+ debug!(safe_size);
+
+ Ok(())
+}
+
+fn find_closest(coordinates: &Vec<(i32, i32)>, x: i32, y: i32) -> Option<usize> {
+ let mut distances = coordinates.iter()
+ .map(|(x1, y1)| manhattan_distance(*x1, *y1, x, y))
+ .enumerate()
+ .collect::<Vec<_>>();
+ distances.sort_by_key(|(_, d)| *d);
+
+ if distances[0] == distances[1] {
+ None
+ }
+ else {
+ distances.first().map(|(i, _)| *i)
+ }
+}
+
+fn manhattan_distance(x1: i32, y1: i32, x2: i32, y2: i32) -> i32 {
+ (x2-x1).abs() + (y2-y1).abs()
+}
diff --git a/2018/src/bin/day_7.rs b/2018/src/bin/day_7.rs
new file mode 100644
index 0000000..ec9d0be
--- /dev/null
+++ b/2018/src/bin/day_7.rs
@@ -0,0 +1,135 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_7"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/7.txt"))?;
+
+ //println!("Input: {:?}", input);
+
+ let (all_steps, blockers) = parse(&input);
+
+
+ let mut serial_ordered = Vec::new();
+ let mut remaining_steps = all_steps.clone();
+ let mut remaining_blockers = blockers.clone();
+
+ while !remaining_steps.is_empty() {
+ let mut unblocked: Vec<char> = remaining_steps.iter()
+ .filter(|c| remaining_blockers.get(c).map(|blockers| blockers.is_empty()).unwrap_or(true))
+ .cloned()
+ .collect();
+ unblocked.sort();
+
+ let next_step = unblocked.first().unwrap().clone();
+
+ serial_ordered.push(next_step);
+ remaining_steps.remove(&next_step);
+ for (_k, mut v) in &mut remaining_blockers {
+ v.retain(|c| *c != next_step);
+ }
+ }
+
+ debug!(serial_ordered);
+ for c in serial_ordered {
+ print!("{}", c);
+ }
+ println!();
+
+
+ let workers = 5;
+ let mut worker_tasks: Vec<Task> = Vec::new();
+ let mut parallel_ordered = Vec::new();
+ let mut remaining_steps = all_steps.clone();
+ let mut remaining_blockers = blockers.clone();
+ let mut current_time = 0;
+
+ while !remaining_steps.is_empty() {
+ let mut unblocked: Vec<char> = remaining_steps.iter()
+ .filter(|c|
+ remaining_blockers.get(c).map(|blockers| blockers.is_empty()).unwrap_or(true)
+ && !worker_tasks.iter().any(|w| w.t == **c)
+ )
+ .cloned()
+ .collect();
+ unblocked.sort();
+
+ let next_unblocked = if worker_tasks.len() < workers {
+ unblocked.first().cloned()
+ } else {
+ None
+ };
+
+ if let Some(next_task) = next_unblocked {
+ worker_tasks.push(Task {
+ t: next_task,
+ completion: current_time + time(next_task)
+ });
+ }
+ else {
+ //Advance time
+ worker_tasks.sort_by_key(|w| w.completion);
+ let complete = worker_tasks.swap_remove(0);
+ current_time = complete.completion;
+ let next_step = complete.t;
+
+ parallel_ordered.push(next_step);
+ remaining_steps.remove(&next_step);
+ for (_k, mut v) in &mut remaining_blockers {
+ v.retain(|c| *c != next_step);
+ }
+ }
+
+
+ }
+
+ debug!(parallel_ordered);
+ for c in parallel_ordered {
+ print!("{}", c);
+ }
+ println!();
+ debug!(current_time);
+
+
+ Ok(())
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+struct Task {
+ t: char,
+ completion: u32
+}
+
+
+fn parse(input: &Vec<String>) -> (HashSet<char>, HashMap<char, Vec<char>>) {
+ let mut blockers = HashMap::new();
+ let mut all_steps = HashSet::new();
+
+ for line in input {
+ //Step I must be finished before step C can begin.
+ let mut split = line.split_whitespace();
+ let blocker: char = split.nth(1).and_then(|x| x.chars().nth(0)).unwrap();
+ let blocked: char = split.nth(5).and_then(|x| x.chars().nth(0)).unwrap();
+
+ blockers.entry(blocked).or_insert(Vec::new()).push(blocker);
+ all_steps.insert(blocker);
+ all_steps.insert(blocked);
+ }
+
+ debug!(all_steps);
+ debug!(blockers);
+
+ (all_steps, blockers)
+}
+
+fn time(c: char) -> u32 {
+ let base_time = 60;
+ let char_time = c as u32 - 'A' as u32 + 1;
+ base_time + char_time
+}
diff --git a/2018/src/bin/day_8.rs b/2018/src/bin/day_8.rs
new file mode 100644
index 0000000..59813b0
--- /dev/null
+++ b/2018/src/bin/day_8.rs
@@ -0,0 +1,66 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::slice::Iter;
+
+// cargo watch -cs "cargo run --release --bin day_8"
+
+fn main() -> Result<(), Box<Error>> {
+ let input: Vec<u32> = read_file(&PathBuf::from("inputs/8.txt"))
+ .map(|lines| lines[0]
+ .split_whitespace()
+ .map(|s| s.parse().unwrap())
+ .collect()
+ )?;
+
+ //println!("Input: {:?}", input);
+
+ let metadata_sum = sum_metadata(&mut input.iter());
+ debug!(metadata_sum);
+
+ let value = node_value(&mut input.iter());
+ debug!(value);
+
+ Ok(())
+}
+
+fn sum_metadata(iter: &mut Iter<'_, u32>) -> u32 {
+ let num_children = iter.next().unwrap().clone();
+ let num_metadata = iter.next().unwrap().clone();
+
+ let children_sum: u32 = (0..num_children)
+ .map(|_| sum_metadata(iter))
+ .sum();
+
+ let metadata_sum: u32 = (0..num_metadata)
+ .map(|_| iter.next().unwrap())
+ .sum();
+
+ children_sum + metadata_sum
+}
+
+
+fn node_value(iter: &mut Iter<'_, u32>) -> u32 {
+ let num_children = iter.next().unwrap().clone();
+ let num_metadata = iter.next().unwrap().clone();
+
+ let node_values: Vec<u32> = (0..num_children)
+ .map(|_| node_value(iter))
+ .collect();
+
+ let metadata: Vec<u32> = (0..num_metadata)
+ .map(|_| iter.next().unwrap().clone())
+ .collect();
+
+ if num_children == 0 {
+ metadata.iter().sum()
+ } else {
+ metadata.iter()
+ .filter(|m| **m > 0 && **m-1 < num_children)
+ .map(|m| node_values[*m as usize - 1])
+ .sum()
+ }
+}
diff --git a/2018/src/bin/day_9.rs b/2018/src/bin/day_9.rs
new file mode 100644
index 0000000..3f85620
--- /dev/null
+++ b/2018/src/bin/day_9.rs
@@ -0,0 +1,91 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+
+use std::collections::LinkedList;
+
+// cargo watch -cs "cargo run --release --bin day_9"
+
+fn main() -> Result<(), Box<Error>> {
+ debug!(get_winning_player_score(438, 71626));
+ debug!(get_winning_player_score(438, 71626*100));
+
+ Ok(())
+}
+
+
+fn get_winning_player_score(players: usize, last_marble_score: u32) -> u32 {
+ let mut marbles_head = LinkedList::new();
+ let mut marbles_tail = LinkedList::new();
+ marbles_head.push_back(0);
+
+ let mut current_player = 0;
+ let mut next_marble = 1;
+ let mut scores = vec!(0; players);
+
+ while next_marble <= last_marble_score {
+ if next_marble % 23 == 0 {
+ move_backwards(&mut marbles_head, &mut marbles_tail, 7);
+ let removed = marbles_head.pop_back().expect("Going backwards should have ended with pushing to head");
+ move_forward(&mut marbles_head, &mut marbles_tail, 1);
+
+ let score = next_marble + removed;
+ scores[current_player] += score;
+ } else {
+ move_forward(&mut marbles_head, &mut marbles_tail, 1);
+ marbles_head.push_back(next_marble);
+ }
+
+ next_marble += 1;
+ current_player = (current_player + 1) % players;
+ }
+
+ scores.iter().max().unwrap().clone()
+}
+
+// WARNING: These don't play well with empty lists
+fn move_forward(marbles_head: &mut LinkedList<u32>, marbles_tail: &mut LinkedList<u32>, i: usize) {
+ if i != 0 {
+ match marbles_tail.pop_front() {
+ Some(marble) => {
+ marbles_head.push_back(marble);
+ move_forward(marbles_head, marbles_tail, i-1);
+ },
+ None => {
+ marbles_tail.append(marbles_head);
+ move_forward(marbles_head, marbles_tail, i);
+ },
+ }
+ }
+}
+
+fn move_backwards(marbles_head: &mut LinkedList<u32>, marbles_tail: &mut LinkedList<u32>, i: usize) {
+ if i != 0 {
+ match marbles_head.pop_back() {
+ Some(marble) => {
+ marbles_tail.push_front(marble);
+ move_backwards(marbles_head, marbles_tail, i-1);
+ },
+ None => {
+ marbles_head.append(marbles_tail);
+ move_backwards(marbles_head, marbles_tail, i);
+ },
+ }
+ }
+}
+
+
+#[test]
+fn trivial() {
+ assert_eq!(get_winning_player_score(9, 32), 32);
+}
+
+#[test]
+fn examples() {
+ assert_eq!(get_winning_player_score(10, 1618), 8317);
+ assert_eq!(get_winning_player_score(13, 7999), 146373);
+ assert_eq!(get_winning_player_score(17, 1104), 2764);
+ assert_eq!(get_winning_player_score(21, 6111), 54718);
+ assert_eq!(get_winning_player_score(30, 5807), 37305);
+}
diff --git a/2018/src/lib.rs b/2018/src/lib.rs
new file mode 100644
index 0000000..72520fe
--- /dev/null
+++ b/2018/src/lib.rs
@@ -0,0 +1,31 @@
+use std::path::PathBuf;
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+/// Reads a specified file into a vector of strings, one line of the
+/// file per string. Fails if any part of reading the file fails.
+pub fn read_file(file: &PathBuf) -> Result<Vec<String>, std::io::Error> {
+ let file = File::open(file)?;
+ let file_reader = BufReader::new(file);
+ file_reader.lines()
+ .collect::<Result<Vec<_>, _>>()
+ .map(preprocess_file_lines)
+}
+
+/// Removes any empty lines and makes sure that lines don't have
+/// problematic whitespace.
+pub fn preprocess_file_lines(lines: Vec<String>) -> Vec<String> {
+ lines.iter()
+ .filter(|line| line.len() > 0)
+ .map(|line| line.trim_right().to_string())
+ .collect()
+}
+
+
+#[macro_export]
+macro_rules! debug {
+ ( $x:expr ) => {
+ println!("{} = {:?}", stringify!($x), $x);
+ };
+}
diff --git a/2019/Cargo.lock b/2019/Cargo.lock
new file mode 100644
index 0000000..52c69da
--- /dev/null
+++ b/2019/Cargo.lock
@@ -0,0 +1,580 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "ansi_term"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "aoc2019"
+version = "0.1.0"
+dependencies = [
+ "archery 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cached 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "im 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rpds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "archery"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "autocfg"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "bitmaps"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cached"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "clap"
+version = "2.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "derivative"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "either"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "heck"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "im"
+version = "14.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitmaps 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_xoshiro 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sized-chunks 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libc"
+version = "0.2.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memoffset"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "proc-macro-error"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "rand_xoshiro"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rayon"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rpds"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "archery 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "sized-chunks"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitmaps 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "static_assertions"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "structopt"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "structopt-derive"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "typenum"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "vec_map"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "version_check"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+"checksum archery 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d308d8fa3f687f7a7588fccc4812ed6914be09518232f00454693a7417273ad2"
+"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
+"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+"checksum bitmaps 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81e039a80914325b37fde728ef7693c212f0ac913d5599607d7b95a9484aae0b"
+"checksum cached 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b052fd10f32987c3bd028d91ef86190b36fba5c8fccb5515d42083f061e6104"
+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
+"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
+"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
+"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700"
+"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
+"checksum derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "942ca430eef7a3806595a6737bc388bf51adb888d3fc0dd1b50f1c170167ee3a"
+"checksum derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2159be042979966de68315bce7034bb000c775f22e3e834e1c52ff78f041cae8"
+"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
+"checksum hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f629dc602392d3ec14bfc8a09b5e644d7ffd725102b48b81e59f90f2633621d7"
+"checksum im 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1f9b6540e530defef7f2df4ed330d45b739b10450548c74a9913f63ea1acc6b"
+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
+"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
+"checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db"
+"checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a"
+"checksum num-complex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fcb0cf31fb3ff77e6d2a6ebd6800df7fdcd106f2ad89113c9130bcd07f93dffc"
+"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
+"checksum num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "76bd5272412d173d6bf9afdf98db8612bbabc9a7a830b7bfc9c188911716132e"
+"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454"
+"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
+"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
+"checksum once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "891f486f630e5c5a4916c7e16c4b24a53e78c860b646e9f8e005e4f16847bfed"
+"checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097"
+"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+"checksum rand_xoshiro 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004"
+"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
+"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
+"checksum rpds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1196a0a2f52d343bd32179834273eaac7d8739f7e3f8b700227d2fa06b9a423b"
+"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
+"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+"checksum sized-chunks 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62db64dd92b3b54314b1e216c274634ca2b3fe8da8b3873be670cb1ac4dad30f"
+"checksum static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3"
+"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+"checksum structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "30b3a3e93f5ad553c38b3301c8a0a0cec829a36783f6a0c467fc4bf553a5f5bf"
+"checksum structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea692d40005b3ceba90a9fe7a78fa8d4b82b0ce627eebbffc329aab850f3410e"
+"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
+"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
+"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
+"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
+"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
+"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
+"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
+"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/2019/Cargo.toml b/2019/Cargo.toml
new file mode 100644
index 0000000..c5937b0
--- /dev/null
+++ b/2019/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "aoc2019"
+version = "0.1.0"
+authors = ["Justin Wernick <justin@worthe-it.co.za>"]
+edition = "2018"
+
+[dependencies]
+structopt = "0.3.5"
+derive_more = "0.99.2"
+derivative = "1.0.3"
+im = "14.0.0"
+rpds = "0.7.0"
+archery = "0.3.0"
+num = "0.2"
+rayon = "1.3.0"
+cached = "0.11.0"
+
+[profile.release]
+debug = true
diff --git a/2019/inputs/day_1.txt b/2019/inputs/day_1.txt
new file mode 100644
index 0000000..5c720ed
--- /dev/null
+++ b/2019/inputs/day_1.txt
@@ -0,0 +1,100 @@
+66690
+86239
+75191
+140364
+95979
+106923
+95229
+123571
+84764
+89444
+98107
+89062
+109369
+146067
+124760
+76900
+139198
+111441
+74046
+84920
+54397
+143807
+121654
+93863
+73909
+104121
+58485
+119084
+126227
+142078
+79820
+132617
+108430
+98032
+107434
+127307
+105619
+57741
+53468
+63301
+137970
+136780
+80897
+133205
+79159
+89124
+94477
+56714
+143704
+122097
+117335
+108246
+75507
+101459
+101162
+146197
+121884
+66217
+57074
+142903
+140951
+64883
+124556
+67382
+142407
+121778
+57933
+94599
+87426
+143758
+64043
+65678
+90137
+61090
+77315
+102383
+146607
+139290
+85394
+149787
+125611
+106405
+91561
+135739
+54845
+68782
+111175
+61011
+125658
+70751
+85607
+75458
+75419
+124311
+66022
+122784
+129018
+54901
+73788
+108240
diff --git a/2019/inputs/day_10.txt b/2019/inputs/day_10.txt
new file mode 100644
index 0000000..51520ab
--- /dev/null
+++ b/2019/inputs/day_10.txt
@@ -0,0 +1,24 @@
+.###.#...#.#.##.#.####..
+.#....#####...#.######..
+#.#.###.###.#.....#.####
+##.###..##..####.#.####.
+###########.#######.##.#
+##########.#########.##.
+.#.##.########.##...###.
+###.#.##.#####.#.###.###
+##.#####.##..###.#.##.#.
+.#.#.#####.####.#..#####
+.###.#####.#..#..##.#.##
+########.##.#...########
+.####..##..#.###.###.#.#
+....######.##.#.######.#
+###.####.######.#....###
+############.#.#.##.####
+##...##..####.####.#..##
+.###.#########.###..#.##
+#.##.#.#...##...#####..#
+##.#..###############.##
+##.###.#####.##.######..
+##.#####.#.#.##..#######
+...#######.######...####
+#....#.#.#.####.#.#.#.##
diff --git a/2019/inputs/day_11.txt b/2019/inputs/day_11.txt
new file mode 100644
index 0000000..d6581e1
--- /dev/null
+++ b/2019/inputs/day_11.txt
@@ -0,0 +1 @@
+3,8,1005,8,320,1106,0,11,0,0,0,104,1,104,0,3,8,1002,8,-1,10,101,1,10,10,4,10,1008,8,1,10,4,10,102,1,8,29,2,1005,1,10,1006,0,11,3,8,1002,8,-1,10,101,1,10,10,4,10,108,0,8,10,4,10,102,1,8,57,1,8,15,10,1006,0,79,1,6,3,10,3,8,102,-1,8,10,101,1,10,10,4,10,108,0,8,10,4,10,101,0,8,90,2,103,18,10,1006,0,3,2,105,14,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,0,8,10,4,10,101,0,8,123,2,9,2,10,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,1,10,4,10,1001,8,0,150,1,2,2,10,2,1009,6,10,1,1006,12,10,1006,0,81,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,1,10,4,10,102,1,8,187,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,0,10,4,10,101,0,8,209,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,1,10,4,10,101,0,8,231,1,1008,11,10,1,1001,4,10,2,1104,18,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1001,8,0,264,1,8,14,10,1006,0,36,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,101,0,8,293,1006,0,80,1006,0,68,101,1,9,9,1007,9,960,10,1005,10,15,99,109,642,104,0,104,1,21102,1,846914232732,1,21102,1,337,0,1105,1,441,21102,1,387512115980,1,21101,348,0,0,1106,0,441,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21102,209533824219,1,1,21102,1,395,0,1106,0,441,21101,0,21477985303,1,21102,406,1,0,1106,0,441,3,10,104,0,104,0,3,10,104,0,104,0,21101,868494234468,0,1,21101,429,0,0,1106,0,441,21102,838429471080,1,1,21102,1,440,0,1106,0,441,99,109,2,21201,-1,0,1,21101,0,40,2,21102,472,1,3,21101,0,462,0,1106,0,505,109,-2,2106,0,0,0,1,0,0,1,109,2,3,10,204,-1,1001,467,468,483,4,0,1001,467,1,467,108,4,467,10,1006,10,499,1102,1,0,467,109,-2,2106,0,0,0,109,4,2101,0,-1,504,1207,-3,0,10,1006,10,522,21101,0,0,-3,21202,-3,1,1,22101,0,-2,2,21102,1,1,3,21102,541,1,0,1106,0,546,109,-4,2105,1,0,109,5,1207,-3,1,10,1006,10,569,2207,-4,-2,10,1006,10,569,22102,1,-4,-4,1105,1,637,22102,1,-4,1,21201,-3,-1,2,21202,-2,2,3,21102,588,1,0,1105,1,546,22101,0,1,-4,21102,1,1,-1,2207,-4,-2,10,1006,10,607,21101,0,0,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,629,21201,-1,0,1,21102,629,1,0,105,1,504,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2105,1,0
diff --git a/2019/inputs/day_12.txt b/2019/inputs/day_12.txt
new file mode 100644
index 0000000..7e72a58
--- /dev/null
+++ b/2019/inputs/day_12.txt
@@ -0,0 +1,4 @@
+<x=14, y=2, z=8>
+<x=7, y=4, z=10>
+<x=1, y=17, z=16>
+<x=-4, y=-1, z=1>
diff --git a/2019/inputs/day_13.txt b/2019/inputs/day_13.txt
new file mode 100644
index 0000000..c600ec1
--- /dev/null
+++ b/2019/inputs/day_13.txt
@@ -0,0 +1 @@
+1,380,379,385,1008,2689,888873,381,1005,381,12,99,109,2690,1102,0,1,383,1101,0,0,382,21001,382,0,1,20102,1,383,2,21101,0,37,0,1105,1,578,4,382,4,383,204,1,1001,382,1,382,1007,382,41,381,1005,381,22,1001,383,1,383,1007,383,25,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1101,-1,0,384,1106,0,119,1007,392,39,381,1006,381,161,1102,1,1,384,20101,0,392,1,21101,23,0,2,21102,0,1,3,21102,138,1,0,1105,1,549,1,392,384,392,21001,392,0,1,21101,23,0,2,21101,3,0,3,21102,1,161,0,1105,1,549,1101,0,0,384,20001,388,390,1,20101,0,389,2,21101,0,180,0,1106,0,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,20101,0,389,2,21101,205,0,0,1105,1,393,1002,390,-1,390,1102,1,1,384,21001,388,0,1,20001,389,391,2,21101,228,0,0,1105,1,578,1206,1,261,1208,1,2,381,1006,381,253,20101,0,388,1,20001,389,391,2,21101,253,0,0,1106,0,393,1002,391,-1,391,1101,0,1,384,1005,384,161,20001,388,390,1,20001,389,391,2,21101,279,0,0,1106,0,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,0,304,0,1106,0,393,1002,390,-1,390,1002,391,-1,391,1101,0,1,384,1005,384,161,20102,1,388,1,20101,0,389,2,21101,0,0,3,21101,0,338,0,1106,0,549,1,388,390,388,1,389,391,389,21001,388,0,1,21002,389,1,2,21102,4,1,3,21101,0,365,0,1105,1,549,1007,389,24,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,230,18,20,1,1,20,109,3,21201,-2,0,1,22101,0,-1,2,21101,0,0,3,21102,1,414,0,1106,0,549,22102,1,-2,1,22102,1,-1,2,21101,0,429,0,1105,1,601,2102,1,1,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,22102,1,-3,-7,109,-8,2106,0,0,109,4,1202,-2,41,566,201,-3,566,566,101,639,566,566,2101,0,-1,0,204,-3,204,-2,204,-1,109,-4,2105,1,0,109,3,1202,-1,41,594,201,-2,594,594,101,639,594,594,20102,1,0,-2,109,-3,2106,0,0,109,3,22102,25,-2,1,22201,1,-1,1,21101,0,521,2,21102,1,1011,3,21102,1,1025,4,21102,630,1,0,1106,0,456,21201,1,1664,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,2,2,0,2,0,2,0,2,0,0,2,2,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,2,0,1,1,0,0,0,0,2,0,0,2,0,2,2,2,2,0,2,0,0,0,2,2,0,0,2,2,2,2,0,0,0,0,0,2,0,0,0,0,2,2,0,1,1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,2,2,0,2,0,0,0,0,2,0,0,0,0,2,0,0,0,0,2,2,2,0,0,1,1,0,0,2,2,2,0,0,0,2,0,0,0,0,0,2,2,0,0,2,0,2,0,0,0,2,2,0,0,0,2,0,0,0,2,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,2,0,0,2,0,0,0,0,2,0,0,2,0,2,0,2,0,2,0,0,1,1,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2,0,0,2,2,0,0,0,2,2,0,0,2,0,0,0,2,2,2,2,2,0,2,0,1,1,0,0,0,0,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,2,2,2,0,0,0,0,0,2,0,0,2,0,0,1,1,0,2,0,0,2,0,0,0,0,2,0,0,0,0,2,2,0,2,0,0,0,0,2,0,0,0,0,0,2,0,2,0,0,2,0,0,2,0,0,1,1,0,2,2,2,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,2,0,0,2,0,2,0,2,2,0,2,2,0,2,0,2,0,0,1,1,0,0,2,0,0,2,0,2,0,0,2,0,0,2,0,0,0,2,0,0,0,0,2,0,0,2,0,0,2,2,0,2,0,0,0,0,2,2,0,1,1,0,0,2,2,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,2,2,2,0,0,2,0,2,0,2,2,0,0,2,0,2,0,0,1,1,0,0,2,2,2,0,0,2,2,0,2,2,2,0,0,0,2,2,2,0,2,0,0,0,0,0,2,0,0,2,0,2,0,0,0,0,0,0,0,1,1,0,2,0,0,0,2,2,0,2,0,0,2,0,2,2,2,0,0,2,2,0,2,0,0,0,0,0,0,2,2,0,2,2,0,2,0,0,2,0,1,1,0,0,2,0,0,2,2,0,0,0,0,0,2,2,0,2,2,2,0,2,0,2,2,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,1,1,0,2,0,2,0,2,2,2,2,0,0,0,2,0,0,0,2,2,0,0,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,2,0,0,0,1,1,0,0,0,0,2,0,0,2,0,0,2,2,0,2,0,0,0,2,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,2,0,1,1,0,2,0,0,0,2,0,0,0,2,2,0,2,0,0,2,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,0,0,2,0,0,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,34,58,37,19,14,62,51,10,28,52,86,20,39,30,61,36,77,73,19,11,17,74,7,54,40,59,20,92,18,13,85,72,83,58,18,68,10,22,94,22,25,40,67,96,55,96,42,16,80,80,96,35,19,79,81,63,91,5,72,68,80,93,79,36,91,47,71,82,45,29,51,36,10,62,57,29,17,16,4,88,75,81,70,77,32,2,38,37,35,86,41,35,61,71,72,22,14,33,12,10,10,56,30,3,90,71,24,62,69,31,47,2,18,77,43,20,64,85,50,43,43,73,16,23,98,4,23,53,82,15,88,1,39,78,43,57,65,8,45,79,17,44,32,76,31,3,25,71,45,16,42,61,89,21,93,4,98,66,68,5,13,19,48,65,29,5,24,59,29,49,57,39,21,96,10,8,25,82,17,42,46,49,83,4,81,32,14,7,76,62,31,74,55,19,39,63,89,41,38,28,34,34,88,7,77,43,87,10,47,85,39,31,88,69,40,72,51,49,64,46,64,14,66,95,95,58,38,88,82,35,6,58,3,21,33,58,9,95,43,52,13,22,22,10,11,47,35,33,31,58,93,83,13,14,55,71,88,42,73,83,91,84,62,78,80,15,26,50,8,15,6,91,89,3,12,53,47,47,82,67,12,77,6,63,88,94,53,19,97,36,34,59,91,27,37,45,44,31,8,58,16,7,74,76,83,17,28,42,85,19,1,61,73,84,37,15,43,52,80,48,51,98,70,77,28,55,78,85,64,32,22,82,69,7,82,55,78,24,5,89,55,4,34,28,71,76,81,90,96,2,2,77,41,32,24,60,10,11,26,64,66,19,11,77,11,82,81,1,52,2,79,43,47,87,63,73,3,81,69,66,53,4,83,88,13,5,62,94,55,58,4,93,96,58,40,69,64,56,80,71,85,44,45,24,80,59,53,15,85,92,89,95,69,77,53,27,72,3,54,49,9,35,10,85,43,86,9,42,69,29,64,96,17,72,47,24,2,13,40,45,62,19,41,85,28,68,73,20,52,56,19,57,1,36,64,18,26,41,94,81,45,35,29,32,28,87,86,53,71,54,67,68,47,53,17,40,61,58,74,2,51,43,23,62,54,13,80,67,88,94,1,62,85,7,12,87,51,4,69,25,57,6,79,94,15,75,93,46,19,28,84,72,84,59,60,59,59,14,11,30,57,53,75,83,72,61,65,50,26,49,23,40,82,11,67,8,55,13,22,41,32,33,89,37,69,11,24,24,8,21,89,11,46,89,88,59,3,7,43,85,74,92,72,60,85,82,33,82,71,14,21,41,4,78,88,4,22,81,30,92,17,9,62,69,84,47,6,86,49,94,11,96,21,1,5,1,45,19,60,59,17,85,67,42,21,11,79,39,27,72,54,19,69,50,52,78,78,6,16,96,86,37,58,79,9,45,10,73,29,53,75,63,50,66,6,69,8,74,68,88,9,88,87,50,34,45,12,43,43,58,14,29,32,77,77,97,45,29,41,94,21,91,52,22,74,44,48,11,20,68,9,51,7,85,93,74,59,16,34,60,12,3,18,17,4,71,44,49,79,68,54,96,74,21,74,60,59,16,77,65,97,84,54,52,37,95,9,3,41,9,72,82,82,95,31,71,56,50,59,93,57,79,16,9,74,72,47,1,9,5,55,63,64,80,40,93,54,11,57,26,76,19,85,41,80,90,92,27,61,24,83,93,96,95,28,68,80,11,60,65,36,2,46,75,59,52,11,36,74,62,52,6,23,85,93,61,36,26,70,2,13,97,52,92,96,87,63,63,31,2,50,25,34,79,46,4,48,51,74,96,74,7,43,82,84,50,59,53,13,51,8,81,36,93,10,31,10,50,76,69,33,3,71,1,1,65,68,57,69,15,64,81,59,38,38,89,79,80,52,44,59,26,96,21,38,38,79,2,96,2,92,73,49,14,71,74,66,94,98,63,28,59,26,30,67,1,61,84,92,47,24,27,41,57,95,89,6,96,48,43,7,82,42,5,27,15,32,89,53,3,35,63,84,97,92,77,50,38,73,10,50,89,95,96,77,61,51,90,22,75,41,77,1,14,72,68,91,10,80,28,25,10,86,54,10,87,55,40,79,16,35,8,82,51,70,84,12,72,74,4,88,71,69,83,9,55,10,57,9,3,40,74,72,61,75,64,54,32,61,26,53,48,45,22,6,83,21,21,9,4,7,65,98,78,17,54,35,95,79,36,53,59,84,53,14,20,94,12,31,54,86,39,95,82,38,8,22,58,50,27,32,53,79,49,71,76,18,64,75,64,88,58,88,27,62,31,54,11,59,11,3,42,66,85,41,888873
diff --git a/2019/inputs/day_14.txt b/2019/inputs/day_14.txt
new file mode 100644
index 0000000..dac9757
--- /dev/null
+++ b/2019/inputs/day_14.txt
@@ -0,0 +1,59 @@
+2 RWPCH => 9 PVTL
+1 FHFH => 4 BLPJK
+146 ORE => 5 VJNBT
+8 KDFNZ, 1 ZJGH, 1 GSCG => 5 LKPQG
+11 NWDZ, 2 WBQR, 1 VRQR => 2 BMJR
+3 GSCG => 4 KQDVM
+5 QVNKN, 6 RPWKC => 3 BCNV
+10 QMBM, 4 RBXB, 2 VRQR => 1 JHXBM
+15 RPWKC => 6 MGCQ
+1 QWKRZ => 4 FHFH
+10 RWPCH => 6 MZKG
+11 JFKGV, 5 QVNKN, 1 CTVK => 4 VQDT
+1 SXKT => 5 RPWKC
+1 VQDT, 25 ZVMCB => 2 RBXB
+6 LGLNV, 4 XSNKB => 3 WBQR
+199 ORE => 2 SXKT
+1 XSNKB, 6 CWBNX, 1 HPKB, 5 PVTL, 1 JNKH, 9 SXKT, 3 KQDVM => 3 ZKTX
+7 FDSX => 6 WJDF
+7 JLRM => 4 CWBNX
+167 ORE => 5 PQZXH
+13 JHXBM, 2 NWDZ, 4 RFLX, 12 VRQR, 10 FJRFG, 14 PVTL, 2 JLRM => 6 DGFG
+12 HPKB, 3 WHVXC => 9 ZJGH
+1 JLRM, 2 ZJGH, 2 QVNKN => 9 FJRFG
+129 ORE => 7 KZFPJ
+2 QMBM => 1 RWPCH
+7 VJMWM => 4 JHDW
+7 PQZXH, 7 SXKT => 9 BJVQM
+1 VJMWM, 4 JHDW, 1 MQXF => 7 FDSX
+1 RPWKC => 7 WHVXC
+1 ZJGH => 1 ZVMCB
+1 RWPCH => 3 MPKR
+187 ORE => 8 VJMWM
+15 CTVK => 5 GSCG
+2 XSNKB, 15 ZVMCB, 3 KDFNZ => 2 RFLX
+18 QVNKN => 8 XLFZJ
+4 CWBNX => 8 ZSCX
+2 ZJGH, 1 JLRM, 1 MGCQ => 9 NPRST
+13 BJVQM, 2 BCNV => 2 QWKRZ
+2 QWKRZ, 2 BLPJK, 5 XSNKB => 2 VRQR
+13 HPKB, 3 VQDT => 9 JLRM
+2 SXKT, 1 VJNBT, 5 VLWQB => 6 CTVK
+2 MPKR, 2 LMNCH, 24 VRQR => 8 DZFNW
+2 VQDT => 1 KDFNZ
+1 CTVK, 6 FDSX => 6 QVNKN
+3 CTVK, 1 QVNKN => 4 HPKB
+3 NPRST, 1 KGSDJ, 1 CTVK => 2 QMBM
+4 KZFPJ, 1 PQZXH => 5 VLWQB
+2 VQDT => 7 KGSDJ
+3 MPKR => 2 JNKH
+1 KQDVM => 5 XQBS
+3 ZKGMX, 1 XQBS, 11 MZKG, 11 NPRST, 1 DZFNW, 5 VQDT, 2 FHFH => 6 JQNF
+2 FJRFG, 17 BMJR, 3 BJVQM, 55 JQNF, 8 DGFG, 13 ZJGH, 29 ZKTX => 1 FUEL
+27 KZFPJ, 5 VJNBT => 5 MQXF
+11 FDSX, 1 WHVXC, 1 WJDF => 4 ZKGMX
+1 ZVMCB => 4 NWDZ
+1 XLFZJ => 6 LGLNV
+13 ZSCX, 4 XLFZJ => 8 LMNCH
+1 RPWKC, 1 FDSX, 2 BJVQM => 8 JFKGV
+1 WJDF, 1 LKPQG => 4 XSNKB
diff --git a/2019/inputs/day_15.txt b/2019/inputs/day_15.txt
new file mode 100644
index 0000000..ca5836c
--- /dev/null
+++ b/2019/inputs/day_15.txt
@@ -0,0 +1 @@
+3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,1002,1034,1,1039,102,1,1036,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1106,0,124,1002,1034,1,1039,1001,1036,0,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1105,1,124,1001,1034,-1,1039,1008,1036,0,1041,1001,1035,0,1040,1002,1038,1,1043,101,0,1037,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,102,1,1035,1040,1001,1038,0,1043,101,0,1037,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,1,1032,1006,1032,165,1008,1040,9,1032,1006,1032,165,1102,1,2,1044,1105,1,224,2,1041,1043,1032,1006,1032,179,1102,1,1,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,35,1044,1106,0,224,1101,0,0,1044,1105,1,224,1006,1044,247,102,1,1039,1034,1002,1040,1,1035,1002,1041,1,1036,102,1,1043,1038,101,0,1042,1037,4,1044,1105,1,0,1,5,41,19,22,1,39,81,29,20,15,82,33,18,45,30,32,55,28,26,70,13,56,32,28,18,3,59,90,11,95,15,85,8,61,25,59,24,34,1,85,5,25,54,57,18,20,54,80,91,28,65,36,12,44,36,13,92,24,56,13,39,69,29,79,10,41,27,23,25,72,20,3,61,15,51,11,12,12,48,10,45,13,29,49,90,30,17,9,41,21,18,7,30,48,17,83,71,4,10,31,10,96,81,77,9,50,39,21,36,33,72,12,3,23,79,18,4,75,17,58,64,8,7,97,60,72,72,1,94,55,42,2,94,2,21,88,19,82,57,96,19,25,27,41,62,15,40,23,61,86,27,73,61,13,46,52,81,12,34,23,73,23,59,1,30,47,9,99,10,37,17,28,98,5,92,73,8,63,4,86,76,79,7,30,68,28,91,12,12,98,74,4,22,44,10,23,45,37,16,90,76,23,74,75,12,21,38,14,15,76,28,49,71,7,6,6,71,53,33,12,87,15,92,66,21,38,13,53,92,34,49,25,6,67,21,27,89,24,61,25,30,41,30,99,28,19,41,90,51,74,14,33,54,48,10,14,42,2,67,76,10,21,2,67,43,27,69,11,16,78,7,36,9,24,48,63,81,53,29,94,34,25,99,66,47,17,97,33,52,11,62,22,52,30,23,89,95,15,13,50,48,26,10,6,69,78,13,6,94,1,28,67,10,70,16,50,19,24,15,79,50,27,3,19,62,4,31,83,20,17,83,67,5,80,26,36,62,87,3,10,80,22,65,60,10,78,4,20,60,30,11,7,83,10,13,72,81,37,22,14,55,63,51,27,32,77,52,20,50,16,48,2,55,10,53,26,84,6,87,43,37,26,3,85,62,25,78,50,16,10,37,22,54,5,80,24,7,32,49,18,27,12,41,70,82,20,34,91,15,98,77,22,6,79,3,8,54,17,32,4,44,2,97,14,15,65,30,97,14,79,75,11,77,5,61,37,20,91,20,45,74,19,40,2,41,89,12,34,44,18,62,57,17,68,22,96,7,59,63,2,60,70,2,26,75,26,3,53,19,80,16,97,7,34,58,52,66,24,75,25,30,75,42,13,12,89,13,3,84,92,1,75,30,54,43,2,56,15,1,15,84,99,6,98,42,17,29,1,18,26,70,71,29,91,23,21,87,66,18,38,32,18,81,65,2,58,99,12,4,84,24,32,88,30,67,49,29,59,64,18,70,10,24,56,5,27,97,50,4,28,85,65,16,67,83,15,16,61,18,86,8,36,25,36,29,97,45,19,81,41,29,45,30,69,26,57,93,27,72,34,30,99,61,2,48,16,12,76,98,28,14,32,32,90,48,10,30,57,23,39,2,8,39,33,13,88,34,31,74,15,60,8,47,60,31,5,79,1,98,86,33,3,99,33,62,11,96,25,22,38,98,84,3,56,70,49,3,8,56,87,4,29,59,65,26,34,77,7,14,78,26,25,70,49,3,31,45,92,24,95,17,4,9,4,96,64,92,27,67,4,99,6,44,7,16,86,2,75,1,6,68,81,4,1,44,49,7,92,8,40,36,25,81,13,56,99,10,2,30,72,6,43,30,12,43,93,19,20,23,95,10,19,66,63,28,96,40,50,8,15,56,38,13,93,42,71,12,18,87,8,4,21,85,9,2,66,77,10,80,26,61,9,43,20,88,10,39,67,55,31,49,17,58,26,80,20,84,54,49,5,73,11,52,15,63,7,62,24,57,92,61,25,87,56,37,31,38,14,99,0,0,21,21,1,10,1,0,0,0,0,0,0
diff --git a/2019/inputs/day_16.txt b/2019/inputs/day_16.txt
new file mode 100644
index 0000000..357965c
--- /dev/null
+++ b/2019/inputs/day_16.txt
@@ -0,0 +1 @@
+59723517898690342336085619027921111260000667417052529433894092649779685557557996383085708903241535436786723718804155370155263736632861535632645335233170435646844328735934063129720822438983948765830873108060969395372667944081201020154126736565212455403582565814037568332106043336657972906297306993727714730061029321153984390658949013821918352341503629705587666779681013358053312990709423156110291835794179056432958537796855287734217125615700199928915524410743382078079059706420865085147514027374485354815106354367548002650415494525590292210440827027951624280115914909910917047084328588833201558964370296841789611989343040407348115608623432403085634084
diff --git a/2019/inputs/day_17.txt b/2019/inputs/day_17.txt
new file mode 100644
index 0000000..49131d4
--- /dev/null
+++ b/2019/inputs/day_17.txt
@@ -0,0 +1 @@
+1,330,331,332,109,3974,1102,1182,1,15,1101,1475,0,24,1001,0,0,570,1006,570,36,101,0,571,0,1001,570,-1,570,1001,24,1,24,1106,0,18,1008,571,0,571,1001,15,1,15,1008,15,1475,570,1006,570,14,21102,1,58,0,1105,1,786,1006,332,62,99,21101,333,0,1,21102,73,1,0,1105,1,579,1102,0,1,572,1101,0,0,573,3,574,101,1,573,573,1007,574,65,570,1005,570,151,107,67,574,570,1005,570,151,1001,574,-64,574,1002,574,-1,574,1001,572,1,572,1007,572,11,570,1006,570,165,101,1182,572,127,1002,574,1,0,3,574,101,1,573,573,1008,574,10,570,1005,570,189,1008,574,44,570,1006,570,158,1105,1,81,21102,340,1,1,1105,1,177,21101,0,477,1,1106,0,177,21102,1,514,1,21101,0,176,0,1106,0,579,99,21102,184,1,0,1105,1,579,4,574,104,10,99,1007,573,22,570,1006,570,165,1002,572,1,1182,21101,0,375,1,21101,0,211,0,1105,1,579,21101,1182,11,1,21102,1,222,0,1106,0,979,21102,1,388,1,21102,1,233,0,1106,0,579,21101,1182,22,1,21101,0,244,0,1105,1,979,21101,0,401,1,21102,1,255,0,1106,0,579,21101,1182,33,1,21102,1,266,0,1106,0,979,21102,414,1,1,21102,277,1,0,1105,1,579,3,575,1008,575,89,570,1008,575,121,575,1,575,570,575,3,574,1008,574,10,570,1006,570,291,104,10,21102,1182,1,1,21102,1,313,0,1106,0,622,1005,575,327,1101,1,0,575,21101,327,0,0,1105,1,786,4,438,99,0,1,1,6,77,97,105,110,58,10,33,10,69,120,112,101,99,116,101,100,32,102,117,110,99,116,105,111,110,32,110,97,109,101,32,98,117,116,32,103,111,116,58,32,0,12,70,117,110,99,116,105,111,110,32,65,58,10,12,70,117,110,99,116,105,111,110,32,66,58,10,12,70,117,110,99,116,105,111,110,32,67,58,10,23,67,111,110,116,105,110,117,111,117,115,32,118,105,100,101,111,32,102,101,101,100,63,10,0,37,10,69,120,112,101,99,116,101,100,32,82,44,32,76,44,32,111,114,32,100,105,115,116,97,110,99,101,32,98,117,116,32,103,111,116,58,32,36,10,69,120,112,101,99,116,101,100,32,99,111,109,109,97,32,111,114,32,110,101,119,108,105,110,101,32,98,117,116,32,103,111,116,58,32,43,10,68,101,102,105,110,105,116,105,111,110,115,32,109,97,121,32,98,101,32,97,116,32,109,111,115,116,32,50,48,32,99,104,97,114,97,99,116,101,114,115,33,10,94,62,118,60,0,1,0,-1,-1,0,1,0,0,0,0,0,0,1,50,26,0,109,4,1201,-3,0,587,20102,1,0,-1,22101,1,-3,-3,21102,0,1,-2,2208,-2,-1,570,1005,570,617,2201,-3,-2,609,4,0,21201,-2,1,-2,1106,0,597,109,-4,2106,0,0,109,5,2101,0,-4,630,20101,0,0,-2,22101,1,-4,-4,21101,0,0,-3,2208,-3,-2,570,1005,570,781,2201,-4,-3,653,20101,0,0,-1,1208,-1,-4,570,1005,570,709,1208,-1,-5,570,1005,570,734,1207,-1,0,570,1005,570,759,1206,-1,774,1001,578,562,684,1,0,576,576,1001,578,566,692,1,0,577,577,21102,702,1,0,1106,0,786,21201,-1,-1,-1,1106,0,676,1001,578,1,578,1008,578,4,570,1006,570,724,1001,578,-4,578,21102,731,1,0,1105,1,786,1106,0,774,1001,578,-1,578,1008,578,-1,570,1006,570,749,1001,578,4,578,21101,756,0,0,1105,1,786,1106,0,774,21202,-1,-11,1,22101,1182,1,1,21102,774,1,0,1105,1,622,21201,-3,1,-3,1106,0,640,109,-5,2105,1,0,109,7,1005,575,802,20102,1,576,-6,20101,0,577,-5,1105,1,814,21101,0,0,-1,21101,0,0,-5,21101,0,0,-6,20208,-6,576,-2,208,-5,577,570,22002,570,-2,-2,21202,-5,51,-3,22201,-6,-3,-3,22101,1475,-3,-3,2102,1,-3,843,1005,0,863,21202,-2,42,-4,22101,46,-4,-4,1206,-2,924,21102,1,1,-1,1105,1,924,1205,-2,873,21102,1,35,-4,1106,0,924,1202,-3,1,878,1008,0,1,570,1006,570,916,1001,374,1,374,1201,-3,0,895,1101,0,2,0,2101,0,-3,902,1001,438,0,438,2202,-6,-5,570,1,570,374,570,1,570,438,438,1001,578,558,921,21002,0,1,-4,1006,575,959,204,-4,22101,1,-6,-6,1208,-6,51,570,1006,570,814,104,10,22101,1,-5,-5,1208,-5,49,570,1006,570,810,104,10,1206,-1,974,99,1206,-1,974,1102,1,1,575,21101,973,0,0,1105,1,786,99,109,-7,2105,1,0,109,6,21101,0,0,-4,21102,0,1,-3,203,-2,22101,1,-3,-3,21208,-2,82,-1,1205,-1,1030,21208,-2,76,-1,1205,-1,1037,21207,-2,48,-1,1205,-1,1124,22107,57,-2,-1,1205,-1,1124,21201,-2,-48,-2,1105,1,1041,21102,1,-4,-2,1106,0,1041,21101,0,-5,-2,21201,-4,1,-4,21207,-4,11,-1,1206,-1,1138,2201,-5,-4,1059,2102,1,-2,0,203,-2,22101,1,-3,-3,21207,-2,48,-1,1205,-1,1107,22107,57,-2,-1,1205,-1,1107,21201,-2,-48,-2,2201,-5,-4,1090,20102,10,0,-1,22201,-2,-1,-2,2201,-5,-4,1103,2102,1,-2,0,1106,0,1060,21208,-2,10,-1,1205,-1,1162,21208,-2,44,-1,1206,-1,1131,1106,0,989,21101,0,439,1,1105,1,1150,21101,477,0,1,1106,0,1150,21102,1,514,1,21102,1,1149,0,1105,1,579,99,21101,1157,0,0,1106,0,579,204,-2,104,10,99,21207,-3,22,-1,1206,-1,1138,2101,0,-5,1176,2102,1,-4,0,109,-6,2106,0,0,32,5,46,1,3,1,46,1,3,1,46,1,3,1,46,1,3,1,46,1,3,1,40,11,40,1,5,1,44,1,5,1,44,1,5,1,44,1,5,1,44,1,5,1,40,11,40,1,3,1,46,1,3,1,46,1,3,1,46,1,3,9,38,1,11,1,26,1,11,1,11,1,26,1,11,1,11,1,26,1,11,5,7,1,26,1,15,1,7,1,26,1,15,1,7,1,26,1,15,1,7,1,26,1,11,7,5,1,26,1,11,1,3,1,1,1,5,1,26,1,9,13,1,1,3,13,10,1,9,1,1,1,3,1,1,1,3,1,1,1,3,1,22,5,5,1,1,13,3,1,26,1,5,1,5,1,1,1,3,1,5,1,26,1,5,1,5,7,5,1,26,1,5,1,7,1,9,1,26,1,5,1,7,1,9,1,26,1,5,1,7,1,9,1,26,1,5,1,7,11,26,1,5,1,34,11,5,1,34,1,15,1,34,1,5,9,1,9,26,1,5,1,7,1,9,1,26,1,5,1,7,1,9,1,26,1,5,1,7,1,9,1,22,11,7,1,9,1,22,1,3,1,13,1,9,1,22,1,3,1,13,1,9,1,22,1,3,1,13,1,9,1,22,1,3,1,13,1,9,1,22,1,3,1,13,1,9,1,22,5,13,11,22
diff --git a/2019/inputs/day_18.txt b/2019/inputs/day_18.txt
new file mode 100644
index 0000000..3cb4307
--- /dev/null
+++ b/2019/inputs/day_18.txt
@@ -0,0 +1,81 @@
+#################################################################################
+#.............#.....#.................#.#.....#...#.......#...................#a#
+#.#####.#######.#.###.#########.#####.#.#.###Y###.#.#####.#.#####.###########.#.#
+#.#...#.#.....#.#..c#.........#...#.#...#...#.#...#.#.#...#.#.#...#...#...#.....#
+#.#.###.#.###.#.###.#.###########.#.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#######
+#.#...#...#.#...#.#...#...........#.#...#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.....#
+#.#.#.#####.#####.#####.###.#######.#.###.#.#######.#.#.###.#.###.#.#.#.#.#.###.#
+#.#.#.............#.#...#.#.#..e..#.....#.#...........#...#.#...#...#...#.....#.#
+#.#########.#####.#.#.###.#.#.###.#####.#.###############.#T#.#.###############.#
+#...#..k....#.....#.#.Z.#...#...#.....#.#.........#.#.....#.#.#.....#.L.....#...#
+###.#.#.#######.###.###.#######.#####.#.#########.#.#.###.#.#.###.#.###.###.#.###
+#...#.#.#.....#.#...#...#.....#.....#.#.#...#...#.#.#.#...#.#.#...#...#.#...#...#
+#.###.#.#.###.#.#.###.###.###.#####.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#####.#
+#.#...#.#.#...#.#...#.....#.#.....#.#.#.#.#...#...#.#...#.#.#...#.#...#.#.#.....#
+#.###.#.#.#.###.###.#######.#.#####.#.#.#.#########.###.###.#.###.#.###.#.#.###.#
+#...#.#.#.#...#...#.........#.#.....#.#.#.............#.......#...#.#...#.#...#.#
+###.#.###.###.###.###.#.#####.#.#####.###############.#########.#.#.###.#.###.#.#
+#.....#...#...#.J...#.#.#.....#.....#...#...........#.#...#...#.#.......#...#.#.#
+#######.###.#######.#.###.#####.#######.#########.#.#.###.#.#.#########.#####.#.#
+#.......#.#...#...#...#...#...#.#.......#.....O.#.#.#.#...#.#.......#...#.....#s#
+#.#######.###.#.#.#####.###.#.#.#.#######.#####.#.#.#.#.###.#####.#.#.###.#####.#
+#...#...#...#...#...#.#.#...#...#.......#.....#.#.#.#.#...#.#...#.#.#...#...#...#
+###.#.#.#.#########.#.#.#.#######.#####.#.#####.#.###.###.#.###.###.#.#####.#.###
+#.#...#.#.........#...#...#....d#.....#.#.#.....#.#...#...#.#.#...#.#.#.....#.#.#
+#.#####.#######.#######.###.###.#####.#.#.#.#####.#.###.#.#.#.###.#.#.#.#####.#.#
+#...#.#.......#.......#...#.#...#.....#.#.#.....#.......#.#.....#.#.#.#.#.......#
+#.#.#.#######.#.#.#####.###.#.#####.###.#.#####.#############.###.#.#.#.#######.#
+#.#...#.....#.#.#...#...#...#.....#...#.#.#...#.#...........#.#...#.#.#.#...#.#.#
+#.###.###.#.#.#.###.#.###.#######.#####.#.###.#.#.#########.#.#.###.#.#.#.#.#.#.#
+#...#.....#.#.#...#...#...#.......#.....#...#.#.#.....#...#...#...#.#.#...#.#...#
+#.#.#######.#.###.#####.###.#######.#######.#.#.#####.###.#######.#.#####.#.#.###
+#.#.#.....#.#.#.#.#.#...#.#.#...#...#...#...#.#.....#...#.....#...#.....#.#.#w#.#
+#.#.#.###.#.#.#.#.#.#.###.#.#.#.###.#.#.#.###.#.###.###.#.###.#.###.###.###.#.#.#
+#.#.#.#.#.#.#.#.#.#.#.#m..#...#...#...#.#.#...#...#...#.#...#.#.#.....#.#...#.#.#
+###.#.#.#.###W#.#.#.#.#.#########.#####.#.#.#.###.#####.###.#.#.#######.#.###.#.#
+#...#...#.#...#.....#.#.......#...#...#.#.#.#.#.#.....#.....#.#.........#.#.#...#
+#.###.###.#.###.#####.#.###.###.###.#.#.#.#.#.#.#####.#######.###########.#.###.#
+#.#...#...#.#...#.S...#...#.....#...#.#.#...#.....#.#.........#...#...#...#.....#
+#.#.###.###.#####.#######.#######.###.#.#########.#.###########.#.#.#.#.###.#####
+#.....#...........#.......F.......#..................f..........#...#...#.......#
+#######################################.@.#######################################
+#.....#.#...........#.....#.........................#...#.....#.M.......#.....#.#
+###P#.#.#.#######.###.###.#.#######.###.#.#########.#.#.#.###.###.#####.###.#.#.#
+#...#...#...#.#...#.....#.#.#.......#...#...#.........#...#.......#...#.....#.#.#
+#.#.#######.#.#.###.#####.#.#.#######.#####.###############.#########.#######.#.#
+#.#.#.....#.#.#.#...#...#.#.#.#.........#...#.......#...#.....#.....#.#.......#.#
+#.###.###.#.#.#.#.###.#.#.#.#.###########.###.#####.#.#.#######.###.#.#.#######.#
+#...#.#.#.#...#.#.#...#...#.#...........#...#...#.#...#.......#.#.#.#.#.........#
+#.#.#.#.#.#.###.#.#.#####.#######.#####.###.###.#.###########.#.#.#.#.#.#######.#
+#.#.#...#...#...#.#r#.....#.....#.....#.#...#.#.#.......#...#.....#.#...#.....#.#
+#.#.###.#####.###.#.#######.###.#####.#.#.#.#.#.###.#####.#.#######.#.###.###.#.#
+#.#...#.#...#...#.#.........#...#...#.#.#.#...#...#.#.....#.#......p#...#.#.#.#.#
+###.#.#.#.#.###.#.###########.###.#.#.#.#.###.###.#.#.#####.#.###.#######.#.#.###
+#...#.#.#.#...#.......#.....#.#...#...#.#...#.#...#.....#...#.#...#.K...#.#.#...#
+#.#####.#.###.#######.#.###Q#.#.#######.###.#.#.#####.###.###.#.###.###.#.#.###.#
+#.....#...#...#.#...#.#.#.#...#...#.....#...#.#.....#.#...#...#.#...#.#..j#.#...#
+#.###.#####.###.#.#.###.#.#########.###.#.#########.###.#.#.###.#.###.#####.#.###
+#...#.#.....#...#.#.B...#...#...#...#...#.#.......#.....#.#...#.#...........#.R.#
+#.###.#.#######.#.#######.#.#.#.#.###.###.#.#.###.#######.###.###.#############.#
+#.#...#.......#.#n....#...#.#.#...#...#.#...#...#.....#...#.#.....#..u..#.....#.#
+###.#.#######.#.#####.#.###.#.#####.###.#.#####.###.###.###.###.###.###.#.###.#.#
+#...#.#...#...#.....#.#.#...#...#.#...#.#...#...#...#...#...#.#.#...#...#.#...#.#
+#.#####.#.#.###.#.#####.#.###.#.#.###.#.#####.#######.#####.#.###.###.###.###.#.#
+#...#...#.#.#...#.......#.#...#.#...#...#.....#.......#.....#.U...#.#...#...#...#
+#.#.#.###.#.#.#########.#.#####.###.###.#.#.###.#######.###########.###X#.#.###.#
+#.#..l#...#.#...#.......#.....#...#...#.#.#o#...#.#.....#...#......x....#.#.#...#
+#.#####C###.#.###.###########.###.#.###.#.###.###.#.###.#.#.#I#############.#.###
+#.....#...#.#.#...#...#.....#.#...#.#...#.#...#.....#...#.#...#v......G.#...#..q#
+###.#####.#.###.###.#.#.###.#.#.###.#.###.#.###.#####.#.#.#####.#######.#.#####.#
+#.#y#...#.#...#.#...#.#...#.#...#...#...#.#.#...#.....#.#..i..#...#.....#...#...#
+#.#.#.#.#.###.#.#.###.#.#.#.#####.#.###.#.#.###.#.###########H#.#.#.#####.#.#.###
+#...#.#.#...#.#.....#.#.#.#.#...#.#.....#.#...#.#...........#.#.#.#g..#...#.#...#
+#.###.#.###A#.#######.#.#.#.#.###.#######.###.#.#########.#.#.#.#.###.#####.###.#
+#.#...#.....#.........#.#.#.#.#...#.....#...#.#.......#...#.#.#.#.#.#.#...#...#.#
+###.#####################.#.#.#.#####.###.#.#.#########.###.#.###.#.#.#.#.###.#.#
+#...#.......#.............#..t#.#...#...#.#.#.#.......#.#...#...#.#.#.N.#.....#.#
+#.###.#####.#.#########.#######.#.#D#.#.#.#.#.#.#####.#.#.#####.#.#.###########.#
+#.#...#...#..z#.#.......#.....#...#.#.#.#.#.#...#...#...#.#.#..h#.#.....#......b#
+#.#.###.#.#####.#.#######.###.#####.###.#.#.#####.#.#####.#.#.###.#.###.#.#######
+#.......#.......#...........#...........#.#.....E.#.........#...V.#...#.........#
+#################################################################################
diff --git a/2019/inputs/day_18_2.txt b/2019/inputs/day_18_2.txt
new file mode 100644
index 0000000..8fda759
--- /dev/null
+++ b/2019/inputs/day_18_2.txt
@@ -0,0 +1,81 @@
+#################################################################################
+#.............#.....#.................#.#.....#...#.......#...................#a#
+#.#####.#######.#.###.#########.#####.#.#.###Y###.#.#####.#.#####.###########.#.#
+#.#...#.#.....#.#..c#.........#...#.#...#...#.#...#.#.#...#.#.#...#...#...#.....#
+#.#.###.#.###.#.###.#.###########.#.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#######
+#.#...#...#.#...#.#...#...........#.#...#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.....#
+#.#.#.#####.#####.#####.###.#######.#.###.#.#######.#.#.###.#.###.#.#.#.#.#.###.#
+#.#.#.............#.#...#.#.#..e..#.....#.#...........#...#.#...#...#...#.....#.#
+#.#########.#####.#.#.###.#.#.###.#####.#.###############.#T#.#.###############.#
+#...#..k....#.....#.#.Z.#...#...#.....#.#.........#.#.....#.#.#.....#.L.....#...#
+###.#.#.#######.###.###.#######.#####.#.#########.#.#.###.#.#.###.#.###.###.#.###
+#...#.#.#.....#.#...#...#.....#.....#.#.#...#...#.#.#.#...#.#.#...#...#.#...#...#
+#.###.#.#.###.#.#.###.###.###.#####.#.#.#.#.#.#.#.#.#.###.#.###.#####.#.#.#####.#
+#.#...#.#.#...#.#...#.....#.#.....#.#.#.#.#...#...#.#...#.#.#...#.#...#.#.#.....#
+#.###.#.#.#.###.###.#######.#.#####.#.#.#.#########.###.###.#.###.#.###.#.#.###.#
+#...#.#.#.#...#...#.........#.#.....#.#.#.............#.......#...#.#...#.#...#.#
+###.#.###.###.###.###.#.#####.#.#####.###############.#########.#.#.###.#.###.#.#
+#.....#...#...#.J...#.#.#.....#.....#...#...........#.#...#...#.#.......#...#.#.#
+#######.###.#######.#.###.#####.#######.#########.#.#.###.#.#.#########.#####.#.#
+#.......#.#...#...#...#...#...#.#.......#.....O.#.#.#.#...#.#.......#...#.....#s#
+#.#######.###.#.#.#####.###.#.#.#.#######.#####.#.#.#.#.###.#####.#.#.###.#####.#
+#...#...#...#...#...#.#.#...#...#.......#.....#.#.#.#.#...#.#...#.#.#...#...#...#
+###.#.#.#.#########.#.#.#.#######.#####.#.#####.#.###.###.#.###.###.#.#####.#.###
+#.#...#.#.........#...#...#....d#.....#.#.#.....#.#...#...#.#.#...#.#.#.....#.#.#
+#.#####.#######.#######.###.###.#####.#.#.#.#####.#.###.#.#.#.###.#.#.#.#####.#.#
+#...#.#.......#.......#...#.#...#.....#.#.#.....#.......#.#.....#.#.#.#.#.......#
+#.#.#.#######.#.#.#####.###.#.#####.###.#.#####.#############.###.#.#.#.#######.#
+#.#...#.....#.#.#...#...#...#.....#...#.#.#...#.#...........#.#...#.#.#.#...#.#.#
+#.###.###.#.#.#.###.#.###.#######.#####.#.###.#.#.#########.#.#.###.#.#.#.#.#.#.#
+#...#.....#.#.#...#...#...#.......#.....#...#.#.#.....#...#...#...#.#.#...#.#...#
+#.#.#######.#.###.#####.###.#######.#######.#.#.#####.###.#######.#.#####.#.#.###
+#.#.#.....#.#.#.#.#.#...#.#.#...#...#...#...#.#.....#...#.....#...#.....#.#.#w#.#
+#.#.#.###.#.#.#.#.#.#.###.#.#.#.###.#.#.#.###.#.###.###.#.###.#.###.###.###.#.#.#
+#.#.#.#.#.#.#.#.#.#.#.#m..#...#...#...#.#.#...#...#...#.#...#.#.#.....#.#...#.#.#
+###.#.#.#.###W#.#.#.#.#.#########.#####.#.#.#.###.#####.###.#.#.#######.#.###.#.#
+#...#...#.#...#.....#.#.......#...#...#.#.#.#.#.#.....#.....#.#.........#.#.#...#
+#.###.###.#.###.#####.#.###.###.###.#.#.#.#.#.#.#####.#######.###########.#.###.#
+#.#...#...#.#...#.S...#...#.....#...#.#.#...#.....#.#.........#...#...#...#.....#
+#.#.###.###.#####.#######.#######.###.#.#########.#.###########.#.#.#.#.###.#####
+#.....#...........#.......F.......#....@#@...........f..........#...#...#.......#
+#################################################################################
+#.....#.#...........#.....#............@#@..........#...#.....#.M.......#.....#.#
+###P#.#.#.#######.###.###.#.#######.###.#.#########.#.#.#.###.###.#####.###.#.#.#
+#...#...#...#.#...#.....#.#.#.......#...#...#.........#...#.......#...#.....#.#.#
+#.#.#######.#.#.###.#####.#.#.#######.#####.###############.#########.#######.#.#
+#.#.#.....#.#.#.#...#...#.#.#.#.........#...#.......#...#.....#.....#.#.......#.#
+#.###.###.#.#.#.#.###.#.#.#.#.###########.###.#####.#.#.#######.###.#.#.#######.#
+#...#.#.#.#...#.#.#...#...#.#...........#...#...#.#...#.......#.#.#.#.#.........#
+#.#.#.#.#.#.###.#.#.#####.#######.#####.###.###.#.###########.#.#.#.#.#.#######.#
+#.#.#...#...#...#.#r#.....#.....#.....#.#...#.#.#.......#...#.....#.#...#.....#.#
+#.#.###.#####.###.#.#######.###.#####.#.#.#.#.#.###.#####.#.#######.#.###.###.#.#
+#.#...#.#...#...#.#.........#...#...#.#.#.#...#...#.#.....#.#......p#...#.#.#.#.#
+###.#.#.#.#.###.#.###########.###.#.#.#.#.###.###.#.#.#####.#.###.#######.#.#.###
+#...#.#.#.#...#.......#.....#.#...#...#.#...#.#...#.....#...#.#...#.K...#.#.#...#
+#.#####.#.###.#######.#.###Q#.#.#######.###.#.#.#####.###.###.#.###.###.#.#.###.#
+#.....#...#...#.#...#.#.#.#...#...#.....#...#.#.....#.#...#...#.#...#.#..j#.#...#
+#.###.#####.###.#.#.###.#.#########.###.#.#########.###.#.#.###.#.###.#####.#.###
+#...#.#.....#...#.#.B...#...#...#...#...#.#.......#.....#.#...#.#...........#.R.#
+#.###.#.#######.#.#######.#.#.#.#.###.###.#.#.###.#######.###.###.#############.#
+#.#...#.......#.#n....#...#.#.#...#...#.#...#...#.....#...#.#.....#..u..#.....#.#
+###.#.#######.#.#####.#.###.#.#####.###.#.#####.###.###.###.###.###.###.#.###.#.#
+#...#.#...#...#.....#.#.#...#...#.#...#.#...#...#...#...#...#.#.#...#...#.#...#.#
+#.#####.#.#.###.#.#####.#.###.#.#.###.#.#####.#######.#####.#.###.###.###.###.#.#
+#...#...#.#.#...#.......#.#...#.#...#...#.....#.......#.....#.U...#.#...#...#...#
+#.#.#.###.#.#.#########.#.#####.###.###.#.#.###.#######.###########.###X#.#.###.#
+#.#..l#...#.#...#.......#.....#...#...#.#.#o#...#.#.....#...#......x....#.#.#...#
+#.#####C###.#.###.###########.###.#.###.#.###.###.#.###.#.#.#I#############.#.###
+#.....#...#.#.#...#...#.....#.#...#.#...#.#...#.....#...#.#...#v......G.#...#..q#
+###.#####.#.###.###.#.#.###.#.#.###.#.###.#.###.#####.#.#.#####.#######.#.#####.#
+#.#y#...#.#...#.#...#.#...#.#...#...#...#.#.#...#.....#.#..i..#...#.....#...#...#
+#.#.#.#.#.###.#.#.###.#.#.#.#####.#.###.#.#.###.#.###########H#.#.#.#####.#.#.###
+#...#.#.#...#.#.....#.#.#.#.#...#.#.....#.#...#.#...........#.#.#.#g..#...#.#...#
+#.###.#.###A#.#######.#.#.#.#.###.#######.###.#.#########.#.#.#.#.###.#####.###.#
+#.#...#.....#.........#.#.#.#.#...#.....#...#.#.......#...#.#.#.#.#.#.#...#...#.#
+###.#####################.#.#.#.#####.###.#.#.#########.###.#.###.#.#.#.#.###.#.#
+#...#.......#.............#..t#.#...#...#.#.#.#.......#.#...#...#.#.#.N.#.....#.#
+#.###.#####.#.#########.#######.#.#D#.#.#.#.#.#.#####.#.#.#####.#.#.###########.#
+#.#...#...#..z#.#.......#.....#...#.#.#.#.#.#...#...#...#.#.#..h#.#.....#......b#
+#.#.###.#.#####.#.#######.###.#####.###.#.#.#####.#.#####.#.#.###.#.###.#.#######
+#.......#.......#...........#...........#.#.....E.#.........#...V.#...#.........#
+#################################################################################
diff --git a/2019/inputs/day_19.txt b/2019/inputs/day_19.txt
new file mode 100644
index 0000000..e85881e
--- /dev/null
+++ b/2019/inputs/day_19.txt
@@ -0,0 +1 @@
+109,424,203,1,21102,11,1,0,1106,0,282,21101,0,18,0,1106,0,259,1201,1,0,221,203,1,21102,1,31,0,1106,0,282,21101,0,38,0,1106,0,259,20102,1,23,2,21202,1,1,3,21101,1,0,1,21101,0,57,0,1105,1,303,2101,0,1,222,20101,0,221,3,21001,221,0,2,21102,1,259,1,21101,0,80,0,1105,1,225,21101,185,0,2,21102,91,1,0,1106,0,303,1202,1,1,223,21001,222,0,4,21102,259,1,3,21101,225,0,2,21102,1,225,1,21101,0,118,0,1106,0,225,20102,1,222,3,21102,1,131,2,21101,133,0,0,1106,0,303,21202,1,-1,1,22001,223,1,1,21101,148,0,0,1105,1,259,2101,0,1,223,21002,221,1,4,21002,222,1,3,21101,0,16,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21101,0,195,0,106,0,109,20207,1,223,2,20101,0,23,1,21102,1,-1,3,21101,0,214,0,1105,1,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,1201,-4,0,249,22101,0,-3,1,22101,0,-2,2,21201,-1,0,3,21101,0,250,0,1106,0,225,21201,1,0,-4,109,-5,2106,0,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,22102,1,-2,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,21201,-2,0,3,21101,343,0,0,1106,0,303,1105,1,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,22101,0,-4,1,21102,384,1,0,1106,0,303,1105,1,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,21201,1,0,-4,109,-5,2106,0,0
diff --git a/2019/inputs/day_2.txt b/2019/inputs/day_2.txt
new file mode 100644
index 0000000..dd34cff
--- /dev/null
+++ b/2019/inputs/day_2.txt
@@ -0,0 +1 @@
+1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,9,1,19,1,19,5,23,1,23,6,27,2,9,27,31,1,5,31,35,1,35,10,39,1,39,10,43,2,43,9,47,1,6,47,51,2,51,6,55,1,5,55,59,2,59,10,63,1,9,63,67,1,9,67,71,2,71,6,75,1,5,75,79,1,5,79,83,1,9,83,87,2,87,10,91,2,10,91,95,1,95,9,99,2,99,9,103,2,10,103,107,2,9,107,111,1,111,5,115,1,115,2,119,1,119,6,0,99,2,0,14,0
diff --git a/2019/inputs/day_20.txt b/2019/inputs/day_20.txt
new file mode 100644
index 0000000..09d6330
--- /dev/null
+++ b/2019/inputs/day_20.txt
@@ -0,0 +1,113 @@
+ K Z V U I F
+ Q T Y Y E E
+ ###################################.#####.###.###########.#####.#.#####################################
+ #.......#.#.............#.........#.#.......#.#.#.........#.....#...#...#...........#...#.....#.#.....#
+ ###.#####.###.###.###.###########.#.###.#####.#.###.#.#.#.###.###.###.#####.#######.###.#####.#.###.###
+ #.#...#.#.#.#.#.#.#.#.....#...........#.....#.#...#.#.#.#...#.#.#.#.....#.#.#...#.#.#...#.#.#.....#...#
+ #.#.###.#.#.###.###.#.#########.###.#######.#.#.#.#######.#.#.#.#.#.###.#.#.#.###.#####.#.#.#.#####.###
+ #.....#...#...............#.#.#.#.#.#.....#.#.#.#...#.....#.#.#.#.#...#.....#.#.#.........#...#.#...#.#
+ #.#######.###########.###.#.#.###.#.###.#.#.#.#.###.###.###.#.#.#.#.###.#.###.#.#.#.#######.###.###.#.#
+ #...#.......#...#.#...#...#...#.#.#.#...#...#.....#.#.#.#...#...#...#...#.........#.#.#.#...#.......#.#
+ #.#######.#.###.#.#######.###.#.#.#.#.#.###.###.#####.#####.###.#.#####.#####.#.#.###.#.###.#.#######.#
+ #.#.#...#.#...#.......#.......#.#...#.#...#.#.#...#.#.......#...#.#.........#.#.#...............#.....#
+ #.#.#.#######.#####.#####.###.#.###.#.#####.#.#.###.#####.###.#####.###.###########.###############.###
+ #.#...#...#.......#...#...#.#.......#.....#.#.....#.#.......#.#...#.#.#.#.......#.......#...#...#.#...#
+ #.###.###.#####.#.###.#####.#####.#.###.#######.#.#.#######.#.#.#####.#.#.###########.#####.###.#.#.###
+ #.#.#.#...#...#.#.#...#.#.#.#.#.#.#.#...#.......#.#.#.#.....#.....#...............#...#.#...#.........#
+ #.#.#.#.#####.#.#####.#.#.#.#.#.###.#.#####.###.###.#.#####.#.#######.#.#######.#######.#.#.###.#####.#
+ #.......#.#.#...#.#...............#.#...#.#.#.......#...#...#.......#.#.#.#.#...#.#.....#.#.#...#.#...#
+ #.#######.#.###.#.#.###.#.#.#.###.#.###.#.###.#.###.#.###.#.#.#.#######.#.#.#####.#.#######.#.###.###.#
+ #.#.#.#.#.#.......#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.....#.#.#.#.#.#...#.......#.#.#.#...#.#.#...#.#.#
+ #.#.#.#.#.#####.#####.#.#####.#.#.#.#.###.#.#.###.#####.#####.#.#.#.#.#####.#.###.#.#.#.###.#.###.#.###
+ #.#.#.#.#.#.....#.#.....#.......#.#.#.#...#.#...#...#.......#.#.#.#.........#.#...#.......#.#.#.#.#.#.#
+ #.#.#.#.#.#.###.#.#.#####.###.#.#.#.#.#.###.#.###.#.###.#######.#.#.###.###.#####.#.#.#.###.#.#.#.#.#.#
+ #.......#.#.#.#.#.#.#...#.#.#.#.#...#...#...#...#.#.#.....#.#...#...#...#.......#...#.#...#.#.#.#...#.#
+ #####.###.#.#.###.#####.###.###.###.#####.#####.#.#.#.#####.#.#.#####.#######.#####.#######.#.#.#.###.#
+ #.#...#.........#...#.#.......#...#...#.....#...#.#.#.....#...#.#...........#.#.#.#...#.#.........#...#
+ #.###.#.#.#######.#.#.#.#########.#########.#.###.#.#.#.###.#.#########.###.###.#.#.###.###.#######.###
+ #.#.....#...#...#.#...#.....#.......#.......#.....#.#.#...#.#.....#.....#.....#...#.#...#.........#...#
+ #.###.#.#.#####.###.###.#######.#####.#############.#.#########.###.###########.###.#.#.#.###.#.###.#.#
+ #...#.#.#.#.#...#.#.#.....# U N Q W Z N #.......#.#...#...#...#.#.#
+ ###.###.###.###.#.#.###.### Y D P L W J #####.#########.#######.###
+ #.#.#.#.#...#...#.#...#.#.# #.....#...#...........#.#.#
+ #.#.#.#.###.###.#.#.###.#.# ###.#.###.###.###.#####.#.#
+ #...................#.#...# #.#.#.........#...#........CB
+ #.###.#######.#.###.#.#.#.# #.#.#.###.#####.###.#.#.#.#
+ #.#.........#.#...#.....#.# #...#.#.....#...#...#.#.#..AA
+ #######.#######.###.#####.# #.#######.#.###.#.#.###.###
+ #.....#.......#...#...#...# QJ..#.#...#.#.#.#...#...#.#.#
+ ###.#.#.###.###########.### ###.#.#######.###########.#
+YG....#.....#.#.......#......TY #.........#...........#...#
+ #.#.#.###########.#.#.##### #.#####.###.#########.#.#.#
+ #.#.#.#...#...#...#.#.#...# CB..#.#.......#.#.#.#.....#..DN
+ #######.#####.#.#.#####.### ###.#########.#.#.#########
+ #.....#...#...#.#.#...#.#.# #...#.........#...#.......#
+ #.###.#.#.#.#.#.#.#.#.#.#.# ###.###.#####.#.#.#.#####.#
+SP..#.....#...#...#...#......YG #.......#...#...#.#.#.....#
+ ########################### #.#.###.###.#.###.#.#.#####
+NJ....#.................#.#.# KQ..#.#.......#.#...#.#.....#
+ #.#.#.#####.#.#.#####.#.#.# ###.###.###.###.#.#.###.#.#
+ #.#.#.....#.#.#.#.....#...# #.#...#.#.#.#.#.#.....#.#..IT
+ ###.#####.###.#####.#####.# #.#.#####.###.#############
+ #.#.....#...#.....#........WE IE..#.#.#.#...............#.#
+ #.#.#.#.#.#########.#.###.# #.#.#.#.#.###.###.###.###.#
+ #...#.#...#.#.#.#...#.#...# #.#.#...#.#.#...#.#...#.#.#
+ #.#######.#.#.#.#####.##### #.#####.#.#.#.#.#####.#.#.#
+ #.#.....#.#.........#.#...# #...........#.#.#.#...#....QJ
+ #######.###.#.#.###.#####.# #######.#.#######.#.#.###.#
+ #.#.....#...#.#.#.........# #.....#.#.#...#.#...#.....#
+ #.###.#.#.#######.#.#####.# ###.#########.#.###########
+YV..#...#.#...#.#.#.#.#.....# #.......#.........#.#.....#
+ #.#.###.#.#.#.#.#.###.#.### #.#####.###.#####.#.#.#.#.#
+ #.....#...#.#...#.#.#.#....QX #.#...#.........#.#...#.#..QP
+ ###.###.#######.###.###.#.# #.###.#.###.#####.#.#####.#
+ #.#.#.....#.....#.....#.#.# #.#.#.#.#...#.....#...#...#
+ #.#####.#######.###.#.##### #.#.#.#####.#.###.###.#.#.#
+ #.#...#.#.....#.#.#.#...#..DM FE..#.#...#.#.#.#.......#.#.#
+ #.#.#####.#.###.#.#.###.#.# #.#.#.#.#.###############.#
+ #.#.......#...#.#.....#...# #.#...#.#.#.....#.......#.#
+ #.#.#.#.#.###.#.#####.###.# #######.#.#.#######.#.#####
+QX....#.#.#.#.............#.# #.......#.#.......#.#.....#
+ #####.#.#.#.#.#.########### ###.###.#.#.#.###.#.#####.#
+ #.#.#.#.#.#.#.#.#.........# GX..#.#.......#.#.#.......#..DM
+ #.#.###############.###.#.# #.#.#####.#.###.###.###.#.#
+ #.#.#.........#...#...#.#..CS #.....#.#.#.#.#...#.#.#.#.#
+ #.#.#######.#####.###.#.### #######.#.###.#.#####.#####
+WE........#.#.#.#.#.#...#...# MX........#.#.........#......CS
+ #####.###.#.#.#.#.#.#.##### #####.###.###.#####.###.###
+ #...#...............#.#.#.# #.#.....#.#.......#...#...#
+ ###.###################.#.# #.#.###########.#.###.#.#.#
+ #...............#.#........ME #.#.#.#...#...#.#.#...#.#.#
+ #.#.#####.#####.#.#.###.#.# #.#.#####.#######.#.#####.#
+GX..#...#.#.#...........#.#.# #.................#.......#
+ #.#.###.#######.###.#####.# J D Z V S I Y #.###.###.#.###.###.#.#.#.#
+ #.#.......#.......#.....#.# I N T Y P T V #...#...#.#.#.#.#.#.#.#.#.#
+ #.#.#.#########.#.#.#############.#########.###.#.#.#############.###.###########.###.#.#.#.#.#.#####.#
+ #.#.#.....#.....#.#...#.......#.....#.......#.....#.#.#.#.#...#...#.........#.....#...#.#.....#...#...#
+ #.#############.###.#######.#.#####.#.###.###.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.#.#####.###.#####
+ #...........#.....#.....#...#.......#...#.#.#.....#.#.....#.#.......#.#.#...#...#.#.#.#.#.....#.#.....#
+ ###.#######.#######.#####.###.#######.#.###.###.#.#.#.###.#.#.#######.#############.#.#######.#.#.###.#
+ #.#.....#.#.#.#.......#.#.#.#...#...#.#...#...#.#.#.....#...#.......#.....#.#...#...#...#.......#.#...#
+ #.#.#.###.#.#.#.#.###.#.###.###.#.#.###.#.###.#.#########.#####.#.###.#.###.#.#########.#####.#####.#.#
+ #...#...#.....#.#.#...#...#.#...#.#...#.#.#.....#.#.#.....#...#.#.#...#.............#.....#.....#...#.#
+ #####.###########.#####.###.#.###.#.###.#####.#.#.#.###.#.#.#.###.#.#######.###.#########.#.#.#########
+ #.........#.....#.#...........#...#.#...#.#...#.#...#...#.#.#.....#.......#...#.#.....#.#.#.#.....#.#.#
+ ###.###.#.###.#####.#.#.#.#.#.#.###.###.#.###.#####.#.#####.#.###.###.#####.#####.#####.#####.#####.#.#
+ #...#.#.#.#.........#.#.#.#.#...#...#.....#.....#.......#...#.#.#.#.......#.#.#...#.....#.#.#.........#
+ #.#.#.#.###.###.###########.###.#.###.#.#####.#.#.#.#.#.#.#.###.###.#.###.###.###.#.#.#.#.#.#.###.#.#.#
+ #.#.#...#...#.....#.........#.#.#...#.#.#.#...#.#.#.#.#.#.#.......#.#...#.#.....#...#.#.#.......#.#.#.#
+ #.#.###.#.#.#.#.#.#####.#####.#.###.#.###.###.#####.#######.###.###.#########.###.#######.#.#.#####.#.#
+ #.#.#...#.#.#.#.#.#.#.#.#.......#...#...#...#...#.....#.#.....#.#.#.......#...#.....#.#.#.#.#.#.#...#.#
+ #.#####.#.#####.###.#.#######.#.#.#.###.###.#.#.###.###.###.#####.#.#.#####.#####.#.#.#.###.#.#.#####.#
+ #...#...#.#.....#.#.....#.#...#.#.#.#...#.#...#.#.......#.#.#.#.#...#...........#.#.#...#.#.#.....#.#.#
+ ###.###.#########.#####.#.###.#####.#.###.###.#####.#####.#.#.#.#.#######.#######.###.###.#####.#.#.###
+ #.....#.#.....................#...#.#.......#.#.....#.....#.....#.#...........#.....#.#.#.#.#...#.#...#
+ #.###.#####.#.#.#.###.#.#.#.###.###.###.#.###.#####.###.#.#.#########.###########.###.#.#.#.###.###.###
+ #...#...#...#.#.#.#...#.#.#.#.......#.#.#...#.....#.#...#.#.......#.#.........#.............#.........#
+ ###.#.#####.#############.#####.#.###.#.###.#####.#.#.###.###.#.#.#.#####.#.###.###.###.###.#.#####.###
+ #...#.#.#.#...#.#...#.......#...#.....#.#...#.....#...#.#.#.#.#.#...#.....#.....#.....#...#.#...#.....#
+ #.###.#.#.###.#.###.###.#####.#####.#####.###.#########.#.#.#####.#######.#####.###.#####.#.#.###.###.#
+ #.#.........#.#.........#.....#.....#.....#.........#.....#.......#...........#...#...#...#.#...#.#...#
+ ###################################.###.#######.#.###.###.###.#######.#################################
+ N J W Z Z M M T
+ D I L W Z X E Y
diff --git a/2019/inputs/day_21.txt b/2019/inputs/day_21.txt
new file mode 100644
index 0000000..cafb613
--- /dev/null
+++ b/2019/inputs/day_21.txt
@@ -0,0 +1 @@
+109,2050,21102,1,966,1,21101,0,13,0,1106,0,1378,21101,20,0,0,1105,1,1337,21101,27,0,0,1105,1,1279,1208,1,65,748,1005,748,73,1208,1,79,748,1005,748,110,1208,1,78,748,1005,748,132,1208,1,87,748,1005,748,169,1208,1,82,748,1005,748,239,21101,0,1041,1,21102,73,1,0,1106,0,1421,21101,0,78,1,21101,0,1041,2,21101,88,0,0,1106,0,1301,21101,68,0,1,21102,1041,1,2,21102,103,1,0,1106,0,1301,1101,0,1,750,1105,1,298,21101,0,82,1,21101,0,1041,2,21102,1,125,0,1105,1,1301,1102,1,2,750,1105,1,298,21102,79,1,1,21102,1,1041,2,21101,147,0,0,1106,0,1301,21102,1,84,1,21102,1,1041,2,21101,0,162,0,1106,0,1301,1101,0,3,750,1106,0,298,21101,0,65,1,21101,1041,0,2,21101,0,184,0,1106,0,1301,21101,76,0,1,21102,1,1041,2,21101,199,0,0,1106,0,1301,21102,75,1,1,21102,1,1041,2,21101,214,0,0,1105,1,1301,21101,221,0,0,1106,0,1337,21101,10,0,1,21102,1041,1,2,21102,236,1,0,1105,1,1301,1106,0,553,21102,1,85,1,21102,1,1041,2,21101,254,0,0,1105,1,1301,21101,78,0,1,21101,0,1041,2,21102,1,269,0,1106,0,1301,21102,276,1,0,1105,1,1337,21101,10,0,1,21102,1,1041,2,21101,0,291,0,1105,1,1301,1101,1,0,755,1105,1,553,21101,32,0,1,21102,1,1041,2,21102,313,1,0,1106,0,1301,21102,1,320,0,1106,0,1337,21102,327,1,0,1105,1,1279,1202,1,1,749,21102,65,1,2,21101,0,73,3,21102,1,346,0,1106,0,1889,1206,1,367,1007,749,69,748,1005,748,360,1101,0,1,756,1001,749,-64,751,1106,0,406,1008,749,74,748,1006,748,381,1102,1,-1,751,1105,1,406,1008,749,84,748,1006,748,395,1102,1,-2,751,1105,1,406,21102,1100,1,1,21101,0,406,0,1105,1,1421,21101,32,0,1,21102,1,1100,2,21101,421,0,0,1105,1,1301,21102,1,428,0,1106,0,1337,21102,435,1,0,1105,1,1279,2102,1,1,749,1008,749,74,748,1006,748,453,1102,1,-1,752,1106,0,478,1008,749,84,748,1006,748,467,1101,0,-2,752,1105,1,478,21101,1168,0,1,21101,0,478,0,1106,0,1421,21102,485,1,0,1105,1,1337,21102,1,10,1,21101,1168,0,2,21101,0,500,0,1105,1,1301,1007,920,15,748,1005,748,518,21101,0,1209,1,21102,1,518,0,1106,0,1421,1002,920,3,529,1001,529,921,529,101,0,750,0,1001,529,1,537,101,0,751,0,1001,537,1,545,1001,752,0,0,1001,920,1,920,1105,1,13,1005,755,577,1006,756,570,21102,1100,1,1,21101,570,0,0,1105,1,1421,21102,1,987,1,1105,1,581,21101,1001,0,1,21102,1,588,0,1106,0,1378,1101,0,758,593,1001,0,0,753,1006,753,654,21001,753,0,1,21101,610,0,0,1106,0,667,21101,0,0,1,21101,621,0,0,1106,0,1463,1205,1,647,21101,1015,0,1,21101,635,0,0,1106,0,1378,21101,1,0,1,21101,646,0,0,1105,1,1463,99,1001,593,1,593,1106,0,592,1006,755,664,1101,0,0,755,1105,1,647,4,754,99,109,2,1102,1,726,757,21202,-1,1,1,21101,9,0,2,21102,1,697,3,21102,692,1,0,1105,1,1913,109,-2,2105,1,0,109,2,101,0,757,706,1201,-1,0,0,1001,757,1,757,109,-2,2106,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,255,63,95,191,159,223,127,0,155,123,163,249,179,110,200,117,68,60,61,190,197,250,196,186,111,187,99,158,244,217,222,246,94,205,35,54,115,239,218,243,62,241,229,168,79,199,215,178,182,118,43,228,125,203,214,113,231,120,77,153,141,157,253,143,87,102,86,207,213,177,57,181,156,85,78,204,247,174,109,172,248,92,98,53,93,232,69,242,212,237,152,70,216,183,47,49,124,121,116,122,230,114,100,103,201,51,55,84,171,234,254,238,233,76,185,34,50,175,219,140,42,189,136,38,226,169,39,184,198,166,137,220,251,245,202,142,56,139,167,206,126,252,106,107,71,162,235,236,101,108,119,58,173,170,46,221,227,59,154,188,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,73,110,112,117,116,32,105,110,115,116,114,117,99,116,105,111,110,115,58,10,13,10,87,97,108,107,105,110,103,46,46,46,10,10,13,10,82,117,110,110,105,110,103,46,46,46,10,10,25,10,68,105,100,110,39,116,32,109,97,107,101,32,105,116,32,97,99,114,111,115,115,58,10,10,58,73,110,118,97,108,105,100,32,111,112,101,114,97,116,105,111,110,59,32,101,120,112,101,99,116,101,100,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,65,78,68,44,32,79,82,44,32,111,114,32,78,79,84,67,73,110,118,97,108,105,100,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,59,32,101,120,112,101,99,116,101,100,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,65,44,32,66,44,32,67,44,32,68,44,32,74,44,32,111,114,32,84,40,73,110,118,97,108,105,100,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,59,32,101,120,112,101,99,116,101,100,32,74,32,111,114,32,84,52,79,117,116,32,111,102,32,109,101,109,111,114,121,59,32,97,116,32,109,111,115,116,32,49,53,32,105,110,115,116,114,117,99,116,105,111,110,115,32,99,97,110,32,98,101,32,115,116,111,114,101,100,0,109,1,1005,1262,1270,3,1262,20101,0,1262,0,109,-1,2106,0,0,109,1,21102,1,1288,0,1106,0,1263,21001,1262,0,0,1102,0,1,1262,109,-1,2106,0,0,109,5,21102,1310,1,0,1105,1,1279,22102,1,1,-2,22208,-2,-4,-1,1205,-1,1332,22101,0,-3,1,21101,1332,0,0,1106,0,1421,109,-5,2106,0,0,109,2,21101,1346,0,0,1105,1,1263,21208,1,32,-1,1205,-1,1363,21208,1,9,-1,1205,-1,1363,1105,1,1373,21102,1,1370,0,1106,0,1279,1106,0,1339,109,-2,2105,1,0,109,5,1202,-4,1,1386,20101,0,0,-2,22101,1,-4,-4,21102,0,1,-3,22208,-3,-2,-1,1205,-1,1416,2201,-4,-3,1408,4,0,21201,-3,1,-3,1106,0,1396,109,-5,2106,0,0,109,2,104,10,22102,1,-1,1,21101,0,1436,0,1106,0,1378,104,10,99,109,-2,2105,1,0,109,3,20002,593,753,-1,22202,-1,-2,-1,201,-1,754,754,109,-3,2105,1,0,109,10,21102,5,1,-5,21102,1,1,-4,21102,1,0,-3,1206,-9,1555,21101,3,0,-6,21101,5,0,-7,22208,-7,-5,-8,1206,-8,1507,22208,-6,-4,-8,1206,-8,1507,104,64,1105,1,1529,1205,-6,1527,1201,-7,716,1515,21002,0,-11,-8,21201,-8,46,-8,204,-8,1105,1,1529,104,46,21201,-7,1,-7,21207,-7,22,-8,1205,-8,1488,104,10,21201,-6,-1,-6,21207,-6,0,-8,1206,-8,1484,104,10,21207,-4,1,-8,1206,-8,1569,21102,1,0,-9,1105,1,1689,21208,-5,21,-8,1206,-8,1583,21102,1,1,-9,1106,0,1689,1201,-5,716,1588,21002,0,1,-2,21208,-4,1,-1,22202,-2,-1,-1,1205,-2,1613,21201,-5,0,1,21102,1613,1,0,1105,1,1444,1206,-1,1634,22101,0,-5,1,21101,0,1627,0,1106,0,1694,1206,1,1634,21101,2,0,-3,22107,1,-4,-8,22201,-1,-8,-8,1206,-8,1649,21201,-5,1,-5,1206,-3,1663,21201,-3,-1,-3,21201,-4,1,-4,1106,0,1667,21201,-4,-1,-4,21208,-4,0,-1,1201,-5,716,1676,22002,0,-1,-1,1206,-1,1686,21101,1,0,-4,1105,1,1477,109,-10,2106,0,0,109,11,21102,0,1,-6,21101,0,0,-8,21101,0,0,-7,20208,-6,920,-9,1205,-9,1880,21202,-6,3,-9,1201,-9,921,1724,21002,0,1,-5,1001,1724,1,1733,20101,0,0,-4,21202,-4,1,1,21101,1,0,2,21101,9,0,3,21101,1754,0,0,1105,1,1889,1206,1,1772,2201,-10,-4,1767,1001,1767,716,1767,20102,1,0,-3,1105,1,1790,21208,-4,-1,-9,1206,-9,1786,22101,0,-8,-3,1105,1,1790,22101,0,-7,-3,1001,1733,1,1795,21001,0,0,-2,21208,-2,-1,-9,1206,-9,1812,21201,-8,0,-1,1105,1,1816,22101,0,-7,-1,21208,-5,1,-9,1205,-9,1837,21208,-5,2,-9,1205,-9,1844,21208,-3,0,-1,1106,0,1855,22202,-3,-1,-1,1106,0,1855,22201,-3,-1,-1,22107,0,-1,-1,1106,0,1855,21208,-2,-1,-9,1206,-9,1869,21201,-1,0,-8,1105,1,1873,22101,0,-1,-7,21201,-6,1,-6,1105,1,1708,22102,1,-8,-10,109,-11,2106,0,0,109,7,22207,-6,-5,-3,22207,-4,-6,-2,22201,-3,-2,-1,21208,-1,0,-6,109,-7,2105,1,0,0,109,5,2102,1,-2,1912,21207,-4,0,-1,1206,-1,1930,21102,1,0,-4,22101,0,-4,1,21202,-3,1,2,21102,1,1,3,21102,1949,1,0,1105,1,1954,109,-5,2105,1,0,109,6,21207,-4,1,-1,1206,-1,1977,22207,-5,-3,-1,1206,-1,1977,21202,-5,1,-5,1105,1,2045,22102,1,-5,1,21201,-4,-1,2,21202,-3,2,3,21102,1,1996,0,1105,1,1954,22102,1,1,-5,21102,1,1,-2,22207,-5,-3,-1,1206,-1,2015,21101,0,0,-2,22202,-3,-2,-3,22107,0,-4,-1,1206,-1,2037,21202,-2,1,1,21101,2037,0,0,106,0,1912,21202,-3,-1,-3,22201,-5,-3,-5,109,-6,2106,0,0
diff --git a/2019/inputs/day_22.txt b/2019/inputs/day_22.txt
new file mode 100644
index 0000000..b61e760
--- /dev/null
+++ b/2019/inputs/day_22.txt
@@ -0,0 +1,100 @@
+deal with increment 34
+deal into new stack
+cut 1712
+deal into new stack
+cut 1984
+deal with increment 62
+deal into new stack
+deal with increment 13
+deal into new stack
+deal with increment 67
+cut -5590
+deal with increment 63
+cut -1086
+deal with increment 52
+cut 7894
+deal with increment 71
+cut -864
+deal into new stack
+cut 239
+deal with increment 17
+cut -7187
+deal with increment 62
+deal into new stack
+cut -7380
+deal with increment 14
+cut 3842
+deal into new stack
+cut -5258
+deal with increment 40
+deal into new stack
+deal with increment 45
+cut -6026
+deal with increment 21
+cut 3600
+deal with increment 56
+cut 2329
+deal into new stack
+deal with increment 13
+cut -2409
+deal with increment 49
+cut 294
+deal into new stack
+cut 4776
+deal with increment 17
+cut 5801
+deal with increment 43
+cut 8999
+deal with increment 46
+cut -8527
+deal with increment 4
+deal into new stack
+cut -6767
+deal into new stack
+deal with increment 33
+cut -532
+deal with increment 29
+deal into new stack
+deal with increment 56
+cut 6867
+deal with increment 70
+cut 4276
+deal into new stack
+cut -5621
+deal with increment 56
+cut -2966
+deal with increment 70
+deal into new stack
+deal with increment 51
+cut -4097
+deal with increment 42
+deal into new stack
+cut -5180
+deal with increment 61
+deal into new stack
+cut 5367
+deal with increment 50
+cut 3191
+deal with increment 75
+cut 915
+deal with increment 72
+cut -3893
+deal with increment 22
+cut -3405
+deal with increment 30
+cut -6509
+deal with increment 31
+cut -7220
+deal with increment 45
+cut 6489
+deal with increment 70
+cut -4047
+deal into new stack
+deal with increment 75
+cut 3980
+deal with increment 10
+cut 9677
+deal into new stack
+deal with increment 45
+cut -6969
+deal into new stack
diff --git a/2019/inputs/day_23.txt b/2019/inputs/day_23.txt
new file mode 100644
index 0000000..e4f8887
--- /dev/null
+++ b/2019/inputs/day_23.txt
@@ -0,0 +1 @@
+3,62,1001,62,11,10,109,2215,105,1,0,1846,1780,1120,1959,571,2182,1083,631,1485,1306,1157,2153,1654,1592,1454,664,1815,951,2124,794,695,2023,1378,1248,1518,984,1887,2058,823,1019,891,1277,1685,2089,1341,1922,1186,765,1751,1413,602,922,858,1623,1217,1559,1050,1990,734,1720,0,0,0,0,0,0,0,0,0,0,0,0,3,64,1008,64,-1,62,1006,62,88,1006,61,170,1106,0,73,3,65,20101,0,64,1,21001,66,0,2,21101,105,0,0,1105,1,436,1201,1,-1,64,1007,64,0,62,1005,62,73,7,64,67,62,1006,62,73,1002,64,2,133,1,133,68,133,101,0,0,62,1001,133,1,140,8,0,65,63,2,63,62,62,1005,62,73,1002,64,2,161,1,161,68,161,1101,1,0,0,1001,161,1,169,101,0,65,0,1101,0,1,61,1101,0,0,63,7,63,67,62,1006,62,203,1002,63,2,194,1,68,194,194,1006,0,73,1001,63,1,63,1105,1,178,21102,1,210,0,105,1,69,2101,0,1,70,1102,0,1,63,7,63,71,62,1006,62,250,1002,63,2,234,1,72,234,234,4,0,101,1,234,240,4,0,4,70,1001,63,1,63,1105,1,218,1105,1,73,109,4,21101,0,0,-3,21102,0,1,-2,20207,-2,67,-1,1206,-1,293,1202,-2,2,283,101,1,283,283,1,68,283,283,22001,0,-3,-3,21201,-2,1,-2,1106,0,263,22102,1,-3,-3,109,-4,2106,0,0,109,4,21101,0,1,-3,21101,0,0,-2,20207,-2,67,-1,1206,-1,342,1202,-2,2,332,101,1,332,332,1,68,332,332,22002,0,-3,-3,21201,-2,1,-2,1106,0,312,21202,-3,1,-3,109,-4,2106,0,0,109,1,101,1,68,358,21001,0,0,1,101,3,68,366,21001,0,0,2,21102,1,376,0,1106,0,436,22101,0,1,0,109,-1,2106,0,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,109,8,21202,-6,10,-5,22207,-7,-5,-5,1205,-5,521,21102,1,0,-4,21102,1,0,-3,21101,0,51,-2,21201,-2,-1,-2,1201,-2,385,471,20102,1,0,-1,21202,-3,2,-3,22207,-7,-1,-5,1205,-5,496,21201,-3,1,-3,22102,-1,-1,-5,22201,-7,-5,-7,22207,-3,-6,-5,1205,-5,515,22102,-1,-6,-5,22201,-3,-5,-3,22201,-1,-4,-4,1205,-2,461,1106,0,547,21102,-1,1,-4,21202,-6,-1,-6,21207,-7,0,-5,1205,-5,547,22201,-7,-6,-7,21201,-4,1,-4,1106,0,529,21201,-4,0,-7,109,-8,2106,0,0,109,1,101,1,68,564,20102,1,0,0,109,-1,2106,0,0,1102,97571,1,66,1101,1,0,67,1101,598,0,68,1101,556,0,69,1101,0,1,71,1101,0,600,72,1105,1,73,1,-1605712,28,112719,1102,1,48679,66,1102,1,1,67,1102,1,629,68,1102,556,1,69,1101,0,0,71,1102,631,1,72,1106,0,73,1,1782,1102,1,7877,66,1102,1,2,67,1101,658,0,68,1101,302,0,69,1102,1,1,71,1102,1,662,72,1105,1,73,0,0,0,0,26,81559,1101,0,22453,66,1101,1,0,67,1102,1,691,68,1101,0,556,69,1102,1,1,71,1102,1,693,72,1105,1,73,1,125,35,19959,1101,0,21493,66,1101,0,5,67,1102,1,722,68,1101,0,302,69,1102,1,1,71,1101,0,732,72,1106,0,73,0,0,0,0,0,0,0,0,0,0,2,56893,1102,77191,1,66,1101,1,0,67,1102,1,761,68,1101,556,0,69,1101,1,0,71,1101,763,0,72,1105,1,73,1,1037327,8,179734,1101,57977,0,66,1101,0,1,67,1101,792,0,68,1102,556,1,69,1101,0,0,71,1101,0,794,72,1105,1,73,1,1430,1102,57173,1,66,1101,0,1,67,1101,0,821,68,1102,1,556,69,1101,0,0,71,1101,0,823,72,1106,0,73,1,1128,1101,0,37573,66,1102,1,3,67,1102,1,850,68,1102,253,1,69,1102,1,1,71,1101,856,0,72,1105,1,73,0,0,0,0,0,0,17,209158,1101,0,17569,66,1102,1,1,67,1101,0,885,68,1102,556,1,69,1101,2,0,71,1101,887,0,72,1106,0,73,1,8329,20,85972,34,54146,1101,84653,0,66,1101,1,0,67,1101,0,918,68,1102,1,556,69,1102,1,1,71,1101,0,920,72,1105,1,73,1,3167,20,64479,1101,0,88657,66,1102,1,1,67,1101,0,949,68,1101,556,0,69,1102,0,1,71,1102,1,951,72,1105,1,73,1,1419,1101,0,104579,66,1101,2,0,67,1101,0,978,68,1101,0,302,69,1101,0,1,71,1102,982,1,72,1105,1,73,0,0,0,0,6,76316,1102,33797,1,66,1101,0,1,67,1102,1011,1,68,1101,556,0,69,1102,1,3,71,1101,0,1013,72,1105,1,73,1,5,35,13306,35,26612,39,113194,1102,75781,1,66,1101,0,1,67,1102,1,1046,68,1102,1,556,69,1101,0,1,71,1101,1048,0,72,1106,0,73,1,1777,20,42986,1101,32183,0,66,1102,1,1,67,1102,1,1077,68,1102,556,1,69,1102,1,2,71,1102,1,1079,72,1105,1,73,1,10,35,6653,39,169791,1101,19079,0,66,1101,0,4,67,1102,1,1110,68,1102,253,1,69,1101,0,1,71,1102,1118,1,72,1105,1,73,0,0,0,0,0,0,0,0,7,7877,1102,1,56893,66,1101,0,4,67,1102,1147,1,68,1101,253,0,69,1102,1,1,71,1101,0,1155,72,1105,1,73,0,0,0,0,0,0,0,0,45,73189,1102,104651,1,66,1101,1,0,67,1102,1,1184,68,1101,556,0,69,1101,0,0,71,1101,0,1186,72,1105,1,73,1,1351,1101,0,43661,66,1101,1,0,67,1102,1213,1,68,1101,0,556,69,1102,1,1,71,1101,1215,0,72,1105,1,73,1,763676,28,75146,1101,16963,0,66,1102,1,1,67,1102,1,1244,68,1102,1,556,69,1102,1,1,71,1102,1246,1,72,1106,0,73,1,11,26,163118,1101,461,0,66,1101,1,0,67,1102,1275,1,68,1101,556,0,69,1101,0,0,71,1102,1,1277,72,1106,0,73,1,1263,1102,101483,1,66,1101,1,0,67,1102,1304,1,68,1102,556,1,69,1102,0,1,71,1102,1306,1,72,1106,0,73,1,1607,1101,0,14251,66,1101,0,3,67,1102,1333,1,68,1101,302,0,69,1102,1,1,71,1102,1,1339,72,1105,1,73,0,0,0,0,0,0,2,170679,1101,0,27073,66,1101,0,4,67,1102,1,1368,68,1102,1,302,69,1101,1,0,71,1101,0,1376,72,1106,0,73,0,0,0,0,0,0,0,0,1,154743,1101,0,15583,66,1101,0,1,67,1102,1,1405,68,1102,556,1,69,1101,0,3,71,1101,0,1407,72,1106,0,73,1,1,33,14998,21,302361,34,81219,1101,0,56597,66,1101,0,6,67,1102,1440,1,68,1102,1,302,69,1102,1,1,71,1101,1452,0,72,1106,0,73,0,0,0,0,0,0,0,0,0,0,0,0,45,146378,1102,6991,1,66,1101,0,1,67,1102,1,1481,68,1102,1,556,69,1101,0,1,71,1102,1,1483,72,1106,0,73,1,902,21,201574,1102,1,89867,66,1101,2,0,67,1101,1512,0,68,1101,0,302,69,1101,1,0,71,1102,1516,1,72,1106,0,73,0,0,0,0,5,10798,1102,1,61553,66,1102,1,1,67,1102,1,1545,68,1102,556,1,69,1101,0,6,71,1101,0,1547,72,1106,0,73,1,2,20,21493,17,104579,7,15754,26,244677,39,282985,39,339582,1101,73189,0,66,1102,2,1,67,1101,0,1586,68,1101,0,351,69,1102,1,1,71,1101,0,1590,72,1105,1,73,0,0,0,0,255,60251,1101,0,91463,66,1102,1,1,67,1101,1619,0,68,1101,556,0,69,1102,1,1,71,1101,0,1621,72,1105,1,73,1,6467743,28,37573,1102,1,34369,66,1101,0,1,67,1101,1650,0,68,1102,556,1,69,1102,1,1,71,1101,1652,0,72,1105,1,73,1,8933,21,100787,1102,1,77081,66,1101,0,1,67,1101,1681,0,68,1102,1,556,69,1102,1,1,71,1101,1683,0,72,1105,1,73,1,2310,33,7499,1101,0,44699,66,1101,0,1,67,1102,1712,1,68,1101,556,0,69,1101,3,0,71,1101,1714,0,72,1105,1,73,1,3,8,89867,5,5399,34,108292,1101,97387,0,66,1102,1,1,67,1102,1747,1,68,1102,556,1,69,1102,1,1,71,1102,1749,1,72,1105,1,73,1,4,20,107465,1101,0,13463,66,1101,1,0,67,1101,1778,0,68,1101,0,556,69,1102,0,1,71,1102,1,1780,72,1106,0,73,1,1250,1102,51581,1,66,1102,1,3,67,1102,1807,1,68,1101,302,0,69,1101,0,1,71,1102,1,1813,72,1105,1,73,0,0,0,0,0,0,2,113786,1102,1,73679,66,1102,1,1,67,1102,1842,1,68,1102,556,1,69,1101,1,0,71,1102,1,1844,72,1105,1,73,1,160,39,56597,1101,0,60251,66,1101,0,1,67,1101,1873,0,68,1102,556,1,69,1102,6,1,71,1101,1875,0,72,1106,0,73,1,22677,47,94099,1,51581,1,103162,9,14251,9,28502,9,42753,1101,0,81559,66,1101,0,3,67,1102,1914,1,68,1101,0,302,69,1101,1,0,71,1102,1920,1,72,1105,1,73,0,0,0,0,0,0,47,188198,1101,0,6653,66,1101,4,0,67,1102,1949,1,68,1101,302,0,69,1101,0,1,71,1101,0,1957,72,1106,0,73,0,0,0,0,0,0,0,0,39,226388,1101,63659,0,66,1101,0,1,67,1101,0,1986,68,1102,556,1,69,1102,1,1,71,1102,1,1988,72,1105,1,73,1,-2,34,27073,1101,94099,0,66,1101,2,0,67,1101,0,2017,68,1101,0,302,69,1102,1,1,71,1102,2021,1,72,1106,0,73,0,0,0,0,2,227572,1101,100787,0,66,1101,0,3,67,1101,2050,0,68,1102,1,302,69,1101,1,0,71,1101,0,2056,72,1105,1,73,0,0,0,0,0,0,6,19079,1101,0,47599,66,1102,1,1,67,1101,0,2085,68,1102,556,1,69,1102,1,1,71,1101,2087,0,72,1105,1,73,1,2677,33,22497,1102,1,7499,66,1101,0,3,67,1101,2116,0,68,1102,1,302,69,1101,0,1,71,1101,0,2122,72,1105,1,73,0,0,0,0,0,0,6,38158,1101,0,101359,66,1102,1,1,67,1101,2151,0,68,1102,1,556,69,1102,1,0,71,1102,1,2153,72,1105,1,73,1,1752,1101,48091,0,66,1101,1,0,67,1102,1,2180,68,1101,0,556,69,1101,0,0,71,1101,0,2182,72,1106,0,73,1,1463,1102,5399,1,66,1101,0,2,67,1102,1,2209,68,1101,0,302,69,1102,1,1,71,1101,0,2213,72,1106,0,73,0,0,0,0,6,57237
diff --git a/2019/inputs/day_24.txt b/2019/inputs/day_24.txt
new file mode 100644
index 0000000..ba900ad
--- /dev/null
+++ b/2019/inputs/day_24.txt
@@ -0,0 +1,5 @@
+##.#.
+.##..
+##.#.
+.####
+###..
diff --git a/2019/inputs/day_25.txt b/2019/inputs/day_25.txt
new file mode 100644
index 0000000..5351575
--- /dev/null
+++ b/2019/inputs/day_25.txt
@@ -0,0 +1 @@
+109,4795,21102,1,3124,1,21102,1,13,0,1106,0,1424,21102,1,166,1,21101,24,0,0,1105,1,1234,21102,31,1,0,1106,0,1984,1106,0,13,6,4,3,2,52,51,21,4,28,56,55,3,19,-9,-10,47,89,88,90,90,6,77,73,85,71,1,76,68,63,65,22,-27,70,76,81,87,5,105,105,107,108,95,4,97,92,109,109,5,110,105,110,108,95,4,115,96,109,109,13,-3,59,101,85,92,97,13,84,80,92,78,34,-15,26,-16,46,88,72,79,84,0,72,76,-3,85,74,79,75,-8,64,68,75,57,65,70,64,66,72,8,-41,32,-22,56,77,82,-4,60,76,62,70,-2,74,-11,55,52,68,67,73,56,60,52,-20,44,56,66,-24,48,58,42,49,54,-16,-53,10,0,56,99,96,95,82,94,83,45,-9,23,-13,61,85,88,74,71,82,73,79,73,89,67,65,-4,62,73,70,69,56,68,57,2,-35,24,-14,64,85,90,4,70,67,79,7,83,-2,68,75,-5,78,65,57,75,-10,76,53,76,0,-37,31,-21,57,78,83,-3,64,74,72,0,76,-9,73,58,57,-13,70,57,49,67,-18,54,64,48,55,-23,48,44,56,42,-14,-51,14,-4,74,95,100,14,97,77,86,79,9,92,79,75,5,27,-17,61,82,87,1,68,78,76,4,80,-5,66,58,78,60,-10,73,60,52,70,-15,57,67,51,58,-6,-43,14,-4,74,95,100,14,81,94,90,90,9,92,79,75,5,60,-50,23,42,38,-32,38,39,30,42,47,-38,30,36,28,25,41,38,34,31,18,23,29,19,33,-52,20,29,-55,27,27,27,8,15,-61,22,16,-64,24,13,18,-54,-69,-70,-14,7,12,-74,-8,-11,1,-71,5,-80,-4,-3,3,-15,-84,-85,-109,29,-19,59,80,85,-1,82,62,71,64,-6,77,64,60,-10,62,66,57,59,63,57,67,51,-19,56,58,57,57,-10,-47,44,-34,39,58,54,-16,60,61,57,64,48,56,-23,52,40,60,38,-28,44,53,-31,55,32,55,-35,48,42,41,-39,32,38,42,-42,-44,12,33,38,-48,28,19,25,32,-52,-76,-77,59,-49,13,55,-30,42,51,-33,49,50,32,31,31,39,36,48,-42,24,35,32,34,29,21,35,19,25,37,-53,14,10,26,18,-57,-59,-3,18,23,-63,1,17,3,-67,1,-4,14,-2,6,-73,-8,14,-76,-12,-78,-40,2,4,-13,-82,-106,-107,35,-25,53,74,79,0,74,60,-10,65,53,72,64,52,56,52,50,-19,53,57,62,56,-24,58,54,38,39,40,-29,-31,2,56,35,-34,-58,-59,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-94,-98,-103,-83,-97,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-90,-94,-97,-97,-86,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,263,-253,-199,-233,-158,-156,-151,-169,-226,-239,-158,-162,-176,-164,-160,-172,-179,-247,-162,-170,-177,-184,-183,-253,-171,-190,-167,-174,-258,-257,-227,-183,-197,-187,-175,-182,-193,-184,-268,-202,-191,-194,-192,-197,-205,-191,-207,-276,-278,-222,-201,-196,-282,-206,-219,-196,-286,-207,-206,-210,-223,-222,-223,-225,-280,-293,-296,-232,-220,-231,-300,-212,-223,-218,-304,-236,-228,-223,-239,-227,-310,-227,-240,-244,-314,-248,-237,-250,-243,-239,-247,-237,-308,-345,-273,-260,-248,-243,-263,-329,-252,-252,-248,-260,-267,-266,-253,-337,-249,-260,-255,-259,-342,-260,-267,-280,-270,-271,-348,-281,-268,-272,-279,-285,-342,-355,-280,-278,-279,-284,-277,-361,-282,-278,-274,-275,-290,-298,-300,-369,-300,-292,-290,-373,-309,-375,-299,-298,-301,-310,-302,-297,-370,-383,-302,-316,-321,-311,-315,-299,-321,-308,-392,-306,-322,-330,-312,-397,-326,-334,-317,-401,-330,-338,-324,-325,-337,-329,-339,-341,-398,-411,-347,-335,-346,-415,-334,-352,-350,-346,-341,-338,-422,-334,-345,-340,-344,-427,-345,-357,-357,-351,-432,-365,-361,-353,-367,-370,-354,-363,-351,-427,-464,-441,-397,-373,-434,-447,-376,-380,-374,-375,-373,-452,-454,-398,-377,-372,-458,-376,-388,-382,-377,-387,-396,-465,-400,-398,-468,-404,-404,-395,-403,-473,-390,-396,-476,-406,-409,-395,-480,-408,-404,-483,-418,-396,-486,-403,-399,-409,-417,-413,-421,-493,37,-5,73,71,-8,75,62,58,-12,62,55,74,64,48,50,-19,45,63,-22,61,48,44,-26,50,37,44,48,-31,33,40,48,41,43,30,37,-25,-38,-63,0,0,109,7,21101,0,0,-2,22208,-2,-5,-1,1205,-1,1169,22202,-2,-4,1,22201,1,-6,1,21202,-2,1,2,21102,1162,1,0,2105,1,-3,21201,-2,1,-2,1106,0,1136,109,-7,2106,0,0,109,6,2101,0,-5,1182,20101,0,0,-2,21102,0,1,-3,21201,-5,1,-5,22208,-3,-2,-1,1205,-1,1229,2201,-5,-3,1205,20101,0,0,1,22102,1,-3,2,21202,-2,1,3,21102,1,1222,0,2105,1,-4,21201,-3,1,-3,1105,1,1192,109,-6,2106,0,0,109,2,21202,-1,1,1,21101,1256,0,2,21102,1251,1,0,1106,0,1174,109,-2,2105,1,0,109,5,22201,-4,-3,-1,22201,-2,-1,-1,204,-1,109,-5,2106,0,0,109,3,1202,-2,1,1280,1006,0,1303,104,45,104,32,1201,-1,66,1291,21002,0,1,1,21101,1301,0,0,1105,1,1234,104,10,109,-3,2105,1,0,0,0,109,2,2101,0,-1,1309,1102,1,0,1308,21102,1,4601,1,21102,13,1,2,21101,4,0,3,21102,1,1353,4,21101,1343,0,0,1105,1,1130,20102,1,1308,-1,109,-2,2106,0,0,63,109,3,1201,-2,0,1360,20008,0,1309,-1,1206,-1,1419,1005,1308,1398,1102,1,1,1308,21008,1309,-1,-1,1206,-1,1387,21102,106,1,1,1106,0,1391,21101,0,92,1,21102,1,1398,0,1106,0,1234,104,45,104,32,1201,-2,1,1407,21002,0,1,1,21102,1417,1,0,1105,1,1234,104,10,109,-3,2105,1,0,109,3,1202,-2,1,1128,21102,1,34,1,21101,0,1441,0,1106,0,1234,1001,1128,0,1447,20101,0,0,1,21102,1,1456,0,1105,1,1234,21102,1,41,1,21101,1467,0,0,1105,1,1234,1001,1128,1,1472,21002,0,1,1,21101,1482,0,0,1105,1,1234,21102,46,1,1,21102,1493,1,0,1105,1,1234,21001,1128,3,1,21102,4,1,2,21102,1,1,3,21102,1,1273,4,21101,1516,0,0,1106,0,1130,21001,1128,0,1,21102,1,1527,0,1105,1,1310,1001,1128,2,1532,21002,0,1,-1,1206,-1,1545,21101,0,1545,0,2105,1,-1,109,-3,2106,0,0,109,0,99,109,2,1102,1,0,1550,21101,0,4601,1,21102,13,1,2,21101,4,0,3,21101,1664,0,4,21102,1,1582,0,1105,1,1130,2,2486,1352,1551,1102,0,1,1552,21001,1550,0,1,21102,1,33,2,21101,0,1702,3,21102,1,1609,0,1106,0,2722,21007,1552,0,-1,1205,-1,1630,20107,0,1552,-1,1205,-1,1637,21102,1,1630,0,1106,0,1752,21101,0,548,1,1106,0,1641,21101,687,0,1,21101,0,1648,0,1105,1,1234,21101,0,4457,1,21101,1659,0,0,1106,0,1424,109,-2,2105,1,0,109,4,21202,-2,-1,-2,2102,1,-3,1675,21008,0,-1,-1,1206,-1,1697,1201,-3,2,1687,20101,-27,0,-3,22201,-3,-2,-3,2001,1550,-3,1550,109,-4,2105,1,0,109,5,21008,1552,0,-1,1206,-1,1747,1201,-3,1901,1717,20101,0,0,-2,1205,-4,1736,20207,-2,1551,-1,1205,-1,1747,1102,-1,1,1552,1105,1,1747,22007,1551,-2,-1,1205,-1,1747,1102,1,1,1552,109,-5,2105,1,0,109,1,21101,826,0,1,21102,1765,1,0,1105,1,1234,21002,1550,1,1,21102,1776,1,0,1105,1,2863,21102,1090,1,1,21102,1787,1,0,1106,0,1234,99,1106,0,1787,109,-1,2106,0,0,109,1,21101,512,0,1,21101,0,1809,0,1106,0,1234,99,1105,1,1809,109,-1,2105,1,0,109,1,1102,1,1,1129,109,-1,2106,0,0,109,1,21102,1,377,1,21101,0,1842,0,1105,1,1234,1106,0,1831,109,-1,2106,0,0,109,1,21101,407,0,1,21101,1863,0,0,1105,1,1234,99,1106,0,1863,109,-1,2106,0,0,109,1,21102,1,452,1,21101,1885,0,0,1106,0,1234,99,1106,0,1885,109,-1,2105,1,0,1941,1947,1953,1958,1965,1972,1978,4083,3936,4362,4458,4463,4254,3769,4145,4116,3848,4384,3957,4371,4258,3951,4063,3935,4053,4163,4259,3817,4062,4500,3970,4331,4022,3969,4163,4483,4089,3810,4092,4196,2281,2468,2418,2450,2487,2125,2505,5,95,108,104,104,23,5,96,91,108,108,1,4,101,105,112,3,6,104,104,106,107,94,-1,6,109,104,109,107,94,-1,5,111,91,100,93,23,5,114,95,108,108,1,109,3,21102,1993,1,0,1106,0,2634,1006,1129,2010,21101,0,316,1,21101,0,2007,0,1106,0,1234,1106,0,2076,21101,0,0,-1,1201,-1,1894,2019,21001,0,0,1,21102,0,1,2,21102,1,0,3,21101,0,2037,0,1106,0,2525,1206,1,2054,1201,-1,1934,2050,21102,2051,1,0,106,0,0,1105,1,2076,21201,-1,1,-1,21207,-1,7,-2,1205,-2,2014,21101,0,177,1,21102,1,2076,0,1105,1,1234,109,-3,2105,1,0,109,3,2001,1128,-2,2088,21002,0,1,-1,1205,-1,2108,21101,201,0,1,21101,2105,0,0,1105,1,1234,1106,0,2119,22101,0,-1,1,21101,2119,0,0,1106,0,1424,109,-3,2105,1,0,0,109,1,1101,0,0,2124,21101,0,4601,1,21101,0,13,2,21101,0,4,3,21102,2173,1,4,21102,2154,1,0,1106,0,1130,1005,2124,2168,21102,226,1,1,21102,2168,1,0,1106,0,1234,109,-1,2106,0,0,109,3,1005,2124,2275,1201,-2,0,2183,20008,0,1128,-1,1206,-1,2275,1201,-2,1,2195,20102,1,0,-1,21202,-1,1,1,21102,5,1,2,21102,1,1,3,21102,2216,1,0,1106,0,2525,1206,1,2275,21102,1,258,1,21101,2230,0,0,1105,1,1234,21202,-1,1,1,21101,0,2241,0,1106,0,1234,104,46,104,10,1101,1,0,2124,1201,-2,0,2256,1101,0,-1,0,1201,-2,3,2262,21002,0,1,-1,1206,-1,2275,21101,2275,0,0,2105,1,-1,109,-3,2106,0,0,0,109,1,1101,0,0,2280,21101,4601,0,1,21101,0,13,2,21102,1,4,3,21102,1,2329,4,21102,1,2310,0,1106,0,1130,1005,2280,2324,21102,1,273,1,21102,1,2324,0,1105,1,1234,109,-1,2105,1,0,109,3,1005,2280,2413,1201,-2,0,2339,21008,0,-1,-1,1206,-1,2413,1201,-2,1,2351,20102,1,0,-1,22101,0,-1,1,21102,5,1,2,21101,1,0,3,21102,2372,1,0,1105,1,2525,1206,1,2413,21102,301,1,1,21102,2386,1,0,1106,0,1234,22102,1,-1,1,21102,2397,1,0,1106,0,1234,104,46,104,10,1102,1,1,2280,1201,-2,0,2412,101,0,1128,0,109,-3,2106,0,0,109,1,21101,0,-1,1,21102,1,2431,0,1105,1,1310,1205,1,2445,21102,1,133,1,21101,0,2445,0,1106,0,1234,109,-1,2106,0,0,109,1,21102,3,1,1,21101,2463,0,0,1106,0,2081,109,-1,2106,0,0,109,1,21101,4,0,1,21102,1,2481,0,1105,1,2081,109,-1,2106,0,0,70,109,1,21102,5,1,1,21102,2500,1,0,1105,1,2081,109,-1,2105,1,0,109,1,21102,6,1,1,21102,2518,1,0,1105,1,2081,109,-1,2106,0,0,0,0,109,5,2102,1,-3,2523,1101,0,1,2524,21202,-4,1,1,21101,0,2585,2,21101,2550,0,0,1105,1,1174,1206,-2,2576,2101,0,-4,2558,2001,0,-3,2566,101,3094,2566,2566,21008,0,-1,-1,1205,-1,2576,1102,0,1,2524,21001,2524,0,-4,109,-5,2105,1,0,109,5,22201,-4,-3,-4,22201,-4,-2,-4,21208,-4,10,-1,1206,-1,2606,21102,-1,1,-4,201,-3,2523,2615,1001,2615,3094,2615,21002,0,1,-1,22208,-4,-1,-1,1205,-1,2629,1101,0,0,2524,109,-5,2106,0,0,109,4,21101,0,3094,1,21102,30,1,2,21101,1,0,3,21102,1,2706,4,21102,1,2659,0,1105,1,1130,21101,0,0,-3,203,-2,21208,-2,10,-1,1205,-1,2701,21207,-2,0,-1,1205,-1,2663,21207,-3,29,-1,1206,-1,2663,2101,3094,-3,2693,2102,1,-2,0,21201,-3,1,-3,1106,0,2663,109,-4,2105,1,0,109,2,1201,-1,0,2715,1102,-1,1,0,109,-2,2105,1,0,0,109,5,2102,1,-2,2721,21207,-4,0,-1,1206,-1,2739,21102,1,0,-4,21202,-4,1,1,21202,-3,1,2,21102,1,1,3,21101,0,2758,0,1105,1,2763,109,-5,2106,0,0,109,6,21207,-4,1,-1,1206,-1,2786,22207,-5,-3,-1,1206,-1,2786,21201,-5,0,-5,1105,1,2858,22101,0,-5,1,21201,-4,-1,2,21202,-3,2,3,21101,0,2805,0,1105,1,2763,21202,1,1,-5,21101,0,1,-2,22207,-5,-3,-1,1206,-1,2824,21102,0,1,-2,22202,-3,-2,-3,22107,0,-4,-1,1206,-1,2850,22102,1,-2,1,21201,-4,-1,2,21101,0,2850,0,105,1,2721,21202,-3,-1,-3,22201,-5,-3,-5,109,-6,2105,1,0,109,3,21208,-2,0,-1,1205,-1,2902,21207,-2,0,-1,1205,-1,2882,1105,1,2888,104,45,21202,-2,-1,-2,21201,-2,0,1,21102,2899,1,0,1106,0,2909,1106,0,2904,104,48,109,-3,2106,0,0,109,4,22102,1,-3,1,21101,10,0,2,21101,0,2926,0,1105,1,3010,21201,1,0,-2,21201,2,0,-1,1206,-2,2948,22101,0,-2,1,21101,0,2948,0,1106,0,2909,22101,48,-1,-1,204,-1,109,-4,2105,1,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,109,8,21101,0,0,-4,21101,0,0,-3,21102,1,51,-2,21201,-2,-1,-2,1201,-2,2959,3034,20101,0,0,-1,21202,-3,2,-3,22207,-7,-1,-5,1205,-5,3059,21201,-3,1,-3,22102,-1,-1,-5,22201,-7,-5,-7,22207,-3,-6,-5,1205,-5,3078,22102,-1,-6,-5,22201,-3,-5,-3,22201,-1,-4,-4,1205,-2,3024,21202,-4,1,-7,21202,-3,1,-6,109,-8,2106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3131,3143,0,3252,3527,0,0,11,61,105,95,94,17,50,97,83,78,79,83,108,-19,2,7,-79,-9,-2,2,-83,-11,-7,-86,-3,-16,-7,-11,-6,-21,-21,-94,-30,-96,-25,-19,-23,-31,-101,-29,-25,-104,-21,-34,-38,-108,-39,-34,-32,-33,-31,-114,-43,-47,-35,-49,-105,-120,-69,-43,-123,-49,-56,-57,-47,-128,-40,-51,-46,-50,-133,-51,-63,-63,-57,-138,-69,-58,-62,-65,-143,-79,-69,-63,-68,-148,-79,-68,-82,-83,-63,-81,-77,-85,-145,-158,-75,-88,-92,-162,-91,-85,-89,-97,-167,-96,-104,-87,-171,-106,-104,-105,-97,-176,-94,-109,-114,-104,-112,-114,-169,3259,3267,0,3344,0,3124,0,7,65,89,99,98,108,85,108,76,8,27,27,36,-48,16,32,18,13,-53,18,10,27,-57,8,10,9,17,-62,16,16,19,7,10,5,21,-1,-3,-72,-3,5,7,-76,6,1,-2,-11,3,-10,-10,-6,-14,-59,-87,1,-10,-5,-84,-10,-24,-94,-21,-11,-14,-14,-99,-22,-22,-18,-103,-23,-20,-33,-23,-39,-109,-27,-26,-30,-44,-114,-28,-44,-52,-34,-105,3351,3359,0,0,3408,3252,0,7,76,108,102,104,86,91,88,48,36,55,51,-19,46,58,66,46,59,-25,48,58,55,55,-30,36,47,45,50,30,37,41,-38,38,39,41,27,-43,22,34,42,22,35,-35,-50,-51,-2,16,13,30,26,26,15,27,9,15,27,-49,3415,3423,0,0,3458,4392,3344,7,76,108,88,88,97,89,102,34,48,66,69,73,62,62,61,73,3,72,61,77,55,53,-2,-17,34,53,49,68,-15,59,45,-25,39,49,48,-29,39,46,48,51,55,-21,3465,3486,0,3584,0,4053,3408,20,51,84,80,93,8,62,88,70,84,83,75,79,71,-1,33,66,74,79,63,75,40,32,70,77,-11,57,63,69,54,-16,51,61,-19,69,58,63,-23,63,57,39,53,-28,51,52,38,51,36,44,49,47,-37,41,39,-40,43,30,26,-44,26,33,-16,3534,3548,0,0,0,0,3124,13,54,100,86,103,15,63,98,77,93,94,78,90,90,35,49,68,64,-6,59,61,59,73,-11,53,69,55,-15,49,59,58,-19,64,58,57,-23,59,52,39,49,48,-29,40,48,50,-33,55,44,49,-23,3591,3600,0,0,3732,3458,3673,8,75,96,89,96,20,53,83,106,72,11,44,38,37,35,37,38,36,-48,17,29,33,20,-53,-4,14,12,-44,-12,20,23,8,6,-63,-14,4,7,11,0,0,-1,11,-72,4,-5,-7,-3,-10,-5,-1,-11,-81,-17,-5,-16,-85,-4,-18,-17,-4,-14,-26,-10,-93,-12,-26,-23,-19,-30,-30,-31,-19,-102,-26,-35,-37,-33,-40,-35,-31,-41,-97,3680,3703,0,3901,3584,0,4241,22,50,88,92,7,41,77,83,70,81,77,65,83,67,-3,34,74,79,71,76,56,63,67,28,55,82,79,70,72,78,85,9,-4,68,78,0,75,-9,73,73,61,63,62,-15,71,62,64,56,53,57,49,-9,3739,3748,0,3828,0,3981,3584,8,59,102,104,103,93,87,97,99,79,5,24,20,-50,26,17,31,11,21,-56,30,7,17,16,22,-62,2,14,3,-66,17,4,0,-70,6,-3,11,-9,1,-76,-7,-2,0,-1,1,-82,-18,-2,-16,-86,-4,-12,-16,-19,-19,-8,-17,-5,-95,-28,-24,-28,-29,-31,-19,-33,-25,-20,-105,-39,-28,-32,-30,-28,-28,-98,-113,-67,-33,-116,-52,-36,-50,-120,-37,-50,-54,-35,-94,3835,3844,0,4166,0,3732,0,8,64,102,98,100,88,88,85,92,56,27,54,51,42,51,49,39,-31,51,36,35,42,47,-37,46,40,-40,31,23,43,25,-45,30,22,22,35,-50,22,32,-53,25,23,-56,27,14,10,-60,-22,11,2,14,19,-66,-28,14,4,-2,-71,11,-4,10,9,-3,1,-7,-65,3908,3920,0,0,0,3673,0,11,68,86,102,87,99,102,80,98,92,94,100,60,24,43,39,51,37,-33,31,47,33,-37,27,-39,30,28,45,-43,40,24,30,22,35,18,29,29,17,30,-27,-55,28,15,11,30,-53,21,7,-63,1,11,10,-67,-2,10,6,13,-3,-5,-74,-7,3,10,0,-67,-80,3,-10,-4,1,-14,-14,-73,3988,3997,0,3732,4095,0,0,8,72,88,105,104,85,90,87,100,55,29,48,44,63,-20,54,40,-30,34,-32,43,39,49,48,39,31,-39,44,46,31,40,40,44,-46,18,30,19,-50,32,32,12,28,29,17,21,13,-59,24,18,-62,13,15,14,9,-67,-3,7,6,-71,-7,3,-1,0,-7,-63,4060,4068,0,3458,0,0,0,7,68,97,107,89,93,89,97,26,43,91,73,85,91,85,72,72,76,68,3,78,-6,63,74,60,59,79,57,0,54,67,57,52,50,-5,4102,4114,0,0,0,4337,3981,11,58,98,90,91,95,85,84,96,86,90,82,51,38,59,64,-22,60,45,44,-26,38,-28,58,42,42,52,36,32,44,29,45,30,-39,47,32,42,29,-44,35,30,18,30,34,-50,19,27,29,-54,-4,24,25,15,19,11,7,20,16,9,3,-66,19,-50,-55,4173,4185,0,0,0,3828,0,11,72,87,92,87,95,83,84,14,57,77,77,55,34,55,60,-26,56,41,40,-30,38,54,40,34,34,42,30,31,-39,32,28,40,26,-44,34,24,-47,32,33,29,33,27,31,35,25,13,-57,22,20,16,28,15,6,18,-65,2,2,15,4,1,7,-72,14,5,7,-1,-63,4248,4259,0,0,3673,0,0,10,68,86,106,92,89,82,100,88,93,91,77,6,38,18,36,36,33,-25,-52,-2,30,27,9,21,10,10,8,-47,-62,-15,12,4,-1,16,1,-69,13,14,8,7,2,14,-76,0,-9,-14,3,4,0,-14,-7,-16,-8,-3,-5,-89,-20,-9,-13,-16,-94,-25,-23,-27,-14,-10,-100,-18,-18,-38,-22,-22,-106,-23,-29,-109,-28,-42,-45,-48,-38,-42,-50,-35,-53,-35,-51,-107,4344,4351,0,4095,0,0,0,6,59,107,91,88,90,90,40,38,70,68,58,-12,66,56,-15,68,55,51,-19,47,44,44,50,54,44,58,56,-28,54,39,38,45,-33,50,44,-36,35,27,47,29,-41,38,36,43,24,36,-33,4399,4422,0,3408,0,4457,0,22,65,74,90,87,6,41,86,76,88,70,0,44,63,70,74,79,63,71,57,69,57,58,34,39,81,-4,60,74,73,61,56,72,72,-12,71,65,-15,50,52,-18,68,59,61,53,50,54,46,-26,51,51,53,47,34,44,43,55,-21,4464,4484,0,4392,4556,0,0,19,64,81,78,95,91,81,91,95,5,39,75,71,68,75,79,77,70,74,79,71,2,38,-41,42,29,25,-45,32,22,40,35,-50,31,27,26,23,-43,-56,8,-58,21,22,8,21,20,21,17,3,-54,15,0,8,12,1,11,-1,11,-7,-77,-8,-3,-1,-2,0,-83,3,-12,-10,-11,-88,-3,-21,-9,-19,-23,-5,-95,-7,-18,-13,-17,-100,-28,-34,-34,-26,-21,-33,-23,-19,-95,4563,4588,1553,0,0,0,4457,24,56,89,75,88,87,88,84,70,13,50,67,75,79,68,78,66,78,60,-10,27,64,66,65,67,12,53,97,83,93,105,105,87,91,83,25,24,23,3981,4653,16777243,0,3344,4659,32796,0,4166,4672,67108893,0,3252,4683,46,0,3673,4699,31,1818,3527,4719,536870944,0,3408,4727,268435489,0,3584,4741,34,1829,3828,4755,35,1850,4241,4767,36,1796,4053,4778,1061,0,4337,4782,38,1872,3901,4790,41,0,5,110,98,94,100,99,12,95,95,87,90,94,15,80,92,96,95,86,78,10,106,86,97,85,97,102,98,88,92,82,15,104,85,80,98,85,81,93,10,86,73,74,78,78,82,72,19,84,85,76,88,93,8,76,82,74,71,87,84,80,77,64,69,75,65,79,7,90,102,107,91,99,98,84,13,102,98,96,95,91,14,92,82,11,77,74,92,29,13,92,96,87,89,93,87,97,81,11,86,88,87,87,11,98,99,95,102,86,94,15,90,78,98,76,10,91,104,87,84,98,86,16,95,93,81,3,106,113,98,7,105,96,102,106,100,98,102,4,95,92,101,94
diff --git a/2019/inputs/day_3.txt b/2019/inputs/day_3.txt
new file mode 100644
index 0000000..504e9fe
--- /dev/null
+++ b/2019/inputs/day_3.txt
@@ -0,0 +1,2 @@
+R995,D882,R144,U180,L638,U282,L907,D326,R731,D117,R323,U529,R330,U252,R73,U173,R345,U552,R230,U682,R861,U640,L930,U590,L851,D249,R669,D878,R951,D545,L690,U392,R609,D841,R273,D465,R546,U858,L518,U567,L474,D249,L463,D390,L443,U392,L196,U418,R433,U651,R520,D450,R763,U714,R495,D716,L219,D289,L451,D594,R874,U451,R406,U662,R261,D242,R821,D951,R808,D862,L871,U133,R841,D465,R710,U300,R879,D497,R85,U173,R941,U953,R705,U972,R260,D315,L632,U182,L26,D586,R438,U275,L588,U956,L550,D576,R738,U974,R648,D880,R595,D510,L789,U455,R627,U709,R7,D486,L184,U999,L404,U329,L852,D154,L232,U398,L587,U881,R938,D40,L657,D164,R45,D917,R106,U698,L824,D426,R879,U700,R847,D891,L948,U625,R663,D814,R217,U30,R610,D781,L415,D435,L904,U815,R152,U587,R287,U141,R866,D636,L290,D114,L751,D660,R6,U383,L263,U799,R330,U96,L6,U542,L449,D361,R486,U278,L990,U329,L519,U605,R501,D559,R916,U198,L499,D174,R513,U396,L473,D565,R337,D770,R211,D10,L591,D920,R367,D748,L330,U249,L307,D645,R661,U266,R234,D403,L513,U443,L989,D1,L674,D210,L537,D872,L607,D961,R894,U632,L195,U744,L426,U531,R337,D821,R113,U436,L700,U779,R555,U891,R268,D30,R958,U411,R904,U24,R760,D958,R231,U229,L561,D134,L382,D961,L237,U676,L223,U324,R663,D186,R833,U188,R419,D349,L721,U152,L912,U490,R10,D995,L98,U47,R140,D815,R826,U730,R808,U256,R479,D322,L504,D891,L413,D848,L732,U375,L307,U7,R682,U270,L495,D248,R691,D945,L70,U220,R635,D159,R269,D15,L161,U214,R814,D3,R354,D632,R469,D36,R85,U215,L243,D183,R140,U179,R812,U180,L905,U136,L34,D937,L875
+L999,D22,L292,U843,R390,U678,R688,D492,L489,U488,R305,U951,L636,U725,R402,U84,L676,U171,L874,D201,R64,D743,R372,U519,R221,U986,L393,D793,R72,D184,L553,D137,L187,U487,L757,U880,L535,U887,R481,U236,L382,D195,L388,D90,R125,U414,R512,D382,R972,U935,L172,D1,R957,U593,L151,D158,R396,D42,L30,D178,R947,U977,R67,D406,R744,D64,L677,U23,R792,U864,R259,U315,R314,U17,L37,D658,L642,U135,R624,U601,L417,D949,R203,D122,R76,D493,L569,U274,L330,U933,R815,D30,L630,D43,R86,U926,L661,D491,L541,D96,R868,D565,R664,D935,L336,D152,R63,U110,L782,U14,R172,D945,L732,D870,R404,U767,L907,D558,R748,U591,R461,D153,L635,D457,R241,U478,L237,U218,R393,U468,L182,D745,L388,D360,L222,D642,L151,U560,R437,D326,R852,U525,R717,U929,L470,U621,R421,U408,L540,D176,L69,U753,L200,U251,R742,U628,R534,U542,R85,D71,R283,U905,L418,D755,L593,U335,L114,D684,L576,D645,R652,D49,R86,D991,L838,D309,L73,U847,L418,U675,R991,U463,R314,D618,L433,U173,R869,D115,L18,U233,R541,U516,L570,U340,R264,D442,L259,U276,R433,D348,R524,D353,R336,D883,R580,U157,R79,D27,L134,D161,L748,D278,R322,D581,R654,D156,L930,D293,L156,U311,R807,D618,R408,U719,R366,D632,R307,D565,R478,D620,R988,D821,R365,D581,L946,D138,L943,U69,R620,U208,L407,U188,L122,U353,L751,U565,R849,D874,R668,D794,L140,D474,R289,D773,R344,D220,L55,D385,L394,U208,R305,U736,L896,D376,R331,D855,L466,U516,L741,U124,L825,U467,L525,D911,R76,U220,L610,U102,L261,D891,L585,U397,L152,U753,R822,D252,R106,U145,L7,U524,R343,U352,L357,D399,L446,D140,L723,U46,R687,D409,R884
diff --git a/2019/inputs/day_4.txt b/2019/inputs/day_4.txt
new file mode 100644
index 0000000..f62320b
--- /dev/null
+++ b/2019/inputs/day_4.txt
@@ -0,0 +1,2 @@
+138241
+674034
diff --git a/2019/inputs/day_5.txt b/2019/inputs/day_5.txt
new file mode 100644
index 0000000..f8c2724
--- /dev/null
+++ b/2019/inputs/day_5.txt
@@ -0,0 +1 @@
+3,225,1,225,6,6,1100,1,238,225,104,0,1102,57,23,224,101,-1311,224,224,4,224,1002,223,8,223,101,6,224,224,1,223,224,223,1102,57,67,225,102,67,150,224,1001,224,-2613,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,2,179,213,224,1001,224,-469,224,4,224,102,8,223,223,101,7,224,224,1,223,224,223,1001,188,27,224,101,-119,224,224,4,224,1002,223,8,223,1001,224,7,224,1,223,224,223,1,184,218,224,1001,224,-155,224,4,224,1002,223,8,223,1001,224,7,224,1,224,223,223,1101,21,80,224,1001,224,-101,224,4,224,102,8,223,223,1001,224,1,224,1,224,223,223,1101,67,39,225,1101,89,68,225,101,69,35,224,1001,224,-126,224,4,224,1002,223,8,223,1001,224,1,224,1,224,223,223,1102,7,52,225,1102,18,90,225,1101,65,92,225,1002,153,78,224,101,-6942,224,224,4,224,102,8,223,223,101,6,224,224,1,223,224,223,1101,67,83,225,1102,31,65,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1007,226,226,224,102,2,223,223,1005,224,329,1001,223,1,223,108,677,226,224,1002,223,2,223,1005,224,344,1001,223,1,223,1007,677,677,224,1002,223,2,223,1005,224,359,1001,223,1,223,1107,677,226,224,102,2,223,223,1006,224,374,1001,223,1,223,8,226,677,224,1002,223,2,223,1006,224,389,101,1,223,223,8,677,677,224,102,2,223,223,1006,224,404,1001,223,1,223,1008,226,226,224,102,2,223,223,1006,224,419,1001,223,1,223,107,677,226,224,102,2,223,223,1006,224,434,101,1,223,223,7,226,226,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,226,226,224,1002,223,2,223,1006,224,464,1001,223,1,223,1107,226,677,224,1002,223,2,223,1005,224,479,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,494,1001,223,1,223,1108,226,677,224,1002,223,2,223,1006,224,509,101,1,223,223,1008,677,677,224,1002,223,2,223,1006,224,524,1001,223,1,223,1008,677,226,224,102,2,223,223,1006,224,539,1001,223,1,223,1108,677,677,224,102,2,223,223,1005,224,554,101,1,223,223,108,677,677,224,102,2,223,223,1006,224,569,101,1,223,223,1108,677,226,224,102,2,223,223,1005,224,584,1001,223,1,223,108,226,226,224,1002,223,2,223,1005,224,599,1001,223,1,223,1007,226,677,224,102,2,223,223,1005,224,614,1001,223,1,223,7,226,677,224,102,2,223,223,1006,224,629,1001,223,1,223,107,226,226,224,102,2,223,223,1005,224,644,101,1,223,223,7,677,226,224,102,2,223,223,1005,224,659,101,1,223,223,107,677,677,224,1002,223,2,223,1005,224,674,1001,223,1,223,4,223,99,226
diff --git a/2019/inputs/day_6.txt b/2019/inputs/day_6.txt
new file mode 100644
index 0000000..49d849c
--- /dev/null
+++ b/2019/inputs/day_6.txt
@@ -0,0 +1,2306 @@
+21X)BWV
+YZJ)YLQ
+FQS)PZW
+R64)71F
+ZH4)QVZ
+LWB)H4Q
+4HQ)PVJ
+TZ5)VBV
+LF1)FKZ
+GKS)BGN
+45B)2NS
+14W)2JY
+1XY)FJ8
+ZRC)WR9
+GCL)6PB
+LP4)GQ8
+26V)HTK
+3M8)1GJ
+47Q)JYK
+WDB)N2R
+KH8)TGY
+LFX)N2X
+VSZ)7PC
+M6W)4WL
+HH9)8PC
+L59)8Y8
+Q49)LWH
+CJ5)XDG
+K51)FGH
+H31)2RJ
+39M)Y4M
+12C)VLF
+PZW)7DW
+MP2)19Q
+R76)CHH
+N6J)KBW
+WR9)W25
+T99)ZF1
+1TS)8SM
+8WW)YX7
+PW6)B2J
+7KX)YM5
+HM6)GVX
+DNB)2YP
+6WC)2LW
+BG5)SB6
+KK1)JTF
+YDT)244
+GGQ)2DJ
+GCP)Q8H
+S1Y)J69
+LBV)DYG
+ZKN)JBS
+8XY)Y8Z
+XMH)NHD
+XVM)2LX
+SYP)BC8
+PXH)YYG
+F29)G9Y
+BYX)4QS
+8MY)S1D
+N2Y)BZK
+FRC)72W
+S2K)YH5
+7JF)K65
+DJ9)K4L
+P26)WXT
+DW9)1DJ
+NP4)3SB
+XS7)CDL
+6XH)4ZT
+2DJ)GCP
+2K4)VV1
+Q6P)NNN
+HQW)ZR9
+9G2)FNB
+H9N)5ZJ
+13Z)GKD
+9MW)37Y
+VDY)BG9
+BL3)12C
+LNN)JST
+Z3V)T39
+XS3)WYG
+8J5)QFQ
+7DW)DXY
+JMV)DM4
+VL3)V7Q
+GZC)ZHV
+3N6)R2H
+FQ6)7LG
+SR9)D66
+1M8)K2L
+24N)M94
+JST)WM9
+7SB)99Q
+58J)YN7
+WWH)5KS
+C39)X9J
+58S)KBP
+TVF)VNG
+TKC)Y34
+KKP)4S6
+XSP)939
+N6J)DZP
+JXP)N6R
+KNJ)7FS
+N3V)LMJ
+JVF)R94
+21C)R4Z
+NYK)5GN
+GVJ)Q6C
+R69)NRS
+GLS)C7D
+T4J)46R
+5GB)51S
+9WD)7PN
+HHX)KK2
+H2P)ZML
+DWD)Q9F
+FKZ)LC3
+Q9F)M8N
+CRZ)LM1
+6DP)YML
+NSR)L2X
+PMX)Q7K
+37R)1GF
+L4G)P4W
+17N)X6D
+JTF)89B
+JGJ)DVJ
+VF9)GMW
+NHD)DJ3
+TRY)F6S
+J11)BVW
+95X)XB5
+3XD)HPM
+7BB)1LW
+FJ8)TV4
+JV3)M9W
+T7L)6SS
+R48)LSB
+F2P)9D2
+PTY)QBY
+KXM)6G1
+N1H)Q2R
+P27)SR9
+1S2)N3G
+V7Q)642
+891)TW7
+B9Y)BRL
+GW4)3XZ
+QWM)G46
+WVK)S6N
+N82)317
+8PG)S21
+NT3)1VX
+QB5)Y3H
+PTT)639
+G8M)WM8
+B36)LX9
+M9M)4P3
+3F9)Q3R
+DND)TJL
+VQB)6N3
+PJT)JTK
+BBN)T4L
+LYP)M3V
+T9R)HH9
+XBR)3X5
+MX3)SWF
+SF1)MXT
+X67)6DQ
+82Z)FQ4
+L64)FNG
+CDG)5D9
+JKZ)XZ5
+MH1)1KD
+5NW)ZH4
+P3T)76Z
+2M4)CKW
+54L)8P7
+JSH)5H5
+LGR)P2V
+QNV)SJ7
+KPS)XMQ
+F2H)49M
+8NJ)KKP
+XZ1)LRZ
+RVK)J5Z
+QT9)NGQ
+1TK)P7X
+39M)595
+DN9)HKY
+HK1)ZRH
+SH1)JV5
+B25)GQ6
+QZC)WYC
+6CJ)F5D
+5R1)HQ7
+FNT)P4J
+4R6)P49
+LG4)QT9
+GWH)RY1
+1FX)ZK8
+HK4)G2N
+4WL)GPR
+SQT)KK1
+RT4)FCN
+NRF)P84
+DQW)4L4
+52N)T4J
+69D)2FV
+RMV)J7N
+S9J)1WM
+B88)9GT
+5M7)GXN
+3XF)6FX
+FL9)8VZ
+X88)JZR
+ZVZ)8J2
+Q83)94V
+82Y)HT7
+7Y7)7X3
+KNK)R1W
+469)PMG
+D9Z)GD1
+Z62)WR1
+YDF)6B6
+5KS)6GW
+57T)ML7
+GXC)R89
+S2N)99C
+JFH)RP9
+KPH)R26
+DZX)93P
+CWT)C2H
+VKN)5M7
+VNG)SH1
+G2N)F6Q
+NFV)FK3
+R65)TQL
+Z6T)4NG
+RQN)KPR
+972)9TB
+KZ1)6TY
+8K2)HKL
+KHJ)H1W
+6N3)XTR
+25Q)T49
+8HF)K9M
+GQX)PHP
+5ZJ)9S7
+C7D)VMJ
+JXV)SJD
+J17)64C
+5XN)WN7
+PH9)WQH
+43T)Q9V
+Z5F)NZ8
+VHQ)D95
+244)7KX
+6N7)JPH
+HC8)HND
+ZF1)39F
+24X)ZPF
+BWV)HQW
+R3N)5R1
+QB9)6XY
+KHW)KFZ
+S2V)DRQ
+S21)1RQ
+C9V)TSD
+Q1Y)LC2
+93Y)W5C
+8ST)T4P
+R5Z)CL4
+424)WNZ
+R7M)5JS
+4R6)H97
+ZXZ)S62
+FRH)SBJ
+ZK8)N82
+6FX)MTK
+Z5M)BRQ
+YYP)FX8
+RZJ)DRK
+V8G)TKQ
+5L9)J1G
+RZG)69H
+R9G)X79
+WFS)ZJQ
+4P8)GXC
+TYW)S54
+R2H)QH7
+6HX)F2H
+BBD)DC5
+DDB)6WC
+2G3)4JN
+FKC)K7V
+XTK)8BD
+Z7X)QGY
+8CG)3F9
+F39)MM9
+F1L)1R7
+ZVH)JDC
+BVW)PXM
+PRV)BF7
+FX8)1XR
+FB2)XN6
+R9L)Z1V
+YDT)H52
+6Z5)XZ1
+QD2)Z7Y
+TLS)6T3
+54C)DL7
+KPR)4TY
+19N)415
+1QG)GNN
+S6N)4MK
+4L8)LD2
+5Z7)PRY
+5C4)2MC
+94B)DY3
+CVK)GTS
+7N7)P27
+5MW)GGH
+2HQ)JYL
+L9J)HLP
+5Y4)NGN
+2BZ)GWN
+HD8)CZS
+HQ7)M9D
+DC5)RK6
+66W)2VT
+3D4)GHZ
+T49)VTP
+PL4)ZS9
+SJ7)TRC
+NKT)G5Y
+K1G)3GN
+37V)4LG
+KWL)VDZ
+7XF)1P8
+64C)FX4
+DY4)J3F
+RV8)8KF
+DRQ)KQ7
+HND)2N7
+HQS)HMW
+J24)9VX
+7DK)3PM
+467)VBK
+Q6C)TZC
+SZY)9TC
+BMM)4S4
+HFH)2S6
+K5K)4QP
+N6W)RZG
+TKQ)489
+4R1)F22
+J1G)YDF
+FVW)9WD
+CV7)TMC
+R6K)H31
+GDL)X14
+H1B)NKT
+XTR)PL6
+BSC)SM7
+MLT)S7B
+22S)R7T
+X8Y)4WX
+NR9)NK9
+FSM)J3S
+WHF)VSG
+ZBG)Q3D
+RMY)7KM
+XBX)1M8
+MHY)1C2
+GSS)X9G
+86F)Y4W
+VL6)6H9
+1VH)L3B
+SF8)CDG
+GTK)45F
+49M)NLL
+FN6)PN3
+KSC)R3Z
+6TN)3QN
+FNG)742
+X45)WWH
+SF5)2WH
+JSJ)B1H
+95L)M8F
+L59)C4Y
+93P)M89
+K1C)6ZZ
+21T)8M6
+X9M)7NX
+WPK)LNG
+393)F6N
+M4L)JXP
+VKN)X88
+NFK)ZVZ
+LKV)C2V
+SWX)TM8
+V7F)8ZN
+3RW)FD8
+9SM)H27
+TP3)1YB
+6MG)D8X
+8S7)345
+9SV)X67
+25P)JDD
+BFX)TNG
+36J)VBH
+HN7)WVK
+ZR3)3NR
+M3V)GPY
+52M)MFV
+MZB)CJ5
+MX3)XLQ
+LCG)PHS
+HZD)RNC
+GWN)DWD
+XBM)WP4
+2FV)YXW
+ZTP)QD2
+R1G)JY6
+KY4)8CG
+H54)RVK
+5HG)WYQ
+BVC)SK1
+948)P3T
+SV8)5MW
+V4D)YLT
+69X)LNZ
+BL3)Y97
+DXG)WLZ
+VV1)SS3
+ZCD)VXB
+X6D)XL2
+B9H)2NB
+KHK)WPK
+YLT)KFT
+P49)CC5
+KBW)CRH
+8KQ)LJ4
+8JJ)VTJ
+TKM)428
+3SB)273
+GPY)R2Z
+WTX)P6W
+LB1)3PR
+Y1R)DJM
+25P)CY5
+SVB)PJM
+56N)S2V
+H82)8D5
+CYB)GP4
+HJ2)BSH
+2J1)F1T
+C4Y)PRM
+TZC)PM5
+K55)NBJ
+X43)LPP
+WYG)3FW
+WFG)N2Y
+Q37)5L9
+WSF)KSH
+V2H)S9J
+HN2)DW9
+3LL)PFH
+6X3)XVM
+8XZ)991
+26L)WTX
+Y97)5C5
+XXL)79Y
+NK9)RR8
+L7W)83Q
+8TX)45B
+GMJ)1H4
+ZRW)58J
+36X)PRS
+8B2)HTL
+8JZ)L94
+PRY)QTW
+PL4)X8Y
+89N)1RJ
+DFJ)62K
+5QZ)CN3
+RYQ)SL6
+1H4)PGZ
+B1H)J88
+JCC)111
+V6W)GG7
+BZK)97X
+49J)WVY
+1WM)21X
+TCN)KSC
+RRD)26V
+VC6)WPS
+Y5S)YJS
+DVR)2J8
+LJF)839
+64D)GZC
+79Y)SZY
+JHT)D6J
+K4K)L59
+YHB)QWM
+6H9)MRR
+X79)M62
+LW7)GGB
+469)TRQ
+14K)951
+L9Y)K51
+W7C)Y73
+XD1)CYL
+1XQ)HYK
+Q19)PWG
+F4M)KHW
+SM1)J3Q
+MV1)1X9
+NMV)3SM
+8ZD)L61
+VWX)6R6
+S4Z)JK4
+9GT)R13
+F66)89X
+DLT)K6R
+H4C)NW9
+R3D)6Z5
+MKN)M5V
+H4C)22S
+BFM)J2V
+KQW)G8D
+V61)6HG
+JX4)LH3
+PHS)P68
+V9M)56X
+1Q6)Y8V
+319)KX2
+M8F)881
+974)KSL
+LRP)XXL
+M3Y)Q39
+LC3)B9H
+4T8)ZRW
+KYB)T7L
+DXJ)72V
+SRP)D3M
+BRN)NGD
+43S)NJ1
+KWJ)VGZ
+DNY)F2J
+DKW)YT1
+6B4)6N5
+GRQ)RYT
+4KV)WFG
+6PG)T9R
+Q3T)V2P
+4M5)HLG
+WKZ)9ZP
+XTP)JMC
+PVZ)JN1
+5F2)26L
+76Z)R5P
+FVW)NS1
+MWS)PXD
+Z7Z)8S7
+CTH)7C2
+837)48K
+3SM)HYY
+J2B)1TS
+Y8V)BS6
+YYD)3XH
+4F7)BFM
+6S1)95D
+4KN)JV3
+GSZ)HVF
+9CP)GPZ
+BFN)LB1
+N72)741
+K6R)3WF
+P4J)QQW
+54G)469
+36T)GJ4
+HXM)X6W
+MR9)M29
+XMQ)SP9
+71F)TJR
+95X)DLT
+1ZX)QVK
+F1L)1SY
+B7X)XDB
+FJW)ZCR
+43X)1XH
+D5H)93V
+FQH)5RJ
+CLW)1RG
+X4Y)X9M
+CRH)DWH
+XWX)GWZ
+36J)TKC
+YFN)YJ6
+15X)MBT
+6T3)NDG
+8SY)4R7
+XMG)HR5
+KSZ)WKZ
+PM5)3K8
+BR4)J1T
+F72)GV7
+317)P1W
+CV7)SPK
+H53)PMX
+NDG)56N
+N68)ZXZ
+X3W)XGJ
+JRJ)S7X
+MKN)DBW
+8CM)953
+M2K)3XL
+95K)95X
+58S)4HL
+D95)L9Y
+FRH)KQW
+NLL)C3D
+X1H)FM1
+R1M)GGQ
+Y8Z)W1B
+KLD)G1V
+6CJ)R5X
+5C5)HN7
+T7M)ZXT
+SZF)B5W
+RPW)6TG
+3VP)2W9
+X2J)RXH
+DWG)C9V
+9FB)524
+1PZ)8ZD
+ZKZ)6S1
+L36)ZKN
+F1J)2D4
+LWC)6SW
+SWF)Y4V
+51L)MWS
+KFZ)52N
+GD1)HFH
+LFK)L36
+KPZ)ZQ6
+3NT)W48
+2CD)G3D
+345)JXV
+2LW)SWX
+9ZY)XTJ
+VWR)576
+STH)NHY
+L4X)M4L
+ZML)RN7
+RDF)7PB
+7FK)3KR
+GVX)DCF
+1WX)DD2
+971)H6W
+H6H)BPX
+BWQ)Z4J
+JPL)3SV
+QWJ)TR8
+376)H9P
+Q3D)1YS
+1N2)FQ6
+2LM)53K
+VSG)6DP
+KNM)8B7
+S7B)YXF
+YHB)JHP
+Y7N)CPB
+M29)3FB
+J37)C8B
+MK3)WHL
+MRG)TQ8
+BFM)DLH
+H4Q)9HF
+D81)R7M
+LRQ)ZKZ
+C1B)413
+BKC)PW6
+GP4)6MX
+C39)JSH
+BW8)TL2
+71Q)3YP
+415)H2V
+DBH)BR4
+JJ7)J2H
+G52)87N
+YV2)JN3
+7PR)Z3V
+999)G8M
+S7Y)JRJ
+G3D)88H
+SR3)NTR
+JY5)FC8
+MYL)B7X
+K7V)HM6
+FXY)L47
+NNN)GYH
+8JJ)Y5S
+3G5)37V
+FLP)4B2
+839)83S
+H27)CV7
+X4F)RXV
+S3P)WMZ
+LD2)SF8
+DYG)77S
+LGR)2LM
+7BX)G2K
+KNF)9S5
+JBS)R45
+T6C)CGH
+CNV)2BZ
+356)1KP
+P93)54J
+VGZ)31Y
+GNG)HDL
+RHW)222
+4T4)4T8
+WVY)M5Z
+KQ7)XMG
+K7F)S2N
+X6Z)Z9S
+XYH)WFC
+7BM)J2B
+H9F)LKV
+WDJ)HWH
+MWM)83M
+YM5)7J5
+Z62)8NR
+99Q)TVF
+VDP)C2N
+9VX)B5T
+YS6)KNF
+35R)ZH5
+JN5)Y4H
+MSN)XSP
+776)CJ4
+3FB)HXT
+HZV)6HY
+Q6N)HXS
+MBT)FTN
+3JP)YJ2
+4DC)KSD
+8PG)5QZ
+YSP)CNV
+THM)CST
+3X5)BPC
+ZG9)4KY
+8M6)MZ5
+FDF)XNB
+H4X)N72
+ZH5)J79
+KN7)ZXV
+1GP)R76
+K5R)CLZ
+W8G)XVF
+YJQ)HB8
+BWC)TB6
+WFH)T6C
+DPB)VYF
+K8N)KWJ
+C2V)HMF
+H93)HF3
+TR8)MFW
+RJ4)F66
+BS6)FVW
+QFW)5B2
+ML7)FB2
+TGY)X9Z
+PRM)ZV3
+4YX)4YV
+36D)N6X
+XLQ)TLS
+WMZ)NRF
+BCM)2CV
+M74)CHT
+JYL)LQ4
+RSN)KXR
+KNK)3Y2
+89X)BJK
+C2H)4YQ
+YYQ)VMB
+164)11H
+WYQ)WSF
+1RG)DRH
+GKD)LLT
+H53)T2F
+X2Q)F82
+B5D)5F8
+JK1)4F7
+1YB)P26
+B6F)552
+RTD)883
+ZPF)DWG
+JRV)DL1
+MLQ)S1Y
+TX8)5QV
+NDT)2MF
+HFS)61F
+HD8)TCN
+8BL)F2X
+4MK)R6Z
+WVN)RMY
+GGX)JCC
+GQ8)J11
+H4V)5FJ
+3JD)VNC
+7KS)9SM
+NTR)YV2
+4LG)JK1
+3XZ)GGX
+SVZ)P96
+4WG)N3V
+QY7)8N9
+XMP)LKL
+T4P)RLM
+J7C)JJZ
+7PC)Y23
+LPP)M6T
+F82)9KL
+9XR)VT4
+SF1)4T3
+FW6)N66
+QBY)D49
+BCM)17Y
+H1W)R6K
+ZVN)7QK
+BRH)7JF
+LKL)39C
+LV1)BJS
+8PC)FN6
+CHB)TBS
+ZLR)3XD
+8BD)BSC
+NVC)9FB
+Z9L)HK1
+FT3)BWL
+446)S8V
+LM1)D8G
+KH3)Q6P
+J8C)WFH
+YT1)SDH
+CGZ)X3V
+77B)V9M
+2RJ)H4V
+NHY)H47
+89B)HM7
+Z1V)58S
+17Y)1Q7
+J3F)891
+WDG)VSZ
+PJM)21T
+3YL)74D
+8XJ)15N
+Z2X)VHH
+N6R)R93
+5QV)8XY
+KSD)RYF
+6DQ)X8F
+Z2Q)MZB
+ZFG)972
+5LK)FT3
+D25)1CF
+RMQ)2HQ
+85N)HDY
+952)WFS
+T4J)B88
+2MC)JFH
+BRL)D64
+GJ4)65N
+ZC2)QLQ
+69T)3WV
+W4F)WMG
+74D)NCN
+3YY)19K
+JKG)6CJ
+S68)GGZ
+6N6)H2P
+3XL)ZVG
+S1D)14K
+GMK)DW3
+HJF)1D5
+9DP)P9D
+18K)Z2Q
+248)YD2
+DTK)MR3
+LH8)1GZ
+7ZC)RZJ
+YJ2)ZVN
+JN1)1FX
+3WV)289
+53D)GJX
+883)FXW
+79K)ZXD
+DLH)9X5
+BRQ)KHK
+2XW)R65
+RGD)GCY
+RNC)TR9
+HYV)54C
+SJF)BBD
+T81)F2T
+GZ2)KBQ
+G2K)48L
+PL6)B5D
+R76)Z4Z
+QVK)TDX
+F6N)M6X
+8XQ)3JP
+HXD)WNB
+CLZ)37R
+K6R)SY1
+X9G)8CM
+2W9)W4X
+ZXV)JC5
+HKY)1Q4
+KV1)QZC
+LMT)CLW
+Y4M)P57
+1YS)SJF
+NGV)N1R
+VLF)RGD
+FJ5)8WN
+PWG)V4K
+XDC)KY2
+3DJ)RV8
+1RJ)2GN
+WXT)MP2
+R89)JLR
+GGB)RDG
+Z6L)GQX
+ZJQ)TLG
+3WF)FQH
+5YP)5Z3
+C1B)CCD
+SBW)BQB
+41C)W4H
+1P5)YYP
+R5X)36J
+DZL)KNW
+P57)CN4
+C85)78L
+6YB)S7R
+CYB)LNN
+881)Z5X
+642)B5K
+X9J)SQT
+BJK)M39
+BMW)SHT
+2NS)VKN
+1C2)JHT
+H46)ZGD
+JY6)RF8
+V1D)82Y
+Z4Z)FW6
+CRP)JRG
+1VX)77V
+M2F)MHH
+B7X)JJV
+H29)7JR
+Z4C)N13
+HN2)PRV
+FTN)5FY
+8HS)Z4M
+JTP)GLS
+JST)8XZ
+4GX)T2P
+1GZ)V8W
+5MW)RT4
+9G2)QPQ
+X6C)NGV
+GP8)8SY
+J67)ZBL
+R45)BWC
+DDF)S37
+31R)PHR
+V4K)2L6
+J69)SYP
+DVF)R29
+DLS)1BQ
+72W)JKH
+JPV)FL9
+TSK)69T
+93V)T9M
+CST)WPW
+37Y)BJ8
+JR2)V4Z
+B7C)X1V
+WN7)GCD
+K65)TM5
+HFS)KYB
+1XR)TX8
+7L2)NXY
+57Z)M6W
+WMG)5HG
+F6S)3YF
+FMB)N6Q
+HS4)QNV
+XN6)X2C
+56X)Z5F
+NJ1)3M8
+65K)S2S
+MSJ)Z3P
+3RW)YJQ
+YRB)L4G
+5DZ)5YP
+TB6)TGV
+PDM)H9F
+MTR)B36
+GGH)2LS
+4S6)4KV
+SVB)MV1
+JQN)18K
+SRN)ZFK
+ZFX)HXD
+YNR)GCL
+8QM)GDK
+17G)B9Y
+JKZ)19N
+MJD)5BH
+NSR)24N
+T48)CF2
+Q3R)3TZ
+741)T7M
+P2C)G9Q
+V8G)17G
+GCC)54L
+53K)TC8
+ZGD)F7V
+J5Z)Z7X
+4YV)HZV
+GPZ)69X
+RYT)RTK
+Z6T)7ZC
+FMT)ZVJ
+56X)7KS
+M89)YDR
+F6Q)V8G
+Y4V)MY7
+1Q7)17N
+YV7)HQS
+YLQ)GJ2
+5WT)VQB
+YN7)DR2
+MPX)JBC
+LFL)DPB
+TNG)5Q1
+LW7)HC8
+HBR)Q6N
+9K2)DNB
+GXN)MHW
+SGZ)1HF
+WFS)N4R
+3GN)2K4
+5Y4)1MH
+M9W)7PR
+WCK)DMQ
+COM)TKH
+6XY)LTM
+WQF)1S2
+Z6N)3BD
+CF2)LFL
+GDX)ZQ4
+PGZ)1VH
+X5D)6CP
+TDX)MKV
+3XX)BHR
+SPL)DXS
+GM5)TZR
+M8W)DBH
+PFH)KGJ
+W4H)MKN
+SPK)LRQ
+V4P)63V
+5LQ)WDG
+L2G)49J
+HB2)6Q9
+YV4)NTM
+H47)9MW
+ZB8)Y8J
+C3D)HTQ
+9HF)9K2
+XDG)GDX
+FMS)239
+JJP)PKV
+6C1)BL3
+FNX)JX4
+SN2)237
+TSD)PNN
+RY1)JL3
+TX5)B2R
+BS5)HJK
+TBS)JNC
+1BQ)PR5
+NRS)FX1
+5GX)BKC
+8Y8)FRH
+GP1)KFR
+H1W)ZLJ
+FX1)WT6
+HJK)WFT
+7Z4)GT9
+FD8)RGG
+8VZ)5PJ
+1LW)PTY
+PTT)15X
+QVZ)6LR
+Q9V)WMP
+BLW)4DX
+554)35D
+YML)DND
+997)CTW
+L2L)6WB
+PR9)K5K
+6TY)5Y4
+2RQ)DVF
+5PL)NK7
+3WB)KJ7
+PXM)HN2
+NBJ)FMB
+BGN)BRP
+BTH)C2B
+9X5)MLT
+XGJ)KGD
+TDC)SBW
+56Q)K7F
+HF3)Z2X
+RP9)952
+PKV)K4K
+222)95K
+LX9)4WG
+RYF)HB2
+5CL)C4P
+J2H)6PG
+CXP)5GB
+38R)L7N
+NJ1)YDZ
+LBC)42B
+6WB)NCK
+524)YOU
+D8X)YNZ
+KY2)BRH
+W5X)DZX
+SP9)G1J
+JKT)LGJ
+J2V)PJT
+6SS)R9G
+8MF)2L8
+X4J)8JJ
+T1P)DLS
+NWC)76R
+YXW)RMQ
+Y64)9NF
+XB5)52M
+JKP)YC1
+FZ2)ZCD
+Q3S)CWT
+YCS)QDR
+S3M)792
+Q7K)N5M
+952)MYL
+GPR)F37
+Y7G)TFK
+V7H)2G3
+CHW)BVC
+FSM)TRY
+RS7)BFX
+KF6)3RW
+TGV)6BJ
+3TP)CXP
+DXS)BW8
+8QM)NT3
+R4Z)X43
+7X3)7N7
+JJZ)3WB
+GWZ)K7Z
+XQF)R1M
+2L8)4YX
+891)F1D
+S73)KS9
+289)3TB
+XJF)PDZ
+C29)K7N
+YH5)8F3
+9NF)8LD
+YX7)1NW
+ZLJ)ZGS
+DWS)CY2
+Z4P)XBM
+HKY)K55
+P6W)BWQ
+P1H)L64
+54T)25P
+W38)6KP
+CNV)9S2
+7FS)75T
+9SV)PQQ
+H46)VL3
+3FW)W91
+JBW)T99
+J89)MLR
+CJC)4B6
+NYK)189
+R2K)3CT
+S54)BHJ
+98D)HRL
+F1T)GRQ
+T9M)NZJ
+5B2)FNX
+PQJ)D89
+WG3)2W2
+ZS9)WW8
+FSG)5SS
+DW4)ZFG
+78L)49Z
+NGQ)2TJ
+M6X)GDP
+KXR)95L
+1WQ)FNT
+BRP)L4X
+J3F)5C4
+2NB)JJD
+SZL)5PT
+FNB)DN9
+LNZ)ZBG
+Z4J)NQV
+D6J)H54
+1CF)SZF
+QQF)1N2
+FFS)VF9
+NK7)KRM
+6HY)TDQ
+C2Q)16T
+JTK)ZLR
+1KD)N3R
+2XH)JKP
+BJ8)QHR
+G9Y)5F2
+4R7)HGM
+JGH)XS7
+72G)LLM
+QLQ)Q1Y
+TJL)8JW
+N8F)8SX
+JY8)HZD
+3W9)JPV
+WK4)HBD
+8X9)6XH
+YYG)WJQ
+HZL)NQZ
+BLY)JJG
+6CH)CR4
+GQ6)248
+DWH)5LK
+LQM)Z7Q
+SN2)4DC
+BF7)BTH
+Z9S)NG8
+F5D)HK4
+2S6)5NW
+LTM)757
+FC8)89N
+SBJ)4T4
+XLM)XQR
+S29)TDC
+1YK)RL3
+6J2)7NB
+SK1)7CS
+GBD)H77
+9KL)HJF
+LJ4)VST
+S9W)4KN
+99C)Z6N
+L58)M2K
+5JS)LR8
+WR5)9XR
+V6W)WK4
+9S7)FRC
+TM8)C39
+F4Q)Y86
+BN1)MTR
+BGG)GP8
+GJN)MV8
+TLG)XYH
+83S)CHW
+Z1H)GX4
+3TB)HHX
+J3Q)JQL
+5Q1)75N
+W91)57T
+DVJ)HBR
+B6F)M9M
+WMP)5XN
+WXQ)B17
+83M)XMH
+8N9)SAN
+LVG)8ZV
+L2J)7SB
+FNT)KM7
+BPC)B9T
+1TQ)K27
+JZR)RJ4
+L9S)H93
+189)36D
+TZG)2Z4
+5LZ)HXM
+SJD)Q3S
+WJQ)D81
+GP8)GZ2
+1TP)ZNV
+X2J)837
+DJM)KDJ
+7GP)NYK
+TQ8)446
+HZL)4L8
+29G)3VP
+4LZ)XTK
+KFX)6N6
+HPM)WWQ
+X1V)KVV
+Y64)V4C
+5GN)54T
+SJ1)QS3
+DM4)83W
+KDT)ZB8
+DL7)DKC
+TML)SPL
+LC2)K1W
+MHW)5Z7
+MXT)RQN
+9KL)K9L
+M3T)YRM
+KFR)Q49
+1DJ)SN2
+F82)2J1
+PWN)5PX
+YT1)V7F
+T6S)T1F
+B8L)WB2
+Q79)LKF
+853)RTD
+KBQ)356
+HTL)54G
+43T)53D
+B5W)PH9
+7KQ)8TX
+T2Z)1WQ
+8HY)29M
+552)M74
+STR)6HX
+FRV)HMM
+45F)J7C
+4Y9)HFS
+GNN)WJ6
+HXT)JQ8
+PNN)51L
+PHR)RK5
+MM8)H1B
+N66)G85
+C4P)W7Z
+991)FSM
+7QK)SLP
+GDP)71Q
+5MC)MRG
+F2X)HY1
+B9B)CWM
+SVZ)HN8
+XDB)4P8
+BS3)VFP
+VXM)KCL
+9G6)831
+9Z8)FNJ
+GX4)C2Q
+WFB)MZ9
+63V)MX3
+V8W)82Z
+RTK)319
+427)WY1
+4T3)VVN
+T2P)4LC
+CR4)FQS
+K4L)DTK
+HLP)WCK
+4YQ)H9N
+RK5)QFW
+GT9)SRN
+YXF)FXY
+V74)L3W
+MY7)2RQ
+JLR)JNS
+9S5)LPH
+H54)J37
+8XR)BLY
+QMC)T48
+4TY)1QG
+Z4J)H82
+BZC)LKD
+4CP)86F
+Z24)L58
+1FN)X15
+5FJ)QWJ
+K27)2CD
+3Z9)3W9
+L6V)J1J
+51V)HJ2
+WD5)Q99
+49Z)G6N
+Y4V)DDF
+MFV)3GH
+B1T)9CM
+X9Z)BG5
+2M6)1XQ
+2J8)3G5
+VMB)13Z
+51S)BMW
+1MH)LFK
+VBK)3D4
+SDM)8XR
+7NX)S2K
+52L)4NL
+LRS)664
+JDD)43S
+JJV)H6X
+62K)7L2
+WR1)L3D
+LN4)WXQ
+S52)C85
+F22)9SV
+LH3)8B2
+YBD)8MY
+TGM)N6H
+ZVJ)MSN
+S2S)5HV
+2MF)GP1
+9ZP)3ZK
+1LW)H44
+QTW)T9P
+GHZ)YV7
+W7Z)M3Y
+5FK)NWC
+97X)36T
+G7X)K5R
+GLP)XQF
+WQH)ZM7
+8YP)KF6
+WNB)WG1
+W21)1TQ
+VBH)XM4
+CY5)3N6
+G1V)K1G
+L2X)L9S
+2CV)3LL
+BKC)LC8
+R5P)JDL
+JL3)T5B
+HDY)FRM
+XL2)F29
+8Y8)N86
+C8B)FDF
+L3W)Z9L
+WJ6)6FW
+5HV)157
+DW9)1WX
+C2B)JR2
+6HK)7GP
+N86)971
+GZ6)KHJ
+V4Z)376
+WT6)F4Q
+H97)FP5
+M4L)MCT
+D8G)BCQ
+XPG)NP5
+8CG)GBD
+6SD)6X3
+54L)1TP
+N1W)MJD
+ZXT)VXM
+QH7)JN5
+S7H)4M5
+QSC)44B
+19K)QLJ
+951)25C
+PJZ)W21
+X8F)X4F
+CZW)SV8
+ZYJ)F5C
+XNR)KPH
+658)47Q
+D66)3GD
+ZGK)D65
+4ZT)YBT
+3NR)K3P
+WMD)HRP
+VGN)554
+2GN)WH3
+8SX)DXJ
+Z4M)MR9
+R1V)VDY
+1D1)CRZ
+CC5)MH1
+2NS)PXH
+SLP)1FN
+PTB)LYC
+V4D)Z5M
+Z2N)X77
+DR4)7KQ
+646)98D
+9PN)F21
+PB8)728
+WXT)4S9
+3YP)TGM
+6PG)776
+9KY)T7C
+5SS)LV1
+8HR)53Z
+972)FZ2
+XJ8)9PN
+6PB)Q35
+ZCR)42N
+NNP)YPG
+SL6)XL4
+1CG)YZJ
+QKG)5GX
+L94)HD8
+ZVH)GVJ
+R93)3YL
+4GC)2XH
+FNJ)ZL5
+2LR)YBD
+YDW)HMN
+S8V)YRB
+YV2)HS4
+6B6)6WZ
+SVG)LB5
+DMQ)VWX
+72Y)997
+MHY)3YY
+JX9)XHT
+MTV)DSB
+413)6SD
+DSB)25Q
+9HF)BRG
+B5W)P93
+9TB)XTP
+JN3)6W2
+TFK)MKW
+T49)4NY
+742)MSJ
+8F6)ZKW
+TRQ)3JD
+F2T)R8H
+LQ4)GMJ
+B9T)H46
+T2F)ZC2
+VC6)TJF
+YDZ)R48
+RGG)974
+DTK)H4C
+DTF)QCP
+7KM)Z4C
+GTS)MLJ
+296)424
+664)H86
+2YP)ZYJ
+V18)VC6
+7CS)SQH
+DZS)3X8
+QYT)8HS
+62Y)SQW
+D8X)YXX
+N2X)D3B
+P84)6J2
+JPH)DZL
+WM9)KWM
+TM5)GM5
+W4X)YYR
+TNG)LRP
+1KP)ZQX
+MZ9)72Y
+WJZ)MPF
+NP5)SQ3
+D66)5QS
+H7H)ZCB
+16T)V74
+X15)1WS
+8NR)Y7N
+237)DYP
+N4Y)CGZ
+Z8K)BYX
+8KF)N6W
+RF8)NMV
+WFC)7XF
+449)DDB
+D49)X1H
+TM8)78Q
+G6N)73R
+HGM)GD7
+F21)Y1R
+TRC)5HH
+N14)S73
+ZXT)BS5
+NG8)4L5
+8ZN)Q79
+4HJ)Q3T
+837)NDT
+1R7)R2K
+77S)6YB
+S7R)1XY
+2VT)KNJ
+WQ4)64D
+M5Z)PVZ
+RQN)8V9
+VVN)K2K
+V2B)N3K
+B17)7BX
+1W5)LMT
+1YW)X2J
+XJC)XJF
+P4W)4J1
+PRS)Q4P
+BMM)QB5
+L7N)H29
+4W5)GKS
+8WN)KH8
+N4R)39M
+4NY)14W
+19Q)ZG9
+W6W)J8C
+PWZ)4RW
+8F3)JBW
+BC8)F4N
+QG8)VDP
+YG1)GBY
+KRM)WJZ
+4HL)2TH
+W1V)FMT
+1BL)NC2
+RTN)R6C
+QLJ)PLT
+SQH)93Y
+KM7)9G2
+5Z3)JY8
+WB2)YSP
+3S1)4W5
+5BH)SXV
+28Q)5Q7
+PDZ)XD1
+D79)WHF
+6BJ)DQT
+5F8)C29
+46R)XNR
+NC2)2Y8
+T5B)863
+TJF)PDM
+L47)5QW
+F59)JX9
+RK6)QG8
+GD7)RWP
+863)7DK
+97R)LJF
+6N7)X32
+WLZ)XDM
+RXH)79K
+WG1)NQW
+BNR)1P5
+ZXV)QQF
+ZJX)GSZ
+X2C)L5L
+NVC)L2G
+T1F)FK2
+GGZ)KH3
+TZC)R9K
+157)FRV
+3CX)Z1J
+NS1)BGG
+MFW)36X
+DW3)C53
+88H)LP4
+FX4)F4M
+676)7BB
+9TR)Q3H
+P5H)Z1H
+LB1)XBR
+SWS)FLP
+4S4)QMC
+KNW)5LZ
+3PR)TVL
+JYK)46F
+ZM7)Z6T
+Q99)427
+5R1)MYP
+3TZ)YHB
+QPD)L6V
+HB8)K7P
+2W2)ZFX
+BS3)GWH
+953)S2C
+1BC)WKC
+S7X)9PL
+1RQ)KLD
+1XY)JRV
+D37)SF5
+PXD)P2C
+4L4)CVV
+MYP)2VZ
+WPW)SFQ
+N6H)8D7
+8B7)9RM
+297)Q93
+LNG)R64
+BXB)NSR
+DKC)MTV
+6C1)81V
+75N)21C
+XY7)THS
+BRG)YY2
+F37)RMV
+831)LYP
+M1P)GZ6
+ZXD)NR9
+6G1)35R
+H2V)51V
+Q9F)RRD
+FXW)3XX
+ZV3)CDP
+JC5)JGH
+Y73)KFX
+V6G)1W5
+7BB)DR7
+RN7)56M
+3GV)8X9
+HMM)41C
+JK4)V1D
+MFV)2J4
+QQW)H62
+N1R)CCC
+B5T)3GV
+G8D)8QM
+JNB)Z75
+8D7)ST5
+JXX)C1B
+G5Y)Y92
+G46)DW4
+3CQ)R9L
+FR9)Q83
+N6Q)JR4
+ZG2)S4Z
+JDC)NCF
+ZLX)2XW
+JJD)QLN
+YY2)FJ5
+Z3P)W7C
+LSB)N68
+64D)8BL
+PR9)J67
+N6X)M2F
+SQ3)XZ7
+MKW)KVM
+L61)PL4
+R2Z)2BF
+HGM)KQK
+222)RJQ
+4LC)PY4
+54C)N14
+MLR)Z7Z
+BBD)W1V
+JK1)32M
+SY1)3S1
+65N)3TK
+1X9)4HQ
+6F3)H6H
+489)GFB
+Y86)52L
+HN7)R1G
+48K)5MC
+4P3)Z6L
+CHT)8R9
+3M8)HKP
+RK6)PP4
+X77)V4D
+YDR)LCG
+DZP)3CY
+75T)TKM
+ZFK)5LQ
+6R6)8NV
+TVL)RHW
+HMN)BNR
+PG2)VN1
+FVQ)SQ5
+1HF)W5X
+WVY)TGX
+VYF)2N1
+BJS)LTJ
+72V)GCC
+8NV)BS3
+ZL5)P1H
+3KR)69D
+CZS)8WW
+4N2)72G
+KK2)JXX
+5Q7)KPZ
+4QP)HYV
+1SY)V7H
+CN4)JTP
+9TC)SVG
+K7P)T6S
+QFQ)999
+NGN)QKG
+BHR)DR4
+TGX)XPG
+DY3)YG1
+M5Z)PHZ
+KBQ)HVY
+9D2)N5J
+GMF)4LZ
+1P8)BFN
+GBY)KY4
+49M)LWB
+FNZ)FFS
+JL3)V2H
+LB5)7FK
+PM5)1BL
+PHZ)LH8
+NCF)YNR
+HSK)W6W
+5RJ)C95
+RPK)ZRK
+Y34)54N
+5QW)TZ5
+KGJ)43X
+P2V)Q9T
+NQZ)L7W
+WP4)S29
+J3S)C9G
+5C2)TX5
+3PM)PK2
+3GD)393
+CCD)3Z9
+QKQ)PB8
+FCN)LRS
+FQ4)M3T
+45B)B1T
+NPJ)MK3
+KGD)JJP
+F5Y)JKZ
+C6D)HSK
+TR9)7SS
+2TX)H73
+NFV)X5D
+C2V)43T
+M6T)KPS
+PK2)1CG
+TP1)N4Y
+1D5)D9Z
+MTR)97R
+3TK)X3W
+R7T)3VC
+PHP)1LV
+5GB)2H5
+YC1)24X
+S5H)W79
+FQS)JVF
+DML)6F3
+Z75)LXP
+DMJ)29G
+54N)GSS
+RWP)D79
+VBV)XWX
+VST)CMS
+GZ2)676
+N72)FP3
+792)ZJX
+H73)J17
+M8N)WQ4
+H6X)L5G
+3VC)LBC
+YBT)YR2
+LYC)4GX
+3VP)17F
+F5Y)9ZY
+8LD)BCM
+7JR)X45
+MV8)FY7
+JN6)31R
+MZ5)CVK
+239)S7Y
+DJ3)S7H
+RVK)6HK
+G85)WR5
+LKF)TZG
+SQ5)NP4
+HN8)H53
+CTW)MCJ
+8ZV)6YF
+2RQ)SR3
+MRR)Z4P
+WQ3)TYW
+6SW)L2J
+HFC)CTH
+N5M)1TK
+757)RDF
+R5Z)MHY
+NW9)V3P
+K3P)PWN
+GD7)GDL
+B2J)FN2
+BRJ)GK8
+S62)3NT
+9BH)38R
+KQK)WXW
+2LS)T8V
+4J1)5WT
+7J5)H3D
+W1B)F72
+F4N)NFK
+QCP)4HJ
+DWH)V5B
+87N)XY7
+F13)LWC
+7VH)67W
+PMG)DY4
+JMC)WQ3
+6HY)PTT
+YJ8)DML
+9CM)DM1
+54J)DNJ
+1Q6)8ST
+CKW)XS3
+ZKW)JPL
+111)YFN
+H6W)R5Z
+THS)X4J
+DTM)PWZ
+ZH5)8PG
+JR4)Z24
+NCN)8HF
+3BD)B8L
+76R)LN4
+N3K)97M
+JJG)N1H
+5JW)P48
+YJS)XMP
+4RW)T2Z
+D65)DNY
+KWM)ZGK
+5FY)9BK
+Y8J)7DR
+5PJ)1YW
+24L)PTB
+XTR)PJZ
+LLM)QSC
+R6Z)V6W
+H62)PQJ
+HT7)V18
+6CP)S3M
+WXW)N6J
+GJX)F5Y
+Q35)QY7
+3K8)F59
+8SX)SWS
+B2R)6N7
+R8H)CRP
+CGH)HFC
+NWC)QKQ
+P9D)BLW
+NK3)YLD
+CDP)2M4
+Q39)QB9
+F2J)X7D
+J79)QHD
+VXM)948
+X7D)GLP
+NP4)Q37
+69H)K1C
+FF1)65K
+P7X)YDW
+HTK)B6F
+273)CTT
+D25)164
+QGY)DXG
+G46)BMM
+QPQ)SZL
+HM7)G7X
+VMJ)J24
+5QS)RD6
+KVV)4CP
+6W2)8KQ
+1JP)PR9
+4B2)SF1
+FX4)NNP
+2N7)ZRC
+JQ8)N1W
+LKD)83V
+345)CJC
+HVF)QYT
+Y4H)7VH
+5LR)4MJ
+S2C)FSG
+V5B)BBN
+5X5)SJ1
+MKC)NPJ
+BWL)F39
+VDZ)Z27
+7GP)YB3
+8R9)R3N
+SQW)GNG
+3X8)V2B
+D89)SM1
+Z4P)RSN
+YB3)5LR
+V4C)1JP
+FGH)FF1
+GKS)R69
+M5V)H4X
+3CY)KXM
+G4S)D5H
+12P)1YK
+3Y2)R1V
+KTZ)DQW
+KD3)L2L
+KSL)F13
+R3Z)JKT
+G9Q)1D1
+2J4)5DZ
+X3V)MM8
+Z7Y)1BC
+G1J)G4S
+W4X)LFX
+YJ6)JMV
+FP5)KN7
+PCQ)8HR
+FN2)W8G
+31P)WFB
+YXX)CYB
+NXY)77B
+NCK)Z8K
+VPX)3TG
+CN3)JY5
+HXS)WQF
+FK3)DZS
+WFT)9DP
+XZ5)F1L
+639)T81
+R26)PCQ
+2VZ)YYD
+4S9)1PZ
+HVY)V4P
+K55)K8N
+2Y8)WMD
+69T)24L
+MHH)SRP
+WPS)YWV
+9PL)NHB
+D3B)KDT
+SHT)GJN
+42N)6MG
+K9F)YDT
+N2R)FVQ
+F3Q)296
+YML)8XQ
+6YF)B9B
+R13)Y64
+DNJ)DKW
+H44)ZTP
+1Q4)5JW
+RLM)BRJ
+LMJ)8HY
+CL4)LF1
+6GW)TMM
+VTP)JWQ
+TQL)G52
+3QN)VWR
+BFN)VPX
+T39)TSK
+Z1J)S3R
+F7V)XBX
+VNC)LW7
+WM8)788
+HBD)K9F
+JQL)JGJ
+3SV)WVN
+DM1)297
+VHQ)467
+PVJ)12P
+3GH)2M6
+6MG)KD3
+1NW)4GC
+VTJ)FKC
+Q8H)P86
+5QW)BXB
+ML7)V61
+94V)NK3
+XM4)TML
+V2P)5Y3
+CR6)JKG
+7LG)S9W
+8TX)V6G
+2JY)ZG2
+DVR)57Z
+VN1)Z2R
+ZC3)N2C
+SB6)RPW
+58W)1ZX
+VFP)X6C
+JQN)ZC3
+53Z)LQM
+KWL)TP1
+HKP)4BW
+S9T)Q19
+K2K)WD5
+WLM)YV4
+SFQ)4R1
+6KP)CTQ
+V3P)XDC
+CXM)MKC
+31Y)Z62
+XHT)L7R
+FK2)S52
+LVY)HFP
+RJQ)KV1
+9S2)2LR
+NZ8)DVR
+JKH)PG2
+ZQX)3TP
+81V)9CP
+42B)WDJ
+7PB)S68
+39C)6C1
+RR8)KSZ
+XL4)RTN
+3XH)RYQ
+78Q)TP3
+GCD)5YQ
+R29)LVG
+Q3H)646
+TMM)ZLX
+4B2)WDB
+6N5)449
+3XL)NFV
+CDL)6JS
+TMC)B7C
+R1W)ZWC
+LH3)XJC
+CHH)DFJ
+1FN)MLQ
+LMT)658
+HK8)BN1
+73R)1GP
+ZQ6)6B4
+Z5X)D37
+YPG)GTK
+8SM)VL6
+W5C)C6D
+4BW)YS6
+DYP)2TX
+R9K)BRN
+KS9)L9J
+XTJ)B25
+Y23)CHB
+NHB)LG4
+L5L)7Z4
+DRK)9SL
+ST5)NVC
+2WH)DTM
+1LV)SDM
+788)256
+TW7)6TN
+6FW)3CX
+BG9)4Y9
+67W)JJ7
+2D4)FR9
+Z8K)F1J
+LTJ)31P
+R94)YJ8
+5PT)MPX
+9SL)LGR
+FKZ)9G6
+DR7)SGZ
+SM7)9KY
+TKH)8MF
+VXB)4N2
+XQR)W38
+21F)HK8
+Y3H)XLM
+DBW)M8W
+11H)853
+1WS)66W
+DW4)KNK
+NQV)SVB
+6ZZ)8YP
+ZWC)5PL
+PP4)3CQ
+T8V)THM
+J1J)HMK
+CPB)Y7G
+GYH)9BH
+WPK)FMS
+95D)FJW
+HM7)CJJ
+ZGS)LBV
+HMK)BZC
+2BF)DWS
+LWC)85N
+L3B)M1P
+7C2)WG3
+3ZK)7BM
+GDK)8XJ
+LGJ)4R6
+DL1)JSJ
+44B)6T9
+KFT)CXM
+Q4P)STR
+LBC)6ZD
+GDK)STH
+6MX)F2P
+Y92)21F
+6ZD)YYQ
+HYK)58W
+3YF)KNM
+X9G)8K2
+QWN)JQN
+17F)KTZ
+CJ4)62Y
+KQW)GMF
+15N)S9T
+G1V)GMK
+M62)X6J
+8V9)SVZ
+WW8)DJ9
+FP3)28Q
+PMX)F3Q
+N3G)56Q
+46F)ZN3
+D3M)S3P
+D64)LVY
+72Y)ZHM
+LPH)WLM
+HY1)HZL
+L3D)QPD
+Q9T)X6Z
+6HG)3DJ
+KBP)9TR
+25C)9Z8
+ZR9)RYK
+TJR)5C2
+56M)X4Y
+TL2)5CL
+939)ZVH
+595)DTF
+Z27)D25
+54T)MWM
+ZBL)W4F
+6JS)H7H
+YWV)QWN
+5D9)S5H
+P96)KZ1
+TDQ)8JZ
+NQW)VHQ
+K9L)DMJ
+H6W)8F6
+2TJ)8NJ
+MCJ)T1P
+M94)JNB
+5ZJ)9BG
+KCL)RS7
+X6J)ZGQ
+PQQ)JN6
+S2K)5FK
+K7N)X2Q
+HTQ)GW4
+LTJ)RPK
+DD2)8J5
+7NX)Z2N
+6LR)R3D
+YR2)7Y7
+JBS)CZW
+ZRK)XJ8
+4L5)3XF
+GJ2)FNZ
+XTP)YCS
+HRP)P5H
+BRJ)J89
+RD6)ZR3
+YNZ)N8F
+2N1)XGH
+JDL)DLD
+YLD)94B
+ZNV)1Q6
+6TG)CR6
+GMW)KWL
+TZR)698
+RDG)VGN
+F1D)5X5
+3CT)6CH
diff --git a/2019/inputs/day_7.txt b/2019/inputs/day_7.txt
new file mode 100644
index 0000000..b21d6af
--- /dev/null
+++ b/2019/inputs/day_7.txt
@@ -0,0 +1 @@
+3,8,1001,8,10,8,105,1,0,0,21,46,59,84,93,110,191,272,353,434,99999,3,9,101,2,9,9,102,3,9,9,1001,9,5,9,102,4,9,9,1001,9,4,9,4,9,99,3,9,101,3,9,9,102,5,9,9,4,9,99,3,9,1001,9,4,9,1002,9,2,9,101,2,9,9,102,2,9,9,1001,9,3,9,4,9,99,3,9,1002,9,2,9,4,9,99,3,9,102,2,9,9,1001,9,5,9,1002,9,3,9,4,9,99,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,99
diff --git a/2019/inputs/day_8.txt b/2019/inputs/day_8.txt
new file mode 100644
index 0000000..21110e8
--- /dev/null
+++ b/2019/inputs/day_8.txt
@@ -0,0 +1 @@
+211202121222222222221222212222202022222222222122221220222222222222222222222202222222222222122121022222212222222222212212222222210222202212222222012222200222021222222222220222222222202222222222222022220221222222222222222222222222222222222222022022022222222222222222222212222222221222222202220222202222220202021222222222221222202222212222222222222122222220222222222222222222222222222222222222122220022222212222222222202222222222220222202212221222102222211202020222222222221222222222212222222222222022220221222222222222222222222212222222222222122022122222202222222222212202222222212222202212222222202222220222022222222222221222212222202022222222222222221220222222222222222222222212222222222222022122222222222222222222202202222222220222222202222222212222210002122222222222221222212222222022222222222122221221222222222222222212222202222222222222022220222222202222222222212222222222221222222222220222112222211012121222222222222222222222222221222222222122220222222222222222222212222212222222222222022120222222222222222222212202222222221222212202221222122222212122121222222222222222212222122022222222222222221220222222222222222212222212222220222222122021022222222222222222212202222222221222222202220222102222200212020222022222222222212222012221222222222122221221222222222222222212222202222222222222222121122222212222222222212212222222221222212222222222111222212022021222122222220222202222022022222222222122220221222222222222222202222222222222222222122120222222222222222222202212222222210222212212221222020222201222222222022222222222222222122222222222222022221220222222222222222202222212222222222222222222022222222222222222202222222222221222212202221222002222220202020222122222220222202222112221222222222022220222222222222222222222222212222220222222022120022222212222022222202202222222200222202202221222210222220022122222222222222222212222022021222222222222220221222222222222222202222202222221222222222020122222212220122222202212222222201222202212221222112222220002222222022222220222222222122121222222222022222221222222222222222212222202222201222222222120222222222221222222222202222222212222202222220222101222200212021222022222221222202222122222222222222222221220222222222222222222222212222210222222022022122222222220022222202202222222222222222222222222220222221022022222122222220222222222012020222220222122220221222222222222222212222212222212222222222220022222212222022222212222222222212222212212221222011222222012022222122222220222202222220122222222222122220221222222222222222222222212222221222222122020022222222222222222222222222202220222202212220222022222212102221222122222222222202222112021222222222022222220222222222222222222222222222202222222022120020222212221022222202202222212210222212202220222211222210102220222222222220222222222120122222222222022220220222222222222222222222222222202222222222222120222222220122222222202222202200222202222222222220222200012022222122222220222202222220122222222222122220222222222222222222202222212222220220222122122022222212222022222222222222202201222212212221222221222212122221222022222220222200222112022222222222222220020222222222222222202222202222220221222222020222222202221122222212212222212212222222212221222212222211012221222022222222222220222201121222220222022222021222222222222222212222222222200221222122220221222202220122222222202222222211222222202220222022222212002120222222222220222220222100222222221222022222122222222202222222212222212222221222222022121122222202222022222202202222212200222222202220222010222212102222222002222221222221222011022222222222022222120222222202222222222222212222210221222022221021222212220222222202212222212202222222202220222001222220012020222112222222222221222121122222220222122220020222222212222222212222212222220222222122022221222202220022222222202222222210222202202220222010222211022120222212222221222220222202120222221222122221122222222220222222202222202222210221222222221122222222220022222202212222202201222202212220222012222200212022222122222222222222222212222222222222122220121222222210222222202222212222201220222122121122222222222022222222222222212210222212212220222200222200012122222112222221222202222201220222222222222221221222222201222222212222222222210220222222122121222222221022222222222222212220222202212220222202222202012220222212222220222201222010121222220222222220020222222201222222212222212222220220222222122221222222221022222202202222202202222212222220222211222201112021222012222220222221222101121222220222222221121222222201222222212222202222022220222022221122222222222122222212222222222201222222222222222220222201202122222102222222222201222102220222222222122220222222222220222222222222202222211222222122120221222212221122222212202222202200222222222222222020222222222121222222222222222212222012021202222222022220021222222222222222202222222222200220222022221020222212220122222202222222222221222222212220212220222210122220222222222222222212222110222212220222222220021222222212222222222222212222001221222122020021222212222022222202202222212212222222202222212102222210022121222102222121222210222021121202221222122221022222222210222222222222202222001221222222121120212222220022222202212222202220222222212222212012222200022221222022222020222200222222122222221222022222122222222201222222202222202222110222222122221121222202221222222222202222222222222222202222212220222220202121222222222121222201222111221212221222022220120222222210222222202222212222202222222020021020202212222122222202212222202211222222202221212002222212122222222022222121222202222102121212221222022220022222202200222222212220222222211222222121221021222222221022222202222222222212222222202222212010222202102121222022222120222220222201021202222222022222222222222220222222212221212222200221222122221120222212221122222222222222202201222222212222212222222221222120222002222121222201222100021222221222222222120222212211222222222222202222001221222022020122210222221022222222212222222212222202222222212120222202022221222122202122222221222002221212222222022222222222202200222222212220222222111221222122221220210212221022222222202222212202222212212221222010222222102222222002220020222210222212120222222222022220022222202212222222222222212222002222222220121221210202221122222212212222222222222202202222202122222200222111222122220122222210222000020202221222022222221222222222222222202222212222211220222022220020212222220222222212212222222211222212212220202200222222102112222222222222222221222112021222221222222221222222222200222222202221222222212221022020220022220202222122222222202222210222222212202222202122222220112100222002200020222212222010120202220222022221020222212210222222202220202222011220220121121022022222221222222202212222222222222202222220222221222211012110222102221021222222222200220002222222022220121222212201222222202222212222212222221120220020121202222222222222202222222220222222212222202210222200022210222212220122222221222012220102220222222022221222212222222222202221212222021222022122222121012212222022222222222222200222222212212222212202222221102110222012212122222220222001222202221222222120021222212201222222212222222222011221120020221220111202220022222222202222201221222222222220202110222202012021222122220020222202222121220002222222122122122222222222222222212221212222220221122120020221110202222122222222212222212210222212112222222010222200112110222022222121222221222212020002220222222222121222202211222222212220202222222222220122120121011222221222222202202222222220222212102221222101222210222002222110221222202211222001021022222222022121220222212221222222222220222222012221121121021020121202220221222202212222001220222212112222202210222220212101222110211020222202222000220022222222122020222222222221222222222220222222022221122121121222002222221221222222202222210210222212212222202101222211102022222100220120212220222010020102220222222020222222222211222222202220222222221220121001022021110222221221222222222222011222222222022221202000222221022201222200221221010200222011220202220222022220220222212202222222222221222222212221220221220021210202221120222202012222112221222222022220202111222222102112222200220121110202222011020112221222222122101222212220222222202222202222101222222121122220001212221121222222202222220222222202112221222200212212112110222201201020101220222000220002221222022220011222212211222222202222202222012222122001122022210222220222222222022222222220222212102221222120202221202010222011201220010212222001221212220222122121100222222222222222212220212221001220221001120220221212221120222212002222010212222212222220202200212212112022222020220022001201222000020222222222122121002222202220222222212222202221200222220112120122211222222122222222212222012210222202212221212121212201202110222002200220211201222210022222220222122222010222222222222222222220212222122220222222122122200222221122222222012222221201222222112221212002212211022212222122211121222210222212222112222222022222211222220210222222222221222222102221221211022121110222222020222222012222201212222212202221212110222202102021222210211222210221222010020212021222022221021222200212222222222221202200111221121110122021020202221222222222202222022121222212012220212212212202212122222021220020120222222202122102220222122021211222201111222222222221212220101222022200022120002222222220222222002222022110222202202221222202222212202221222120220021210202222020122102020222022020102222220112022222202220202210100222122221122022202202222221222212012222110001222212202221212202212222212100222220211121101220222210021002122222022222222222212102222222202221222200002221020021022022002212222121222212112222100100212212112222202212222212002220220100211220102211222020021012120222022221222222211222022222202220212220102221021111020021201202220120222202222222012200212202102221212212202211022221222121212020221210222210100202222222122220212222201102022222222220212202000221222202222120212212221122222212102222111010222212122222202210212212002120221202221222002200222212020022221222022120000222210211122222202221212220012222022212020121120212222222222202112222111011202202022220202220212212002201220002212021002200222122222112221222122121222222210211222222222220222200111221020122122022121202220121222222022222220210212222022222222020222202022102221222202120112212222200112212020222122122111222212020222222202220212211101221222211221220120202220120222212102222120222222202102222222021202221122212222010210021122210222102120022220222122222210222202220122222202220222220001222020211220220020212220221022212222122010102212212222221202112222220002220221101212221021211222221200202021222222222012222221011222222222220222220222221120112221221012212220122222212022122122101222202022221212020212210022112221000220221102221222100120022221222022022001222210212022222222220222202220222222120121022002202221220222212012122200201202222202222222210212201012011221020221222212222222200220202122222022220102222222011222222212222222202012221221100221121212212222222122212112122222002202202112222222002212202212212221112220221111211222201000122121222122022020222201010222222202222212202221220122120120120120212221021222202012122021021212222112222212112210200122222220002212220112210222110021012022222222021021222212011122222222220202220110221020202121022212202221022022212212222101020222202202222222000222201202110221200222222010201212200221222022222222020000222201112222222220221212222012221120111220022102212221122122222112222012122222222122221202200222212122101221210210022001221222112122222122222122221111222212002222222210221212201120211021110120021201222222021022202022022101000222200022222212120220201212210221210222220222220212011221202220222222122000222210120022222220221202222021210020120120020221222221221122222122222202222222201022221210112212222122122220110202121112202222210022112022222122020122021210212222222011221222210010221222221022222121222221120122222122022012022202202012222222210200201002012221012221020200220202120211102222222222022110022202001122222112220212211120221222200221021020212220222122222112122201111202212102221220010200211002101221111211120121222212120102222022222222022000222212220022222021222212221012212122120021021100202222022222212012222002221222000002221212121201220222010222012210122002211202202201202020222222121101212202112122222212221102211011222120012221221210222221222122202122122212122202022102222202010221201002010221121210020102211222210220112021222122020221200210202222222200222122221200201222121122221112202222121022202022122001102222022112221220120222201212200221011200221212220202200211102020222022122212101221022022221122220112210220212220112222121012222222222222212012022201202212122212200200122210211122100222002210021201200222212202012021222222120112001220220122221102220012221201220221120002022011202221220022202212122210002202001202220212110222222002201221111222221220200212122022222220222222020120010211200022222212221212202110210222110000221120222220220222222102022122211222010222211221202202220112001222010211201201211222112002222220212222220112202221122222220101020022002211202221112210022212022220021120212202122122220222122001202222012201202102100221112210110120210212222111222222212022020111000222122022221202220002111220212121222222221020102222222222212222222222001222020022211221221200221012212220222202212101211222120010222121200022020200002210210222222102221022200220222020210212201101202221121021202122122220110212101100220220101202210202201220121200102211210212201122022020201022020000221202200122221011222012001022221022002211101122122221222120202202222222101212212201210220202211212102222222200200012220011212121100022222201122021212200201001122222022020012120011002222021201010021122221121022202122122110122222211021220200212202222222220221020200001011010202122210002020202022021012002202201222220011022110210112121221222112102000122221220220220012222102002202101112221211222210222222020022210210120112200222211111122021220122022002000211020022222010020022201021221121000100000202212221022021212112222202112212222222200221021200222102100121121221221010212202102200012220212120022212102222011022220220220211200121211220211001122222102221221020202202222010121212200100221202012222212112011222020210010010221212122200102022220221020002000212022122221202021122000112210021200010000210222220120121201122222021102212102111222201121202201202002020120200201212110202101010102022200121222211012221121122221000122021100210212222122211220212102221020122210202222110002212200011201200021201220022012110200222202010110002212220010120010022120110012200120022222122021212000212022122022010021101012221222020212102122120000212202002202202222222210012200102200200111220022112012202102021122021120011121200020122220001221102112201201020102122212202112220122122212222022110111222010201211210002212202112020020222212100211112122120200002020201020021202021200200022222010120111011000012120121101212002212222122121200022022212122202211001220201122201201012022011111200001112022002112002200220221121202120002212010122222010222121211010100220111112122101222222021021211212122121120212202000200210112220002211221002010102121110201000000011200112100002201220112102201101001200002222202202212002201221110202000102001202000200100102121000220100101111222110
diff --git a/2019/inputs/day_9.txt b/2019/inputs/day_9.txt
new file mode 100644
index 0000000..6ec0b92
--- /dev/null
+++ b/2019/inputs/day_9.txt
@@ -0,0 +1 @@
+1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1101,0,3,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1102,23,1,1004,1102,1,26,1000,1102,897,1,1028,1101,27,0,1012,1102,33,1,1001,1102,32,1,1007,1101,39,0,1005,1101,0,29,1018,1101,0,0,1020,1101,1,0,1021,1101,0,21,1002,1102,1,35,1014,1101,0,36,1009,1102,1,38,1006,1102,1,251,1024,1102,28,1,1017,1102,37,1,1008,1102,1,329,1026,1102,25,1,1011,1102,31,1,1013,1102,892,1,1029,1102,242,1,1025,1102,1,881,1022,1102,22,1,1003,1102,874,1,1023,1101,20,0,1016,1101,24,0,1019,1101,0,326,1027,1101,0,34,1015,1102,1,30,1010,109,-2,2102,1,7,63,1008,63,36,63,1005,63,205,1001,64,1,64,1105,1,207,4,187,1002,64,2,64,109,9,21101,40,0,6,1008,1013,43,63,1005,63,227,1105,1,233,4,213,1001,64,1,64,1002,64,2,64,109,26,2105,1,-9,4,239,1001,64,1,64,1106,0,251,1002,64,2,64,109,-15,1205,2,263,1105,1,269,4,257,1001,64,1,64,1002,64,2,64,109,-9,2102,1,0,63,1008,63,36,63,1005,63,295,4,275,1001,64,1,64,1106,0,295,1002,64,2,64,109,-14,1207,10,38,63,1005,63,311,1105,1,317,4,301,1001,64,1,64,1002,64,2,64,109,28,2106,0,4,1106,0,335,4,323,1001,64,1,64,1002,64,2,64,109,-8,1206,6,351,1001,64,1,64,1106,0,353,4,341,1002,64,2,64,109,-1,2107,33,-7,63,1005,63,369,1106,0,375,4,359,1001,64,1,64,1002,64,2,64,109,-9,2108,26,-1,63,1005,63,395,1001,64,1,64,1106,0,397,4,381,1002,64,2,64,109,3,1201,-2,0,63,1008,63,38,63,1005,63,419,4,403,1105,1,423,1001,64,1,64,1002,64,2,64,109,-13,2101,0,9,63,1008,63,23,63,1005,63,445,4,429,1105,1,449,1001,64,1,64,1002,64,2,64,109,11,1208,1,32,63,1005,63,471,4,455,1001,64,1,64,1106,0,471,1002,64,2,64,109,17,21108,41,38,-4,1005,1019,487,1105,1,493,4,477,1001,64,1,64,1002,64,2,64,109,6,1206,-9,511,4,499,1001,64,1,64,1106,0,511,1002,64,2,64,109,-23,21102,42,1,8,1008,1014,42,63,1005,63,533,4,517,1106,0,537,1001,64,1,64,1002,64,2,64,109,-3,2107,36,5,63,1005,63,555,4,543,1106,0,559,1001,64,1,64,1002,64,2,64,109,-6,1202,5,1,63,1008,63,21,63,1005,63,581,4,565,1106,0,585,1001,64,1,64,1002,64,2,64,109,1,1208,10,40,63,1005,63,605,1001,64,1,64,1106,0,607,4,591,1002,64,2,64,109,7,1201,0,0,63,1008,63,42,63,1005,63,631,1001,64,1,64,1106,0,633,4,613,1002,64,2,64,109,1,21107,43,42,7,1005,1013,649,1105,1,655,4,639,1001,64,1,64,1002,64,2,64,109,7,21108,44,44,3,1005,1016,677,4,661,1001,64,1,64,1106,0,677,1002,64,2,64,109,-7,21102,45,1,9,1008,1015,44,63,1005,63,701,1001,64,1,64,1106,0,703,4,683,1002,64,2,64,109,13,21101,46,0,-7,1008,1012,46,63,1005,63,729,4,709,1001,64,1,64,1105,1,729,1002,64,2,64,109,-13,2101,0,3,63,1008,63,33,63,1005,63,753,1001,64,1,64,1106,0,755,4,735,1002,64,2,64,109,14,1205,1,773,4,761,1001,64,1,64,1105,1,773,1002,64,2,64,109,-23,1202,10,1,63,1008,63,30,63,1005,63,797,1001,64,1,64,1105,1,799,4,779,1002,64,2,64,109,13,2108,22,-7,63,1005,63,817,4,805,1106,0,821,1001,64,1,64,1002,64,2,64,109,-11,1207,5,24,63,1005,63,843,4,827,1001,64,1,64,1105,1,843,1002,64,2,64,109,11,21107,47,48,7,1005,1017,861,4,849,1106,0,865,1001,64,1,64,1002,64,2,64,109,15,2105,1,-2,1001,64,1,64,1106,0,883,4,871,1002,64,2,64,109,10,2106,0,-7,4,889,1106,0,901,1001,64,1,64,4,64,99,21102,1,27,1,21102,1,915,0,1105,1,922,21201,1,28510,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21102,1,942,0,1106,0,922,22102,1,1,-1,21201,-2,-3,1,21101,957,0,0,1106,0,922,22201,1,-1,-2,1105,1,968,21202,-2,1,-2,109,-3,2106,0,0
diff --git a/2019/readme.org b/2019/readme.org
new file mode 100644
index 0000000..c674de4
--- /dev/null
+++ b/2019/readme.org
@@ -0,0 +1,26 @@
+* Advent of Code 2019
+
+** Personal challenge
+
+Try to keep the solution pure. Only main can do IO things, like return
+different results when it's called differently. The rest of the
+program should only be pure expressions.
+
+** Optimizations
+
+- Limit the use of statements. Try to use expressions instead, or move
+ the statement out to a function.
+
+** Findings
+
+- Having iterators that you can't clone (like stdin) makes certain
+ things difficult. Eg, doing part 1 and 2 together.
+- Using "new type" structs can be a pain. derive_more crate made most
+ of that pain go away.
+- With immutable types, 'reset the machine to try again' type
+ constraints were handled for free. This made many later puzzles easier.
+- The 'no statement' constraint meant that some functions ended up
+ nested in a way that makes it harder to name and read.
+- The persistent data structures don't integrate with Rayon iterators.
+- Easier to test subsets, but harder to inspect and audit runtime behaviour.
+- Although it isn't frequently used, Rust supports functions inside functions.
diff --git a/2019/src/bin/day_1.rs b/2019/src/bin/day_1.rs
new file mode 100644
index 0000000..572d287
--- /dev/null
+++ b/2019/src/bin/day_1.rs
@@ -0,0 +1,93 @@
+use derive_more;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 1: The Tyranny of the Rocket Equation")]
+/// Calculates the fuel needed for your rocket to save Santa.
+///
+/// The weight of each module is read from stdin, one module weight
+/// per line. See https://adventofcode.com/2019/day/1 for details.
+struct Opt {
+ /// Includes the weight of fuel
+ #[structopt(short = "i", long = "include-fuel-weight")]
+ include_fuel_weight: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let input = stdin.lock().lines().map(|l| match l {
+ Ok(s) => match s.parse::<Module>() {
+ Ok(module) => module,
+ Err(e) => {
+ eprintln!("Invalid input \"{}\": {}", s, e);
+ process::exit(1);
+ }
+ },
+ Err(e) => {
+ eprintln!("Error reading input: {}", e);
+ process::exit(1);
+ }
+ });
+
+ println!("{}", fuel_required(input, opt.include_fuel_weight))
+}
+
+fn fuel_required(it: impl Iterator<Item = Module>, include_fuel_weight: bool) -> Fuel {
+ it.map(if include_fuel_weight {
+ Module::fuel_including_fuel_weight
+ } else {
+ Module::fuel_excluding_fuel_weight
+ })
+ .sum()
+}
+
+#[derive(Debug, derive_more::FromStr, Clone, Copy)]
+struct Module {
+ weight: Weight,
+}
+
+impl Module {
+ fn fuel_excluding_fuel_weight(self) -> Fuel {
+ self.weight.required_fuel()
+ }
+
+ fn fuel_including_fuel_weight(self) -> Fuel {
+ iter::successors(Some(self.weight.required_fuel()), |fuel| {
+ if fuel.is_zero() {
+ None
+ } else {
+ Some(fuel.weight().required_fuel())
+ }
+ })
+ .sum()
+ }
+}
+
+#[derive(Debug, derive_more::FromStr, Clone, Copy)]
+struct Weight(u32);
+
+impl Weight {
+ fn required_fuel(self) -> Fuel {
+ Fuel((self.0 / 3).saturating_sub(2))
+ }
+}
+
+#[derive(Debug, derive_more::Add, derive_more::Sum, Clone, Copy, derive_more::Display)]
+struct Fuel(u32);
+
+impl Fuel {
+ fn weight(self) -> Weight {
+ Weight(self.0)
+ }
+
+ fn is_zero(self) -> bool {
+ self.0 == 0
+ }
+}
diff --git a/2019/src/bin/day_10.rs b/2019/src/bin/day_10.rs
new file mode 100644
index 0000000..f25c3d2
--- /dev/null
+++ b/2019/src/bin/day_10.rs
@@ -0,0 +1,158 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::iter::FromIterator;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 10: Monitoring Station")]
+/// Finds the asteroid with the best view of the other asteroids. If
+/// an n is provided, then it will print the nth asteroid destroyed by
+/// a laser from the asteroid with the best view. Otherwise, it will
+/// print the number of asteroids visible.
+///
+/// Takes a map of asteroids in on stdin.
+///
+/// See https://adventofcode.com/2019/day/10 for details.
+struct Opt {
+ /// indexed from 0
+ #[structopt(short = "n")]
+ n: Option<usize>,
+}
+
+fn main() {
+ let opt = Opt::from_args();
+ let stdin = io::stdin();
+ let map: AsteroidMap = stdin
+ .lock()
+ .lines()
+ .map(|l| exit_on_failed_assertion(l, "Error reading input"))
+ .collect();
+
+ match opt.n {
+ Some(n) => println!("{:?}", map.nth_destroyed_asteroid(n)),
+ None => println!("{}", map.best_asteroid_line_of_sight_count()),
+ };
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug)]
+struct AsteroidMap {
+ asteroids: Vec<Asteroid>,
+}
+
+impl FromIterator<String> for AsteroidMap {
+ fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
+ AsteroidMap {
+ asteroids: iter
+ .into_iter()
+ .enumerate()
+ .flat_map(move |(y, line)| {
+ line.chars()
+ .enumerate()
+ .map(move |(x, c)| (x, y, c))
+ .collect::<Vec<_>>()
+ })
+ .filter(|(_x, _y, c)| *c == '#')
+ .map(|(x, y, _x)| Asteroid {
+ x: x as i32,
+ y: y as i32,
+ })
+ .collect(),
+ }
+ }
+}
+
+impl AsteroidMap {
+ fn best_asteroid_line_of_sight_count(&self) -> usize {
+ self.optimal_view_asteroid()
+ .map(|a| self.count_visible_from(&a))
+ .unwrap_or(0)
+ }
+
+ fn nth_destroyed_asteroid(&self, n: usize) -> Option<Asteroid> {
+ self.optimal_view_asteroid()
+ .and_then(|source| self.nth_destroyed_asteroid_from(&source, n))
+ }
+
+ fn nth_destroyed_asteroid_from(&self, source: &Asteroid, n: usize) -> Option<Asteroid> {
+ if self.asteroids.len() - 1 < n {
+ None
+ } else if self.count_visible_from(source) >= n {
+ sort_by_key(
+ self.asteroids
+ .iter()
+ .filter(|b| self.has_line_of_sight(source, b)),
+ |b| (source.angle_to(b) * 100000.) as i32,
+ )
+ .nth(n)
+ .cloned()
+ } else {
+ self.remove_visible_to(source)
+ .nth_destroyed_asteroid_from(source, n - self.count_visible_from(source))
+ }
+ }
+
+ fn optimal_view_asteroid(&self) -> Option<Asteroid> {
+ self.asteroids
+ .iter()
+ .max_by_key(|a| self.count_visible_from(a))
+ .cloned()
+ }
+
+ fn count_visible_from(&self, a: &Asteroid) -> usize {
+ self.asteroids
+ .iter()
+ .filter(|b| a != *b && self.has_line_of_sight(a, b))
+ .count()
+ }
+
+ fn remove_visible_to(&self, source: &Asteroid) -> AsteroidMap {
+ AsteroidMap {
+ asteroids: self
+ .asteroids
+ .iter()
+ .filter(|b| self.has_line_of_sight(source, b))
+ .cloned()
+ .collect(),
+ }
+ }
+
+ fn has_line_of_sight(&self, a: &Asteroid, b: &Asteroid) -> bool {
+ a != b
+ && !self.asteroids.iter().any(|c| {
+ a != c
+ && b != c
+ && a.angle_to(b) == a.angle_to(c)
+ && a.distance_squared(b) > a.distance_squared(c)
+ })
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+struct Asteroid {
+ x: i32,
+ y: i32,
+}
+
+impl Asteroid {
+ fn angle_to(&self, other: &Asteroid) -> f32 {
+ ((self.x as f32 - other.x as f32).atan2(other.y as f32 - self.y as f32)
+ + std::f32::consts::PI)
+ % (2. * std::f32::consts::PI)
+ }
+
+ fn distance_squared(&self, other: &Asteroid) -> i32 {
+ (self.x - other.x).pow(2) + (self.y - other.y).pow(2)
+ }
+}
diff --git a/2019/src/bin/day_11.rs b/2019/src/bin/day_11.rs
new file mode 100644
index 0000000..da3e1fd
--- /dev/null
+++ b/2019/src/bin/day_11.rs
@@ -0,0 +1,205 @@
+use aoc2019::*;
+use rpds::list;
+use rpds::list::List;
+use rpds::RedBlackTreeMap;
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 11: Space Police")]
+/// Calculates how many blocks a painting robot would paint.
+///
+/// Takes the program to run on the robot in on stdin.
+///
+/// See https://adventofcode.com/2019/day/11 for details.
+struct Opt {
+ /// debug mode prints the size of the painted area on a black background
+ #[structopt(short = "d", long = "debug")]
+ debug: bool,
+}
+
+fn main() {
+ let opt = Opt::from_args();
+ let stdin = io::stdin();
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let finished_robot = exit_on_failed_assertion(
+ Robot::new(program, !opt.debug).execute(),
+ "Robot encountered an error",
+ );
+ if opt.debug {
+ println!("{}", finished_robot.canvas.size());
+ } else {
+ println!("{}", finished_robot);
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Robot {
+ program: IntcodeProgram,
+ position: (i32, i32),
+ facing: Direction,
+ canvas: RedBlackTreeMap<(i32, i32), bool>,
+ background: bool,
+}
+
+impl fmt::Display for Robot {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ (self.min_white_y()..=self.max_white_y())
+ .map(move |y| {
+ (self.min_white_x()..=self.max_white_x())
+ .map(move |x| (x, y))
+ .map(|coord| self.canvas.get(&coord).cloned().unwrap_or(self.background))
+ .map(|c| write!(f, "{}", if c { '#' } else { ' ' }))
+ .collect::<fmt::Result>()
+ .and_then(|_| writeln!(f, ""))
+ })
+ .collect()
+ }
+}
+
+#[derive(Debug, Clone)]
+enum Direction {
+ Up,
+ Down,
+ Left,
+ Right,
+}
+
+impl Robot {
+ fn new(program: IntcodeProgram, background: bool) -> Robot {
+ Robot {
+ program: program.run_to_termination_or_input(),
+ position: (0, 0),
+ facing: Direction::Up,
+ canvas: RedBlackTreeMap::new(),
+ background,
+ }
+ }
+
+ fn execute(&self) -> Result<Robot, IntcodeProgramError> {
+ iter::successors(Some(self.clone()), |robot| Some(robot.next()))
+ .find(|robot| {
+ robot.program.error.is_some()
+ || (robot.program.halted && robot.program.output.is_empty())
+ })
+ .unwrap() // infinite iterator won't terminate unless this is Some
+ .as_result()
+ }
+
+ fn as_result(&self) -> Result<Robot, IntcodeProgramError> {
+ match self.program.error {
+ Some(ref error) => Err(error.clone()),
+ None => Ok(self.clone()),
+ }
+ }
+
+ fn next(&self) -> Robot {
+ match (
+ self.program.output.get(0).map(intcode_to_bool),
+ self.program.output.get(1).map(intcode_to_bool),
+ ) {
+ (Some(paint), Some(rot)) => Robot {
+ program: self
+ .program
+ .with_cleared_output()
+ .with_input(list![bool_to_intcode(
+ self.canvas
+ .get(&self.facing.rotate(rot).move_position(self.position))
+ .cloned()
+ .unwrap_or(self.background),
+ )])
+ .run_to_termination_or_input(),
+ position: self.facing.rotate(rot).move_position(self.position),
+ facing: self.facing.rotate(rot),
+ canvas: self.canvas.insert(self.position, paint),
+ background: self.background,
+ },
+ _ => Robot {
+ program: self
+ .program
+ .with_input(list![bool_to_intcode(
+ self.canvas
+ .get(&self.position)
+ .cloned()
+ .unwrap_or(self.background),
+ )])
+ .run_to_termination_or_input(),
+ ..self.clone()
+ },
+ }
+ }
+
+ fn min_white_x(&self) -> i32 {
+ self.white_blocks().map(|(x, _y)| x).min().unwrap_or(0)
+ }
+ fn min_white_y(&self) -> i32 {
+ self.white_blocks().map(|(_x, y)| y).min().unwrap_or(0)
+ }
+ fn max_white_x(&self) -> i32 {
+ self.white_blocks().map(|(x, _y)| x).max().unwrap_or(0)
+ }
+ fn max_white_y(&self) -> i32 {
+ self.white_blocks().map(|(_x, y)| y).max().unwrap_or(0)
+ }
+
+ fn white_blocks<'a>(&'a self) -> impl 'a + Iterator<Item = (i32, i32)> {
+ self.canvas
+ .iter()
+ .filter(|(_, val)| **val)
+ .map(|(coord, _)| coord)
+ .cloned()
+ }
+}
+
+impl Direction {
+ fn rotate(&self, clockwise: bool) -> Direction {
+ use Direction::*;
+
+ if clockwise {
+ match self {
+ Up => Right,
+ Right => Down,
+ Down => Left,
+ Left => Up,
+ }
+ } else {
+ match self {
+ Up => Left,
+ Left => Down,
+ Down => Right,
+ Right => Up,
+ }
+ }
+ }
+
+ fn move_position(&self, position: (i32, i32)) -> (i32, i32) {
+ use Direction::*;
+ match self {
+ Up => (position.0, position.1 + 1),
+ Down => (position.0, position.1 - 1),
+ Left => (position.0 - 1, position.1),
+ Right => (position.0 + 1, position.1),
+ }
+ }
+}
diff --git a/2019/src/bin/day_12.rs b/2019/src/bin/day_12.rs
new file mode 100644
index 0000000..7e42f4c
--- /dev/null
+++ b/2019/src/bin/day_12.rs
@@ -0,0 +1,205 @@
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::num::ParseIntError;
+use std::ops;
+use std::process;
+use std::str::FromStr;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 12: The N-Body Problem")]
+/// Simulates N bodies, physically interacting
+///
+/// See https://adventofcode.com/2019/day/12 for details.
+struct Opt {
+ #[structopt(short = "n")]
+ n: Option<u64>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let planets: Vec<Planet> = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(x.parse::<Planet>(), "Input was not a valid planet"))
+ .collect();
+
+ match opt.n {
+ Some(n) => println!("{}", energy(simulate_planets_n_iterations(planets, n))),
+ None => println!("{}", simulate_planets_to_duplicate(planets)),
+ };
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn energy(planets: Vec<Planet>) -> i32 {
+ planets.into_iter().map(|p| p.energy()).sum()
+}
+
+fn simulate_planets_n_iterations(planets: Vec<Planet>, n: u64) -> Vec<Planet> {
+ simulate_planets_iter(planets)
+ .find(|(i, _)| *i == n)
+ .unwrap()
+ .1
+}
+
+fn simulate_planets_to_duplicate(planets: Vec<Planet>) -> u64 {
+ lowest_common_multiple(
+ simulate_planets_to_duplicate_1d(planets.clone(), |(p, o)| p.equal_x(o)),
+ simulate_planets_to_duplicate_1d(planets.clone(), |(p, o)| p.equal_y(o)),
+ simulate_planets_to_duplicate_1d(planets.clone(), |(p, o)| p.equal_z(o)),
+ )
+}
+
+fn simulate_planets_to_duplicate_1d(
+ planets: Vec<Planet>,
+ eq: impl FnMut((&Planet, &Planet)) -> bool + Copy,
+) -> u64 {
+ simulate_planets_iter(planets.clone())
+ .skip(1)
+ .find(|(_i, ps)| ps.iter().zip(planets.iter()).all(eq))
+ .unwrap()
+ .0
+}
+
+fn lowest_common_multiple(x: u64, y: u64, z: u64) -> u64 {
+ (1..)
+ .map(|i| x * i)
+ .find(|mx| multiples(y, *mx) && multiples(z, *mx))
+ .unwrap()
+}
+
+fn multiples(x: u64, target: u64) -> bool {
+ target % x == 0
+}
+
+fn simulate_planets_iter(planets: Vec<Planet>) -> impl Iterator<Item = (u64, Vec<Planet>)> {
+ iter::successors(Some((0, planets.clone())), |(i, planets)| {
+ Some((i + 1, simulate_planets(planets.clone())))
+ })
+}
+
+fn simulate_planets(planets: Vec<Planet>) -> Vec<Planet> {
+ simulate_velocity(simulate_gravity(planets))
+}
+
+fn simulate_gravity(planets: Vec<Planet>) -> Vec<Planet> {
+ planets
+ .iter()
+ .map(|p| Planet {
+ pos: p.pos.clone(),
+ vel: planets
+ .iter()
+ .filter(|o| p != *o)
+ .map(|o| p.acc(o))
+ .fold(p.vel, |acc, next| acc + next),
+ })
+ .collect()
+}
+
+fn simulate_velocity(planets: Vec<Planet>) -> Vec<Planet> {
+ planets
+ .into_iter()
+ .map(|p| Planet {
+ pos: p.pos + p.vel,
+ vel: p.vel,
+ })
+ .collect()
+}
+
+#[derive(Debug, Default, Clone, PartialEq)]
+struct Planet {
+ pos: Vec3d,
+ vel: Vec3d,
+}
+
+#[derive(Debug, Default, Clone, Copy, PartialEq)]
+struct Vec3d {
+ x: i32,
+ y: i32,
+ z: i32,
+}
+
+impl FromStr for Planet {
+ type Err = ParseIntError;
+
+ fn from_str(s: &str) -> Result<Self, ParseIntError> {
+ s.replace(|c| "<>xyz= ".contains(c), "")
+ .split(',')
+ .map(|i| i.parse::<i32>())
+ .collect::<Result<Vec<_>, _>>()
+ .and_then(|v| match &v[..] {
+ [x, y, z] => Ok(Planet {
+ pos: Vec3d {
+ x: *x,
+ y: *y,
+ z: *z,
+ },
+ vel: Vec3d::default(),
+ }),
+ _ => "wrong number of fields"
+ .parse::<i32>()
+ .map(|_x| Planet::default()),
+ })
+ }
+}
+
+impl Planet {
+ fn acc(&self, other: &Planet) -> Vec3d {
+ Vec3d {
+ x: gravity(self.pos.x, other.pos.x),
+ y: gravity(self.pos.y, other.pos.y),
+ z: gravity(self.pos.z, other.pos.z),
+ }
+ }
+
+ fn energy(&self) -> i32 {
+ (self.pos.x.abs() + self.pos.y.abs() + self.pos.z.abs())
+ * (self.vel.x.abs() + self.vel.y.abs() + self.vel.z.abs())
+ }
+
+ fn equal_x(&self, other: &Planet) -> bool {
+ self.pos.x == other.pos.x && self.vel.x == other.vel.x
+ }
+
+ fn equal_y(&self, other: &Planet) -> bool {
+ self.pos.y == other.pos.y && self.vel.y == other.vel.y
+ }
+
+ fn equal_z(&self, other: &Planet) -> bool {
+ self.pos.z == other.pos.z && self.vel.z == other.vel.z
+ }
+}
+
+fn gravity(this: i32, that: i32) -> i32 {
+ if that > this {
+ 1
+ } else if this > that {
+ -1
+ } else {
+ 0
+ }
+}
+
+impl ops::Add<Vec3d> for Vec3d {
+ type Output = Vec3d;
+ fn add(self, rhs: Vec3d) -> Self::Output {
+ Vec3d {
+ x: self.x + rhs.x,
+ y: self.y + rhs.y,
+ z: self.z + rhs.z,
+ }
+ }
+}
diff --git a/2019/src/bin/day_13.rs b/2019/src/bin/day_13.rs
new file mode 100644
index 0000000..ac1c478
--- /dev/null
+++ b/2019/src/bin/day_13.rs
@@ -0,0 +1,149 @@
+use aoc2019::*;
+use rpds::list;
+use rpds::list::List;
+use rpds::vector::Vector;
+use rpds::RedBlackTreeMap;
+use std::cmp::Ordering;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 13: Care Package")]
+/// Executes an Intcode game
+///
+/// The program is read from stdin as a series of comma-separated
+/// values. Newlines are ignored.
+///
+/// See https://adventofcode.com/2019/day/13 for details.
+struct Opt {
+ #[structopt(short = "q", long = "quarters")]
+ quarters: Option<Intcode>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ match opt.quarters {
+ Some(quarters) => {
+ let result = score_on_won_game(program.with_mem_0(quarters));
+ println!("{}", result);
+ }
+ None => {
+ let result = exit_on_failed_assertion(program.execute(), "Program errored");
+ println!("{}", count_blocks(&result));
+ }
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Default, Clone)]
+struct Screen {
+ screen: RedBlackTreeMap<(Intcode, Intcode), Intcode>,
+ previous_ball: (Intcode, Intcode),
+ ball: (Intcode, Intcode),
+ paddle: (Intcode, Intcode),
+ score: Intcode,
+}
+
+impl Screen {
+ fn render(output: &Vector<Intcode>) -> Screen {
+ (0..output.len() / 3)
+ .map(|i| i * 3)
+ .map(|i| {
+ (
+ output[i].clone(),
+ output[i + 1].clone(),
+ output[i + 2].clone(),
+ )
+ })
+ .fold(Screen::default(), |acc, (x, y, tile)| {
+ if x == Intcode::from(-1) && y == Intcode::from(0) {
+ Screen { score: tile, ..acc }
+ } else if tile == Intcode::from(4) {
+ Screen {
+ ball: (x, y),
+ previous_ball: acc.ball,
+ ..acc
+ }
+ } else if tile == Intcode::from(3) {
+ Screen {
+ paddle: (x.clone(), y.clone()),
+ screen: acc.screen.insert((x, y), tile),
+ ..acc
+ }
+ } else if tile == Intcode::from(0) {
+ Screen {
+ screen: acc.screen.remove(&(x, y)),
+ ..acc
+ }
+ } else {
+ Screen {
+ screen: acc.screen.insert((x, y), tile),
+ ..acc
+ }
+ }
+ })
+ }
+
+ fn paddle_required_direction(&self) -> Intcode {
+ match self.paddle.0.cmp(&self.ball.0) {
+ Ordering::Less => Intcode::from(1),
+ Ordering::Equal => Intcode::from(0),
+ Ordering::Greater => Intcode::from(-1),
+ }
+ }
+}
+
+fn count_blocks(output: &Vector<Intcode>) -> usize {
+ Screen::render(output)
+ .screen
+ .values()
+ .filter(|val| **val == Intcode::from(2))
+ .count()
+}
+
+fn score_on_won_game(program: IntcodeProgram) -> Intcode {
+ Screen::render(
+ &iter::successors(Some(program.run_to_termination_or_input()), |program| {
+ Some(next_game_state(program.clone()))
+ })
+ .take_while(|program| !program.halted)
+ .find(|program| count_blocks(&program.output) == 0)
+ .unwrap()
+ .output,
+ )
+ .score
+}
+
+fn next_game_state(program: IntcodeProgram) -> IntcodeProgram {
+ program_with_next_input(program.run_to_termination_or_input())
+}
+
+fn program_with_next_input(program: IntcodeProgram) -> IntcodeProgram {
+ program.with_input(list![next_input(&program.output)])
+}
+
+fn next_input(output: &Vector<Intcode>) -> Intcode {
+ Screen::render(output).paddle_required_direction()
+}
diff --git a/2019/src/bin/day_14.rs b/2019/src/bin/day_14.rs
new file mode 100644
index 0000000..0532f5f
--- /dev/null
+++ b/2019/src/bin/day_14.rs
@@ -0,0 +1,221 @@
+use rpds::map::red_black_tree_map::RedBlackTreeMap;
+use rpds::rbt_map;
+use rpds::vector::Vector;
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use std::str::FromStr;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 14: Space Stoichiometry")]
+/// Finds how much ore you need to produce one fuel.
+///
+/// Recipes are passed in on stdin, one per line.
+///
+/// See https://adventofcode.com/2019/day/14 for details.
+struct Opt {
+ #[structopt(long = "available-ore")]
+ available_ore: Option<i64>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let recipes = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(x.parse::<Recipe>(), "Input was not a valid recipe"))
+ .collect::<Vec<_>>();
+
+ match opt.available_ore {
+ Some(ore) => println!("{}", max_fuel_production(ore, &recipes)),
+ None => println!("{}", Desires::new(1).min_ore_required(&recipes)),
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn max_fuel_production(ore_max: i64, recipes: &[Recipe]) -> i64 {
+ binary_search_max_fuel_production(
+ ore_max / Desires::new(1).min_ore_required(&recipes),
+ 2 * ore_max / Desires::new(1).min_ore_required(&recipes),
+ ore_max,
+ recipes,
+ )
+}
+
+fn binary_search_max_fuel_production(
+ fuel_min: i64,
+ fuel_max: i64,
+ ore_max: i64,
+ recipes: &[Recipe],
+) -> i64 {
+ if fuel_max - fuel_min <= 1 {
+ fuel_min
+ } else if Desires::new((fuel_min + fuel_max) / 2).min_ore_required(recipes) <= ore_max {
+ binary_search_max_fuel_production((fuel_min + fuel_max) / 2, fuel_max, ore_max, recipes)
+ } else {
+ binary_search_max_fuel_production(fuel_min, (fuel_min + fuel_max) / 2, ore_max, recipes)
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Recipe {
+ ingredients: Vector<Chemical>,
+ output: Chemical,
+}
+
+#[derive(Default, Debug, Clone)]
+struct Chemical {
+ name: String,
+ quantity: i64,
+}
+
+impl FromStr for Recipe {
+ type Err = ParseErr;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ // 2 XSNKB, 15 ZVMCB, 3 KDFNZ => 2 RFLX
+ s.replace(" => ", "=")
+ .replace(", ", ",")
+ .split(|c| c == ',' || c == '=')
+ .map(|chem| chem.parse::<Chemical>())
+ .collect::<Result<Vector<Chemical>, ParseErr>>()
+ .map(|chemicals| Recipe {
+ ingredients: chemicals
+ .drop_last()
+ .expect("Assertion failed: line did not have any chemicals"),
+ output: chemicals
+ .last()
+ .cloned()
+ .expect("Assertion failed: line did not have any chemicals"),
+ })
+ }
+}
+
+impl Recipe {
+ fn required_scale(&self, desired_quantity: i64) -> i64 {
+ (desired_quantity + self.output.quantity - 1) / self.output.quantity
+ }
+}
+
+impl FromStr for Chemical {
+ type Err = ParseErr;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ // 1 FUEL
+ match s.split(' ').collect::<Vec<_>>()[..] {
+ [quantity, name] => quantity
+ .parse::<i64>()
+ .map_err(|_| ParseErr)
+ .map(|q| Chemical {
+ name: name.to_string(),
+ quantity: q,
+ }),
+ _ => Err(ParseErr),
+ }
+ }
+}
+
+impl Chemical {
+ fn scale(&self, scale: i64) -> Chemical {
+ Chemical {
+ name: self.name.clone(),
+ quantity: self.quantity * scale,
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy)]
+struct ParseErr;
+
+impl fmt::Display for ParseErr {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Error parsing input")
+ }
+}
+
+impl std::error::Error for ParseErr {}
+
+#[derive(Debug, Clone)]
+struct Desires {
+ chemicals: RedBlackTreeMap<String, i64>,
+}
+
+impl Desires {
+ fn new(fuel: i64) -> Desires {
+ Desires {
+ chemicals: rbt_map!["FUEL".to_string() => fuel, "ORE".to_string() => 0],
+ }
+ }
+
+ fn min_ore_required(&self, recipes: &[Recipe]) -> i64 {
+ iter::successors(Some(self.clone()), |prev| Some(prev.next(recipes)))
+ .find(|desires| desires.is_only_ore())
+ .unwrap()
+ .chemicals
+ .get("ORE")
+ .cloned()
+ .unwrap()
+ }
+
+ fn is_only_ore(&self) -> bool {
+ !self
+ .chemicals
+ .iter()
+ .any(|(name, quantity)| *quantity > 0 && name != "ORE")
+ }
+
+ fn next(&self, recipes: &[Recipe]) -> Desires {
+ self.chemicals
+ .iter()
+ .find(|(name, quantity)| **quantity > 0 && *name != "ORE")
+ .map(|(mixing, quantity)| {
+ self.with_mixed_recipe(
+ recipes
+ .iter()
+ .find(|recipe| recipe.output.name == *mixing)
+ .expect("Required chemical without a recipe"),
+ *quantity,
+ )
+ })
+ .unwrap_or(self.clone())
+ }
+
+ fn with_mixed_recipe(&self, recipe: &Recipe, desired_quantity: i64) -> Desires {
+ recipe.ingredients.iter().fold(
+ self.with_chemical(
+ recipe
+ .output
+ .scale(-1 * recipe.required_scale(desired_quantity)),
+ ),
+ |acc, next_ingredient| {
+ acc.with_chemical(next_ingredient.scale(recipe.required_scale(desired_quantity)))
+ },
+ )
+ }
+
+ fn with_chemical(&self, chemical: Chemical) -> Desires {
+ Desires {
+ chemicals: match self.chemicals.get(&chemical.name) {
+ Some(existing_quantity) => self
+ .chemicals
+ .insert(chemical.name.clone(), existing_quantity + chemical.quantity),
+ None => self
+ .chemicals
+ .insert(chemical.name.clone(), chemical.quantity),
+ },
+ }
+ }
+}
diff --git a/2019/src/bin/day_15.rs b/2019/src/bin/day_15.rs
new file mode 100644
index 0000000..b2205bb
--- /dev/null
+++ b/2019/src/bin/day_15.rs
@@ -0,0 +1,183 @@
+use aoc2019::*;
+use rpds::list;
+use rpds::list::List;
+use rpds::rbt_set;
+use rpds::set::red_black_tree_set::RedBlackTreeSet;
+use rpds::vector;
+use rpds::vector::Vector;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 15: Oxygen System")]
+/// Executes an Intcode robot that's searching a map. Prints the
+/// time taken for oxygen to propagate to the whole area.
+///
+/// See https://adventofcode.com/2019/day/15 for details.
+struct Opt {
+ /// Run in 'find' mode, find the oxygen tank but don't see how long it takes the oxygen to propagate
+ #[structopt(short = "f")]
+ find: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ if opt.find {
+ println!("{}", shortest_distance(program));
+ } else {
+ println!("{}", max_depth_from_oxygen(program));
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn shortest_distance(program: IntcodeProgram) -> usize {
+ iter::successors(
+ Some((
+ rbt_set![(0, 0)],
+ vector![((0, 0), program.run_to_termination_or_input())],
+ )),
+ |(visited, programs)| {
+ Some(next_depth_states(
+ visited.clone(),
+ next_program_states(programs, visited),
+ ))
+ },
+ )
+ .enumerate()
+ .find(|(_i, (_visited, programs))| {
+ programs
+ .iter()
+ .any(|(_location, program)| program.output == vector![2.into()])
+ })
+ .unwrap()
+ .0
+}
+
+fn max_depth_from_oxygen(program: IntcodeProgram) -> usize {
+ max_depth(
+ iter::successors(
+ Some((
+ rbt_set![(0, 0)],
+ vector![((0, 0), program.run_to_termination_or_input())],
+ )),
+ |(visited, programs)| {
+ Some(next_depth_states(
+ visited.clone(),
+ next_program_states(programs, visited),
+ ))
+ },
+ )
+ .find(|(_visited, programs)| {
+ programs
+ .iter()
+ .any(|(_location, program)| program.output == vector![2.into()])
+ })
+ .unwrap()
+ .1
+ .iter()
+ .find(|(_location, program)| program.output == vector![2.into()])
+ .cloned()
+ .unwrap()
+ .1,
+ )
+}
+
+fn max_depth(program: IntcodeProgram) -> usize {
+ iter::successors(
+ Some((
+ rbt_set![(0, 0)],
+ vector![((0, 0), program.run_to_termination_or_input())],
+ )),
+ |(visited, programs)| {
+ Some(next_depth_states(
+ visited.clone(),
+ next_program_states(programs, visited),
+ ))
+ },
+ )
+ .take_while(|(_visited, programs)| programs.len() > 0)
+ .count()
+ - 1
+}
+
+fn inputs() -> [((i32, i32), Intcode); 4] {
+ [
+ ((0, 1), Intcode::from(1)),
+ ((0, -1), Intcode::from(2)),
+ ((1, 0), Intcode::from(3)),
+ ((-1, 0), Intcode::from(4)),
+ ]
+}
+
+fn next_program_states(
+ programs: &Vector<((i32, i32), IntcodeProgram)>,
+ visited: &RedBlackTreeSet<(i32, i32)>,
+) -> Vector<((i32, i32), IntcodeProgram)> {
+ let inputs = inputs();
+ programs
+ .iter()
+ .flat_map(|(location, program)| {
+ inputs.iter().map(move |(vec, input)| {
+ (
+ (location.0 + vec.0, location.1 + vec.1),
+ program
+ .with_cleared_output()
+ .with_input(list![input.clone()])
+ .run_to_termination_or_input(),
+ )
+ })
+ })
+ .filter(|(location, program)| {
+ !visited.contains(location) && program.output != vector![0.into()]
+ })
+ .collect()
+}
+
+fn next_depth_states(
+ previous_visited: RedBlackTreeSet<(i32, i32)>,
+ programs: Vector<((i32, i32), IntcodeProgram)>,
+) -> (
+ RedBlackTreeSet<(i32, i32)>,
+ Vector<((i32, i32), IntcodeProgram)>,
+) {
+ (
+ programs
+ .iter()
+ .fold(previous_visited, |acc, (next, _)| acc.insert(*next)),
+ dedup_locations(programs),
+ )
+}
+
+fn dedup_locations(
+ programs: Vector<((i32, i32), IntcodeProgram)>,
+) -> Vector<((i32, i32), IntcodeProgram)> {
+ programs.iter().fold(Vector::new(), |acc, next| {
+ if acc.iter().any(|(loc, _)| *loc == next.0) {
+ acc
+ } else {
+ acc.push_back(next.clone())
+ }
+ })
+}
diff --git a/2019/src/bin/day_16.rs b/2019/src/bin/day_16.rs
new file mode 100644
index 0000000..aa53127
--- /dev/null
+++ b/2019/src/bin/day_16.rs
@@ -0,0 +1,112 @@
+use rayon::prelude::*;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::num::ParseIntError;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 16: Flawed Frequency Transmission")]
+/// Performs the flawed frequency transform of a number.
+///
+/// See https://adventofcode.com/2019/day/16 for details.
+struct Opt {
+ /// the offset after which you start reading output
+ #[structopt(short = "o", long = "offset", default_value = "0")]
+ offset: usize,
+ input_repeats: usize,
+ fft_repeats: usize,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(parse(&x), "Input was not a valid recipe"))
+ .for_each(|input| {
+ println!(
+ "{}",
+ transform(input, opt.input_repeats, opt.fft_repeats, opt.offset)
+ .into_iter()
+ .map(|c| c.to_string())
+ .collect::<String>()
+ );
+ });
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn parse(s: &str) -> Result<Vec<i32>, ParseIntError> {
+ s.chars().map(|c| c.to_string().parse::<i32>()).collect()
+}
+
+fn transform(input: Vec<i32>, input_repeats: usize, fft_repeats: usize, offset: usize) -> Vec<i32> {
+ iter::successors(
+ Some(
+ input
+ .iter()
+ .cycle()
+ .take(input.len() * input_repeats)
+ .cloned()
+ .collect::<Vec<i32>>(),
+ ),
+ |input| Some(next_phase(input, offset)),
+ )
+ .nth(fft_repeats)
+ .unwrap()
+ .into_iter()
+ .skip(offset)
+ .take(8)
+ .collect()
+}
+
+fn next_phase(input: &Vec<i32>, offset: usize) -> Vec<i32> {
+ if offset > input.len() / 2 {
+ (0..input.len())
+ .into_par_iter()
+ .map(|digit| {
+ if digit < offset {
+ 0
+ } else {
+ input.iter().skip(digit).sum::<i32>().abs() % 10
+ }
+ })
+ .collect()
+ } else {
+ (0..input.len())
+ .into_par_iter()
+ .map(|digit| {
+ input
+ .iter()
+ .zip(pattern(digit))
+ .map(|(x, y)| x * y)
+ .sum::<i32>()
+ .abs()
+ % 10
+ })
+ .collect()
+ }
+}
+
+fn pattern(digit: usize) -> impl Iterator<Item = i32> {
+ iter::repeat(0)
+ .take(digit + 1)
+ .chain(iter::repeat(1).take(digit + 1))
+ .chain(iter::repeat(0).take(digit + 1))
+ .chain(iter::repeat(-1).take(digit + 1))
+ .cycle()
+ .skip(1)
+}
diff --git a/2019/src/bin/day_17.rs b/2019/src/bin/day_17.rs
new file mode 100644
index 0000000..e85373c
--- /dev/null
+++ b/2019/src/bin/day_17.rs
@@ -0,0 +1,78 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 17: Set and Forget")]
+/// Pilots a vacuum robot around on a scaffold. What could go wrong?
+///
+/// See https://adventofcode.com/2019/day/17 for details.
+struct Opt {
+ /// Draw the map and exit
+ #[structopt(short = "d")]
+ draw_map: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let result = exit_on_failed_assertion(
+ if opt.draw_map {
+ program.execute()
+ } else {
+ // L,12,L,8,R,10,R,10,L,6,L,4,L,12,L,12,L,8,R,10,R,10,L,6,L,4,L,12,R,10,L,8,L,4,R,10,L,6,L,4,L,12,L,12,L,8,R,10,R,10,R,10,L,8,L,4,R,10,L,6,L,4,L,12,R,10,L,8,L,4,R,10
+ // | | ||
+
+ let input = vec![
+ "A,B,A,B,C,B,A,C,B,C\n",
+ "L,12,L,8,R,10,R,10\n",
+ "L,6,L,4,L,12\n",
+ "R,10,L,8,L,4,R,10\n",
+ "y\n",
+ ];
+ program
+ .with_mem_0(Intcode::from(2))
+ .with_input(
+ input
+ .iter()
+ .flat_map(|line| line.chars().map(|c| Intcode::from(c as u8)))
+ .collect(),
+ )
+ .execute()
+ },
+ "Program failed",
+ );
+
+ println!(
+ "{}",
+ result
+ .drop_last()
+ .unwrap()
+ .iter()
+ .flat_map(|c| c.to_signed_bytes_be())
+ .map(|c| c as char)
+ .collect::<String>()
+ );
+ println!("{}", result.last().unwrap());
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
diff --git a/2019/src/bin/day_18.rs b/2019/src/bin/day_18.rs
new file mode 100644
index 0000000..255baa0
--- /dev/null
+++ b/2019/src/bin/day_18.rs
@@ -0,0 +1,365 @@
+use rpds::rbt_set;
+use rpds::vector::Vector;
+use rpds::RedBlackTreeMap;
+use rpds::RedBlackTreeSet;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::iter::FromIterator;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 18: Many-Worlds Interpretation")]
+/// Finds the shortest path through a maze with keys
+///
+/// See https://adventofcode.com/2019/day/18 for details.
+struct Opt {}
+
+fn main() {
+ let stdin = io::stdin();
+ let _opt = Opt::from_args();
+
+ let maze: Maze = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .collect();
+
+ println!("{}", maze.shortest_route());
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+struct Maze {
+ blocks: Vec<Vec<char>>,
+ start: BoardState,
+ keys: KeySet,
+}
+
+impl FromIterator<String> for Maze {
+ fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
+ Maze::from_blocks(
+ iter.into_iter()
+ .map(|line| line.chars().collect())
+ .collect(),
+ )
+ }
+}
+
+impl Maze {
+ fn from_blocks(blocks: Vec<Vec<char>>) -> Maze {
+ Maze {
+ start: BoardState {
+ robots: blocks
+ .iter()
+ .enumerate()
+ .flat_map(|(y, line)| {
+ line.iter()
+ .enumerate()
+ .filter(|(_x, ch)| **ch == '@')
+ .map(move |(x, _ch)| Location { x, y })
+ })
+ .collect(),
+ keys: KeySet::default(),
+ },
+ keys: blocks
+ .iter()
+ .flat_map(|line| line.iter())
+ .fold(KeySet::default(), |acc, next| acc.add_key(*next)),
+ blocks,
+ }
+ }
+
+ fn block_at(&self, location: &Location) -> Option<char> {
+ self.blocks
+ .get(location.y)
+ .and_then(|line| line.get(location.x))
+ .cloned()
+ }
+
+ fn shortest_route(&self) -> usize {
+ iter::successors(
+ Some((
+ ExploredStates::default().insert(&self.start),
+ rbt_set![self.start.clone()],
+ )),
+ |(explored, locations)| {
+ Some(Maze::next_depth_states(
+ explored.clone(),
+ self.next_locations(locations, explored),
+ ))
+ },
+ )
+ // .inspect(|(explored, states)| eprintln!("{:?}", states))
+ .take_while(|(_explored, states)| states.size() > 0)
+ .enumerate()
+ .find(|(_i, (_explored, states))| states.iter().any(|state| state.keys == self.keys))
+ .unwrap()
+ .0
+ }
+
+ fn next_depth_states(
+ explored: ExploredStates,
+ locations: RedBlackTreeSet<BoardState>,
+ ) -> (ExploredStates, RedBlackTreeSet<BoardState>) {
+ (
+ locations
+ .iter()
+ .fold(explored, |acc, next| acc.insert(next)),
+ locations,
+ )
+ }
+
+ fn next_locations(
+ &self,
+ locations: &RedBlackTreeSet<BoardState>,
+ explored: &ExploredStates,
+ ) -> RedBlackTreeSet<BoardState> {
+ locations
+ .iter()
+ .flat_map(|current| {
+ (0..current.robots.len()).flat_map(move |i_robot| {
+ [(-1, 0), (1, 0), (0, -1), (0, 1)]
+ .iter()
+ .map(move |(dx, dy)| current.next(i_robot, *dx, *dy))
+ .map(move |(state, new_location)| {
+ self.block_at(&new_location)
+ .map(|c| state.with_key(c))
+ .unwrap_or(state)
+ })
+ })
+ })
+ .filter(|state| self.is_open(state))
+ .filter(|state| !explored.contains(state))
+ .collect()
+ }
+
+ fn is_open(&self, state: &BoardState) -> bool {
+ state.robots.iter().all(|location| {
+ self.block_at(location)
+ .map(|c| Maze::char_is_open(c, state.keys))
+ .unwrap_or(false)
+ })
+ }
+
+ fn char_is_open(c: char, keys: KeySet) -> bool {
+ c != '#' && !keys.door_is_locked(c)
+ }
+}
+
+#[derive(Default, Debug, Clone)]
+struct ExploredStates {
+ for_key: RedBlackTreeMap<KeySet, ExploredStatesForKey>,
+}
+
+#[derive(Default, Debug, Clone)]
+struct ExploredStatesForKey {
+ robots: Vector<RedBlackTreeSet<Location>>,
+}
+
+impl ExploredStates {
+ fn insert(&self, new: &BoardState) -> ExploredStates {
+ ExploredStates {
+ for_key: self.for_key.insert(
+ new.keys.clone(),
+ self.for_key
+ .get(&new.keys)
+ .map(|current| ExploredStatesForKey {
+ robots: current
+ .robots
+ .iter()
+ .zip(new.robots.iter())
+ .map(|(current_explored, robot)| current_explored.insert(robot.clone()))
+ .collect(),
+ })
+ .unwrap_or_else(|| ExploredStatesForKey {
+ robots: new
+ .robots
+ .iter()
+ .map(|robot| RedBlackTreeSet::new().insert(robot.clone()))
+ .collect(),
+ }),
+ ),
+ }
+ }
+
+ fn contains(&self, state: &BoardState) -> bool {
+ self.for_key
+ .get(&state.keys)
+ .filter(|for_key| {
+ state
+ .robots
+ .iter()
+ .zip(for_key.robots.iter())
+ .all(|(r_state, r_explored)| r_explored.contains(r_state))
+ })
+ .is_some()
+ }
+}
+
+#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct BoardState {
+ robots: Vector<Location>,
+ keys: KeySet,
+}
+
+impl BoardState {
+ fn next(&self, i_robot: usize, dx: isize, dy: isize) -> (BoardState, Location) {
+ (
+ BoardState {
+ robots: self
+ .robots
+ .set(i_robot, self.robots[i_robot].next(dx, dy))
+ .unwrap(),
+ ..self.clone()
+ },
+ self.robots[i_robot].next(dx, dy),
+ )
+ }
+
+ fn with_key(&self, c: char) -> BoardState {
+ BoardState {
+ keys: self.keys.add_key(c),
+ ..self.clone()
+ }
+ }
+}
+
+#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct Location {
+ x: usize,
+ y: usize,
+}
+
+impl Location {
+ fn next(&self, dx: isize, dy: isize) -> Location {
+ Location {
+ x: (self.x as isize + dx) as usize,
+ y: (self.y as isize + dy) as usize,
+ }
+ }
+}
+
+#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+struct KeySet {
+ bitset: u32,
+}
+
+impl KeySet {
+ fn add_key(self, key: char) -> KeySet {
+ KeySet {
+ bitset: self.bitset | KeySet::key_to_bitset(key),
+ }
+ }
+
+ fn door_is_locked(self, door: char) -> bool {
+ KeySet::door_to_bitset(door) & (!self.bitset) > 0
+ }
+
+ fn key_to_bitset(key: char) -> u32 {
+ if key.is_ascii_alphabetic() && key.is_ascii_lowercase() {
+ 1 << (key as u8 - b'a')
+ } else {
+ 0
+ }
+ }
+
+ fn door_to_bitset(door: char) -> u32 {
+ if door.is_ascii_alphabetic() && door.is_ascii_uppercase() {
+ 1 << (door as u8 - b'A')
+ } else {
+ 0
+ }
+ }
+}
+
+#[test]
+fn doors_are_locked_without_key() {
+ assert_eq!(true, KeySet::default().door_is_locked('A'))
+}
+
+#[test]
+fn doors_are_unlocked_with_key() {
+ assert_eq!(false, KeySet::default().add_key('a').door_is_locked('A'))
+}
+
+#[test]
+fn example_1() {
+ let maze: Maze = r"
+#########
+#b.A.@.a#
+#########
+"
+ .split('\n')
+ .map(|s| s.to_string())
+ .collect();
+
+ assert_eq!(maze.shortest_route(), 8);
+}
+
+#[test]
+fn example_2() {
+ let maze: Maze = r"
+#################
+#i.G..c...e..H.p#
+########.########
+#j.A..b...f..D.o#
+########@########
+#k.E..a...g..B.n#
+########.########
+#l.F..d...h..C.m#
+#################
+"
+ .split('\n')
+ .map(|s| s.to_string())
+ .collect();
+
+ assert_eq!(maze.shortest_route(), 136);
+}
+
+#[test]
+fn example_3() {
+ let maze: Maze = r"
+#############
+#DcBa.#.GhKl#
+#.###@#@#I###
+#e#d#####j#k#
+###C#@#@###J#
+#fEbA.#.FgHi#
+#############
+"
+ .split('\n')
+ .map(|s| s.to_string())
+ .collect();
+
+ assert_eq!(maze.shortest_route(), 32);
+}
+
+#[test]
+fn example_4() {
+ let maze: Maze = r"
+#############
+#g#f.D#..h#l#
+#F###e#E###.#
+#dCba@#@BcIJ#
+#############
+#nK.L@#@G...#
+#M###N#H###.#
+#o#m..#i#jk.#
+#############
+"
+ .split('\n')
+ .map(|s| s.to_string())
+ .collect();
+
+ assert_eq!(maze.shortest_route(), 74);
+}
diff --git a/2019/src/bin/day_19.rs b/2019/src/bin/day_19.rs
new file mode 100644
index 0000000..73c8374
--- /dev/null
+++ b/2019/src/bin/day_19.rs
@@ -0,0 +1,102 @@
+use aoc2019::*;
+use cached::cached_key;
+use cached::UnboundCache;
+use rpds::list;
+use rpds::list::List;
+use rpds::vector;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 19: Tractor Beam")]
+/// Finds the effective area of a tractor beam in an n x n square, and
+/// how far away you need to be to capture Santa's ship.
+///
+/// See https://adventofcode.com/2019/day/19 for details.
+struct Opt {
+ /// The size for a diagnostics scan.
+ #[structopt(long = "diagnostics-size")]
+ diagnostics_size: Option<usize>,
+ /// The size of Santa's ship
+ #[structopt(long = "ship-size")]
+ ship_size: Option<usize>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ if let Some(size) = opt.diagnostics_size {
+ println!("{}", count_active_in_area(program.clone(), 0, 0, size));
+ }
+ if let Some(size) = opt.ship_size {
+ println!("{:?}", find_closest_ship_space(program, size))
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn count_active_in_area(program: IntcodeProgram, left: usize, top: usize, size: usize) -> usize {
+ (left..left + size)
+ .flat_map(|x| (top..top + size).map(move |y| (x, y)))
+ .filter(|(x, y)| tractor_beam_is_active(program.clone(), *x, *y))
+ .count()
+}
+
+fn area_is_all_full(program: IntcodeProgram, left: usize, top: usize, size: usize) -> bool {
+ // This check with a grid that's aligned to 10 gives an early exit
+ // for most, that will have the program executions shared. This
+ // makes the memoized tractor function more effective at cutting
+ // down on execution, even though you need to do the whole lot
+ // again to verify if this passes.
+ (left..left + size)
+ .flat_map(|x| (top..top + size).map(move |y| (x, y)))
+ .filter(|(x, y)| x % 10 == 0 && y % 10 == 0)
+ .all(|(x, y)| tractor_beam_is_active(program.clone(), x, y))
+ && (left..left + size)
+ .flat_map(|x| (top..top + size).map(move |y| (x, y)))
+ .all(|(x, y)| tractor_beam_is_active(program.clone(), x, y))
+}
+
+fn find_closest_ship_space(program: IntcodeProgram, size: usize) -> (usize, usize) {
+ (0..)
+ .flat_map(|radius| {
+ (0..radius)
+ .flat_map(move |x| (0..radius).map(move |y| (x, y)))
+ .filter(move |(x, y)| {
+ (radius - 1) * (radius - 1) < x * x + y * y && x * x + y * y <= radius * radius
+ })
+ })
+ .find(|(x, y)| area_is_all_full(program.clone(), *x, *y, size))
+ .unwrap()
+}
+
+cached_key! {
+ TRACTOR_BEAM_IS_ACTIVE: UnboundCache<(usize, usize), bool> = UnboundCache::new();
+ Key = { (x, y) };
+ fn tractor_beam_is_active(program: IntcodeProgram, x: usize, y: usize) -> bool = {
+ program
+ .with_input(list![Intcode::from(x), Intcode::from(y)])
+ .execute()
+ == Ok(vector![Intcode::from(1)])
+
+ }
+}
diff --git a/2019/src/bin/day_2.rs b/2019/src/bin/day_2.rs
new file mode 100644
index 0000000..ba9e189
--- /dev/null
+++ b/2019/src/bin/day_2.rs
@@ -0,0 +1,96 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 2: 1202 Program Alarm")]
+/// Executes an Intcode program
+///
+/// The program is read from stdin as a series of comma-separated
+/// values. Newlines are ignored. When the program halts, the value at
+/// position 0 is returned.
+///
+/// If an output is provided, all possible inputs are tried to find
+/// the input that results in the desired output. In this case, the
+/// inputs are returned in the format (noun, verb).
+///
+///See https://adventofcode.com/2019/day/2 for details.
+struct Opt {
+ #[structopt(short = "n", long = "noun")]
+ noun: Option<Intcode>,
+ #[structopt(short = "v", long = "verb")]
+ verb: Option<Intcode>,
+ #[structopt(short = "o", long = "output")]
+ output: Option<Intcode>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect();
+
+ match (opt.noun, opt.verb, opt.output) {
+ (Some(noun), Some(verb), _) => {
+ let result = exit_on_failed_assertion(
+ program
+ .with_noun_verb_input(noun, verb)
+ .execute_returning_memory_0(),
+ "Program errored",
+ );
+ println!("{}", result);
+ }
+ (_, _, Some(output)) => {
+ let (noun, verb) =
+ exit_on_failed_assertion(find_input(&program, output), "Program errored");
+ println!("({}, {})", noun, verb);
+ }
+ (None, None, None) => {
+ let result =
+ exit_on_failed_assertion(program.execute_returning_memory_0(), "Program errored");
+ println!("{}", result);
+ }
+ _ => {
+ eprintln!("Either a noun and verb or an expected output must be provided");
+ process::exit(1);
+ }
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn find_input(
+ program: &IntcodeProgram,
+ output: Intcode,
+) -> Result<(Intcode, Intcode), IntcodeProgramError> {
+ (0..99)
+ .flat_map(|noun| (0..99).map(move |verb| (Intcode::from(noun), Intcode::from(verb))))
+ .map(|(noun, verb)| {
+ (
+ noun.clone(),
+ verb.clone(),
+ program
+ .with_noun_verb_input(noun, verb)
+ .execute_returning_memory_0(),
+ )
+ })
+ .find(|(_noun, _verb, out)| *out == Ok(output.clone()))
+ .map(|(noun, verb, _out)| Ok((noun, verb)))
+ .unwrap_or(Err(IntcodeProgramError::Unknown))
+}
diff --git a/2019/src/bin/day_20.rs b/2019/src/bin/day_20.rs
new file mode 100644
index 0000000..953df75
--- /dev/null
+++ b/2019/src/bin/day_20.rs
@@ -0,0 +1,310 @@
+use rpds::rbt_set;
+use rpds::vector::Vector;
+use rpds::RedBlackTreeMap;
+use rpds::RedBlackTreeSet;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::iter::FromIterator;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 20: Donut Maze")]
+/// Finds the shortest path through a maze with portals.
+///
+/// See https://adventofcode.com/2019/day/20 for details.
+struct Opt {
+ /// include the rule that going through portals changes your depth
+ #[structopt(short = "d")]
+ include_depth: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let maze = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .collect::<MazeBuilder>()
+ .build();
+
+ println!("{}", maze.shortest_route(opt.include_depth));
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+struct MazeBuilder {
+ map: Vector<Vector<char>>,
+}
+
+impl FromIterator<String> for MazeBuilder {
+ fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
+ MazeBuilder {
+ map: iter
+ .into_iter()
+ .map(|line| line.chars().collect())
+ .collect(),
+ }
+ }
+}
+
+impl MazeBuilder {
+ fn build(self) -> Maze {
+ Maze {
+ walls: self
+ .map
+ .iter()
+ .map(|line| line.iter().map(|ch| *ch != '.').collect())
+ .collect(),
+ portals: self.grouped_portals(),
+ entrance: self
+ .all_portals()
+ .find(|(id, _)| *id == ['A', 'A'])
+ .unwrap()
+ .1,
+ exit: self
+ .all_portals()
+ .find(|(id, _)| *id == ['Z', 'Z'])
+ .unwrap()
+ .1,
+ }
+ }
+
+ fn grouped_portals(&self) -> Vector<(Point, Point)> {
+ self.all_portals()
+ .fold(
+ (Vector::new(), RedBlackTreeMap::new()),
+ |(matched, unmatched): (
+ Vector<(Point, Point)>,
+ RedBlackTreeMap<[char; 2], Point>,
+ ),
+ (next_id, next_p)| match unmatched.get(&next_id) {
+ Some(pair) => (
+ matched.push_back(pair.clone().inside_out(
+ next_p,
+ self.map[0].len(),
+ self.map.len(),
+ )),
+ unmatched.remove(&next_id),
+ ),
+ None => (matched, unmatched.insert(next_id, next_p)),
+ },
+ )
+ .0
+ }
+
+ fn all_portals(&self) -> impl Iterator<Item = ([char; 2], Point)> + '_ {
+ self.horizontal_trailing_portals()
+ .chain(self.horizontal_leading_portals())
+ .chain(self.vertical_trailing_portals())
+ .chain(self.vertical_leading_portals())
+ }
+
+ fn horizontal_trailing_portals(&self) -> impl Iterator<Item = ([char; 2], Point)> + '_ {
+ // .XX
+ (0..self.map.len())
+ .flat_map(move |y| (0..self.map[y].len() - 2).map(move |x| Point { x, y }))
+ .filter(move |p| {
+ self.map[p.y][p.x] == '.'
+ && self.map[p.y][p.x + 1].is_alphabetic()
+ && self.map[p.y][p.x + 2].is_alphabetic()
+ })
+ .map(move |p| ([self.map[p.y][p.x + 1], self.map[p.y][p.x + 2]], p))
+ }
+
+ fn horizontal_leading_portals(&self) -> impl Iterator<Item = ([char; 2], Point)> + '_ {
+ // XX.
+ (0..self.map.len())
+ .flat_map(move |y| (0..self.map[y].len() - 2).map(move |x| Point { x, y }))
+ .filter(move |p| {
+ self.map[p.y][p.x + 2] == '.'
+ && self.map[p.y][p.x + 1].is_alphabetic()
+ && self.map[p.y][p.x].is_alphabetic()
+ })
+ .map(move |p| {
+ (
+ [self.map[p.y][p.x], self.map[p.y][p.x + 1]],
+ Point { x: p.x + 2, y: p.y },
+ )
+ })
+ }
+
+ fn vertical_trailing_portals(&self) -> impl Iterator<Item = ([char; 2], Point)> + '_ {
+ // .XX
+ (0..self.map[0].len())
+ .flat_map(move |x| (0..self.map.len() - 2).map(move |y| Point { x, y }))
+ .filter(move |p| {
+ self.map[p.y][p.x] == '.'
+ && self.map[p.y + 1][p.x].is_alphabetic()
+ && self.map[p.y + 2][p.x].is_alphabetic()
+ })
+ .map(move |p| ([self.map[p.y + 1][p.x], self.map[p.y + 2][p.x]], p))
+ }
+
+ fn vertical_leading_portals(&self) -> impl Iterator<Item = ([char; 2], Point)> + '_ {
+ // XX.
+ (0..self.map[0].len())
+ .flat_map(move |x| (0..self.map.len() - 2).map(move |y| Point { x, y }))
+ .filter(move |p| {
+ self.map[p.y + 2][p.x] == '.'
+ && self.map[p.y + 1][p.x].is_alphabetic()
+ && self.map[p.y][p.x].is_alphabetic()
+ })
+ .map(move |p| {
+ (
+ [self.map[p.y][p.x], self.map[p.y + 1][p.x]],
+ Point { x: p.x, y: p.y + 2 },
+ )
+ })
+ }
+}
+
+#[derive(Debug)]
+struct Maze {
+ walls: Vector<Vector<bool>>,
+ portals: Vector<(Point, Point)>,
+ entrance: Point, // AA
+ exit: Point, // ZZ
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct Point {
+ x: usize,
+ y: usize,
+}
+
+impl Point {
+ fn add(&self, x: isize, y: isize) -> Point {
+ Point {
+ x: (self.x as isize + x) as usize,
+ y: (self.y as isize + y) as usize,
+ }
+ }
+
+ fn inside_out(self, other: Point, width: usize, height: usize) -> (Point, Point) {
+ if self.closest_side(width, height) > other.closest_side(width, height) {
+ (self, other)
+ } else {
+ (other, self)
+ }
+ }
+
+ fn closest_side(&self, width: usize, height: usize) -> usize {
+ self.x.min(width - self.x).min(self.y).min(height - self.y)
+ }
+}
+
+impl Maze {
+ fn shortest_route(&self, include_depth: bool) -> usize {
+ iter::successors(
+ Some((
+ rbt_set![(self.entrance.clone(), 0)],
+ rbt_set![(self.entrance.clone(), 0)],
+ )),
+ |(explored, locations)| {
+ Some(Maze::next_depth_states(
+ explored.clone(),
+ self.next_locations(locations, explored, include_depth),
+ ))
+ },
+ )
+ // .inspect(|(explored, states)| eprintln!("{:?}", states))
+ .take_while(|(_explored, states)| states.size() > 0)
+ .enumerate()
+ .find(|(_i, (_explored, states))| {
+ states
+ .iter()
+ .any(|(p_state, depth)| *p_state == self.exit && (!include_depth || *depth == 0))
+ })
+ .unwrap()
+ .0
+ }
+
+ fn next_depth_states(
+ explored: RedBlackTreeSet<(Point, isize)>,
+ locations: RedBlackTreeSet<(Point, isize)>,
+ ) -> (
+ RedBlackTreeSet<(Point, isize)>,
+ RedBlackTreeSet<(Point, isize)>,
+ ) {
+ (
+ locations
+ .iter()
+ .fold(explored, |acc, next| acc.insert(next.clone())),
+ locations,
+ )
+ }
+
+ fn next_locations(
+ &self,
+ locations: &RedBlackTreeSet<(Point, isize)>,
+ explored: &RedBlackTreeSet<(Point, isize)>,
+ include_depth: bool,
+ ) -> RedBlackTreeSet<(Point, isize)> {
+ locations
+ .iter()
+ .flat_map(|(p, depth)| {
+ [(-1, 0), (1, 0), (0, -1), (0, 1)]
+ .iter()
+ .map(move |(dx, dy)| (p.add(*dx, *dy), *depth))
+ .chain(
+ self.portals
+ .iter()
+ .filter(move |(from, _to)| p == from)
+ .map(move |(_from, to)| (to.clone(), depth + 1)),
+ )
+ .chain(
+ self.portals
+ .iter()
+ .filter(move |(_to, from)| p == from)
+ .map(move |(to, _from)| (to.clone(), depth - 1)),
+ )
+ })
+ .filter(|(p_next, depth)| {
+ !self.walls[p_next.y][p_next.x] && (!include_depth || *depth >= 0)
+ })
+ .filter(|state| !explored.contains(state))
+ .collect()
+ }
+}
+
+#[test]
+fn portal_maze_example_1() {
+ let maze: Maze = r" A
+ A
+ #######.#########
+ #######.........#
+ #######.#######.#
+ #######.#######.#
+ #######.#######.#
+ ##### B ###.#
+BC...## C ###.#
+ ##.## ###.#
+ ##...DE F ###.#
+ ##### G ###.#
+ #########.#####.#
+DE..#######...###.#
+ #.#########.###.#
+FG..#########.....#
+ ###########.#####
+ Z
+ Z "
+ .split('\n')
+ .map(|s| s.to_string())
+ .collect::<MazeBuilder>()
+ .build();
+
+ assert_eq!(maze.shortest_route(false), 23);
+ assert_eq!(maze.shortest_route(true), 26);
+}
diff --git a/2019/src/bin/day_21.rs b/2019/src/bin/day_21.rs
new file mode 100644
index 0000000..7fa781c
--- /dev/null
+++ b/2019/src/bin/day_21.rs
@@ -0,0 +1,109 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 21: Springdroid Adventure")]
+/// Pilots a springdroid around!
+///
+/// See https://adventofcode.com/2019/day/21 for details.
+struct Opt {}
+
+fn main() {
+ let stdin = io::stdin();
+ let _opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let walk_result = exit_on_failed_assertion(
+ {
+ let input = vec![
+ "NOT T T\n",
+ "AND A T\n",
+ "AND B T\n",
+ "AND C T\n",
+ "NOT T J\n",
+ "AND D J\n",
+ "WALK\n",
+ ];
+ program
+ .with_input(
+ input
+ .iter()
+ .flat_map(|line| line.chars().map(|c| Intcode::from(c as u8)))
+ .collect(),
+ )
+ .execute()
+ },
+ "Program failed",
+ );
+
+ println!(
+ "{}",
+ walk_result
+ .drop_last()
+ .unwrap()
+ .iter()
+ .flat_map(|c| c.to_signed_bytes_be())
+ .map(|c| c as char)
+ .collect::<String>()
+ );
+ println!("{}", walk_result.last().unwrap());
+
+ let run_result = exit_on_failed_assertion(
+ {
+ // (!A || !B || !C) && D && (E || H)
+ let input = vec![
+ "OR E J\n",
+ "OR H J\n",
+ "AND D J\n",
+ "NOT T T\n",
+ "AND A T\n",
+ "AND B T\n",
+ "AND C T\n",
+ "NOT T T\n",
+ "AND T J\n",
+ "RUN\n",
+ ];
+ program
+ .with_input(
+ input
+ .iter()
+ .flat_map(|line| line.chars().map(|c| Intcode::from(c as u8)))
+ .collect(),
+ )
+ .execute()
+ },
+ "Program failed",
+ );
+
+ println!(
+ "{}",
+ run_result
+ .drop_last()
+ .unwrap()
+ .iter()
+ .flat_map(|c| c.to_signed_bytes_be())
+ .map(|c| c as char)
+ .collect::<String>()
+ );
+ println!("{}", run_result.last().unwrap());
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
diff --git a/2019/src/bin/day_22.rs b/2019/src/bin/day_22.rs
new file mode 100644
index 0000000..5b999a6
--- /dev/null
+++ b/2019/src/bin/day_22.rs
@@ -0,0 +1,325 @@
+use derive_more::Display;
+use num::bigint::BigInt;
+use num::traits::identities::Zero;
+use num::traits::sign::abs;
+use num::traits::Signed;
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use std::str::FromStr;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 22: Slam Shuffle")]
+/// Shuffles some cards.
+///
+/// See https://adventofcode.com/2019/day/22 for details.
+struct Opt {
+ /// The size of the deck
+ deck_size: BigInt,
+ /// At the end, query the position of card
+ card: BigInt,
+ /// Number of repetitions
+ repetitions: BigInt,
+
+ /// Prints the card in position n, rather than the position of card n
+ #[structopt(short = "p")]
+ position_mode: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let instructions = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(x.parse::<Instruction>(), "Parse error"))
+ .collect::<Vec<Instruction>>();
+
+ //eprintln!("{:?}", instructions);
+
+ if opt.position_mode {
+ println!(
+ "{}",
+ instructions
+ .iter()
+ .rev()
+ .fold(
+ StandardisedInstruction::identity(opt.deck_size.clone()),
+ |acc, next| acc.then(&(next.clone(), opt.deck_size.clone(), false).into())
+ )
+ .repeat(opt.repetitions)
+ .apply(opt.card.clone())
+ );
+ } else {
+ println!(
+ "{}",
+ instructions
+ .iter()
+ .fold(
+ StandardisedInstruction::identity(opt.deck_size.clone()),
+ |acc, next| {
+ eprintln!("{}", acc);
+ acc.then(&(next.clone(), opt.deck_size.clone(), true).into())
+ }
+ )
+ .repeat(opt.repetitions)
+ .apply(opt.card.clone())
+ );
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn mod_plus(a: BigInt, b: BigInt, modulus: BigInt) -> BigInt {
+ mod_normalize(a + b, modulus)
+}
+
+fn mod_sub(a: BigInt, b: BigInt, modulus: BigInt) -> BigInt {
+ mod_normalize(a - b, modulus)
+}
+
+fn mod_times(a: BigInt, b: BigInt, modulus: BigInt) -> BigInt {
+ mod_normalize(a * b, modulus)
+}
+
+fn mod_divide(a: BigInt, b: BigInt, modulus: BigInt) -> BigInt {
+ mod_times(a, mod_inverse(b, modulus.clone()), modulus)
+}
+
+fn mod_pow(a: BigInt, b: BigInt, modulus: BigInt) -> BigInt {
+ a.modpow(&b, &modulus)
+}
+
+fn mod_normalize(a: BigInt, modulus: BigInt) -> BigInt {
+ if a.is_negative() {
+ a.clone() + modulus.clone() * (1 + abs(a) / modulus)
+ } else {
+ a % modulus
+ }
+}
+
+// NB: This may give nonsense if modulus isn't coprime with a
+fn mod_inverse(a: BigInt, modulus: BigInt) -> BigInt {
+ mod_normalize(euclid_gcd_coefficients(a, modulus.clone()).0, modulus)
+}
+
+fn euclid_gcd_coefficients(a: BigInt, b: BigInt) -> (BigInt, BigInt) {
+ fn euclid_gcd_coefficients_inner(
+ r: BigInt,
+ old_r: BigInt,
+ s: BigInt,
+ old_s: BigInt,
+ t: BigInt,
+ old_t: BigInt,
+ ) -> (BigInt, BigInt) {
+ if r.is_zero() {
+ (old_s, old_t)
+ } else {
+ euclid_gcd_coefficients_inner(
+ old_r.clone() - (old_r.clone() / r.clone()) * r.clone(),
+ r.clone(),
+ old_s - (old_r.clone() / r.clone()) * s.clone(),
+ s,
+ old_t - (old_r.clone() / r) * t.clone(),
+ t,
+ )
+ }
+ }
+
+ assert!(a < b);
+
+ euclid_gcd_coefficients_inner(b, a, 0.into(), 1.into(), 1.into(), 0.into())
+}
+
+#[derive(Debug, Clone)]
+enum Instruction {
+ DealIntoNewStack,
+ Cut(BigInt),
+ ReverseCut(BigInt),
+ DealWithIncrement(BigInt),
+}
+
+impl FromStr for Instruction {
+ type Err = ParseErr;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if s.starts_with("deal into new stack") {
+ Ok(Instruction::DealIntoNewStack)
+ } else if s.starts_with("cut -") {
+ s.split(' ')
+ .nth(1)
+ .map(|val| {
+ val.parse::<BigInt>()
+ .map_err(|_| ParseErr)
+ .map(|parsed| Instruction::ReverseCut(abs(parsed)))
+ })
+ .unwrap_or(Err(ParseErr))
+ } else if s.starts_with("cut") {
+ s.split(' ')
+ .nth(1)
+ .map(|val| {
+ val.parse::<BigInt>()
+ .map_err(|_| ParseErr)
+ .map(|parsed| Instruction::Cut(parsed))
+ })
+ .unwrap_or(Err(ParseErr))
+ } else if s.starts_with("deal with increment") {
+ s.split(' ')
+ .nth(3)
+ .map(|val| {
+ val.parse::<BigInt>()
+ .map_err(|_| ParseErr)
+ .map(|parsed| Instruction::DealWithIncrement(parsed))
+ })
+ .unwrap_or(Err(ParseErr))
+ } else {
+ Err(ParseErr)
+ }
+ }
+}
+
+// f(x) = ax + b mod c
+#[derive(Display, Clone)]
+#[display(fmt = "f(x) = {} x + {} % {}", a, b, modulus)]
+struct StandardisedInstruction {
+ a: BigInt,
+ b: BigInt,
+ modulus: BigInt,
+}
+
+impl From<(Instruction, BigInt, bool)> for StandardisedInstruction {
+ fn from((instruction, modulus, forward): (Instruction, BigInt, bool)) -> Self {
+ match (instruction, forward) {
+ (Instruction::DealIntoNewStack, _) => StandardisedInstruction {
+ a: BigInt::from(-1),
+ b: BigInt::from(-1),
+ modulus: modulus,
+ },
+ (Instruction::Cut(n), true) => StandardisedInstruction {
+ a: BigInt::from(1),
+ b: BigInt::from(-n),
+ modulus: modulus,
+ },
+ (Instruction::Cut(n), false) => StandardisedInstruction {
+ a: BigInt::from(1),
+ b: BigInt::from(n),
+ modulus: modulus,
+ },
+ (Instruction::ReverseCut(n), true) => StandardisedInstruction {
+ a: BigInt::from(1),
+ b: BigInt::from(n),
+ modulus: modulus,
+ },
+ (Instruction::ReverseCut(n), false) => StandardisedInstruction {
+ a: BigInt::from(1),
+ b: BigInt::from(-n),
+ modulus: modulus,
+ },
+ (Instruction::DealWithIncrement(n), true) => StandardisedInstruction {
+ a: BigInt::from(n),
+ b: BigInt::from(0),
+ modulus: modulus,
+ },
+ (Instruction::DealWithIncrement(n), false) => StandardisedInstruction {
+ a: BigInt::from(mod_inverse(n, modulus.clone())),
+ b: BigInt::from(0),
+ modulus: modulus,
+ },
+ }
+ .normalise()
+ }
+}
+
+impl StandardisedInstruction {
+ fn identity(modulus: BigInt) -> StandardisedInstruction {
+ StandardisedInstruction {
+ a: BigInt::from(1),
+ b: BigInt::from(0),
+ modulus,
+ }
+ }
+ fn normalise(&self) -> StandardisedInstruction {
+ StandardisedInstruction {
+ a: mod_normalize(self.a.clone(), self.modulus.clone()),
+ b: mod_normalize(self.b.clone(), self.modulus.clone()),
+ modulus: self.modulus.clone(),
+ }
+ }
+ fn then(&self, other: &StandardisedInstruction) -> StandardisedInstruction {
+ // g(f(x)) = ga (fa x + fb) + gb =
+ StandardisedInstruction {
+ a: mod_times(self.a.clone(), other.a.clone(), self.modulus.clone()),
+ b: mod_plus(
+ mod_times(self.b.clone(), other.a.clone(), self.modulus.clone()),
+ other.b.clone(),
+ self.modulus.clone(),
+ ),
+ modulus: self.modulus.clone(),
+ }
+ }
+ fn repeat(&self, repetitions: BigInt) -> StandardisedInstruction {
+ StandardisedInstruction {
+ a: mod_pow(self.a.clone(), repetitions.clone(), self.modulus.clone()),
+ b: mod_divide(
+ mod_times(
+ self.b.clone(),
+ mod_sub(
+ BigInt::from(1),
+ mod_pow(self.a.clone(), repetitions.clone(), self.modulus.clone()),
+ self.modulus.clone(),
+ ),
+ self.modulus.clone(),
+ ),
+ mod_sub(BigInt::from(1), self.a.clone(), self.modulus.clone()),
+ self.modulus.clone(),
+ ),
+ modulus: self.modulus.clone(),
+ }
+ }
+
+ fn apply(&self, x: BigInt) -> BigInt {
+ mod_plus(
+ mod_times(self.a.clone(), x, self.modulus.clone()),
+ self.b.clone(),
+ self.modulus.clone(),
+ )
+ }
+}
+
+#[derive(Debug, Clone, Copy)]
+struct ParseErr;
+
+impl fmt::Display for ParseErr {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Error parsing input")
+ }
+}
+
+impl std::error::Error for ParseErr {}
+
+#[test]
+fn mod_inverse_of_13() {
+ assert_eq!(mod_inverse(1.into(), 13.into()), 1.into());
+ assert_eq!(mod_inverse(2.into(), 13.into()), 7.into());
+ assert_eq!(mod_inverse(3.into(), 13.into()), 9.into());
+ assert_eq!(mod_inverse(4.into(), 13.into()), 10.into());
+ assert_eq!(mod_inverse(5.into(), 13.into()), 8.into());
+ assert_eq!(mod_inverse(6.into(), 13.into()), 11.into());
+ assert_eq!(mod_inverse(7.into(), 13.into()), 2.into());
+ assert_eq!(mod_inverse(8.into(), 13.into()), 5.into());
+ assert_eq!(mod_inverse(9.into(), 13.into()), 3.into());
+ assert_eq!(mod_inverse(10.into(), 13.into()), 4.into());
+ assert_eq!(mod_inverse(11.into(), 13.into()), 6.into());
+ assert_eq!(mod_inverse(12.into(), 13.into()), 12.into());
+}
diff --git a/2019/src/bin/day_23.rs b/2019/src/bin/day_23.rs
new file mode 100644
index 0000000..e074cf4
--- /dev/null
+++ b/2019/src/bin/day_23.rs
@@ -0,0 +1,211 @@
+use aoc2019::*;
+use rpds::list;
+use rpds::list::List;
+use rpds::vector::Vector;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 23: Category Six")]
+/// Executes an Intcode program on a network of computers
+///
+/// See https://adventofcode.com/2019/day/23 for details.
+struct Opt {
+ #[structopt(short = "n", long = "network-size")]
+ network_size: usize,
+ #[structopt(long = "nat")]
+ send_nat: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let network = Network::new(program, opt.network_size);
+
+ if opt.send_nat {
+ println!("{}", network.first_repeated_nat_packet().y);
+ } else {
+ println!("{}", network.first_nat_packet().y);
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Network {
+ computers: Vector<IntcodeProgram>,
+ nat: Option<Packet>,
+ is_potentially_idle: bool,
+ is_idle: bool,
+}
+
+impl Network {
+ fn new(program: IntcodeProgram, network_size: usize) -> Network {
+ Network {
+ computers: (0..network_size)
+ .map(|ip| program.with_input(list![ip.into(), Intcode::from(-1)]))
+ .collect(),
+ nat: None,
+ is_potentially_idle: false,
+ is_idle: false,
+ }
+ }
+
+ fn first_nat_packet(&self) -> Packet {
+ iter::successors(Some(self.clone()), |network| Some(network.next()))
+ .filter_map(|network| network.nat)
+ .next()
+ .unwrap()
+ }
+
+ fn first_repeated_nat_packet(&self) -> Packet {
+ self.sent_nat_packets()
+ .zip(self.sent_nat_packets().skip(1))
+ // .inspect(|(nat, _p2)| eprintln!("{}", nat.y))
+ .find(|(p1, p2)| p1.y == p2.y)
+ .unwrap()
+ .0
+ }
+
+ fn sent_nat_packets<'a>(&'a self) -> impl Iterator<Item = Packet> + 'a {
+ iter::successors(Some(self.clone()), |network| {
+ Some(network.with_nat_packet_sent().run_to_network_idle())
+ })
+ .filter_map(|network| network.nat)
+ }
+
+ fn run_to_network_idle(&self) -> Network {
+ iter::successors(Some(self.clone()), |network| Some(network.next()))
+ .find(|network| network.is_idle)
+ .unwrap()
+ }
+
+ fn with_nat_packet_sent(&self) -> Network {
+ if self.nat.is_some() {
+ Network {
+ computers: self
+ .computers
+ .iter()
+ .enumerate()
+ .map(|(ip, computer)| {
+ computer
+ .with_additional_input(
+ self.nat
+ .iter()
+ .filter(|packet| packet.dest == Intcode::from(ip))
+ .flat_map(|packet| vec![packet.x.clone(), packet.y.clone()])
+ .collect(),
+ )
+ .run_to_termination_or_input()
+ })
+ .collect(),
+ nat: self.nat.clone(),
+ is_potentially_idle: false,
+ is_idle: false,
+ }
+ } else {
+ self.clone()
+ }
+ }
+
+ fn next(&self) -> Network {
+ Network {
+ computers: self
+ .computers
+ .iter()
+ .enumerate()
+ .map(|(ip, computer)| {
+ computer
+ .with_cleared_output()
+ .with_additional_input(if self.empty_queues() {
+ list![Intcode::from(-1)]
+ } else {
+ list![]
+ })
+ .with_additional_input(
+ self.pending_packets()
+ .filter(|packet| packet.dest == Intcode::from(ip))
+ .flat_map(|packet| vec![packet.x, packet.y])
+ .collect(),
+ )
+ .run_to_termination_or_input()
+ })
+ .collect(),
+ nat: self
+ .pending_packets()
+ .filter(|packet| packet.is_nat())
+ .map(|packet| packet.with_dest(0.into()))
+ .last()
+ .or_else(|| self.nat.clone()),
+ is_potentially_idle: self.empty_queues(),
+ is_idle: self.is_potentially_idle && self.empty_queues(),
+ }
+ }
+
+ fn pending_packets<'a>(&'a self) -> impl Iterator<Item = Packet> + 'a {
+ self.computers.iter().flat_map(|computer| {
+ computer
+ .output
+ .iter()
+ .cloned()
+ .collect::<Vec<Intcode>>()
+ .chunks_exact(3)
+ .map(|packet| Packet {
+ dest: packet[0].clone(),
+ x: packet[1].clone(),
+ y: packet[2].clone(),
+ })
+ .collect::<Vec<Packet>>()
+ })
+ }
+
+ fn pending_input<'a>(&'a self) -> impl Iterator<Item = Intcode> + 'a {
+ self.computers
+ .iter()
+ .flat_map(|computer| computer.input.iter().cloned().collect::<Vec<Intcode>>())
+ }
+
+ fn empty_queues(&self) -> bool {
+ self.pending_packets().count() == 0 && self.pending_input().count() == 0
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Packet {
+ dest: Intcode,
+ x: Intcode,
+ y: Intcode,
+}
+
+impl Packet {
+ fn is_nat(&self) -> bool {
+ self.dest == 255.into()
+ }
+
+ fn with_dest(&self, dest: Intcode) -> Packet {
+ Packet {
+ dest,
+ ..self.clone()
+ }
+ }
+}
diff --git a/2019/src/bin/day_24.rs b/2019/src/bin/day_24.rs
new file mode 100644
index 0000000..ebc6a1b
--- /dev/null
+++ b/2019/src/bin/day_24.rs
@@ -0,0 +1,239 @@
+use rpds::RedBlackTreeSet;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::iter::FromIterator;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 24: Planet of Discord")]
+/// Simulates the life and death of Eris bugs
+///
+/// See https://adventofcode.com/2019/day/24 for details.
+struct Opt {
+ /// How many iterations of the game of life should be run
+ /// If not provided, runs until a state appears twice.
+ #[structopt(short = "n")]
+ depth: Option<usize>,
+ /// Interprets the map as being one part of an infinite fractal map
+ #[structopt(short = "f")]
+ fractal: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let initial_state: State = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .collect::<State>()
+ .with_fractal_mode(opt.fractal);
+
+ let final_state = match opt.depth {
+ Some(depth) => initial_state.n_steps_forward(depth),
+ None => initial_state.first_repeated_state(),
+ };
+
+ println!("Bugs: {}", final_state.alive.size());
+ println!("Biodiversity: {}", final_state.biodiversity_rating());
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct State {
+ alive: RedBlackTreeSet<Coordinate>,
+ fractal_mode: bool,
+}
+
+impl FromIterator<String> for State {
+ fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
+ State {
+ alive: iter
+ .into_iter()
+ .enumerate()
+ .flat_map(move |(y, line)| {
+ line.chars()
+ .enumerate()
+ .filter(move |(_x, c)| *c == '#')
+ .map(move |(x, _c)| Coordinate {
+ x: x as isize,
+ y: y as isize,
+ depth: 0,
+ })
+ .collect::<Vec<Coordinate>>()
+ })
+ .collect(),
+ fractal_mode: false,
+ }
+ }
+}
+
+impl State {
+ fn with_fractal_mode(&self, fractal_mode: bool) -> State {
+ State {
+ fractal_mode,
+ ..self.clone()
+ }
+ }
+
+ fn n_steps_forward(&self, n: usize) -> Self {
+ iter::successors(Some(self.clone()), |state| Some(state.next()))
+ .nth(n)
+ .unwrap()
+ }
+
+ fn first_repeated_state(&self) -> State {
+ iter::successors(
+ Some((RedBlackTreeSet::new(), self.clone())),
+ |(seen, state)| Some((seen.insert(state.clone()), state.next())),
+ )
+ .find(|(seen, state)| seen.contains(state))
+ .unwrap()
+ .1
+ }
+
+ fn next(&self) -> State {
+ State {
+ alive: self
+ .still_alive_next_round()
+ .chain(self.comes_alive_next_round())
+ .collect(),
+ ..self.clone()
+ }
+ }
+
+ fn biodiversity_rating(&self) -> usize {
+ self.alive
+ .iter()
+ .map(|coord| 2_usize.pow((coord.y * 5 + coord.x) as u32))
+ .sum()
+ }
+
+ fn still_alive_next_round<'a>(&'a self) -> impl Iterator<Item = Coordinate> + 'a {
+ self.alive
+ .iter()
+ .filter(move |coord| self.count_alive_neighbours(**coord) == 1)
+ .cloned()
+ }
+
+ fn comes_alive_next_round<'a>(&'a self) -> impl Iterator<Item = Coordinate> + 'a {
+ self.alive
+ .iter()
+ .flat_map(move |coord| self.neighbours(*coord))
+ .filter(move |coord| !self.alive.contains(coord))
+ .filter(move |coord| {
+ self.count_alive_neighbours(*coord) == 1 || self.count_alive_neighbours(*coord) == 2
+ })
+ }
+
+ fn count_alive_neighbours(&self, coordinate: Coordinate) -> usize {
+ self.neighbours(coordinate)
+ .into_iter()
+ .filter(|coord| self.alive.contains(coord))
+ .count()
+ }
+
+ fn neighbours(&self, coordinate: Coordinate) -> Vec<Coordinate> {
+ if self.fractal_mode {
+ [(-1, 0), (1, 0), (0, -1), (0, 1)]
+ .into_iter()
+ .map(|(dx, dy)| Coordinate {
+ x: coordinate.x + dx,
+ y: coordinate.y + dy,
+ depth: coordinate.depth,
+ })
+ .flat_map(move |coord| match (coord.x, coord.y) {
+ (x, _y) if x < 0 => vec![Coordinate {
+ x: 1,
+ y: 2,
+ depth: coord.depth - 1,
+ }]
+ .into_iter(),
+ (_x, y) if y < 0 => vec![Coordinate {
+ x: 2,
+ y: 1,
+ depth: coord.depth - 1,
+ }]
+ .into_iter(),
+ (x, _y) if x >= 5 => vec![Coordinate {
+ x: 3,
+ y: 2,
+ depth: coord.depth - 1,
+ }]
+ .into_iter(),
+ (_x, y) if y >= 5 => vec![Coordinate {
+ x: 2,
+ y: 3,
+ depth: coord.depth - 1,
+ }]
+ .into_iter(),
+ (2, 2) => match (coordinate.x, coordinate.y) {
+ (1, 2) => (0..5)
+ .map(|y| Coordinate {
+ x: 0,
+ y,
+ depth: coord.depth + 1,
+ })
+ .collect::<Vec<_>>()
+ .into_iter(),
+ (2, 1) => (0..5)
+ .map(|x| Coordinate {
+ x,
+ y: 0,
+ depth: coord.depth + 1,
+ })
+ .collect::<Vec<_>>()
+ .into_iter(),
+ (3, 2) => (0..5)
+ .map(|y| Coordinate {
+ x: 4,
+ y,
+ depth: coord.depth + 1,
+ })
+ .collect::<Vec<_>>()
+ .into_iter(),
+ (2, 3) => (0..5)
+ .map(|x| Coordinate {
+ x,
+ y: 4,
+ depth: coord.depth + 1,
+ })
+ .collect::<Vec<_>>()
+ .into_iter(),
+ (_, _) => vec![].into_iter(),
+ },
+ _ => vec![coord.clone()].into_iter(),
+ })
+ .collect()
+ } else {
+ [(-1, 0), (1, 0), (0, -1), (0, 1)]
+ .into_iter()
+ .map(|(dx, dy)| Coordinate {
+ x: coordinate.x + dx,
+ y: coordinate.y + dy,
+ depth: coordinate.depth,
+ })
+ .filter(|coord| coord.x >= 0 && coord.x < 5 && coord.y >= 0 && coord.y < 5)
+ .collect()
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq)]
+struct Coordinate {
+ x: isize,
+ y: isize,
+ depth: isize,
+}
diff --git a/2019/src/bin/day_25.dot b/2019/src/bin/day_25.dot
new file mode 100644
index 0000000..58dc131
--- /dev/null
+++ b/2019/src/bin/day_25.dot
@@ -0,0 +1,43 @@
+digraph {
+ Breach [label="Hull Breach"]
+ Crew [label="Crew Quarters (antenna)"]
+ Hallway [label="Hallway (weather machine)"]
+ Storage [label="Storage (klein bottle)"]
+ Stables [label="Stables (spool of cat6)"]
+ Warp [label="Warp Drive Maintenance"]
+ Security [label="Security Checkpoint"]
+ Pressure [label="Pressure-Sensitive Floor"]
+ Gift [label="Gift Wrapping Center"]
+ Sick [label="Sick Bay (infinite loop X)"]
+ Chocolate [label="Hot Chocolate Fountain (giant electromagnet X)"]
+ Observatory [label="Observatory (cake)"]
+ Navigation [label="Navigation (escape pod XX)"]
+ Corridor [label="Corridor"]
+ Holodeck [label="Holodeck (molten lava X)"]
+ Science [label="Science Lab (tambourine)"]
+ Passages [label="Passages (shell)"]
+ Engineering [label="Engineering"]
+ Arcade [label="Arcade (photons X)"]
+ Kitchen [label="Kitchen (mug)"]
+
+
+ Breach -> Crew [label=East]
+ Breach -> Hallway [label=North]
+ Hallway -> Storage [label=North]
+ Storage -> Stables [label=East]
+ Stables -> Warp [label=South]
+ Warp -> Security [label=South]
+ Security -> Pressure [label=East]
+ Stables -> Gift [label=East]
+ Gift -> Sick [label=North]
+ Sick -> Chocolate [label=West]
+ Chocolate -> Observatory [label=North]
+ Chocolate -> Navigation [label=West]
+ Corridor -> Holodeck [label=North]
+ Holodeck -> Science [label=North]
+ Sick -> Corridor [label=East]
+ Corridor -> Passages [label=South]
+ Passages -> Engineering [label=East]
+ Engineering -> Arcade [label=South]
+ Gift -> Kitchen [label=South]
+}
diff --git a/2019/src/bin/day_25.rs b/2019/src/bin/day_25.rs
new file mode 100644
index 0000000..522789e
--- /dev/null
+++ b/2019/src/bin/day_25.rs
@@ -0,0 +1,110 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 25: Cryostasis")]
+/// Pilots a robot to save Santa!
+///
+/// See https://adventofcode.com/2019/day/25 for details.
+struct Opt {}
+
+fn main() {
+ let stdin = io::stdin();
+ let _opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let input = vec![
+ "east",
+ "take antenna",
+ "west",
+ "north",
+ "take weather machine",
+ "north",
+ "take klein bottle",
+ "east",
+ "take spool of cat6",
+ "east",
+ "south",
+ "take mug",
+ "north",
+ "north",
+ "west",
+ "north",
+ "take cake",
+ "south",
+ "east",
+ "east",
+ "north",
+ "north",
+ "take tambourine",
+ "south",
+ "south",
+ "south",
+ "take shell",
+ "north",
+ "west",
+ "south",
+ "west",
+ "south",
+ "south",
+ "inv",
+ //"drop mug",
+ //"drop weather machine",
+ "drop cake",
+ "drop shell",
+ "drop klein bottle",
+ "drop tambourine",
+ //"drop antenna",
+ //"drop spool of cat6",
+ "east",
+ ];
+
+ let result = exit_on_failed_assertion(
+ program
+ .with_input(
+ input
+ .iter()
+ .flat_map(|line| {
+ line.chars()
+ .map(|c| Intcode::from(c as u8))
+ .chain(vec![Intcode::from(10)].into_iter())
+ })
+ .collect(),
+ )
+ .run_to_termination_or_input()
+ .output_into_result(),
+ "Program failed",
+ );
+
+ println!(
+ "{}",
+ result
+ .drop_last()
+ .unwrap()
+ .iter()
+ .flat_map(|c| c.to_signed_bytes_be())
+ .map(|c| c as char)
+ .collect::<String>()
+ );
+ println!("{}", result.last().unwrap());
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
diff --git a/2019/src/bin/day_3.rs b/2019/src/bin/day_3.rs
new file mode 100644
index 0000000..f4163bd
--- /dev/null
+++ b/2019/src/bin/day_3.rs
@@ -0,0 +1,333 @@
+use rpds::vector::Vector;
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use std::str::FromStr;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 3: Crossed Wires")]
+/// Finds the closest intersection between two wires. By default,
+/// 'closest' is defined as closest in terms of Manhattan distance. If
+/// --signal-distance is set, distance is defined in terms of the
+/// total distance along the wire.
+///
+/// See https://adventofcode.com/2019/day/3 for details.
+struct Opt {
+ #[structopt(short = "s", long = "signal-distance")]
+ /// returns the closest intersection by signal distance.
+ signal_distance: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let mut input = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(x.parse::<Wire>(), "Input was not a valid wire"));
+
+ let (wire1, wire2) = match (input.next(), input.next()) {
+ (Some(w1), Some(w2)) => (w1, w2),
+ _ => {
+ eprintln!("Input must have two wires");
+ process::exit(1);
+ }
+ };
+
+ match wire1.closest_collision(&wire2, opt.signal_distance) {
+ Some(c) => println!(
+ "{}",
+ if opt.signal_distance {
+ c.signal_distance
+ } else {
+ c.manhattan_distance()
+ }
+ ),
+ None => {
+ eprintln!("No collisions");
+ process::exit(1);
+ }
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Wire {
+ segments: Vector<WireSegment>,
+}
+
+impl FromStr for Wire {
+ type Err = UnknownError;
+
+ fn from_str(s: &str) -> Result<Self, UnknownError> {
+ s.split(',')
+ .fold(
+ Ok(Vector::new()),
+ |acc: Result<Vector<WireSegment>, UnknownError>, next_str| {
+ acc.and_then(|previous_segments| {
+ WireSegment::from_str(
+ previous_segments.last().map(|l| l.end()).unwrap_or((0, 0)),
+ previous_segments
+ .last()
+ .map(|l| l.end_signal_distance())
+ .unwrap_or(0),
+ next_str,
+ )
+ .map(|seg| previous_segments.push_back(seg))
+ })
+ },
+ )
+ .map(|segments| Wire { segments })
+ }
+}
+
+impl Wire {
+ fn closest_collision(&self, other: &Wire, use_signal_distance: bool) -> Option<Collision> {
+ self.collisions(other).min_by_key(|c| {
+ if use_signal_distance {
+ c.signal_distance
+ } else {
+ c.manhattan_distance()
+ }
+ })
+ }
+
+ fn collisions<'a>(&'a self, other: &'a Wire) -> impl Iterator<Item = Collision> + 'a {
+ self.segments
+ .iter()
+ .flat_map(move |seg1| other.segments.iter().map(move |seg2| (seg1, seg2)))
+ .flat_map(|(seg1, seg2)| seg1.collisions(seg2))
+ .filter(|c| !(c.x == 0 && c.y == 0))
+ }
+}
+
+#[derive(Debug, Clone)]
+struct WireSegment {
+ start: (i32, i32),
+ start_signal_distance: i32,
+ direction: Direction,
+ length: i32,
+}
+
+impl WireSegment {
+ fn from_str(
+ start: (i32, i32),
+ start_signal_distance: i32,
+ s: &str,
+ ) -> Result<Self, UnknownError> {
+ s.parse::<Direction>().and_then(|direction| {
+ WireSegment::length_from_str(s).map(|length| WireSegment {
+ start,
+ start_signal_distance,
+ direction,
+ length,
+ })
+ })
+ }
+
+ fn length_from_str(s: &str) -> Result<i32, UnknownError> {
+ s.chars()
+ .skip(1)
+ .collect::<String>()
+ .parse()
+ .map_err(|_| UnknownError)
+ }
+
+ fn end(&self) -> (i32, i32) {
+ (
+ self.start.0 + self.direction.as_vec().0 * self.length,
+ self.start.1 + self.direction.as_vec().1 * self.length,
+ )
+ }
+
+ fn end_signal_distance(&self) -> i32 {
+ self.start_signal_distance + self.length
+ }
+
+ fn collisions(&self, other: &WireSegment) -> Option<Collision> {
+ use Direction::*;
+
+ match (self.direction, other.direction) {
+ (Left, Left) | (Right, Right) | (Up, Up) | (Down, Down) => None,
+ (Left, Right) | (Right, Left) | (Up, Down) | (Down, Up) => None,
+ (Left, Up) => collisions(
+ self.end(),
+ self.end_signal_distance(),
+ self.length,
+ -1,
+ other.start,
+ other.start_signal_distance,
+ other.length,
+ 1,
+ ),
+ (Left, Down) => collisions(
+ self.end(),
+ self.end_signal_distance(),
+ self.length,
+ -1,
+ other.end(),
+ other.end_signal_distance(),
+ other.length,
+ -1,
+ ),
+ (Right, Up) => collisions(
+ self.start,
+ self.start_signal_distance,
+ self.length,
+ 1,
+ other.start,
+ other.start_signal_distance,
+ other.length,
+ 1,
+ ),
+ (Right, Down) => collisions(
+ self.start,
+ self.start_signal_distance,
+ self.length,
+ 1,
+ other.end(),
+ other.end_signal_distance(),
+ other.length,
+ -1,
+ ),
+ (Down, Right) => collisions(
+ other.start,
+ other.start_signal_distance,
+ other.length,
+ 1,
+ self.end(),
+ self.end_signal_distance(),
+ self.length,
+ -1,
+ ),
+ (Down, Left) => collisions(
+ other.end(),
+ other.end_signal_distance(),
+ other.length,
+ -1,
+ self.end(),
+ self.end_signal_distance(),
+ self.length,
+ -1,
+ ),
+ (Up, Right) => collisions(
+ other.start,
+ other.start_signal_distance,
+ other.length,
+ 1,
+ self.start,
+ self.start_signal_distance,
+ self.length,
+ 1,
+ ),
+ (Up, Left) => collisions(
+ other.end(),
+ other.end_signal_distance(),
+ other.length,
+ -1,
+ self.start,
+ self.start_signal_distance,
+ self.length,
+ 1,
+ ),
+ }
+ }
+}
+
+fn collisions(
+ horizontal_start: (i32, i32),
+ horizontal_start_signal_distance: i32,
+ horizontal_length: i32,
+ horizontal_signal_distance_multiplier: i32,
+ vertical_start: (i32, i32),
+ vertical_start_signal_distance: i32,
+ vertical_length: i32,
+ vertical_signal_distance_multiplier: i32,
+) -> Option<Collision> {
+ if horizontal_start.1 >= vertical_start.1
+ && horizontal_start.1 <= vertical_start.1 + vertical_length
+ && vertical_start.0 >= horizontal_start.0
+ && vertical_start.0 <= horizontal_start.0 + horizontal_length
+ {
+ Some(Collision {
+ x: vertical_start.0,
+ y: horizontal_start.1,
+ signal_distance: horizontal_start_signal_distance
+ + (vertical_start.0 - horizontal_start.0) * horizontal_signal_distance_multiplier
+ + vertical_start_signal_distance
+ + (horizontal_start.1 - vertical_start.1) * vertical_signal_distance_multiplier,
+ })
+ } else {
+ None
+ }
+}
+
+#[derive(Debug, Clone, Copy)]
+enum Direction {
+ Up,
+ Down,
+ Left,
+ Right,
+}
+
+impl FromStr for Direction {
+ type Err = UnknownError;
+
+ fn from_str(s: &str) -> Result<Self, UnknownError> {
+ use Direction::*;
+ match s.chars().next() {
+ Some('L') => Ok(Left),
+ Some('R') => Ok(Right),
+ Some('U') => Ok(Up),
+ Some('D') => Ok(Down),
+ Some(_) => Err(UnknownError),
+ None => Err(UnknownError),
+ }
+ }
+}
+impl Direction {
+ fn as_vec(&self) -> (i32, i32) {
+ use Direction::*;
+ match self {
+ Up => (0, 1),
+ Down => (0, -1),
+ Left => (-1, 0),
+ Right => (1, 0),
+ }
+ }
+}
+
+struct Collision {
+ x: i32,
+ y: i32,
+ signal_distance: i32,
+}
+
+impl Collision {
+ fn manhattan_distance(&self) -> i32 {
+ self.x.abs() + self.y.abs()
+ }
+}
+
+#[derive(Debug, PartialEq)]
+struct UnknownError;
+
+impl fmt::Display for UnknownError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Unknown error")
+ }
+}
+impl std::error::Error for UnknownError {}
diff --git a/2019/src/bin/day_4.rs b/2019/src/bin/day_4.rs
new file mode 100644
index 0000000..d7d6b69
--- /dev/null
+++ b/2019/src/bin/day_4.rs
@@ -0,0 +1,55 @@
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 4: Secure Container")]
+/// Calculates how many possible lock values there are
+///
+/// See https://adventofcode.com/2019/day/4 for details.
+struct Opt {
+ /// Repeated digits must be exactly 2 long
+ #[structopt(long = "larger-range-rule")]
+ larger_range_rule: bool,
+ min: u32,
+ max: u32,
+}
+
+fn main() {
+ let opt = Opt::from_args();
+
+ println!(
+ "{}",
+ valid_combinations(opt.min, opt.max, opt.larger_range_rule)
+ )
+}
+
+fn valid_combinations(min: u32, max: u32, larger_range_rule: bool) -> u32 {
+ (min..max)
+ .filter(|x| {
+ two_adjacent_identical_digits(*x, larger_range_rule) && digits_never_decrease(*x)
+ })
+ .count() as u32
+}
+
+fn two_adjacent_identical_digits(x: u32, larger_range_rule: bool) -> bool {
+ if larger_range_rule {
+ (0..5).any(|d| {
+ digit(x, d) == digit(x, d + 1)
+ && digit(x, d) != digit(x, d + 2)
+ && digit(x, d) != digit(x, d - 1)
+ })
+ } else {
+ (0..5).any(|d| digit(x, d) == digit(x, d + 1))
+ }
+}
+
+fn digits_never_decrease(x: u32) -> bool {
+ (0..5).all(|d| digit(x, d) >= digit(x, d + 1))
+}
+
+fn digit(x: u32, digit: i32) -> u32 {
+ if digit < 0 {
+ 0
+ } else {
+ (x / 10u32.pow(digit as u32)) % 10
+ }
+}
diff --git a/2019/src/bin/day_5.rs b/2019/src/bin/day_5.rs
new file mode 100644
index 0000000..07f7af8
--- /dev/null
+++ b/2019/src/bin/day_5.rs
@@ -0,0 +1,45 @@
+use aoc2019::*;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 5: Sunny with a Chance of Asteroids")]
+/// Executes an Intcode program
+///
+/// The program is read from stdin as a series of comma-separated
+/// values. Newlines are ignored.
+///
+/// See https://adventofcode.com/2019/day/5 for details.
+struct Opt {
+ #[structopt(short = "i", long = "input")]
+ input: Vec<Intcode>,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>()
+ .with_input(opt.input.into_iter().collect());
+
+ let result = exit_on_failed_assertion(program.execute(), "Program errored");
+ println!("{}", result);
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
diff --git a/2019/src/bin/day_6.rs b/2019/src/bin/day_6.rs
new file mode 100644
index 0000000..2af272c
--- /dev/null
+++ b/2019/src/bin/day_6.rs
@@ -0,0 +1,251 @@
+use rpds::vector::Vector;
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::iter::FromIterator;
+use std::process;
+use std::str::FromStr;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 6: Universal Orbit Map")]
+/// Finds the minumum number of orbital transfers between two points.
+///
+/// Input is read from stdin, one direct orbit per line, in the format
+/// `A)B` (B is orbiting A).
+///
+/// See https://adventofcode.com/2019/day/6 for details.
+struct Opt {
+ /// Debug checksum: Counts the total orbits
+ #[structopt(short = "d", long = "debug")]
+ debug: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let orbits: OrbitalMap = stdin
+ .lock()
+ .lines()
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(x.parse::<Orbit>(), "Input was not a valid orbit"))
+ .collect();
+
+ // eprintln!("{:#?}", orbits);
+
+ if opt.debug {
+ println!("{}", orbits.total_orbits());
+ } else {
+ println!("{}", orbits.orbital_transfers("YOU", "SAN"));
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug)]
+struct StrError {
+ str: String,
+}
+
+impl fmt::Display for StrError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.str)
+ }
+}
+impl std::error::Error for StrError {}
+
+#[derive(Debug, Clone)]
+struct Orbit {
+ a: String,
+ b: String,
+}
+
+impl FromStr for Orbit {
+ type Err = StrError;
+
+ fn from_str(s: &str) -> Result<Self, StrError> {
+ match s.split(')').collect::<Vec<_>>()[..] {
+ [a, b] => Ok(Orbit {
+ a: a.to_string(),
+ b: b.to_string(),
+ }),
+ _ => Err(StrError {
+ str: format!("{} is not a valid orbit description", s),
+ }),
+ }
+ }
+}
+
+#[derive(Clone, Debug)]
+struct OrbitalMap {
+ id: String,
+ depth: usize,
+ orbiters: Vector<OrbitalMap>,
+}
+
+struct OrbitalMapBuilder {
+ orbiters: Vector<OrbitalMap>,
+ inserted_orbits: Vector<String>,
+ pending_orbits: Vector<Orbit>,
+}
+
+impl FromIterator<Orbit> for OrbitalMap {
+ fn from_iter<T: IntoIterator<Item = Orbit>>(iter: T) -> Self {
+ iter.into_iter().collect::<OrbitalMapBuilder>().build()
+ }
+}
+
+impl FromIterator<Orbit> for OrbitalMapBuilder {
+ fn from_iter<T: IntoIterator<Item = Orbit>>(iter: T) -> Self {
+ OrbitalMapBuilder {
+ orbiters: Vector::new(),
+ inserted_orbits: Vector::new(),
+ pending_orbits: iter.into_iter().collect(),
+ }
+ }
+}
+
+impl OrbitalMapBuilder {
+ fn build(self) -> OrbitalMap {
+ if self.pending_orbits.is_empty() {
+ OrbitalMap {
+ id: ROOT.into(),
+ depth: 0,
+ orbiters: self.orbiters,
+ }
+ } else {
+ self.pending_orbits
+ .into_iter()
+ .fold(
+ OrbitalMapBuilder {
+ pending_orbits: Vector::new(),
+ ..self
+ },
+ |acc, next| acc.insert(&next),
+ )
+ .build()
+ }
+ }
+
+ fn insert(self, orbit: &Orbit) -> OrbitalMapBuilder {
+ if orbit.a == ROOT {
+ OrbitalMapBuilder {
+ orbiters: self.orbiters.push_back(OrbitalMap::new(orbit.b.clone(), 1)),
+ inserted_orbits: self.inserted_orbits.push_back(orbit.b.clone()),
+ ..self
+ }
+ } else if self.inserted_orbits.iter().any(|o| *o == orbit.a) {
+ OrbitalMapBuilder {
+ orbiters: self
+ .orbiters
+ .into_iter()
+ .map(|map| OrbitalMap::insert(map.clone(), orbit))
+ .collect(),
+ inserted_orbits: self.inserted_orbits.push_back(orbit.b.clone()),
+ ..self
+ }
+ } else {
+ OrbitalMapBuilder {
+ pending_orbits: self.pending_orbits.push_back(orbit.clone()),
+ ..self
+ }
+ }
+ }
+}
+
+const ROOT: &str = "COM";
+
+impl OrbitalMap {
+ fn new(id: String, depth: usize) -> OrbitalMap {
+ OrbitalMap {
+ id,
+ depth,
+ orbiters: Vector::new(),
+ }
+ }
+
+ fn insert(self, orbit: &Orbit) -> OrbitalMap {
+ if orbit.a == self.id {
+ if self.orbiters.iter().any(|o| o.id == orbit.b) {
+ self
+ } else {
+ OrbitalMap {
+ orbiters: self
+ .orbiters
+ .push_back(OrbitalMap::new(orbit.b.clone(), self.depth + 1)),
+ ..self
+ }
+ }
+ } else {
+ OrbitalMap {
+ orbiters: self
+ .orbiters
+ .into_iter()
+ .map(|map| OrbitalMap::insert(map.clone(), orbit))
+ .collect(),
+ ..self
+ }
+ }
+ }
+
+ fn count_orbits(&self) -> usize {
+ self.orbiters.len()
+ + self
+ .orbiters
+ .iter()
+ .map(|o| o.count_orbits())
+ .sum::<usize>()
+ }
+
+ fn total_orbits(&self) -> usize {
+ self.count_orbits()
+ + self
+ .orbiters
+ .iter()
+ .map(|o| o.total_orbits())
+ .sum::<usize>()
+ }
+
+ fn find_depth(&self, id: &str) -> usize {
+ if self.id == id {
+ self.depth
+ } else {
+ // only the actual one will return non-zero from this
+ self.orbiters.iter().map(|o| o.find_depth(id)).sum()
+ }
+ }
+
+ fn contains(&self, id: &str) -> bool {
+ self.id == id || self.orbiters.iter().any(|o| o.contains(id))
+ }
+
+ fn find_common_ancestor(&self, a: &str, b: &str) -> Option<OrbitalMap> {
+ if !self.contains(a) || !self.contains(b) {
+ None
+ } else {
+ self.orbiters
+ .iter()
+ .flat_map(|o| o.find_common_ancestor(a, b))
+ .next()
+ .or(Some(self.clone()))
+ }
+ }
+
+ fn orbital_transfers(&self, from: &str, to: &str) -> usize {
+ self.find_depth(from) + self.find_depth(to)
+ - 2 * self
+ .find_common_ancestor(from, to)
+ .map(|o| o.depth)
+ .unwrap_or(0)
+ - 2
+ }
+}
diff --git a/2019/src/bin/day_7.rs b/2019/src/bin/day_7.rs
new file mode 100644
index 0000000..9b9177a
--- /dev/null
+++ b/2019/src/bin/day_7.rs
@@ -0,0 +1,175 @@
+use aoc2019::*;
+use rpds::list;
+use rpds::list::List;
+use rpds::vector::Vector;
+use std::io;
+use std::io::prelude::*;
+use std::iter;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 7: Amplification Circuit")]
+/// Executes an Intcode program on 5 amplifiers, and finds the input that gives the max output
+///
+/// See https://adventofcode.com/2019/day/7 for details.
+struct Opt {
+ #[structopt(short = "f", long = "feedback-loop")]
+ feedback_loop_mode: bool,
+}
+
+fn main() {
+ let stdin = io::stdin();
+ let opt = Opt::from_args();
+
+ let program: IntcodeProgram = stdin
+ .lock()
+ .split(b',')
+ .map(|x| exit_on_failed_assertion(x, "Error reading input"))
+ .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8"))
+ .map(|x| exit_on_failed_assertion(x.trim().parse::<Intcode>(), "Invalid number"))
+ .collect::<IntcodeProgram>();
+
+ let result = exit_on_failed_assertion(
+ find_max_power(&program, opt.feedback_loop_mode),
+ "Program errored",
+ );
+ println!("{}", result);
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+fn find_max_power(
+ program: &IntcodeProgram,
+ feedback_loop_mode: bool,
+) -> Result<Intcode, IntcodeProgramError> {
+ PhaseSetting::all(feedback_loop_mode)
+ .map(|phase| AmplifierArray::new(program, &phase).execute())
+ .collect::<Result<Vec<Intcode>, _>>()
+ .map(|powers| powers.into_iter().max().unwrap_or(Intcode::from(0)))
+}
+
+#[derive(Debug, Clone)]
+struct PhaseSetting([Intcode; 5]);
+
+impl PhaseSetting {
+ fn all(feedback_loop_mode: bool) -> impl Iterator<Item = PhaseSetting> {
+ if feedback_loop_mode {
+ PhaseSetting::permute(5, 10)
+ } else {
+ PhaseSetting::permute(0, 5)
+ }
+ }
+
+ fn permute(min: i32, max: i32) -> impl Iterator<Item = PhaseSetting> {
+ // This is an absolutely atrocious way to do the permutation,
+ // but luckily it's only 5 elements long.
+ (min..max)
+ .flat_map(move |a| {
+ (min..max).flat_map(move |b| {
+ (min..max).flat_map(move |c| {
+ (min..max).flat_map(move |d| {
+ (min..max).map(move |e| {
+ PhaseSetting([a.into(), b.into(), c.into(), d.into(), e.into()])
+ })
+ })
+ })
+ })
+ })
+ .filter(move |phase| (min..max).all(|x| phase.0.contains(&x.into())))
+ }
+}
+
+#[derive(Debug, Clone)]
+struct AmplifierArray {
+ amplifiers: Vector<IntcodeProgram>,
+}
+
+impl AmplifierArray {
+ fn new(program: &IntcodeProgram, phase: &PhaseSetting) -> AmplifierArray {
+ AmplifierArray {
+ amplifiers: (0..5)
+ .map(|n| AmplifierArray::new_amp(program, phase, n))
+ .collect(),
+ }
+ }
+
+ fn new_amp(program: &IntcodeProgram, phase: &PhaseSetting, n: usize) -> IntcodeProgram {
+ if n == 0 {
+ program.with_input(list![phase.0[n].clone(), Intcode::from(0)])
+ } else {
+ program.with_input(list![phase.0[n].clone()])
+ }
+ }
+
+ fn execute(&self) -> Result<Intcode, IntcodeProgramError> {
+ self.run_to_termination().output_into_result()
+ }
+
+ fn run_to_termination(&self) -> AmplifierArray {
+ iter::successors(Some(self.clone()), |p| Some(p.next()))
+ .find(|p| p.is_terminated())
+ .unwrap() // successors doesn't terminate, so this will never be none.
+ }
+
+ fn output_into_result(&self) -> Result<Intcode, IntcodeProgramError> {
+ self.amplifiers
+ .first()
+ .and_then(|amp| amp.input.first().cloned())
+ .ok_or(IntcodeProgramError::Unknown)
+ }
+
+ fn is_terminated(&self) -> bool {
+ self.amplifiers.last().map(|amp| amp.halted).unwrap_or(true)
+ }
+
+ fn next(&self) -> AmplifierArray {
+ self.run_amplifiers().update_inputs()
+ }
+
+ fn run_amplifiers(&self) -> AmplifierArray {
+ AmplifierArray {
+ amplifiers: self
+ .amplifiers
+ .iter()
+ .map(|amp| amp.run_to_termination_or_input())
+ .collect(),
+ }
+ }
+
+ fn update_inputs(&self) -> AmplifierArray {
+ AmplifierArray {
+ amplifiers: self
+ .amplifiers
+ .iter()
+ .fold(
+ (
+ Vector::new(),
+ self.amplifiers
+ .last()
+ .map(|a| a.output.iter().cloned().collect::<List<Intcode>>())
+ .unwrap_or(List::new()),
+ ),
+ |(amps, piped_input), next_amp| {
+ (
+ amps.push_back(
+ next_amp
+ .with_additional_input(piped_input)
+ .with_cleared_output(),
+ ),
+ next_amp.output.iter().cloned().collect::<List<Intcode>>(),
+ )
+ },
+ )
+ .0,
+ }
+ }
+}
diff --git a/2019/src/bin/day_8.rs b/2019/src/bin/day_8.rs
new file mode 100644
index 0000000..0508e7c
--- /dev/null
+++ b/2019/src/bin/day_8.rs
@@ -0,0 +1,135 @@
+use std::fmt;
+use std::io;
+use std::io::prelude::*;
+use std::process;
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "Day 8: Space Image Format")]
+/// Executes an Intcode program on 5 amplifiers, and finds the input that gives the max output
+///
+/// See https://adventofcode.com/2019/day/8 for details.
+struct Opt {
+ /// Rather than rendering the image, calculate and print its checksum
+ #[structopt(short = "c", long = "checksum")]
+ checksum_mode: bool,
+ #[structopt(short = "w", long = "width")]
+ width: u32,
+ #[structopt(short = "h", long = "height")]
+ height: u32,
+}
+
+fn main() {
+ let opt = Opt::from_args();
+
+ let image: Image = {
+ let mut buffer = String::new();
+ exit_on_failed_assertion(
+ io::stdin().read_to_string(&mut buffer),
+ "Error reading input",
+ );
+
+ Image::from_str(&buffer.trim(), opt.width, opt.height)
+ };
+
+ if opt.checksum_mode {
+ println!("{}", image.checksum());
+ } else {
+ println!("{}", image);
+ }
+}
+
+fn exit_on_failed_assertion<A, E: std::error::Error>(data: Result<A, E>, message: &str) -> A {
+ match data {
+ Ok(data) => data,
+ Err(e) => {
+ eprintln!("{}: {}", message, e);
+ process::exit(1);
+ }
+ }
+}
+
+#[derive(Debug)]
+struct Image {
+ width: u32,
+ height: u32,
+ layers: Vec<ImageLayer>,
+}
+
+impl fmt::Display for Image {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.flatten()
+ .pixels
+ .chunks(self.width as usize)
+ .map(|line| {
+ line.iter()
+ .map(|c| write!(f, "{}", if *c == 0 { ' ' } else { '1' }))
+ .collect::<fmt::Result>()
+ .and_then(|_| writeln!(f))
+ })
+ .collect()
+ }
+}
+
+impl Image {
+ fn from_str(s: &str, width: u32, height: u32) -> Image {
+ Image {
+ width,
+ height,
+ layers: s
+ .as_bytes()
+ .chunks((width * height) as usize)
+ .map(|chunk| ImageLayer::new(chunk))
+ .collect(),
+ }
+ }
+
+ fn checksum(&self) -> usize {
+ self.layers
+ .iter()
+ .min_by_key(|layer| layer.pixel_count(0))
+ .map(|layer| layer.pixel_count(1) * layer.pixel_count(2))
+ .unwrap_or(0)
+ }
+
+ fn flatten(&self) -> ImageLayer {
+ self.layers
+ .iter()
+ .fold(ImageLayer::empty(self.width, self.height), |acc, next| {
+ ImageLayer {
+ pixels: acc
+ .pixels
+ .iter()
+ .zip(next.pixels.iter())
+ .map(|(a, b)| if *a == 2 { *b } else { *a })
+ .collect(),
+ }
+ })
+ }
+}
+
+#[derive(Debug)]
+struct ImageLayer {
+ pixels: Vec<u8>,
+}
+
+impl ImageLayer {
+ fn new(char_pixels: &[u8]) -> ImageLayer {
+ ImageLayer {
+ pixels: char_pixels
+ .iter()
+ .map(|c| c.overflowing_sub(b'0').0)
+ .collect(),
+ }
+ }
+
+ fn empty(width: u32, height: u32) -> ImageLayer {
+ ImageLayer {
+ pixels: vec![2; (width * height) as usize],
+ }
+ }
+
+ fn pixel_count(&self, value: u8) -> usize {
+ self.pixels.iter().filter(|p| **p == value).count()
+ }
+}
diff --git a/2019/src/bin/day_9.rs b/2019/src/bin/day_9.rs
new file mode 100644
index 0000000..7f9b4aa
--- /dev/null
+++ b/2019/src/bin/day_9.rs
@@ -0,0 +1 @@
+// Run the day 5 binary for this
diff --git a/2019/src/lib.rs b/2019/src/lib.rs
new file mode 100644
index 0000000..a7dfc02
--- /dev/null
+++ b/2019/src/lib.rs
@@ -0,0 +1,438 @@
+use derivative::Derivative;
+use num::bigint::BigInt;
+use num::traits::identities::Zero;
+use rpds::RedBlackTreeMap;
+use rpds::{list::List, vector::Vector};
+use std::fmt;
+use std::iter;
+use std::iter::FromIterator;
+use std::iter::IntoIterator;
+use std::iter::Iterator;
+
+pub type Intcode = BigInt;
+
+#[derive(Clone, Derivative)]
+#[derivative(Debug)]
+pub struct IntcodeProgram {
+ #[derivative(Debug(format_with = "std::fmt::Display::fmt"))]
+ instruction_pointer: Intcode,
+ #[derivative(Debug(format_with = "std::fmt::Display::fmt"))]
+ relative_base: Intcode,
+ pub error: Option<IntcodeProgramError>,
+ pub halted: bool,
+ pub awaiting_input: bool,
+ #[derivative(Debug(format_with = "std::fmt::Display::fmt"))]
+ memory: RedBlackTreeMap<Intcode, Intcode>,
+ #[derivative(Debug(format_with = "std::fmt::Display::fmt"))]
+ pub input: List<Intcode>,
+ #[derivative(Debug(format_with = "std::fmt::Display::fmt"))]
+ pub output: Vector<Intcode>,
+}
+
+impl FromIterator<Intcode> for IntcodeProgram {
+ fn from_iter<I: IntoIterator<Item = Intcode>>(iter: I) -> Self {
+ IntcodeProgram {
+ instruction_pointer: Intcode::from(0),
+ relative_base: Intcode::from(0),
+ error: None,
+ halted: false,
+ awaiting_input: false,
+ memory: iter
+ .into_iter()
+ .enumerate()
+ .map(|(addr, val)| (Intcode::from(addr), val))
+ .collect(),
+ input: List::new(),
+ output: Vector::new(),
+ }
+ }
+}
+
+pub fn intcode_to_bool(i: &Intcode) -> bool {
+ *i != Intcode::from(0)
+}
+
+pub fn bool_to_intcode(i: bool) -> Intcode {
+ if i {
+ Intcode::from(1)
+ } else {
+ Intcode::from(0)
+ }
+}
+
+impl IntcodeProgram {
+ pub fn with_mem_0(&self, val: Intcode) -> IntcodeProgram {
+ self.with_memory_set(0.into(), val)
+ }
+
+ pub fn with_noun_verb_input(&self, noun: Intcode, verb: Intcode) -> IntcodeProgram {
+ self.with_memory_set(1.into(), noun)
+ .with_memory_set(2.into(), verb)
+ }
+
+ pub fn with_input(&self, input: List<Intcode>) -> IntcodeProgram {
+ IntcodeProgram {
+ input,
+ ..self.clone()
+ }
+ }
+
+ pub fn with_additional_input(&self, input: List<Intcode>) -> IntcodeProgram {
+ IntcodeProgram {
+ input: self.input.iter().chain(input.iter()).cloned().collect(),
+ ..self.clone()
+ }
+ }
+
+ pub fn with_cleared_output(&self) -> IntcodeProgram {
+ IntcodeProgram {
+ output: Vector::new(),
+ ..self.clone()
+ }
+ }
+
+ pub fn execute(&self) -> Result<Vector<Intcode>, IntcodeProgramError> {
+ self.run_to_termination().output_into_result()
+ }
+
+ pub fn execute_returning_memory_0(&self) -> Result<Intcode, IntcodeProgramError> {
+ self.run_to_termination().memory_0_into_result()
+ }
+
+ pub fn run_to_termination(&self) -> IntcodeProgram {
+ iter::successors(Some(self.clear_await_input()), |p| {
+ Some(IntcodeProgram::next(&p))
+ })
+ .find(|p| p.halted)
+ .unwrap() // successors doesn't terminate, so this will never be none.
+ }
+
+ pub fn run_to_termination_or_input(&self) -> IntcodeProgram {
+ iter::successors(Some(self.clear_await_input()), |p| {
+ Some(IntcodeProgram::next(&p))
+ })
+ .find(|p| p.halted || p.awaiting_input)
+ .unwrap()
+ }
+
+ pub fn output_into_result(&self) -> Result<Vector<Intcode>, IntcodeProgramError> {
+ match self.error {
+ Some(ref error) => Err(error.clone()),
+ None => Ok(self.output.clone()),
+ }
+ }
+
+ fn with_instruction_pointer(&self, instruction_pointer: Intcode) -> IntcodeProgram {
+ IntcodeProgram {
+ instruction_pointer,
+ ..self.clone()
+ }
+ }
+
+ fn with_instruction_pointer_offset(&self, offset: usize) -> IntcodeProgram {
+ IntcodeProgram {
+ instruction_pointer: self.instruction_pointer.clone() + offset,
+ ..self.clone()
+ }
+ }
+
+ fn with_relative_base(&self, relative_base: Intcode) -> IntcodeProgram {
+ IntcodeProgram {
+ relative_base,
+ ..self.clone()
+ }
+ }
+
+ fn with_memory_set(&self, address: Intcode, value: Intcode) -> IntcodeProgram {
+ IntcodeProgram {
+ memory: self.memory.insert(address, value),
+ ..self.clone()
+ }
+ }
+
+ fn with_input_consumed(&self) -> IntcodeProgram {
+ self.input
+ .drop_first()
+ .map(|input| IntcodeProgram {
+ input,
+ ..self.clone()
+ })
+ .unwrap_or(self.error(IntcodeProgramError::Unknown))
+ }
+
+ fn with_output(&self, print: Intcode) -> IntcodeProgram {
+ IntcodeProgram {
+ output: self.output.push_back(print),
+ ..self.clone()
+ }
+ }
+
+ fn memory_0_into_result(&self) -> Result<Intcode, IntcodeProgramError> {
+ match self.error {
+ Some(ref error) => Err(error.clone()),
+ None => Ok(self
+ .memory
+ .get(&Intcode::from(0))
+ .cloned()
+ .unwrap_or(Intcode::from(0))),
+ }
+ }
+ fn next(&self) -> IntcodeProgram {
+ //dbg!(self);
+ self.memory
+ .get(&self.instruction_pointer)
+ .map(|opcode| match opcode.to_radix_le(100).1[0] {
+ 1 => self.add(opcode),
+ 2 => self.multiply(opcode),
+ 3 => self.input(opcode),
+ 4 => self.output(opcode),
+ 5 => self.jump_if_true(opcode),
+ 6 => self.jump_if_false(opcode),
+ 7 => self.less_than(opcode),
+ 8 => self.equals(opcode),
+ 9 => self.set_relative_base(opcode),
+ 99 => self.halt(),
+ unknown => self.error(IntcodeProgramError::InvalidOpcode(unknown.clone())),
+ })
+ .unwrap_or(self.error(IntcodeProgramError::Unknown))
+ }
+
+ fn add(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(4).with_memory_set(
+ self.get_literal(3, mode),
+ self.get(1, mode) + self.get(2, mode),
+ )
+ }
+
+ fn multiply(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(4).with_memory_set(
+ self.get_literal(3, mode),
+ self.get(1, mode) * self.get(2, mode),
+ )
+ }
+
+ fn input(&self, mode: &Intcode) -> IntcodeProgram {
+ match self.input.first().cloned() {
+ Some(input) => self
+ .with_instruction_pointer_offset(2)
+ .with_memory_set(self.get_literal(1, mode), input)
+ .with_input_consumed(),
+ None => self.await_input(),
+ }
+ }
+
+ fn output(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(2)
+ .with_output(self.get(1, mode))
+ }
+
+ fn jump_if_true(&self, mode: &Intcode) -> IntcodeProgram {
+ if !self.get(1, mode).is_zero() {
+ self.with_instruction_pointer(self.get(2, mode))
+ } else {
+ self.with_instruction_pointer_offset(3)
+ }
+ }
+ fn jump_if_false(&self, mode: &Intcode) -> IntcodeProgram {
+ if self.get(1, mode).is_zero() {
+ self.with_instruction_pointer(self.get(2, mode))
+ } else {
+ self.with_instruction_pointer_offset(3)
+ }
+ }
+
+ fn less_than(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(4).with_memory_set(
+ self.get_literal(3, mode),
+ if self.get(1, mode) < self.get(2, mode) {
+ Intcode::from(1)
+ } else {
+ Intcode::from(0)
+ },
+ )
+ }
+
+ fn equals(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(4).with_memory_set(
+ self.get_literal(3, mode),
+ if self.get(1, mode) == self.get(2, mode) {
+ Intcode::from(1)
+ } else {
+ Intcode::from(0)
+ },
+ )
+ }
+
+ fn set_relative_base(&self, mode: &Intcode) -> IntcodeProgram {
+ self.with_instruction_pointer_offset(2)
+ .with_relative_base(self.relative_base.clone() + self.get(1, mode))
+ }
+
+ fn halt(&self) -> IntcodeProgram {
+ IntcodeProgram {
+ halted: true,
+ ..self.clone()
+ }
+ }
+
+ fn await_input(&self) -> IntcodeProgram {
+ IntcodeProgram {
+ awaiting_input: true,
+ ..self.clone()
+ }
+ }
+
+ fn clear_await_input(&self) -> IntcodeProgram {
+ IntcodeProgram {
+ awaiting_input: false,
+ ..self.clone()
+ }
+ }
+
+ fn error(&self, error: IntcodeProgramError) -> IntcodeProgram {
+ IntcodeProgram {
+ halted: true,
+ error: Some(error),
+ ..self.clone()
+ }
+ }
+
+ fn get(&self, pointer_offset: usize, mode: &Intcode) -> Intcode {
+ match mode
+ .to_radix_le(10)
+ .1
+ .get(pointer_offset + 1)
+ .cloned()
+ .unwrap_or(0)
+ {
+ 0 => self.get_position(pointer_offset),
+ 1 => self.get_immediate(pointer_offset),
+ 2 => self.get_relative(pointer_offset),
+ _ => Intcode::from(0),
+ }
+ }
+
+ fn get_literal(&self, pointer_offset: usize, mode: &Intcode) -> Intcode {
+ match mode
+ .to_radix_le(10)
+ .1
+ .get(pointer_offset + 1)
+ .cloned()
+ .unwrap_or(0)
+ {
+ 0 => self.get_immediate(pointer_offset),
+ 1 => self.get_immediate(pointer_offset),
+ 2 => self.get_immediate_relative(pointer_offset),
+ _ => Intcode::from(0),
+ }
+ }
+
+ fn get_immediate(&self, pointer_offset: usize) -> Intcode {
+ self.memory
+ .get(&(self.instruction_pointer.clone() + pointer_offset))
+ .cloned()
+ .unwrap_or(Intcode::from(0))
+ }
+
+ fn get_position(&self, pointer_offset: usize) -> Intcode {
+ self.memory
+ .get(&self.get_immediate(pointer_offset))
+ .cloned()
+ .unwrap_or(Intcode::from(0))
+ }
+
+ fn get_relative(&self, pointer_offset: usize) -> Intcode {
+ self.memory
+ .get(&(self.get_immediate(pointer_offset) + self.relative_base.clone()))
+ .cloned()
+ .unwrap_or(Intcode::from(0))
+ }
+
+ fn get_immediate_relative(&self, pointer_offset: usize) -> Intcode {
+ self.get_immediate(pointer_offset) + self.relative_base.clone()
+ }
+}
+
+#[derive(Debug, PartialEq, Clone)]
+pub enum IntcodeProgramError {
+ InvalidOpcode(u8),
+ Unknown,
+}
+
+impl fmt::Display for IntcodeProgramError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ use IntcodeProgramError::*;
+
+ match self {
+ InvalidOpcode(i) => write!(f, "{} is not a valid opcode", i),
+ Unknown => write!(f, "Unknown error"),
+ }
+ }
+}
+impl std::error::Error for IntcodeProgramError {}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ fn i32_vec_to_intcode_program(input: Vec<i32>) -> IntcodeProgram {
+ input.into_iter().map(Intcode::from).collect()
+ }
+
+ fn i32_vec_to_intcode_memory(input: Vec<i32>) -> RedBlackTreeMap<Intcode, Intcode> {
+ input
+ .into_iter()
+ .enumerate()
+ .map(|(i, val)| (Intcode::from(i), Intcode::from(val)))
+ .collect()
+ }
+
+ fn i32_vec_to_intcode_vec(input: Vec<i32>) -> Vector<Intcode> {
+ input.into_iter().map(Intcode::from).collect()
+ }
+
+ fn test_example_program(
+ before_execution: Vec<i32>,
+ after_execution: Vec<i32>,
+ ) -> IntcodeProgram {
+ let program = i32_vec_to_intcode_program(before_execution).run_to_termination();
+
+ assert_eq!(program.error, None);
+ assert_eq!(program.memory, i32_vec_to_intcode_memory(after_execution));
+ program
+ }
+
+ #[test]
+ fn day_2_example_1() {
+ test_example_program(vec![1, 0, 0, 0, 99], vec![2, 0, 0, 0, 99]);
+ }
+
+ #[test]
+ fn day_2_example_2() {
+ test_example_program(vec![2, 3, 0, 3, 99], vec![2, 3, 0, 6, 99]);
+ }
+
+ #[test]
+ fn day_5_example_1() {
+ test_example_program(vec![1002, 4, 3, 4, 33], vec![1002, 4, 3, 4, 99]);
+ }
+
+ #[test]
+ fn day_9_example_1() {
+ let quine = vec![
+ 109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101, 0, 99,
+ ];
+ let program = i32_vec_to_intcode_program(quine.clone()).run_to_termination();
+ assert_eq!(program.error, None);
+ assert_eq!(program.output, i32_vec_to_intcode_vec(quine));
+ }
+}
+
+pub fn sort_by_key<T, K: Ord>(
+ iter: impl IntoIterator<Item = T>,
+ f: impl FnMut(&T) -> K,
+) -> impl Iterator<Item = T> {
+ let mut tmp: Vec<T> = iter.into_iter().collect();
+ tmp.sort_by_key(f);
+ tmp.into_iter()
+}
diff --git a/2019/src/main.rs b/2019/src/main.rs
new file mode 100644
index 0000000..0c24a73
--- /dev/null
+++ b/2019/src/main.rs
@@ -0,0 +1,12 @@
+use std::io;
+use std::io::prelude::*;
+
+fn main() {
+ let stdin = io::stdin();
+ let answer = string_length_sum(stdin.lock().lines().map(|l| l.unwrap()));
+ dbg!(answer);
+}
+
+fn string_length_sum(it: impl Iterator<Item = String>) -> usize {
+ it.map(|l| l.len()).sum()
+}
diff --git a/2020/Cargo.lock b/2020/Cargo.lock
new file mode 100644
index 0000000..dcd07c3
--- /dev/null
+++ b/2020/Cargo.lock
@@ -0,0 +1,3654 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "Inflector"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
+
+[[package]]
+name = "ab_glyph"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26a685fe66654266f321a8b572660953f4df36a2135706503a4c89981d76e1a2"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff"
+
+[[package]]
+name = "addr2line"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "advent-of-code-2020"
+version = "0.1.0"
+dependencies = [
+ "bevy",
+ "thiserror",
+]
+
+[[package]]
+name = "ahash"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb6ec8807cd25b59e6b8100815afc73f54e294f1a425a2e555971969889a8f8"
+dependencies = [
+ "getrandom 0.2.0",
+ "lazy_static",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alsa"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb213f6b3e4b1480a60931ca2035794aa67b73103d254715b1db7b70dcb3c934"
+dependencies = [
+ "alsa-sys",
+ "bitflags",
+ "libc",
+ "nix 0.15.0",
+]
+
+[[package]]
+name = "alsa-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5a0559bcd3f7a482690d98be41c08a43e92f669b179433e95ddf5e8b8fd36a3"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "android_log-sys"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e"
+
+[[package]]
+name = "android_log-sys"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
+
+[[package]]
+name = "android_logger"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cbd542dd180566fad88fd2729a53a62a734843c626638006a9d63ec0688484e"
+dependencies = [
+ "android_log-sys 0.1.2",
+ "env_logger",
+ "lazy_static",
+ "log",
+]
+
+[[package]]
+name = "android_logger"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5027a747b8132dc36dc894415a300aab31d6489ee788e9ba07bc99558b1278ca"
+dependencies = [
+ "android_log-sys 0.2.0",
+ "env_logger",
+ "lazy_static",
+ "log",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
+
+[[package]]
+name = "anymap"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "ascii"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
+
+[[package]]
+name = "ash"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38"
+dependencies = [
+ "libloading 0.6.5",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146"
+dependencies = [
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "once_cell",
+ "vec-arena",
+]
+
+[[package]]
+name = "async-task"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0"
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "backtrace"
+version = "0.3.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2baad346b2d4e94a24347adeee9c7a93f412ee94b9cc26e5b59dea23848e9f28"
+dependencies = [
+ "addr2line",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide 0.4.3",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base-x"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "base64"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "bevy"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8de175e156277bf382d5212e4f580e74caaa62917b5554e12ab2addd87ae789"
+dependencies = [
+ "android_logger 0.9.0",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_audio",
+ "bevy_core",
+ "bevy_diagnostic",
+ "bevy_dynamic_plugin",
+ "bevy_ecs",
+ "bevy_gilrs",
+ "bevy_gltf",
+ "bevy_input",
+ "bevy_math",
+ "bevy_pbr",
+ "bevy_property",
+ "bevy_render",
+ "bevy_scene",
+ "bevy_sprite",
+ "bevy_tasks",
+ "bevy_text",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_ui",
+ "bevy_utils",
+ "bevy_wgpu",
+ "bevy_window",
+ "bevy_winit",
+ "ndk-glue",
+]
+
+[[package]]
+name = "bevy-glsl-to-spirv"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d5f2f58f0aec3c50a20799792c3705e80dd7df327e79791cacec197e84e5e61"
+
+[[package]]
+name = "bevy_app"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93cdf694a6d588bf46a2a7ae5623f176fc5c4ee4d0d71281fdc25bd263136a14"
+dependencies = [
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_utils",
+ "instant",
+ "log",
+ "serde",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_asset"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ed5c0dcf4262387a3917dcf4cd1a7bf9539bac843a6c9653bb56e9d5ef723c"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_tasks",
+ "bevy_type_registry",
+ "bevy_utils",
+ "crossbeam-channel",
+ "downcast-rs",
+ "js-sys",
+ "log",
+ "ndk-glue",
+ "notify",
+ "parking_lot",
+ "rand",
+ "ron",
+ "serde",
+ "thiserror",
+ "uuid",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_audio"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6198d842cc25f77dc828d0ba0ae9b313fd864e18af29f60e9d5319d056f8166"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_type_registry",
+ "bevy_utils",
+ "parking_lot",
+ "rodio",
+]
+
+[[package]]
+name = "bevy_core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bbe690bd67ba93067651604a3da5b314ec4de5417547ad0f1fbd93da541ea30"
+dependencies = [
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_tasks",
+ "bevy_type_registry",
+ "bevy_utils",
+ "instant",
+ "log",
+]
+
+[[package]]
+name = "bevy_derive"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c18d8de3b2f1c66dbac70fbf82bce0dcbeceecf2356eb1b542c735d5c17e0a0"
+dependencies = [
+ "Inflector",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_diagnostic"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e98868df99533447a6ad202e6826fe24cecab80c163c1dcac56b811ea69a9f7"
+dependencies = [
+ "bevy_app",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_utils",
+ "instant",
+ "parking_lot",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_dynamic_plugin"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc5672a27be1e38e11b6f2f1e1290fde2aa4f074628aad33303953ce881a5a78"
+dependencies = [
+ "bevy_app",
+ "libloading 0.6.5",
+ "log",
+]
+
+[[package]]
+name = "bevy_ecs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad8a73ad248ed6c16b1ca53eaedd76ae5aa284aa5c4527f8cf3526b5e3a7fce"
+dependencies = [
+ "bevy_hecs",
+ "bevy_tasks",
+ "bevy_utils",
+ "downcast-rs",
+ "fixedbitset",
+ "log",
+ "parking_lot",
+ "rand",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_gilrs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "255ceb467ab2982a0bd1ef0c49ae557704f99fe11ab990a11492cea2e6d7fd7f"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "gilrs",
+ "log",
+]
+
+[[package]]
+name = "bevy_gltf"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44dfa912e7fb0ac140b46e2cdf4f6f5e66e6def8049dc8cee69de9a9bafd1836"
+dependencies = [
+ "anyhow",
+ "base64 0.12.3",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_pbr",
+ "bevy_render",
+ "bevy_scene",
+ "bevy_transform",
+ "bevy_type_registry",
+ "gltf",
+ "image",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_hecs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18661dc92bcb6cc1f2f5ad630f3f3eae7b23942860ea6845a2a775b5a1f7564f"
+dependencies = [
+ "bevy_hecs_macros",
+ "bevy_utils",
+ "lazy_static",
+ "serde",
+]
+
+[[package]]
+name = "bevy_hecs_macros"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a85e43b7043183821aa62f09c91164a0aa6de771c5397a7a0d0eaf754cc042a"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "bevy_input"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "069dc814211aaf691c9aca9ce97210d3238c19e599dfc2bc50b183fe925f0a00"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_math"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71ff845326919ef68a796ae4740e33356683020756bc1d23b552b9b31a106fd3"
+dependencies = [
+ "glam",
+]
+
+[[package]]
+name = "bevy_pbr"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34e4185bf49b2cfd31a0aec90722b3e898b37de5d61ec4cc53e5df9ecae19d71"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_property"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bd127fa915b12581aab82cf77ade4a29c1a7b00c19672b88c187c14d111227c"
+dependencies = [
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property_derive",
+ "bevy_utils",
+ "erased-serde",
+ "ron",
+ "serde",
+ "smallvec",
+]
+
+[[package]]
+name = "bevy_property_derive"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3c7a3bc30a90561dc05e662597d595d29a9a7171fb7e5fc34fdb09e4c60c10f"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "bevy_render"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c1e99851a90fba39994aa26887da114cb53388e1ba7324b60cea4156351ad23"
+dependencies = [
+ "anyhow",
+ "bevy-glsl-to-spirv",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "bevy_window",
+ "bitflags",
+ "downcast-rs",
+ "hex",
+ "hexasphere",
+ "image",
+ "log",
+ "once_cell",
+ "parking_lot",
+ "serde",
+ "shaderc",
+ "smallvec",
+ "spirv-reflect",
+ "thiserror",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_scene"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d00a586fa10ea919800eda837f98396b49b99a84ee1fc8d6ad4ede151d3b9e4"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_type_registry",
+ "bevy_utils",
+ "parking_lot",
+ "ron",
+ "serde",
+ "thiserror",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_sprite"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15eb21af28740fcaf9bd4cec1df90a3015ffab1d33d51022ebc9f106f55210d8"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "guillotiere",
+ "rectangle-pack",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_tasks"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c39e34a30611a1c4a80a30d252f0c53afa27e9500fa73dae1dca2e41c85c765"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "event-listener",
+ "futures-lite",
+ "num_cpus",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "bevy_text"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61b128707cbbc841fa8aa3b41e29362d4a7ba38fb4450b7766d3ff9884389766"
+dependencies = [
+ "ab_glyph",
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_math",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_type_registry",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_transform"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4b3c44fc53eb744fc16edc923655a50a01fd0e8e6edfe6f3b3065997e913f5"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_type_registry",
+ "bevy_utils",
+ "log",
+ "smallvec",
+]
+
+[[package]]
+name = "bevy_type_registry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aac65e5c297e547844cb5986da14975181a352f532c8d6fe95f7b62e5a40d32"
+dependencies = [
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_utils",
+ "parking_lot",
+ "serde",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_ui"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2994737dd6413028a2bcda7315ab6cbe8c30c1dab809fb3de4b1e1a8e2fbfabc"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_text",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "bevy_window",
+ "stretch",
+]
+
+[[package]]
+name = "bevy_utils"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "554cd4eba4b278f6cc0fe5da0b7dbe8deba51613e6769f93b0d5a8a32eac54b6"
+dependencies = [
+ "ahash",
+ "getrandom 0.2.0",
+]
+
+[[package]]
+name = "bevy_wgpu"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ba8d9ae1409735ddc2b83426849ba819699288d0ff1166b9caa352511300a1d"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_diagnostic",
+ "bevy_ecs",
+ "bevy_render",
+ "bevy_utils",
+ "bevy_window",
+ "bevy_winit",
+ "crossbeam-channel",
+ "crossbeam-utils",
+ "futures-lite",
+ "log",
+ "parking_lot",
+ "wgpu",
+]
+
+[[package]]
+name = "bevy_window"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f15434d9c46bfc96d449a121e01139489ddc9e79b879edee73c58f90b6b2bbb3"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_utils",
+ "uuid",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_winit"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fd72a8a4b42e975c2cac508500471b468568f042d6bbaf6f200844eba3192b0"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "bevy_utils",
+ "bevy_window",
+ "log",
+ "wasm-bindgen",
+ "web-sys",
+ "winit",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.53.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c72a978d268b1d70b0e963217e60fdabd9523a941457a6c42a7315d15c7e89e5"
+dependencies = [
+ "bitflags",
+ "cexpr",
+ "cfg-if 0.1.10",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3"
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "bumpalo"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
+
+[[package]]
+name = "bytemuck"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41aa2ec95ca3b5c54cf73c91acf06d24f4495d5f1b1c12506ae3483d646177ac"
+
+[[package]]
+name = "byteorder"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
+
+[[package]]
+name = "bytes"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
+
+[[package]]
+name = "cache-padded"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
+
+[[package]]
+name = "cc"
+version = "1.0.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1770ced377336a88a67c473594ccc14eca6f4559217c34f64aac8f83d641b40"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chunked_transfer"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7477065d45a8fe57167bf3cf8bcd3729b54cfcb81cca49bda2d038ea89ae82ca"
+
+[[package]]
+name = "clang-sys"
+version = "0.29.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading 0.5.2",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.9.1",
+ "core-graphics 0.22.1",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa-foundation"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
+dependencies = [
+ "bitflags",
+ "block",
+ "core-foundation 0.9.1",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "combine"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680"
+dependencies = [
+ "ascii",
+ "byteorder",
+ "either",
+ "memchr",
+ "unreachable",
+]
+
+[[package]]
+name = "combine"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9417a0c314565e2abffaece67e95a8cb51f9238cd39f3764d9dfdf09e72b20c"
+dependencies = [
+ "bytes",
+ "memchr",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
+dependencies = [
+ "cache-padded",
+]
+
+[[package]]
+name = "cookie"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+dependencies = [
+ "time",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "copyless"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536"
+
+[[package]]
+name = "core-foundation"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d"
+dependencies = [
+ "core-foundation-sys 0.6.2",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+dependencies = [
+ "core-foundation-sys 0.7.0",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
+dependencies = [
+ "core-foundation-sys 0.8.2",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
+
+[[package]]
+name = "core-graphics"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.7.0",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc239bba52bab96649441699533a68de294a101533b0270b2d65aa402b29a7f9"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.1",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.1",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-video-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+dependencies = [
+ "cfg-if 0.1.10",
+ "core-foundation-sys 0.7.0",
+ "core-graphics 0.19.2",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "coreaudio-rs"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f229761965dad3e9b11081668a6ea00f1def7aa46062321b5ec245b834f6e491"
+dependencies = [
+ "bitflags",
+ "coreaudio-sys",
+]
+
+[[package]]
+name = "coreaudio-sys"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17f73df0f29f4c3c374854f076c47dc018f19acaa63538880dba0937ad4fa8d7"
+dependencies = [
+ "bindgen",
+]
+
+[[package]]
+name = "cpal"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05631e2089dfa5d3b6ea1cfbbfd092e2ee5deeb69698911bc976b28b746d3657"
+dependencies = [
+ "alsa",
+ "core-foundation-sys 0.6.2",
+ "coreaudio-rs",
+ "jni 0.17.0",
+ "js-sys",
+ "lazy_static",
+ "libc",
+ "mach 0.3.2",
+ "ndk",
+ "ndk-glue",
+ "nix 0.15.0",
+ "oboe",
+ "parking_lot",
+ "stdweb 0.1.3",
+ "thiserror",
+ "web-sys",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
+dependencies = [
+ "crossbeam-utils",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "d3d12"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a60cceb22c7c53035f8980524fdc7f17cf49681a3c154e6757d30afbec6ec4"
+dependencies = [
+ "bitflags",
+ "libloading 0.6.5",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "deflate"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "derivative"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "env_logger"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "erased-serde"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ca8b296792113e1500fd935ae487be6e00ce318952a6880555554824d6ebf38"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
+dependencies = [
+ "backtrace",
+ "version_check",
+]
+
+[[package]]
+name = "euclid"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5337024b8293bdce5265dc9570ef6e608a34bfacbbc87fe1a5dcb5f1dac2f4e2"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
+
+[[package]]
+name = "fastrand"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fetch_unroll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5c55005e95bbe15f5f72a73b6597d0dc82ddc97ffe2ca097a99dcd591fefbca"
+dependencies = [
+ "libflate",
+ "tar",
+ "ureq",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e08c8bc7575d7e091fe0706963bd22e2a4be6a64da995f03b2a5a57d66ad015"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
+dependencies = [
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "fsevent"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97f347202c95c98805c216f9e1df210e8ebaec9fdb2365700a43c10797a35e63"
+dependencies = [
+ "bitflags",
+ "fsevent-sys",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a29c77f1ca394c3e73a9a5d24cfcabb734682d9634fc398f2204a63c994120"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb"
+
+[[package]]
+name = "futures-lite"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6c079abfac3ab269e2927ec048dabc89d009ebfdda6b8ee86624f30c689658"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "futures-util"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "stdweb 0.4.20",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "gfx-auxil"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07cd956b592970f08545b9325b87580eb95a51843b6f39da27b8667fec1a1216"
+dependencies = [
+ "fxhash",
+ "gfx-hal",
+ "spirv_cross",
+]
+
+[[package]]
+name = "gfx-backend-dx11"
+version = "0.6.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52b0c3b8b2e0a60c1380a7c27652cd86b791e5d8312fb9592a7a59bd437e9532"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "gfx-auxil",
+ "gfx-hal",
+ "libloading 0.6.5",
+ "log",
+ "parking_lot",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "thunderdome",
+ "winapi 0.3.9",
+ "wio",
+]
+
+[[package]]
+name = "gfx-backend-dx12"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "375014deed24d76b03604736dd899f0925158a1a96db90cbefb9cce070f71af7"
+dependencies = [
+ "arrayvec",
+ "bit-set",
+ "bitflags",
+ "d3d12",
+ "gfx-auxil",
+ "gfx-hal",
+ "log",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "gfx-backend-empty"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2085227c12b78f6657a900c829f2d0deb46a9be3eaf86844fde263cdc218f77c"
+dependencies = [
+ "gfx-hal",
+ "log",
+ "raw-window-handle",
+]
+
+[[package]]
+name = "gfx-backend-metal"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60ba1c77c112e7d35786dbd49ed26f2a76ce53a44bc09fe964935e4e35ed7f2b"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "copyless",
+ "foreign-types",
+ "gfx-auxil",
+ "gfx-hal",
+ "lazy_static",
+ "log",
+ "metal",
+ "objc",
+ "parking_lot",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "storage-map",
+]
+
+[[package]]
+name = "gfx-backend-vulkan"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a3a63cf61067a09b7d1ac480af3cb2ae0c5ede5bed294607bbd814cb1666c45"
+dependencies = [
+ "arrayvec",
+ "ash",
+ "byteorder",
+ "core-graphics-types",
+ "gfx-hal",
+ "inplace_it",
+ "lazy_static",
+ "log",
+ "objc",
+ "raw-window-handle",
+ "smallvec",
+ "winapi 0.3.9",
+ "x11",
+]
+
+[[package]]
+name = "gfx-descriptor"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd8c7afcd000f279d541a490e27117e61037537279b9342279abf4938fe60c6b"
+dependencies = [
+ "arrayvec",
+ "fxhash",
+ "gfx-hal",
+ "log",
+]
+
+[[package]]
+name = "gfx-hal"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123"
+dependencies = [
+ "bitflags",
+ "raw-window-handle",
+]
+
+[[package]]
+name = "gfx-memory"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dccdda5d2b39412f4ca2cb15c70b5a82783a86b0606f5e985342754c8ed88f05"
+dependencies = [
+ "bit-set",
+ "fxhash",
+ "gfx-hal",
+ "log",
+ "slab",
+]
+
+[[package]]
+name = "gilrs"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b64ac678e1174eb012be1cfd409ff2483f23cb79bc880ce4737147245b0fbff"
+dependencies = [
+ "fnv",
+ "gilrs-core",
+ "log",
+ "stdweb 0.4.20",
+ "uuid",
+ "vec_map",
+]
+
+[[package]]
+name = "gilrs-core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1024d4046c5c67d2adb8c90f6ed235163b58e05d35a63bf699b53f0cceeba2c6"
+dependencies = [
+ "core-foundation 0.6.4",
+ "io-kit-sys",
+ "libc",
+ "libudev-sys",
+ "log",
+ "nix 0.18.0",
+ "rusty-xinput",
+ "stdweb 0.4.20",
+ "uuid",
+ "vec_map",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "gimli"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
+
+[[package]]
+name = "glam"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8637c7ec4fd0776c51eeab3e0d5d1aa7e440ece3fc2ee7d674e13c957287bfc1"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+
+[[package]]
+name = "gltf"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6fb0d1d772daf10ea74528c3aeb12215f6d5b820adf2ecfc93a6578d6779c3c"
+dependencies = [
+ "byteorder",
+ "gltf-json",
+ "lazy_static",
+]
+
+[[package]]
+name = "gltf-derive"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6636de7bf52227363554f1ca2d9cd180fc666129ddd0933097e1f227dfa7293"
+dependencies = [
+ "inflections",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "gltf-json"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3fc3deb81e6fa04bf808f6be7c3983229552a95b77f687ad96af00f6d3e7d6c"
+dependencies = [
+ "gltf-derive",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
+[[package]]
+name = "guillotiere"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7cccefbf418f663e11e9500326f46a44273dc598210bbedc8bbe95e696531f"
+dependencies = [
+ "euclid",
+ "svg_fmt",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35"
+
+[[package]]
+name = "hexasphere"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00ad921775e70efb68429688766ca130de39af65d5201db760b0e6558bfa8175"
+dependencies = [
+ "glam",
+ "lazy_static",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.23.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4f0a8345b33b082aedec2f4d7d4a926b845cee184cbe78b703413066564431b"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+ "png",
+ "scoped_threadpool",
+]
+
+[[package]]
+name = "inflections"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
+
+[[package]]
+name = "inotify"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46dd0a94b393c730779ccfd2a872b67b1eb67be3fc33082e733bdb38b5fde4d4"
+dependencies = [
+ "bitflags",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4563555856585ab3180a5bf0b2f9f8d301a728462afffc8195b3f5394229c55"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "inplace_it"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd01a2a73f2f399df96b22dc88ea687ef4d76226284e7531ae3c7ee1dc5cb534"
+
+[[package]]
+name = "instant"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "io-kit-sys"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0"
+dependencies = [
+ "core-foundation-sys 0.6.2",
+ "mach 0.2.3",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
+
+[[package]]
+name = "jni"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1981310da491a4f0f815238097d0d43d8072732b5ae5f8bd0d8eadf5bf245402"
+dependencies = [
+ "cesu8",
+ "combine 3.8.1",
+ "error-chain",
+ "jni-sys",
+ "log",
+ "walkdir",
+]
+
+[[package]]
+name = "jni"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36bcc950632e48b86da402c5c077590583da5ac0d480103611d5374e7c967a3c"
+dependencies = [
+ "cesu8",
+ "combine 4.4.0",
+ "error-chain",
+ "jni-sys",
+ "log",
+ "walkdir",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jobserver"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+dependencies = [
+ "spin",
+]
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
+
+[[package]]
+name = "libflate"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9135df43b1f5d0e333385cb6e7897ecd1a43d7d11b91ac003f4d2c2d2401fdd"
+dependencies = [
+ "adler32",
+ "crc32fast",
+ "rle-decode-fast",
+ "take_mut",
+]
+
+[[package]]
+name = "libloading"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
+dependencies = [
+ "cc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libloading"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1090080fe06ec2648d0da3881d9453d97e71a45f00eb179af7fdd7e3f686fdb0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
+name = "libudev-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "mach"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "mach"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+
+[[package]]
+name = "metal"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c4e8a431536529327e28c9ba6992f2cb0c15d4222f0602a16e6d7695ff3bccf"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "foreign-types",
+ "log",
+ "objc",
+]
+
+[[package]]
+name = "minimp3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9684a8c55935322fdab159b5d7a6163b33f6e7d32c4a8a54fe53d1bcfad738db"
+dependencies = [
+ "minimp3-sys",
+ "slice-deque",
+]
+
+[[package]]
+name = "minimp3-sys"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e21c73734c69dc95696c9ed8926a2b393171d98b3f5f5935686a26a487ab9b90"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-extras"
+version = "2.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
+dependencies = [
+ "lazycell",
+ "log",
+ "mio",
+ "slab",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "naga"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0873deb76cf44b7454fba7b2ba6a89d3de70c08aceffd2c489379b3d9d08e661"
+dependencies = [
+ "bitflags",
+ "fxhash",
+ "log",
+ "num-traits",
+ "spirv_headers",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73"
+dependencies = [
+ "jni-sys",
+ "ndk-sys",
+ "num_enum",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-glue"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241"
+dependencies = [
+ "android_logger 0.8.6",
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-macro",
+ "ndk-sys",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
+dependencies = [
+ "darling",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ndk-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d"
+
+[[package]]
+name = "net2"
+version = "0.2.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "nix"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+ "void",
+]
+
+[[package]]
+name = "nix"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+]
+
+[[package]]
+name = "nom"
+version = "5.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
+dependencies = [
+ "memchr",
+ "version_check",
+]
+
+[[package]]
+name = "notify"
+version = "5.0.0-pre.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8b946889dfdad884379cd56367d93b6d0ce8889cc027d26a69a3a31c0a03bb5"
+dependencies = [
+ "anymap",
+ "bitflags",
+ "crossbeam-channel",
+ "filetime",
+ "fsevent",
+ "fsevent-sys",
+ "inotify",
+ "libc",
+ "mio",
+ "mio-extras",
+ "walkdir",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4"
+dependencies = [
+ "derivative",
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "object"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397"
+
+[[package]]
+name = "oboe"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6a13c9fe73346ff3cee5530b8dd9da1ce3e13cb663be210af3938a2a1dd3eab"
+dependencies = [
+ "jni 0.14.0",
+ "ndk",
+ "ndk-glue",
+ "num-derive",
+ "num-traits",
+ "oboe-sys",
+]
+
+[[package]]
+name = "oboe-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68ff7a51600eabe34e189eec5c995a62f151d8d97e5fbca39e87ca738bb99b82"
+dependencies = [
+ "fetch_unroll",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb477c7fd2a3a6e04e1dc6ca2e4e9b04f2df702021dc5a5d1cf078c587dc59f7"
+dependencies = [
+ "ttf-parser",
+]
+
+[[package]]
+name = "parking"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b"
+dependencies = [
+ "cfg-if 0.1.10",
+ "cloudabi",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pin-project"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+
+[[package]]
+name = "png"
+version = "0.16.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfe7f9f1c730833200b134370e1d5098964231af8450bce9b78ee3ab5278b970"
+dependencies = [
+ "bitflags",
+ "crc32fast",
+ "deflate",
+ "miniz_oxide 0.3.7",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "qstring"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e"
+dependencies = [
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.15",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.15",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "range-alloc"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a871f1e45a3a3f0c73fb60343c811238bb5143a81642e27c2ac7aac27ff01a63"
+
+[[package]]
+name = "raw-window-handle"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "rectangle-pack"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e509b8eba9ca1884760ad1e2161cece724d4fd2b4cb47ddc01706920c6500cd7"
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+
+[[package]]
+name = "regex"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+ "thread_local",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
+
+[[package]]
+name = "ring"
+version = "0.16.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b72b84d47e8ec5a4f2872e8262b8f8256c5be1c938a7d6d3a867a3ba8f722f74"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rle-decode-fast"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac"
+
+[[package]]
+name = "rodio"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9683532495146e98878d4948fa1a1953f584cd923f2a5f5c26b7a8701b56943"
+dependencies = [
+ "cpal",
+ "minimp3",
+]
+
+[[package]]
+name = "ron"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8a58080b7bb83b2ea28c3b7a9a994fd5e310330b7c8ca5258d99b98128ecfe4"
+dependencies = [
+ "base64 0.12.3",
+ "bitflags",
+ "serde",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustls"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e"
+dependencies = [
+ "base64 0.10.1",
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rusty-xinput"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2aa654bc32eb9ca14cce1a084abc9dfe43949a4547c35269a094c39272db3bb"
+dependencies = [
+ "lazy_static",
+ "log",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped_threadpool"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
+
+[[package]]
+name = "shaderc"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50b8aeaae10b9bda5cba66736a7e265f67698e912e1cc6a4678acba286e22be9"
+dependencies = [
+ "libc",
+ "shaderc-sys",
+]
+
+[[package]]
+name = "shaderc-sys"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b12d7c62d6732884c9dfab587503fa3a795b108df152415a89da23812d4737e"
+dependencies = [
+ "cmake",
+ "libc",
+]
+
+[[package]]
+name = "shlex"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "slice-deque"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25"
+dependencies = [
+ "libc",
+ "mach 0.3.2",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spirv-reflect"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cecc7af6a7d3ca6d15f4d6b5077df89c77ad1f4b314d0cabee221656d041dad7"
+dependencies = [
+ "bitflags",
+ "cc",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "spirv_headers",
+]
+
+[[package]]
+name = "spirv_cross"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea964c42ce40326fe96111918abe71fa45076da1ea85769f3f1ab1cda9a1d496"
+dependencies = [
+ "cc",
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "spirv_headers"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c"
+dependencies = [
+ "bitflags",
+ "num-traits",
+]
+
+[[package]]
+name = "stdweb"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e"
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version",
+ "serde",
+ "serde_json",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
+[[package]]
+name = "storage-map"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "stretch"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87"
+dependencies = [
+ "lazy_static",
+ "libm",
+]
+
+[[package]]
+name = "strsim"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
+[[package]]
+name = "svg_fmt"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
+
+[[package]]
+name = "syn"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "take_mut"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60"
+
+[[package]]
+name = "tar"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290"
+dependencies = [
+ "filetime",
+ "libc",
+ "redox_syscall",
+ "xattr",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "thunderdome"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7572415bd688d401c52f6e36f4c8e805b9ae1622619303b9fa835d531db0acae"
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b78a366903f506d2ad52ca8dc552102ffdd3e937ba8a227f024dc1d1eae28575"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "toml"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27"
+dependencies = [
+ "cfg-if 0.1.10",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "ttf-parser"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7622061403fd00f0820df288e5a580e87d3ce15a1c4313c59fd1ffb77129903f"
+
+[[package]]
+name = "typed-arena"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+dependencies = [
+ "matches",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1e9a0b71dba18b6fa17c7b3dcf1440bb3522552deb2f84bf47dabd9fb7e5570"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "unreachable"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
+dependencies = [
+ "void",
+]
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "ureq"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "801125e6d1ba6864cf3a5a92cfb2f0b0a3ee73e40602a0cd206ad2f3c040aa96"
+dependencies = [
+ "base64 0.11.0",
+ "chunked_transfer",
+ "cookie",
+ "lazy_static",
+ "qstring",
+ "rustls",
+ "url 2.2.0",
+ "webpki",
+ "webpki-roots",
+]
+
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+dependencies = [
+ "idna 0.1.5",
+ "matches",
+ "percent-encoding 1.0.1",
+]
+
+[[package]]
+name = "url"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.2.0",
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "uuid"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
+dependencies = [
+ "rand",
+ "serde",
+]
+
+[[package]]
+name = "vec-arena"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
+
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "walkdir"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
+dependencies = [
+ "same-file",
+ "winapi 0.3.9",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42"
+dependencies = [
+ "cfg-if 0.1.10",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da"
+dependencies = [
+ "cfg-if 0.1.10",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307"
+
+[[package]]
+name = "web-sys"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "wgpu"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "549160f188eef412ac978499ddf0ceadad4c9159bb1160f9e6b9d4cc8ee977dc"
+dependencies = [
+ "arrayvec",
+ "futures",
+ "gfx-backend-vulkan",
+ "js-sys",
+ "objc",
+ "parking_lot",
+ "raw-window-handle",
+ "smallvec",
+ "tracing",
+ "typed-arena",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "wgpu-core",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-core"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea487deeae90e06d77eb8e6cef945247774e7c0a0a226d238b31e90633594365"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "copyless",
+ "fxhash",
+ "gfx-backend-dx11",
+ "gfx-backend-dx12",
+ "gfx-backend-empty",
+ "gfx-backend-metal",
+ "gfx-backend-vulkan",
+ "gfx-descriptor",
+ "gfx-hal",
+ "gfx-memory",
+ "naga",
+ "parking_lot",
+ "raw-window-handle",
+ "smallvec",
+ "thiserror",
+ "tracing",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-types"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e3529528e608b54838ee618c3923b0f46e6db0334cfc6c42a16cf4ceb3bdb57"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "winit"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5bc559da567d8aa671bbcd08304d49e982c7bf2cb91e10288b9188931c1b772"
+dependencies = [
+ "bitflags",
+ "cocoa",
+ "core-foundation 0.9.1",
+ "core-graphics 0.22.1",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio",
+ "mio-extras",
+ "ndk",
+ "ndk-glue",
+ "ndk-sys",
+ "objc",
+ "parking_lot",
+ "percent-encoding 2.1.0",
+ "raw-window-handle",
+ "wasm-bindgen",
+ "web-sys",
+ "winapi 0.3.9",
+ "x11-dl",
+]
+
+[[package]]
+name = "wio"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "x11"
+version = "2.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "maybe-uninit",
+ "pkg-config",
+]
+
+[[package]]
+name = "xattr"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
+dependencies = [
+ "libc",
+]
diff --git a/2020/Cargo.toml b/2020/Cargo.toml
new file mode 100644
index 0000000..8a7f35d
--- /dev/null
+++ b/2020/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "advent-of-code-2020"
+version = "0.1.0"
+authors = ["Justin Wernick <justin@worthe-it.co.za>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+bevy = "0.3.0"
+thiserror = "1.0.22" \ No newline at end of file
diff --git a/2020/inputs/day_1.txt b/2020/inputs/day_1.txt
new file mode 100644
index 0000000..fbbfa17
--- /dev/null
+++ b/2020/inputs/day_1.txt
@@ -0,0 +1,200 @@
+1337
+1906
+2007
+1939
+818
+1556
+2005
+1722
+1484
+1381
+1682
+1253
+1967
+1718
+2002
+1398
+1439
+1689
+1746
+1979
+1985
+1387
+1509
+1566
+1276
+1625
+1853
+882
+1750
+1390
+1731
+1555
+1860
+1675
+1457
+1554
+1506
+1639
+1543
+1849
+1062
+1869
+1769
+1858
+1916
+1504
+1747
+1925
+1275
+1273
+1383
+1816
+1814
+1481
+1649
+1993
+1759
+1949
+1499
+1374
+1613
+1424
+783
+1765
+1576
+1933
+1270
+1844
+1856
+1634
+1261
+1293
+1741
+668
+1573
+1599
+1877
+1474
+1918
+476
+1515
+1029
+202
+1589
+1867
+1503
+1582
+1605
+1557
+587
+1462
+1955
+1806
+1834
+1739
+1343
+1594
+1622
+1972
+1527
+1798
+1719
+1866
+134
+2000
+1992
+1966
+1909
+1340
+1621
+1921
+1256
+1365
+1314
+1748
+1963
+1379
+1627
+1848
+1977
+1917
+1826
+1716
+1631
+1404
+1936
+1677
+1661
+1986
+1997
+1603
+1932
+1780
+1902
+2009
+1257
+1871
+1362
+1662
+1507
+1255
+1539
+1962
+1886
+1513
+1264
+1873
+1700
+807
+1426
+1697
+1698
+1519
+1791
+1240
+1542
+1497
+1761
+1640
+1502
+1770
+1437
+1333
+1805
+1591
+1644
+1420
+1809
+1587
+1421
+1540
+1942
+470
+1940
+1831
+1247
+1632
+1975
+1774
+1919
+1829
+1944
+1553
+1361
+1483
+1995
+1868
+1601
+1552
+1854
+1490
+1855
+1987
+1538
+1389
+1454
+1427
+1686
+1456
+1974
diff --git a/2020/inputs/day_10.txt b/2020/inputs/day_10.txt
new file mode 100644
index 0000000..fa8ea01
--- /dev/null
+++ b/2020/inputs/day_10.txt
@@ -0,0 +1,111 @@
+71
+183
+111
+89
+92
+142
+25
+101
+52
+86
+18
+22
+70
+2
+135
+163
+34
+143
+153
+35
+144
+24
+23
+94
+100
+102
+17
+57
+76
+182
+134
+38
+7
+103
+66
+31
+11
+121
+77
+113
+128
+82
+99
+148
+137
+41
+32
+48
+131
+60
+127
+138
+73
+28
+10
+84
+180
+63
+125
+53
+176
+165
+114
+145
+152
+72
+107
+167
+59
+164
+78
+126
+118
+136
+83
+79
+58
+14
+106
+69
+51
+39
+157
+42
+177
+173
+93
+141
+3
+33
+13
+19
+45
+154
+95
+170
+54
+181
+6
+151
+1
+112
+96
+115
+85
+108
+166
+160
+40
+122
+12
diff --git a/2020/inputs/day_11.txt b/2020/inputs/day_11.txt
new file mode 100644
index 0000000..977ae5f
--- /dev/null
+++ b/2020/inputs/day_11.txt
@@ -0,0 +1,90 @@
+LLLLL.LLLLLL.LLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL
+LLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+L.LL.L.L.LL.....L.L..L.LL.L.L.L.....L..LLL.L.....L.L...LL..L.....L...L..L.LLLL..L.LL......L.L.L.
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+......LL..LLLL.L...LL.....L.L.......L..L.LL....L.LLL........L.L.L.LL.....L.........L....L......L
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+.L...L...L.....L...L....L.LL.LLL.LL...LL.L..L...L......L..LL..L..LL..L.L......L.L.LLL......L.L..
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+...........LLL.....LLL.....LL.L..........L..L.L.L...L.L.....L........L......L..L..L...LL....L.L.
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL
+L.......LL...LL...L..L.....L..LL..L.L.LLL.L.L..L.LL.L.........L....LLLL..LL..L.L..L..LLLL..LL.L.
+LLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+....LLL.LL....L.L.........L.L............L..L...L.LLLL......L...L.L..L....L.......L..L..........
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LL.L.LLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.L..LLL..LLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLL.LLLLLLLLL.LLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+.L..LLLL..L.L.LLL.......LL.LL.LL......L.L....L.LLL.......L...L.L.LL...LL.....L.L....L.L...L.L...
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLL
+LLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LL
+LLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL
+LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL
+.L..L..LLL....LL......LL.L.L..LL..LL....L...L..L.L.L...L..L..L.LLLL.L....L.....L..L...L...LLL...
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+..LL.LL.L.LL.L...L..L..L..L...LL........L......LL.LLLL.......L..LLL.L.L....L.....L..LL..L.LL.LL.
+LLLLL.LLLL.L.LLLLL.LLL.LLLLLL.LLLLLLL.LL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLL.LLLL.LLLLLLLLLLL.LLLL..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLL
+LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LL.LL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+.LL..LL.L.LL......L.L.LL...L..LL..LL...L..L.L..LL...L.L..L.....L.LLL..L..LL.L..L.......L..LLL...
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL..LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLL.LLLLL.LLLLLL.LL.L.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+.L.L....LLL.L.L........L..L....L..L...LL..L..LLL..L.L....L..L.LL....LL.L.L.....L........L..L.L..
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLL.LL..LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLL..L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL..LLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.L.LL..LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
diff --git a/2020/inputs/day_12.txt b/2020/inputs/day_12.txt
new file mode 100644
index 0000000..d7bc269
--- /dev/null
+++ b/2020/inputs/day_12.txt
@@ -0,0 +1,755 @@
+F93
+R90
+F81
+E3
+F80
+R90
+W4
+R90
+F64
+N1
+R90
+W4
+F11
+W1
+L180
+F28
+R90
+W4
+L180
+F95
+N3
+F71
+L90
+W1
+F1
+E2
+L90
+F85
+W3
+L90
+F28
+E3
+N5
+F47
+S2
+R90
+N2
+L90
+W4
+L180
+W3
+F51
+F77
+L90
+W5
+N5
+W3
+S5
+W5
+R180
+N1
+W3
+S5
+F36
+W1
+F34
+N4
+F40
+E2
+S3
+R90
+W5
+S2
+N4
+R90
+S2
+L90
+N4
+L90
+S2
+E1
+F2
+N4
+F65
+N1
+F46
+R180
+F60
+N4
+F45
+R90
+S3
+L90
+F70
+W4
+L270
+N4
+F49
+E3
+F52
+R180
+F5
+E5
+R90
+F43
+L90
+S4
+F54
+N1
+F7
+S2
+F91
+S4
+N3
+E3
+S4
+L180
+F15
+S2
+F90
+W5
+S2
+F80
+N4
+L90
+R90
+N4
+E2
+R180
+E5
+F62
+L90
+N5
+F77
+N5
+F75
+E2
+L90
+S4
+F55
+E1
+N5
+F57
+R90
+F6
+L90
+N3
+E5
+L180
+N2
+L270
+N5
+F8
+E2
+F88
+E3
+N3
+E4
+R90
+N1
+W5
+R90
+N4
+E3
+S3
+R90
+N1
+E2
+F4
+N4
+R90
+N3
+W5
+L180
+E1
+F2
+N4
+W5
+F80
+S4
+F7
+L180
+F96
+L90
+F16
+L90
+E4
+F78
+W2
+R90
+S3
+F29
+W4
+R90
+E4
+F39
+N1
+F48
+E4
+L180
+E1
+R180
+E2
+R90
+N3
+R180
+W2
+N5
+W5
+E3
+F25
+E1
+L180
+N5
+F44
+L90
+N4
+W4
+L90
+F72
+L90
+S1
+E5
+N5
+R90
+N1
+W3
+S5
+R90
+W1
+F14
+L90
+W2
+R90
+W3
+F76
+S5
+W5
+F93
+W4
+R90
+F57
+E3
+R90
+S3
+W1
+R90
+S3
+F8
+R90
+N2
+F46
+W4
+S1
+L90
+E4
+W5
+L90
+W2
+F69
+N5
+W5
+F80
+N3
+E4
+L90
+E4
+F25
+S3
+R180
+F77
+R90
+W2
+F19
+E4
+L180
+W2
+F37
+S2
+F68
+L90
+E2
+F66
+S1
+R90
+F66
+E2
+L180
+F97
+N3
+W4
+F43
+S4
+R180
+N1
+R270
+E3
+N2
+N3
+F65
+L90
+S2
+L90
+N3
+L90
+S3
+F23
+L270
+W3
+S5
+E2
+R90
+S1
+F85
+N3
+R90
+W4
+F58
+E1
+L90
+N3
+L90
+E2
+S1
+F14
+E2
+N5
+W1
+N3
+E1
+L90
+E3
+F43
+E3
+N3
+F21
+E4
+F53
+E2
+L180
+E4
+F20
+E2
+N2
+E5
+L90
+N4
+W3
+N4
+S2
+L90
+W3
+F96
+L90
+S3
+R90
+N1
+E3
+S5
+L270
+F41
+N5
+W5
+S1
+W5
+R90
+F79
+W3
+L90
+E3
+F22
+N1
+L90
+E2
+L90
+R90
+F20
+L90
+W3
+R90
+W2
+L180
+W4
+F57
+R180
+N3
+L90
+F36
+L90
+E2
+R90
+N2
+E3
+N1
+W4
+W4
+N3
+E5
+F54
+R180
+F98
+W1
+R90
+F21
+S1
+L90
+S2
+L90
+S2
+F90
+E4
+S2
+R90
+N5
+F25
+N4
+W3
+N2
+F27
+S3
+E3
+N3
+F15
+L180
+S4
+F62
+W2
+L180
+E2
+N2
+L90
+R90
+F97
+R90
+S1
+R90
+E2
+F16
+W2
+E1
+F89
+W1
+L180
+S3
+W2
+S3
+E1
+F92
+F30
+N1
+E2
+S1
+F76
+E1
+S5
+W5
+F28
+W4
+L90
+F44
+E4
+N5
+F25
+R90
+F59
+S4
+F58
+S2
+F19
+W5
+S4
+E5
+N3
+F37
+E1
+L90
+F40
+E5
+F56
+S2
+W5
+F73
+N5
+F2
+L90
+F18
+E2
+N5
+L90
+F56
+R90
+F18
+W1
+S5
+E1
+N1
+L90
+W2
+E4
+N4
+E1
+W4
+N4
+L90
+N3
+R90
+W5
+S5
+F2
+R180
+F96
+R90
+W3
+F26
+L90
+S4
+E2
+F43
+S2
+R90
+F61
+W5
+F93
+R90
+F95
+L90
+E4
+R90
+N4
+F47
+R90
+W5
+L90
+F42
+L90
+W5
+F87
+R90
+N1
+N2
+E4
+F64
+S5
+L270
+F86
+S4
+W3
+S1
+L90
+F72
+R270
+W1
+F17
+S1
+E2
+R90
+W1
+N1
+F42
+N5
+L90
+F87
+F66
+L90
+N2
+W2
+L90
+S5
+F7
+R90
+N4
+L270
+F2
+W1
+N4
+F94
+W5
+R180
+S4
+F15
+E4
+F76
+N1
+E2
+F68
+S3
+F50
+R270
+E5
+F77
+R90
+S3
+E2
+N3
+S4
+F39
+S1
+E5
+S3
+L90
+E4
+S2
+W3
+F54
+R90
+F44
+L90
+W3
+F59
+R90
+N3
+F37
+E1
+F75
+R90
+F31
+W3
+F70
+S5
+L90
+E1
+F67
+W4
+L90
+S1
+W5
+S1
+S4
+W2
+E2
+S3
+R90
+S2
+E5
+L90
+F43
+R90
+E1
+S5
+F42
+L90
+W1
+N2
+E1
+L180
+S4
+W1
+L90
+F81
+E1
+R180
+N5
+R180
+N5
+L180
+F65
+R90
+F64
+W4
+S4
+R90
+F70
+E1
+S1
+F50
+E2
+S4
+E4
+N2
+S1
+R90
+E4
+R90
+F70
+R90
+N4
+F71
+R180
+F80
+S3
+L90
+N5
+L180
+F11
+N1
+R90
+W2
+N1
+R90
+W4
+R90
+F67
+W3
+R90
+W5
+L90
+E4
+F90
+L90
+N4
+L180
+F48
+R90
+W2
+F94
+R90
+N4
+L90
+W2
+F2
+L90
+W1
+E5
+S2
+W5
+S5
+E2
+N3
+W5
+N1
+F98
+S3
+W3
+L90
+S3
+W4
+R90
+W1
+F64
+N5
+R90
+S5
+W5
+F84
+S1
+E3
+L90
+S3
+E5
+F6
+N4
+W1
+R90
+E4
+F14
+N1
+R90
+F31
+L90
+F24
+F4
+N4
+F54
+S3
+R270
+F98
+E1
+L180
+F2
+E4
+F70
+W1
+R180
+N5
+F23
diff --git a/2020/inputs/day_2.txt b/2020/inputs/day_2.txt
new file mode 100644
index 0000000..3a0963f
--- /dev/null
+++ b/2020/inputs/day_2.txt
@@ -0,0 +1,1000 @@
+15-16 l: klfbblslvjclmlnqklvg
+6-13 h: pghjchdxhnjhjd
+4-13 n: nnznntzznqnzbtzj
+10-16 r: nrrrrkrjtxwrrrwx
+1-6 t: rttftttttttttmdttttt
+4-12 l: zhllfxlmvqtnhx
+6-8 d: wxpwgdbjtffddkb
+7-9 q: rqcqxjqhsm
+6-8 x: xxxfxdxxx
+5-9 d: dwnwnbsddfmc
+2-6 j: jvdrrjchml
+8-10 x: xxxcxxxzxxxxx
+15-16 f: ffffffffffffffnfc
+3-12 v: vgvvvvvvvvfqvvvv
+2-5 p: tknppm
+11-12 r: frrnrfqtshrgw
+13-16 f: rfjmkrqkqrxmfnqj
+3-5 f: ffffxffn
+2-4 f: fffwf
+11-13 s: srslssshssssx
+1-6 c: cccdcn
+2-6 t: tthhnc
+12-17 w: wwwwwwwwwwwmwwwwg
+5-6 k: kqkksskkp
+4-5 p: ppppx
+5-12 h: hbjhqhdwnqxhhsh
+6-8 p: ppgzpppw
+3-4 z: zzcz
+6-15 x: hfvxxsqbfxxlhpxtb
+4-7 m: qmxzhgt
+18-20 b: fvzbbrbcvskxrpkwnmwb
+1-11 c: ccccccccccggccc
+1-3 p: dppp
+2-6 j: fjbmljmdb
+2-4 l: slpmqpk
+3-5 b: stbpbbndtgzxlsnbdk
+6-11 h: hlzkdhhhrhchmhbhl
+1-4 w: wwpv
+10-12 p: pmpppkpppgph
+11-14 f: fbdxffpffffffkfffjvf
+4-9 v: vkvfhfvvrvvv
+16-17 t: tmtbztrptdlvttvkt
+2-6 w: wwwwphwwwwnwwj
+6-11 x: xxxxxxxxxxkxx
+9-10 t: ttftchttnd
+2-9 w: wkwwwwwwlww
+2-4 g: ggvcgggggggggg
+5-6 d: dldddsddddddd
+5-8 j: jddjjnld
+9-12 l: xldxlklvlkll
+2-3 w: xwnrwdwndlvl
+16-18 m: mmmmrmmmmmrvvmmvmm
+3-4 t: ctts
+11-12 b: ndgjdbppcdbhhssw
+2-11 s: nssksssnssxvq
+2-5 g: qggwcvf
+10-14 l: llxlllrjlmlllwllll
+8-9 w: wwwwfpwtvtjwjw
+8-10 m: mmmmmmmmmmm
+1-11 z: rldjzzzpzzs
+16-17 v: qvsrnvvvwxgmvjjcvhcx
+14-18 k: kkkkkkkkkkkkkkkkklk
+2-3 q: qqrqqqxqqqq
+4-9 c: lclckhcgn
+2-3 b: nbbbbldlbbb
+15-18 v: vtvvrvxvvnvxhvnvvv
+4-7 q: qqqnqqqq
+3-13 j: svjjdcnkwnbpl
+4-11 q: blnqvqsngwj
+3-4 j: dxdkj
+5-7 c: dzxbsctqwclcgc
+3-4 f: jfhffff
+3-5 t: sttwk
+7-8 t: tnqtvsztqwpvtftknt
+1-12 r: grrrrrrrrrrrrrrr
+7-8 k: kkkkkkqkk
+3-4 l: llls
+1-14 h: khhhjhhhhhhhhh
+3-5 d: ttcdddd
+1-7 w: dqwhwkww
+4-5 p: pppqppppp
+10-14 l: lqlltwlllllllzjk
+15-17 d: ddddddddddddddddcdd
+1-8 z: xpbbjxrzlzznxlz
+1-2 v: vrvv
+7-11 l: llllllclllslll
+3-14 h: hhvhhhhhhhhhhhh
+6-7 m: mmgpbjmgqmm
+9-13 h: hhhhhhhhhhhhfnhhhhwh
+12-17 c: cccpfcccccnccccqscc
+6-12 x: kqfxbhxbdxxxl
+6-8 z: zqkbtzzb
+6-8 l: llllllllllllll
+6-13 d: wdzdxdddddlzdtbd
+3-8 h: gzcknrxkjgtggnqwqjs
+1-6 t: tttttvtt
+5-8 x: fjxnxrtn
+6-9 z: zzzzzzzzszzz
+2-4 v: vpvvtv
+1-7 w: wcwrxgf
+2-3 t: vxftld
+1-2 n: nnxmntsqzk
+5-11 l: nmvllllnlckl
+7-13 c: cwchccjcrfsccc
+2-3 z: dzdz
+7-8 s: sddgbhws
+3-11 w: qqsqrgmwwmwgfdhpsct
+16-17 q: qqqqzqqqqqqqqqqqh
+7-15 h: thqthdphmbhhjphhh
+6-10 k: gcflljjwkk
+9-17 f: ffffffffffffffffdf
+10-12 q: qqqqbqlpqqfdqq
+3-16 x: dbxmwtlqdmvldxlgxdhk
+1-2 x: xxjxh
+10-11 p: ppqpppkpptp
+3-5 w: wwwwwwwww
+10-11 j: xjmhqgdznjf
+9-11 n: dxnnnnnnnnmnnn
+1-5 l: mlllvllwlrblllll
+14-16 q: tqqqqqqwqqqqqmqqqqq
+2-3 b: nvbbbcf
+5-8 x: xmkxxgxq
+1-4 x: xxxfx
+1-6 n: nnnrnm
+9-17 p: pppppppppppppppppp
+2-4 d: ddqd
+13-14 p: fmpkxpprppppzhpp
+5-6 t: tttttgrttt
+10-12 r: rrrrrrrrrlrrrrrrrr
+4-7 h: gnmqvqrhwhh
+4-5 m: smsmmmm
+4-5 q: qgzqb
+6-12 c: rdnnsccnrjkcnm
+4-16 k: gfkxktpwhxzkgcdnb
+4-5 f: ffgvf
+6-13 n: nfslcrnkksfmnmvcfnnz
+15-18 s: sssqsssssmshmsmsss
+1-15 v: vvvvwvvxvvvcvvwvvvvv
+2-8 h: gphlnhph
+4-13 t: vtjvrcxqwbsrk
+2-10 t: tvttftzttttqttt
+12-13 t: dvsbstlkfpztdqs
+7-8 w: rvwncwww
+13-16 v: vlqzjlvxljrvvjvvzp
+12-13 w: wwwwwwwwnwdwwgwwwx
+14-15 d: dcpdddddddddddmdbd
+1-3 b: bbdbbbb
+11-12 t: rkdtncbtkktzmvtghb
+3-7 n: nzbfgbnnx
+5-13 v: vsvbkvvvvvvvv
+3-8 n: nltdrmbn
+14-15 p: mzkmmqdfpcptzbzc
+4-6 q: qtqkgqfmqwm
+9-10 v: vvdvvxvvxvwd
+5-7 m: mmmmmmkm
+6-7 k: kkkkkgkk
+8-9 h: shhhhhhhh
+8-11 p: pppppppppczplbwcpb
+11-17 k: kkkkkkkkkkkkkktkc
+9-17 w: mwtfbvsfnhwxqqvxw
+8-12 j: jhjjjjjrkjnjjjjjjjj
+3-5 g: sgfgqgg
+12-14 j: jjjjjjjjjjjjjjjjjjjj
+1-11 f: jsffffzfffffxffftf
+16-17 f: fffffffffftfffffff
+2-4 k: klkwkk
+5-8 g: gtjngzkhgb
+4-7 b: bbbmbbbb
+4-5 w: wwwdw
+5-15 g: tplhhgmggbhggrllqg
+9-13 v: jvvbqvsbvzhxvh
+1-3 d: ddsddn
+2-5 w: cfwds
+7-11 x: xxxxjxvvxvxhxvml
+5-6 v: jwqxvb
+3-15 s: ssqsssssssssssss
+5-9 d: dddddddddddddddd
+5-8 l: vklnlclj
+10-13 s: sltdlfbssxsss
+11-18 j: hxjxjnjcpmkppnpjpjk
+4-6 t: ttbzhvt
+2-17 v: rzmhrssrjvpncwqwl
+2-4 x: mtcxz
+11-12 d: dddddddwddbd
+2-13 h: whgpdxvkfxrhg
+5-7 d: ddddddxdtddddddhdddq
+4-8 b: lhcfbkbbdmb
+8-15 l: lvtmkgwllqttgplbgjj
+3-5 n: nqngjvw
+12-19 m: mmmmmmmmmmmmmmmmmmgm
+5-9 g: grhgsdcwgmdt
+6-9 j: msgrcrfvzksfxxjq
+6-10 s: xdssssssssssssssg
+8-9 h: hhhnhhnfhh
+12-15 f: fffffffffffffffwfff
+3-7 p: pzzpbjkfcczbmnpkf
+6-7 r: cnjlbhr
+2-5 f: dwxcftrbljgstf
+5-11 h: hhhhjhhhhhqh
+16-18 r: rrrrrrrrrrrrrrrrrmrr
+2-4 r: rxmrd
+7-9 c: ccccczccccc
+7-13 d: ddddddddddddfd
+3-11 k: mmkspkltjwm
+8-11 c: rvccccgtclc
+1-3 v: vvhhv
+4-7 t: jttnttgx
+4-16 n: nnnjnfnnnnnnnnnnnn
+5-6 m: mmmdmqmm
+9-10 x: xxxxxxxkxrx
+2-4 m: tmcmzjmvtcghlgm
+6-7 q: lqqjqqnzqqmq
+16-19 k: kjwkhkkjhkskskpnkfk
+19-20 b: pbbpsbnbbmnntbnbbbbn
+4-5 p: ppppmp
+3-4 d: grlqndd
+4-7 n: nnnnnnsn
+9-12 k: kkkkkkkkfkkkkk
+4-10 h: hfhhhxhfhd
+4-9 t: ttttxbbbcdmxsrhjj
+4-11 l: npxwbsmklbls
+17-20 d: dddddwdhdkddjdddtfdd
+3-4 s: nldssq
+4-8 s: sssdsssgs
+5-16 t: ttttprtcttttttzt
+9-17 j: tjjtjjjjgljjjcjjfj
+7-8 b: bbbbtbkbb
+2-13 l: szllllllllxllll
+8-11 n: bmpnwrnngnmsfw
+1-5 d: jddqtdwddxddjd
+10-11 s: hqgnvslssstqdnvs
+14-16 p: ppppppppvpplpgpp
+2-8 h: khhjfcqp
+6-7 d: fxdpdwvdjkd
+5-7 n: bnnprnf
+9-13 f: vfffwfffffffkfxff
+2-10 j: vjhcggzrjqt
+5-7 g: gggfggzwgg
+5-6 d: ddbsjddfsdnddxfpgdd
+12-13 g: gggqjgxgzpgsggxggxk
+1-8 l: hlslllllll
+12-13 f: sbfftpvbjsmff
+6-7 s: hqcthsb
+5-11 s: qsstnssssqsrsskdss
+2-6 x: hxrfnjfclx
+1-2 w: swwwwwwwwwwwjwmwwwww
+7-12 s: whsbkgsmvnfjnnkq
+10-12 l: fllllllllsllll
+8-9 s: lsssssssqs
+1-7 p: pdpppghqppxpppppp
+1-3 x: jhxmjhkdrxgd
+1-7 b: lbxbbbvbwbbbbt
+4-5 c: cdckcbcmqcc
+5-9 k: kkmklhlmkkgkrld
+12-18 x: dvjxqxxxxxdxxxzxhp
+5-8 h: nhfhnfqx
+15-16 k: kkkkktrkkkkkpkhqxkkd
+1-13 j: dcnbwjxllpksj
+11-13 v: wvqhznrrfgmnvz
+2-5 m: bpjbmbrmfh
+10-15 t: mgtttttqspthnttkktt
+9-10 n: nnpnnnnpnh
+8-10 b: bjbzhbbbcq
+4-12 n: nnnvnnnnnnnnnn
+13-14 v: zbkchmmvjvsgkvhcz
+2-9 j: jdqjgnnjjjvjt
+11-16 g: ggggxqglgglfhvgggn
+1-2 b: bsbm
+8-11 v: lvvvjhvmxvvvv
+5-7 x: xxsxxxpr
+2-15 t: stwqdkrqcwbmngtd
+5-8 r: rcrrvndr
+5-6 v: vvvvvr
+4-5 x: qpxxr
+1-2 k: nkkkkkd
+10-13 r: znlqhvwdvrqbrrrfzwc
+1-2 h: hwhhhchhhhhhhhhhhh
+3-6 b: bbbbbvbbbvbb
+13-14 s: ssssssssmssssdss
+7-11 x: cwxhmnhzxrxdrzzxbw
+5-16 m: rgjtmrqqmfmmckxm
+17-18 b: bbbbbbbbbbbbbbbbbk
+11-20 k: kppkqkftkgkkknbtglkb
+13-14 t: rtcfrkjvtgnrtf
+5-6 z: kdzjxzjgmd
+2-3 p: rxppj
+9-12 b: mtpbbbbbbbbgp
+8-9 b: rbbbbbsbbbbxb
+13-17 r: rxgbrrnrrrrrrkrrlrrr
+8-11 w: pzqswqwcfln
+3-4 x: xxxx
+6-9 j: fjhkjjklc
+6-7 m: ctmzmfm
+8-9 l: lllllllgllpts
+8-9 t: hgpwblqkvqtb
+4-7 d: dddpddd
+4-5 c: ccccwcccg
+1-7 q: lvvtpqqvnsqbzqpr
+8-15 q: qqqqqqqqqqpqqqlqqq
+4-8 f: frfffffffxf
+7-12 r: rrrrrrrrrrrkprrtrrrp
+14-15 j: jsjjjjjjjjjjjjl
+6-17 b: khgflbrbrjbgzjtjt
+5-7 j: jjknjpw
+2-9 h: rhlqbdklh
+5-7 j: lrtvccjbzgjh
+12-14 t: tltwtxtctttnttttft
+8-9 q: qqqqqqqqx
+4-15 p: ppppppppppppppc
+2-3 v: vvvvv
+5-7 h: djvplxb
+11-12 g: gjxlvggsgggxsgfgp
+5-6 g: gggggfg
+1-6 x: wxtxxxxxxxxxx
+1-4 r: rqrcrvrzbrxrwjr
+9-10 w: wwwmwwwwpww
+7-15 z: pzrbrxpzzzzzntzv
+4-5 q: qjqwqqnlqhclq
+12-16 g: ggccgzggggsggjgg
+11-13 b: phbmbsgkvszbbrbb
+2-3 l: xhlbhl
+1-7 q: qwdqmtv
+5-9 x: xxxxjxxxxx
+6-8 p: kvpwqbdp
+11-13 t: tqttttttttttmt
+9-16 l: wzdxdmlxlkfjknnz
+1-11 j: vjjjjjjjjjjj
+2-18 t: tsttttttttttttttthtt
+6-7 n: fnnncnl
+3-5 s: lssvgfssgsshsvstsss
+3-5 h: hhhbhhh
+4-10 x: tsxxxxxxbls
+2-4 n: nnjw
+17-18 p: bptpftnxjchrwthtppk
+14-15 d: dddddddddddddddd
+10-14 m: mmmwnmmgmdmmmmmmmmm
+8-9 k: pkpqffpkktbgkbk
+7-11 l: lllllllllqplllllllll
+11-15 n: nnnzngknbnzdnsnnn
+2-4 l: vbqm
+10-11 w: wwwwwwwwwwq
+3-5 x: xxtxxxxx
+3-15 b: spbcxjlbbbrbbbbb
+4-5 n: nvfsn
+13-16 n: bppjnncnbgjndnnntwgs
+1-8 t: mttttttttt
+6-9 d: jvmssdkdhxsd
+9-10 d: gdrllcfdnd
+7-11 c: cscxccccnztccccz
+15-16 p: pppppkphpppppspg
+2-4 n: vnkjlwwsswscmxktnj
+9-11 r: rrrrrkrzslr
+7-10 t: tttgqtnttttttttt
+4-10 b: bbrzbzpbsbnbbjnbsb
+7-8 j: jlljxtsj
+5-15 z: lzzzfqzzzzzqzzzzzz
+10-11 r: rrrrrrrrrrcrrrr
+6-8 t: tztpbttttt
+2-9 c: vcgtfxfbr
+9-16 r: vgjrwcxhrrhbzxnj
+17-18 r: bczjtmjwrtzwvmgbrl
+5-6 d: dqgddvd
+1-2 r: krzrkr
+8-9 j: rxjjjjgbj
+8-9 c: cjccccccc
+13-14 b: bbbbgbbbbbbbbvb
+5-6 p: hbhwtp
+1-2 w: wfhrfsfbjtpkqcjrwdb
+10-13 q: qqqqqqqnqrqqzqq
+3-4 m: xcmcz
+11-15 d: dldddcddddjddqd
+4-10 h: khhlhhhhhhhhhhhh
+2-4 d: bdfpmxzqzbzmxmmwg
+4-5 l: lgrbl
+9-13 s: ssssssssfsssss
+7-8 p: pplkpmkppppppxp
+3-8 j: jjjjjjjj
+7-8 f: jfffffhzfff
+2-5 p: pppppppp
+8-9 l: tlclllmlz
+4-5 m: mtrmx
+13-16 x: xxxxsxmxxxxvwxxw
+5-8 n: jknnngnv
+4-7 p: ppptppgpppp
+12-15 r: rrrrrrrrrrrxrrrhr
+2-9 s: sssssssssss
+5-6 z: zphzzr
+13-17 m: mmlmmsmzmsddbxmkb
+5-7 g: gggggggg
+8-9 f: ndzfvfkfz
+2-10 g: wtngwdkcxgrth
+6-13 r: rrqrrqrrqrrrcrrrr
+1-6 z: hfzzzz
+10-13 j: jjjjjjjjjjjjdj
+5-11 m: wfqvmhbjhhnmzdlmpjc
+6-8 d: clddzxcdghn
+8-12 n: qfqbbvkpjbznrz
+3-6 r: rrbrrrrrrx
+9-10 r: rrrrrrrrrrr
+4-5 m: chltmcm
+7-8 r: rrrnprrzrhr
+3-4 j: jfcj
+16-17 n: nnnnnnnnnnnnnnnnwnnn
+7-8 r: rrrrrrnfr
+4-12 n: nnnnspnlcnmsnnnn
+11-12 v: vvvvvvfvvvhvvv
+2-8 h: hlhhkhhchhhghh
+4-5 t: stntztttmp
+3-5 v: vvvmbvhvvvlvn
+9-14 x: srxmtbtgxgmqxxxc
+4-5 z: zrlgz
+10-11 p: phxkvklpmdp
+8-15 m: mmmmmmmpmmmmmmm
+1-13 h: mzwqkhhhphsgh
+17-19 s: qssssmssgfmssmmpssk
+6-8 b: bbbbbbbjbb
+3-4 l: rllr
+2-4 j: kvjj
+2-5 n: lnnkrm
+15-16 w: wwwkwwwwwwwwwwwc
+1-3 c: ccncc
+2-5 s: bhppmsttzcscss
+1-4 t: tttxtttt
+1-9 r: rfrrrbhtxrrbrmrmr
+12-13 s: qplrssssmfswrsswss
+2-4 h: zrhhhhzhzhch
+1-5 g: rgjgg
+11-14 t: ttttvftttttqlsttt
+3-4 s: sskss
+5-15 m: mmmmnmmmmmvmmmm
+1-8 j: sjjjjjjj
+1-4 c: ccclcc
+5-7 d: ddddhdd
+2-8 z: tczzjzzzzzzzgz
+1-5 s: qsqdz
+8-11 z: zhzpzrvzhzkzzgm
+5-9 g: nvdfgshgbgltlqggbp
+1-12 r: rrrrrrrrrrrrr
+3-4 m: xmmb
+8-10 j: jjjjdjmjshqjzk
+2-4 t: tptttftt
+4-13 t: ggqscfggftnxgjpn
+4-12 q: hvzjzqsqwqjlqx
+7-8 q: qqqlqqqkqq
+9-10 f: ffffffffdfff
+2-7 k: kgkkkkkk
+7-11 t: xbpdkrtplmfbtkwgp
+4-7 c: ccccccccc
+12-14 d: dddddddddddqdddddd
+6-7 k: xhnntkpnbkfwlr
+3-5 q: qqxxq
+13-17 d: ddddddddddddvddddd
+2-3 g: smglpgpflsrbwxcjctb
+5-9 z: zjzzznfzf
+7-13 l: lmrkvvxtltcnj
+15-16 r: vjrrrkzxrrrqrtrpzv
+2-7 x: xsxxxxxx
+7-14 m: npmnmgdvnqmgrmm
+2-4 x: pxxl
+7-15 k: nkkkckgwdkffkmb
+7-11 n: dznnmcnssmcn
+8-10 s: skssgswssmsss
+14-16 n: nnnnnnnncdnjnnhwnnn
+4-7 g: kggmgggbggggwggcqgng
+4-7 g: gggqggggg
+1-2 c: cccc
+4-8 j: mzzvwjgrbrv
+11-12 x: pksjnwlltskxlj
+1-9 k: zfkkkksrkkkkkkz
+1-6 k: xkkkkknkk
+1-6 c: gccccncbccccc
+14-15 h: hhhhhrhhgkhhhmhh
+7-8 f: qffgnfhf
+2-6 m: vmqwxzgsm
+5-8 k: kkzjkwkvk
+3-4 s: dcsss
+2-4 p: jjbps
+2-11 z: zjzzzzzzzzzz
+4-7 f: bnkhvjfff
+13-16 m: mmmmmmmmmmmmjmmmmmm
+5-10 t: kdwjmcgtvtdttmtvw
+3-12 j: jjljwjfjjjjjnhjjjjc
+13-14 f: fffffflffxfffbf
+2-6 m: zmhmsm
+4-18 n: nnnvnnnnnhnnnfnnnhnn
+3-6 n: xznnsnn
+7-11 g: ggggpgggggggsg
+6-8 l: llllltllll
+4-5 s: ssnttsrs
+6-14 w: wwwwwwwwwwwpwlwwww
+9-12 q: pxqvswnqqbsqvgsd
+1-4 j: mjjjjz
+9-19 f: fffffffflfffffffffff
+2-6 t: rttqtstct
+6-9 d: dddddtddddd
+7-12 l: lllllllllllllll
+1-12 p: gppppppplpppppp
+1-4 s: fslssssssfcd
+6-7 v: wvvzffggdfvbvvv
+2-7 t: kkwgspt
+6-16 n: nncbnnnntwrxlzzwdrsj
+3-4 z: zzszzhrqwngprjt
+4-5 v: vkvvvcfjc
+4-5 j: hcjtj
+2-4 k: kqkkkkkkkksk
+7-9 g: gzgmgpgkv
+5-9 s: kjnwsrjrzssssdlnsqs
+2-8 j: jtjxxgmjkjx
+5-12 r: bfrcrtjkzqffsjtvwj
+1-2 v: xvvvmvvvv
+5-9 v: vzrgdldfvx
+3-5 m: mqsfmmlmvdfj
+12-15 v: wswvvbqqhlvqvwx
+6-7 b: bbmjdhb
+2-4 b: hbjmjr
+6-7 n: pnnnnln
+13-15 z: zzlgzpmztfzqzzl
+5-6 c: pcppscccccc
+6-7 z: zzzzzzz
+6-14 l: lllllllllllllqllqlll
+13-16 r: rrrrrwrrrrrrhrrr
+11-12 r: rrrrhrvhqmqrwr
+15-19 w: wwwwwwwwwwwwwwwwwwdw
+3-6 w: wwqxkw
+17-18 z: zzzzzzzzszzzzzzczvz
+3-4 g: lgxx
+4-5 x: nsdxdskjxtrz
+11-12 w: wvdgqppfwwdf
+2-3 w: qgrz
+7-8 w: wwrppwfwwrcwr
+2-6 n: gtspnngz
+3-7 j: jjpjjjzjjjjj
+1-2 l: pllblvgmfjvv
+15-18 r: rrlgctrrrcrqqgldpr
+3-6 v: vvvvvt
+2-10 s: vslltcxpbg
+5-8 j: blvzjtjnfmjnjtsrzmc
+9-13 b: bbbbbbbbbbbbsb
+3-4 w: wwfjw
+6-7 x: xxxxxxmx
+7-15 g: ggggggrgggggggfggg
+16-18 f: zffffffffffffffwfff
+3-4 q: qcqn
+3-4 k: kvzqk
+4-18 z: wpclkbsxwbmbmkdpzzcm
+1-8 z: zkzzzzzgzzzzz
+7-16 x: xxxxxxxxxxxxxxjkxxx
+3-6 t: xwcjztz
+8-9 r: rdrprrtrs
+1-7 v: dvvvvvcvvd
+6-8 t: tttttkttt
+1-5 w: xzwww
+6-7 c: ctdjbwcc
+3-4 t: ttnttt
+9-10 q: qmcqqqsqqqvqqq
+11-12 d: dpftdmdmdmld
+7-8 j: tbjmbjlj
+3-6 t: tttttqtt
+6-8 t: tdttthbnqt
+2-5 q: qqqqp
+1-3 t: ttht
+13-17 n: nnnnnnnnnnnnnnnndnn
+4-6 j: ftkvjj
+5-10 c: hvccfcsccb
+7-11 v: vmqvqnnnvzglvvvv
+5-8 k: kkkkkksckkk
+1-12 z: rzzzzzzzzzzzzzzzvzz
+17-18 t: tttttmtttmttttttpttt
+16-17 z: xljjnngmjmhprcqzw
+4-11 d: dtddbpddlhn
+17-18 t: tptttttttttttttttbtt
+9-12 w: wwwwwwwwwwwcw
+3-4 z: zdzj
+1-8 q: qlqqkqqhqtqhxqbbwcp
+6-8 r: rkrrlrrmzrcnnrk
+13-17 b: dbsbbbbbbbsbmkbbb
+5-16 q: gqnvqwwgqshmtrdbplfb
+7-9 c: mcvccccczc
+10-11 p: pppxppppppc
+1-6 v: vvvvvmvvvvv
+5-6 s: ssssks
+6-14 r: prgrbvrjrgrkrrr
+2-11 c: qbnxcvxgldcvdd
+11-15 d: ddddddddddsddddd
+13-14 w: rwwwwwwwwwwwwsw
+12-15 t: ttttttttttttttt
+5-8 g: skjgxsjpgvsgr
+5-11 g: ggddglggxgqgg
+2-4 c: cccc
+2-3 h: rvdg
+9-13 r: rrrrrrrrsrrrjrrr
+2-7 f: dflmgzsdftgkgc
+1-5 f: jffffffnfcff
+3-4 c: cccrqc
+2-7 m: kblcghm
+3-4 r: rscrnbbpfkr
+2-3 d: wdtqpd
+5-6 q: qqqpqnqq
+13-15 d: ddddsdddddddddjd
+3-4 c: cmcw
+2-7 q: qqqqqqjqqqqbqfqq
+11-14 x: txxxxpxdxxkxqcv
+10-11 b: bbbbbbbbbkbb
+7-11 p: ppppppppppmpv
+5-6 r: dnxrcvrrr
+1-4 d: rdddddd
+5-9 f: lxgfvffdf
+8-16 k: vmfksjkwkrkkkhkkvknk
+15-16 v: vvvvvqvvvvvvvvgv
+2-5 p: xpctr
+11-15 w: wfwwwwwkwwwwwpr
+11-13 x: xxxxxxxlxrfxxs
+18-19 b: bbbbbbbbbbqbbbbbbbb
+2-4 l: fgwl
+8-11 m: xmjnmmmmnmh
+4-6 g: lgvpksgq
+5-7 t: jtgtvttjlfhpljtzzstd
+7-11 p: mjcgvcmxgqpntxkpb
+2-3 r: rrgrrnr
+6-7 r: rrrrrcr
+4-14 d: dddjdddddddddpdddd
+5-7 q: qqqqkqqqq
+1-4 t: qttqt
+4-10 f: hbfjbzrfgvffq
+16-17 j: wjjwjwpsjjdvfjnhv
+3-4 v: vvtwv
+5-6 s: ssdswspdss
+1-2 r: rnrrmskrr
+4-7 h: rqxbjjhsfh
+4-9 l: llllllllhl
+4-6 w: sgtwwmcpwd
+4-11 l: fjdllznlllmdnll
+4-5 k: kkklk
+4-6 s: sszrssssssss
+12-14 w: wwwwwwwwwwwvwww
+2-4 b: vnzb
+7-18 g: ggggggggggggggggggg
+1-13 s: srjdvvpqnrsnnkzfj
+14-15 g: bmhbclmqcgtqxgg
+8-12 g: gggfhxgglgzb
+3-5 c: scrkcshctccmhm
+7-12 q: qklqqqhqvxqqqqw
+1-6 m: mlmxzwkmm
+3-16 r: rswggrrrrczxfpjt
+14-16 l: llldlblllqllllns
+2-5 w: wwwwmw
+7-9 r: rrrhrprrr
+2-3 j: zjmdfcth
+3-8 w: xwgwwwwww
+1-5 l: plllllll
+2-4 b: fbqp
+2-3 p: jwpmp
+3-4 c: kscm
+2-5 b: mbpbnfkvh
+4-15 m: qrswmmmgmvmfqtmrrn
+12-15 r: rxrrrrrdrhpfrrrrcrrr
+10-13 j: jjljjjjjjnjjjjj
+8-20 w: gjccptmwtrwxjtskrdfp
+11-14 j: jjjjjxjjjjgjjk
+1-4 g: gggzzgg
+4-8 q: wqqqqblsmsk
+1-11 h: lhhhfhhhhbvhhtjwrbh
+4-8 x: xlxqxxtxxxxx
+13-14 x: xxxxsxxxxxxxqxxx
+12-16 b: bxvbbbqbbbbfzbblb
+1-4 j: jzbd
+5-6 q: qqqqwqkkqqq
+2-5 x: xxxxgx
+8-10 n: nnnnnnnnnhn
+5-10 m: mmmmrmmmmmmmm
+2-3 c: qwcz
+3-5 n: cckvz
+18-19 q: qqqqqqlqtqqqqqqqjqv
+5-13 k: kkpkkkkkkkkklkkk
+5-10 q: jfjgqllmqzv
+15-17 l: llllllllllllllhll
+4-10 b: pgqbfrsnvbhzfmtbtw
+1-4 c: mccc
+6-16 f: fffffpfffffffcfffff
+4-9 j: qjbjlcsgljtbvv
+11-12 z: dstqbtxxvdchsg
+3-8 d: jvdpnvqs
+2-3 n: nfvnnnn
+6-12 r: zdbfdrvtmpkrjkr
+1-15 k: kbdckwtkfhvrbjk
+6-8 v: fvhsvgcv
+2-3 p: ppkppp
+2-14 r: drclhnrdhtcbmnr
+7-10 p: vchpmlpjfxbfnwsdxjr
+1-3 v: lvvv
+1-3 b: bbjbb
+2-12 q: qmxbbbgqlscqvdtpq
+7-9 l: lllllkllqlllclll
+16-17 r: hrrrrrrrrrrrrrrrr
+8-9 g: gggggggfg
+6-8 v: zvqffmkv
+9-12 t: tttttznttjtfrtsjxtd
+5-12 q: bqhbltqnjlhqqhtkq
+8-9 d: ddddddddkd
+2-8 q: tvpqmrrq
+13-16 q: qqqgmqqqqqsqmqqpqqqs
+7-9 p: pppppplppp
+4-6 h: hhxhlhhhxhp
+6-8 g: gggggdggggg
+4-5 j: jjjkjj
+4-5 x: xxxfg
+2-13 x: xxhrhxwbrgrdskghtkj
+12-19 x: cxxxxxxxxxxhxxxxxxx
+1-4 m: tmmmm
+5-11 x: mgqnkjxxscxdxr
+3-4 t: tttctt
+4-13 b: bfkbfbbwbcbpvcbkdqww
+5-7 d: dwddddqd
+4-15 l: lvvlfclwbssvsdl
+9-14 d: ndkfnddtdddfjpvdqt
+8-9 s: ssssssssk
+9-13 l: dlljknlsllbslhlml
+4-5 n: lnnwn
+8-12 v: rlvbqlwvfhvv
+6-7 f: rcpfwfvffqfcpf
+10-11 g: rnqgxbtnxqfzgggtn
+8-11 d: ntdzzddkbdhcdddrgdld
+5-6 s: xkmssxscvbpwj
+1-3 r: rrmr
+9-14 p: pvppppppppppppppp
+11-15 t: vhftnbtmwpgbcvt
+2-7 t: pmbwnrj
+10-11 c: cccccccdcvcc
+9-14 s: ssksssssssssslsss
+2-5 t: ctrtqpn
+4-6 t: mttjftttt
+4-5 z: zfbzz
+2-3 x: xwxlwstzmvvt
+4-5 b: vbsbjwpbsbbb
+3-4 x: cwxxlmdf
+5-6 z: zzzqszzzzzz
+1-4 c: ncczc
+3-6 k: kkkkkkk
+2-3 z: rjzkpxxdvzlzxjzz
+8-10 z: fzjzszzdnzbzkzzfz
+1-9 c: ccccxccjpccccc
+3-12 j: jjjjjjjjjjjcj
+10-14 l: llplllvbllllsp
+8-12 r: hnrcrxfzrkcjcprrzjbr
+17-20 q: qqkqqqqqqqqqqqqbqqqh
+6-9 l: lllljlrlpxllllll
+8-9 v: vzzmtwfgv
+3-7 v: fqdbsshw
+12-13 f: fwffnjfbfffzzqfxfffx
+1-3 m: zjmdvjjg
+5-7 r: nrswrlbw
+8-11 c: crzfvzpcbcbchgxbln
+9-17 g: ggggggzgwwjpggpgvgrk
+6-9 k: hhkrvkkqfhqwbdb
+10-16 q: mzzjqfmtkqwvgdfttj
+11-13 m: mmmmmmmmmmtmm
+1-2 j: jjhrrj
+3-12 h: hhhhhhhhhhhhh
+8-11 w: zwkrwznrppw
+7-14 d: dpxjnddbvdbcllqr
+5-8 c: ccccfcccccc
+12-16 p: tnptbppgwxxpppjb
+1-14 t: qktttttttttttttt
+9-12 t: tttttcttgjtt
+3-5 p: tcpdgwhrkxkzjjhvsgqp
+13-14 k: kkkkkkkkkkkkklk
+11-13 x: xxxxxxsxxxxxt
+5-12 n: nxxnnznnnnmlnnn
+12-14 h: hhlhhhhhhhzcnnhhhhkh
+8-10 j: jbjbjmjvjj
+6-9 c: ccccccccsc
+5-12 j: jjjjjjjjjjjcj
+1-2 f: fhffff
+13-17 x: xnlxxxxsxxxxxxxxp
+2-5 d: sddzn
+2-4 q: qqqt
+2-6 p: fmxfxnkp
+9-11 k: nkdgncqkkgwjp
+2-5 p: hpmgcfcmz
+1-3 f: ffczf
+5-9 r: rtrrprrrrrr
+2-4 p: pnpprdn
+9-11 l: ltllbllvllc
+4-5 x: xxxmxxx
+5-9 x: xxxxxxxxxx
+16-20 b: hgcbhbbhbgbbdxhdgjwb
+10-15 c: qcccpcccdcccccfccwcf
+10-11 x: xndsgkwqpxb
+15-17 f: wwbqxrffgfvffdmdffw
+5-6 q: qqqhqvqqqq
+3-4 h: hhhchc
+7-9 x: xxxxxxxxgx
+7-8 f: fmfflfgf
+12-13 v: vvvvvvvvvvvcvvvv
+3-7 g: gggbggsgg
+1-5 w: wpswsggtw
+3-5 h: hhhhkhhhhhdhw
+6-7 w: wwwwwmwwwww
+5-11 m: mfdmcwmlvpmfc
+14-15 j: jjjjjjjjjjjjjjrjj
+3-5 v: rvtvkdvqv
+3-6 p: frppxpdpg
+3-5 t: ttttrt
+2-7 x: xxwxxkfxxxxxxxxxxgxr
+6-8 k: kkkkkpkgkkkk
+10-11 f: fffffpfffkfdf
+11-12 g: gggghgnggflg
+1-7 x: xxnxxxxkxx
+3-4 h: rhhx
+6-8 r: bcwrrrrrhrxmqgrhrzm
+2-6 l: mpdlnnp
+2-4 j: jbjjdhx
+2-15 d: dfdddddddnddddfzddjd
+5-12 h: gbngwvffshph
+1-2 t: txcpth
+14-15 f: ffffkfflfffffgf
+8-9 b: bbbbbbpbj
+5-6 f: zffhfz
+8-15 j: qjjfrtjllqfjjcj
+3-5 l: llxllll
+10-15 z: tpdzhnzkzrtzrzzzrfrz
+3-5 q: qqlqq
+3-4 d: vmzddpm
+8-11 c: cmvzlxtqxcvckxqm
+2-13 r: drpppdsqsmvnlkjb
+7-9 w: wwwwwwkww
+3-6 s: svfspfnpzq
+3-4 b: fqpbbbbzpgqf
+2-4 s: smssm
+8-9 q: qqqqqlqbq
+4-7 s: stcssbw
+15-16 k: kkkkkkkkkkkkkkkk
+10-13 x: xxsxxzxzxxsxphxxxxx
+4-5 p: drpsx
+7-11 v: vvvvvvvvvvvvv
+14-15 n: nnnnnnnnnpnnnbnn
+5-8 k: blgkkkkc
+12-16 g: ggggggggggvggggggg
+1-8 c: cccccccdc
+3-9 p: ppqppppppp
+7-9 q: cxqqqbhqqzhjqv
+1-12 m: mrkvwmmsjmkmw
+2-4 s: xrrj
+2-4 w: mbww
+7-14 v: vvvvvvvvvvvvvbv
+3-8 p: kppjprpxppb
+4-10 n: znncndnnjncnrnkn
+5-7 k: kktnkks
+10-13 r: rrrrrrrrrrrrnr
+1-6 k: kkkkkrvk
+3-5 k: jhjzkbqsjwkxsvd
+5-8 p: pcqpprckrp
+2-5 f: fsjwf
+6-9 l: jxhtplclr
+4-13 x: gdxdcdmmxlfxxs
+2-10 v: vvvrvvvvvhvvvvvvvv
+11-12 v: wqnwrlvjsxvs
+1-4 m: mfqm
+3-5 d: bmddv
+8-10 h: hbhhdhfchh
+4-5 s: sssdb
+2-3 l: lsll
+10-11 k: kkkkdcpnkkgkk
+6-8 r: vrrrrxrrrrr
+3-4 s: gxsbfr
+17-18 p: ptppppppbbpbprpcqpp
+16-17 s: gpgwvvnjbdqpksnsd
+5-10 f: gfkfzqflfzffvf
+6-18 m: kxxfrxjmwmltdvxwmmb
+5-6 d: ddntbd
+11-15 b: bbbrbhbgbbltbbhb
+6-7 r: krbrrrp
+5-6 q: qqqqqkqqqqq
+3-6 k: kfkmjt
+8-10 d: drbwtrdshdbg
+13-15 n: tqnprfnndhplcjn
+2-4 w: wjwg
+10-11 p: xprpnpvhppp
+9-10 r: rrrrrrrrqrrr
+2-8 w: wjwnwhwwwwwww
+12-13 g: gggggggggggwggg
+1-6 s: sssssss
+1-9 k: xkkkkkkkkkkkkkv
+2-4 c: ccccc
+3-7 s: ftssfrm
+12-13 k: kkkkkkkkbkksk
+9-16 q: qqqmqbbqhzqwtlwqb
+7-9 p: ppppppppdppp
+4-6 b: pcvbvkhb
+9-10 g: qmchkfggmgpqgxxgxq
+2-9 t: sthtnttthtlsq
+3-4 x: xxxx
+8-14 s: ssssssssdssssssss
+1-3 m: gmbmvbmqbxvm
+10-15 s: sgwkdvnsswsszwrn
+3-4 s: gmgs
+5-11 f: fffffffffffffffff
+7-9 v: vvfvsvzdhvv
+4-8 l: lllllllpllllllllll
+11-16 x: xxxplxxxxxpxxxxxxxxx
+9-13 t: tdtftttjdtttc
+9-13 g: rknsckngkvdxg
+3-4 d: sdqwddmr
+1-3 l: lljl
+7-17 r: trhrpmrqswrmnrbrrhb
+7-8 g: ghkxwgttgk
+5-7 b: fbnbtbndb
+6-7 v: vnxlvgv
+1-6 t: txtkttg
+2-13 n: ljnnnnlpsnscfnnnnnnf
+4-11 b: bbbbbbbbbbfb
+6-9 x: wxdkxxnnnx
+2-4 w: wswww
+5-13 j: jjsjjjjjjjjjkjjjj
+1-4 f: fszhf
+5-9 z: wzgfpzzzzjszfvfpwz
+5-9 x: xxxxhxxxsx
+15-17 b: bbbbbbbbbbbbbbkbqb
+2-7 x: xvdmgxxwgxx
+3-4 q: qqqq
+6-7 m: mqmlltc
+8-10 k: kkkfkhkkkpkkkk
+2-6 n: cnxnts
+1-6 s: gsssssssssscssss
+1-9 n: bbvkmnkdn
+2-5 p: nmlhpv
+4-6 g: vnggdpgm
+7-12 b: bbbbbbvwsbbbbbbbbbbx
+2-3 b: lgbjjr
+7-12 n: chqccgnwsznngz
+4-6 v: nntkvvv
+2-5 g: qkrjgkqgljh
+1-5 f: rffffsfzxfjfzffff
+15-16 z: zpzzzzzzzzzhzzkszz
+3-4 l: lmflkl
+7-8 f: fffvzxff
+2-4 r: rrrgrrrr
+12-14 w: tjwgwkkwwwwwwwwww
+2-12 m: mzmkmmmmmhmmcmmmrmf
+5-7 q: nfqbgqqqpqqgjq
+1-4 r: ktpr
+5-6 j: jjjgbj
+9-13 d: ddpbdddwbbdmd
+8-9 r: rphfrrrsrr
+10-12 f: fffffffffffbffpff
+5-12 b: xhbbcbbbbxtbbb
+9-10 j: jjjjjjjjqjjj
+3-4 q: qqqn
+3-9 r: srrtqqprjmqgnp
+2-3 c: gcqc
+3-4 c: bclc
+3-6 n: jnxhshghnnqncgncn
+2-4 h: ckhh
+9-12 t: tdjjqcdbtkbtmb
+11-13 x: cxxkxbxktxxxkxxxpxxh
+4-14 m: hjqmqjvqgjdjzsssdkm
+6-12 r: rrrrrlrrrrrrrr
+14-16 g: gngggggkfglzgggv
+9-13 h: hvhhdzhhmhhhh
+3-15 x: xxjxxxxxxxxxxxbxx
+10-12 z: zzzzzzzzzpzzz
+3-4 h: dnhv
+13-14 g: gggggggggggggg
+7-11 r: rrrrrrrrrrr
+6-9 x: czxxlsxxx
+3-5 h: hhchh
+1-9 j: jjjjjgdjjjjjjjf
+7-10 b: ctsbpxrvwbkbjklghnbn
+10-11 g: gggggggggglg
+1-7 x: xnpsxfm
+9-10 q: xxxzqbpdqj
+4-10 q: pqsqbqcvllfn
+11-12 x: xxxkxxxxxxgxxxx
+3-12 s: pstrsssntsssssbssj
+9-12 s: wnsdfrtssllsfbsssccb
+1-6 r: nrrrrmrc
+11-13 k: kkskkkbkkkzkkk
+4-5 h: hhhhshh
+5-19 f: ffffffffffffffffffcf
+3-4 z: zczzz
+5-8 l: ghlllsllfw
+3-9 g: ggpngglkkf
+7-9 b: xwbbbhhbmgjhbbbhnbb
+4-5 c: cjmgczcccpzqr
+15-16 j: jqfqsnnvffpjjjqj
+5-6 z: zzzztvws
+3-7 t: tftxtvfzs
+1-5 l: tlllll
+5-18 n: nnnngnnnnnnnnnnnnnn
+5-6 m: bchzqm
+9-10 p: lmpsbqgzpxggltl
+2-9 h: hqdpjwpxhg
+4-6 n: nqbnbnknnzd
+2-7 q: qbqqqvq
+7-8 c: cccccclc
+8-12 r: rrkrrrprvrcqnr
+14-15 j: jkpjjnjjjwjjjjjjhjwj
+7-9 s: stsstspsn
+8-11 h: hhhhbhhhhjhhhh
+5-6 d: dddtpdd
diff --git a/2020/inputs/day_3.txt b/2020/inputs/day_3.txt
new file mode 100644
index 0000000..0fe60b0
--- /dev/null
+++ b/2020/inputs/day_3.txt
@@ -0,0 +1,323 @@
+...........#..............##...
+...#....................#......
+.....####...........#.#..#.#...
+....##.#.......................
+.......#.##......#.###.........
+.#.....#.......##.......#.....#
+...........##....##.#....#.....
+......#.........#....#.........
+..###....#.........#....#.#....
+....#....#.#..#..#.........#.#.
+..........................#...#
+.##...........#...#.#.......#..
+#....##...#.#....#.............
+....#..##......##..#.#....#....
+#..........#.............#..#.#
+...#.####.....#..#.#.#..#...#..
+..........#......#........#..#.
+............#.....#..#..#....#.
+.................#...#.........
+..#...#...................#....
+..............##...#...........
+..........................#..#.
+#...#...#............#...#.....
+.................#..##.......#.
+............#....#.............
+.#......#.#...#....#...#.......
+.....#.....##..##.....#.......#
+.#..#..##...............#..#...
+#...#...##............#........
+.......#....#.......#..........
+...............................
+#................#...#.........
+...#...#..#..#.............##.#
+......#........#..............#
+...#.....##.#...#...#..........
+.........#..#........##.#...##.
+#.........##..#.......#........
+........##.#.#.................
+.#....#............###....#....
+...#.##....#.....##..#..#....#.
+....#..#........##..#...#..##..
+..........#............#.......
+.........#........##....#..##..
+#....#.........#.#.......#..#..
+...#....#......##.#............
+........#..#...............#...
+..............#.....#........#.
+......#..#.#........#..#..#.##.
+..#........###....#.#..........
+...#..#...#.#....##..#........#
+........#..#..............#....
+#.####.................#....##.
+.#................#............
+....#....#....#................
+#......#........##....#...#....
+......#..##..#..###...#.#.#....
+.#..........##.................
+...#...#....#...#.....#.....#..
+............#......##.........#
+..............##...............
+##....#....#...#...#....#..###.
+...................#.......##..
+#.....##........#....#.........
+...#.......#...........#.......
+...............##..............
+##.......#......#.....#........
+#....#..#..##..#.......#..#..#.
+.....#.............#.......#...
+......#..#........#.......#.#..
+..#...#...........#.##.........
+..#................####.#..#...
+......##....#.........#........
+..#..#.......#...##....#......#
+#.#..........#..............#.#
+.#.#..............#.##...#.....
+................#.....#.#......
+##.........#.........#.....#...
+....#.#.....................#..
+..#..#..#........#.......#.....
+.....#..#.#....#....#.....#....
+..####....#.#.........#........
+#..##...##..#.#............#..#
+.#........#..##.#.....#......##
+.##.##.....##....#.#...........
+....#..#.#..##............#.#..
+........#.#...#....#.........#.
+.....#.#.#.....#....#.....##...
+#...#..#....##..#..............
+..#...#....#...##..#.......#...
+.#....##.......................
+.........#............##.#..#..
+....#................#...#.#...
+...................#..#...#....
+#..#...................#.......
+..##..............#..........##
+...#.##......#.............#...
+.........#.#.........#.........
+...###......#.................#
+..........#....##..............
+.##..#....#.........#.#........
+.........#.......#.......#.#...
+#........#............#......#.
+....................#..........
+.......#...##..........#...#...
+....#.#.......#.#...##..#.#....
+...#..........#..............#.
+........##..............#......
+......#...##......#....##......
+....#.....#.#.##..............#
+...#...........#.#.............
+...........#......#.#..........
+...#.#......#......#...#...#...
+..#.......................#....
+...#...#..#..................#.
+##.....#.....#..#..#.....#...#.
+.#..#.......##.#.#.............
+......##.......##............#.
+.......#..#..#.......#....#.#..
+......#.....##..##...#........#
+.....#........#.##..........#..
+#....##............#........#..
+.....#..#...#............#...#.
+##.#....#........#.............
+.##...............##......#.#..
+###..#..#.......#.#..........#.
+.....#...........#...##........
+..#.#.#.........#.....#....#...
+.....#....##.......#..#.#......
+......#.....#...#..#...##..#...
+.....#....#................#...
+......#....#.#...##......##.#.#
+.....###.............#.........
+.................#......#####..
+.#.......#..........#.#....##..
+..#..#.......#.....#..#......##
+..........#.#.##.......##....#.
+##...#...##.##......#..###.....
+..#..#..#......#....#..........
+..#...#....#......#....#....#.#
+.#...#........#.....#......#..#
+#.........#......#.##.##.......
+#.##..#.............#.....#....
+....#.......#..#..##...##......
+...#.............#.#......#....
+#.....#..........##...##.....#.
+...............#........#....#.
+#.....#...#..#.............##..
+.#....##.#.......#.#..........#
+....#....#.#.....#....#......#.
+......#......#.................
+.#.#..#.#.#...#...#..#.##.#..##
+.............#.....#...........
+............#...#..#..#.....#..
+.#..........#.......#....#.....
+......#..###.#...#.............
+......#..........#.............
+....#.................#..#.#.#.
+...##.##.#....##.##............
+####......#........###......#..
+..#.......#.#..#.##............
+.....#.....#.#.......#.....#...
+.....#..........#.#............
+#.....#.............#......##..
+......##..........##....#......
+.#..............#..........#...
+......#..#...#........#..#....#
+.#......#.......#..#...........
+..#..#....#.#.......#....##..#.
+........#.#................#...
+#.......#.##.#......#...#.....#
+..#...#.#.....##...............
+..........#.....##.............
+.......#............#........#.
+...#............#......#......#
+.#..#.......#...#...#..#..#....
+#....#.#...#......#...#......#.
+.#.......#..#.#...........#....
+...##.#...#.......#..........#.
+.....#..............#..#...#...
+...........................#...
+.............#.....#...........
+....#.#..#..#...#..#...........
+.....#.#.#..#.#....#.#.#.......
+.......#..............#.....##.
+........#..#..#.#..#...#.#.....
+.....#.#...#.#.#.....#..#...#..
+.....#....#.......#......#.#...
+.#.#...........#........#......
+.##..##......#......#......#.#.
+.....#.###.#.......##.#..#.....
+#.......##..#.........#....#...
+.#.............#.........#.#.#.
+..........#..#..#....#....#....
+#....#...........##..#.....#..#
+......#....#...###..#...#......
+.....#....#........#....#..#...
+...##..............#.##...#....
+.#............#........##......
+..##........#.#...........#...#
+..#.#...##...#..#..........##..
+.................#.......#.....
+......#.....#............#.....
+.#.....#.........#.#..#.#......
+.............#.#.#..#.......#.#
+#......#.....#..##...#.......#.
+.......#.#..#...#.........#....
+...#..##...#.........#.#....#..
+........................#..#...
+....##..##................#....
+.......#..#.......#........##..
+.....#....#.##....#............
+.#....#............#.....#...#.
+..##.....#......#......#.#....#
+...#...........#...##....#.....
+......#.##.#..##...##.#.#..##..
+.......##....#......#....#.#...
+.....####..#............#..##..
+......##..##..##.........#...#.
+.#.#...............#.........#.
+......#......#...........#.....
+.....#.......##.....#..#.......
+.....##..#..#....#.#.......#...
+...........###.###.##..#.#..#..
+.#...............##.........#..
+......##..........#..#.....##.#
+.............#....#....#..##...
+.#..............#........#.....
+.#..#.........................#
+.##..............#..........#..
+..#..#.#.#.#......#............
+....#...#.#.#....#........#..#.
+.....#........#....#.....#.....
+.#...#.#......#..#........#.##.
+.......#.....#................#
+.#.#........................#..
+............#..#.......#.......
+....##.#........#...#.#.#.#.#..
+.....#.......##................
+...##...#....#.....#.#.........
+#...#..............#.......#...
+...#.#.#.#..##....##...........
+.....##...#....#.....#.........
+#......#.....#....#............
+....#..###....#.##.......#...#.
+..................##.#......#..
+.....##..............##.#....#.
+.........#...#........#..#....#
+.##..#.........#....#..##...#..
+#.#.##................#.##.....
+..#.#....#.#.......#....#......
+..#.#.##.#.......#.............
+..#....#.#..##.#..........#.#..
+#.....#.....#.....#.........#..
+#.......##.....#....##.....#...
+..#...#.........##.#..##.......
+..#.#.........#.......#........
+#.....#.....##.#.#..#...#..#.##
+.........................#.##..
+..#.#..#..#..#........#......#.
+..#..............#.............
+.....#.......##.##.....#.......
+....#...#...............#..#...
+....#......#.#........##.#..#.#
+....................#..#.......
+.....#.......#......#.##.......
+#.......##..........#.....#....
+.#.......#....#.#......#.......
+......#...#...............#.##.
+....##.#.....#.............#.##
+#..#................##...#.....
+....###......#.#.........#..#..
+...#...#......#...##....#...#.#
+..#...#.#.##.#.................
+.....##......#..#.#....#.......
+##.......#......#.#..#.#.......
+.#.#.#.........#...#.#..#......
+#...#.#........#....#.#.....#..
+....#.......##....#......##....
+.....#..........#......#....#..
+#...#....#...#.....#.#.........
+...#..##.....##....#.....#.#...
+..................#.....##.....
+.....#............#............
+...#.....#..#........#.#..##...
+.......#.#.....................
+......#...#.......#..#...#..#..
+.#..#...#.....##.....#.#.#....#
+....##...#.#............#..#..#
+...........#............#..#...
+.......#.....#................#
+..#......#.#.......#.#.........
+.....#..#.#.##.................
+.....#..#......................
+...#....#...#..#.#..#....#.....
+.#............#.....#..........
+#.##..#..#.......#......#.....#
+.#.........#....#....#.........
+...#.#.#........#.#....#...#...
+#........#..#..#..........#..#.
+.....#..#.....##......##..##.#.
+..............#.......#..#..#..
+....#........#.##.#...#........
+..#.#..#....#........##.....##.
+...##.....#...#.......#.#....#.
+#.....#..##.##.#...##.......#..
+.....#........#.#.#....#.......
+.#................#####..#.#...
+..........##..#..###....#......
+.....#.......#..........#..#...
+..#....#....................#..
+#.....#..#.....#...##.#.....#.#
+...#..##............#.....#....
+##.#..#.......##...............
+........##...#.#.....#......#..
+........#...#..................
+#......#................#.#....
+...........#...#..#.........#..
+...#.##..#.##..................
+.....#......###......#..#......
+..#.#.....#...#..#.##........#.
+....#..........#.#.....#.......
+..#..........#..........#.#....
+..#.##.......#......#..........
diff --git a/2020/inputs/day_4.txt b/2020/inputs/day_4.txt
new file mode 100644
index 0000000..b17cdcd
--- /dev/null
+++ b/2020/inputs/day_4.txt
@@ -0,0 +1,1023 @@
+ecl:#eef340 eyr:2023 hcl:#c0946f pid:244684338 iyr:2020 cid:57 byr:1969 hgt:152cm
+
+pid:303807545 cid:213 ecl:gry hcl:#fffffd
+eyr:2038 byr:1951
+hgt:171cm iyr:2011
+
+hcl:#c0946f byr:1933 eyr:2025 pid:517067213 hgt:173cm
+ecl:hzl
+iyr:2018
+
+pid:5253256652 byr:2009 hgt:152cm iyr:1989 eyr:1968 hcl:64cb63 ecl:hzl
+
+iyr:2013
+pid:862607211 eyr:2020
+hgt:174cm
+byr:1990
+ecl:blu hcl:#888785
+
+ecl:grn byr:1955
+pid:608098408 eyr:2027 iyr:2020 hcl:#b6652a cid:264
+hgt:181cm
+
+byr:1998 ecl:hzl eyr:2021
+hcl:#866857 hgt:189cm iyr:2030
+pid:013735467
+
+pid:075417314 hcl:#b6652a byr:1957
+iyr:2011
+hgt:154cm
+eyr:2025
+ecl:amb
+
+iyr:1993 hgt:74cm eyr:1960
+byr:2029
+hcl:293244 ecl:#3cb5e5 pid:4861232363
+
+hgt:153cm hcl:#6b5442 pid:065240897 byr:1932
+cid:196 ecl:blu eyr:2028 iyr:2019
+
+eyr:2024 ecl:amb
+hcl:#866857 byr:1922 pid:496904942 hgt:164cm iyr:2020
+
+pid:847705161 byr:1951 cid:124 iyr:1991
+eyr:2028 ecl:dne
+hcl:6b2d28 hgt:172cm
+
+byr:2007 iyr:2029 ecl:hzl eyr:2026 hgt:168in
+hcl:z
+pid:63151612
+
+iyr:2027 hgt:172in
+cid:174 byr:2014 hcl:z eyr:1921
+ecl:grt pid:#cebdc2
+
+ecl:amb hcl:#d09c0f
+iyr:2015 hgt:156cm eyr:2026 byr:1962
+pid:086120872
+
+cid:125
+pid:837849996
+byr:1958 ecl:brn hgt:166cm hcl:#ceb3a1 eyr:2028 iyr:2012
+
+ecl:gry hgt:180cm
+pid:939059935 eyr:2023 byr:1977 hcl:#b6652a
+
+hgt:190in byr:2029 eyr:1984
+ecl:gry hcl:z pid:055092916 iyr:2010
+
+hgt:63in ecl:blu byr:1940 iyr:2012 eyr:2029 hcl:#7d3b0c
+pid:163033394
+
+eyr:2040 pid:181cm
+iyr:1928 hgt:76cm hcl:d8aafb byr:1949 cid:275 ecl:xry
+
+hcl:#cfa07d ecl:oth byr:1948 eyr:2021
+pid:719690182 hgt:179cm iyr:2020
+
+byr:1939 cid:266
+eyr:2026 iyr:2017 hcl:#f116d2
+ecl:hzl pid:522421825
+hgt:68in
+
+hcl:z hgt:61in
+cid:115 pid:180cm iyr:2030 byr:2014 eyr:2032 ecl:hzl
+
+ecl:xry
+eyr:2028 pid:191cm iyr:2015 hgt:150cm byr:2029
+
+eyr:2027
+hcl:#a97842 pid:997937480 hgt:61in iyr:2019
+byr:1921
+ecl:grn
+
+hgt:163cm
+pid:912318455 iyr:2016 byr:1988 ecl:brn hcl:#a97842 cid:221 eyr:2029
+
+cid:333 hcl:#c0946f
+hgt:163cm iyr:2018 eyr:2027 ecl:oth
+
+cid:70 hcl:#c0946f
+pid:961507902 byr:1949 ecl:grn iyr:2017 eyr:2029 hgt:69in
+
+hgt:169cm ecl:amb
+iyr:2013 pid:496169901
+byr:1943 eyr:2028 hcl:#ceb3a1
+cid:249
+
+ecl:blu cid:343
+iyr:1998 hgt:154in hcl:#efcc98 byr:1972
+
+pid:508213120 iyr:2012 eyr:2025 hcl:z hgt:70cm byr:1976
+ecl:brn
+
+iyr:1924
+eyr:2005
+hcl:z
+hgt:167 pid:154cm
+byr:2007
+
+pid:761333244 hgt:180cm iyr:2017 hcl:#18171d eyr:2021
+byr:1983
+cid:67 ecl:oth
+
+eyr:1993
+byr:2003
+hcl:#602927
+ecl:grt
+cid:84 hgt:178
+pid:1847086637 iyr:2026
+
+hcl:#866857 hgt:162cm pid:483774485 iyr:2010
+byr:1946 eyr:2028 ecl:gry
+
+pid:726639691 eyr:2028
+hgt:171cm hcl:#ff65a6
+iyr:2011 byr:1989
+
+hcl:z iyr:2026 ecl:xry
+eyr:2037 byr:2005 pid:#f09a0f
+hgt:68 cid:156
+
+hgt:71in ecl:blu eyr:2026 hcl:#18171d
+byr:1981 iyr:2017
+pid:698636544
+
+eyr:2021
+byr:1957 ecl:brn pid:365378126 cid:93 iyr:2019 hcl:#18171d hgt:179cm
+
+byr:1996 iyr:2014 hgt:64cm
+eyr:2034
+hcl:z
+
+pid:629486472 cid:140
+hgt:192cm eyr:2020 hcl:#b6652a iyr:1988 byr:2021 ecl:brn
+
+byr:1955 iyr:2015 eyr:2030
+ecl:gry hcl:z pid:6550198754
+hgt:158cm cid:305
+
+ecl:gry hcl:#a97842
+hgt:176cm eyr:2022 pid:810146585 iyr:2020
+
+byr:2027 hcl:#cfa07d
+iyr:2011 ecl:#f07598
+cid:293
+hgt:150cm pid:#fa948d eyr:2029
+
+eyr:2028 iyr:2013 hgt:69in ecl:gry pid:317170371
+cid:147 hcl:#bfe1f1
+
+byr:1976
+pid:059341891 hgt:174cm
+ecl:oth
+eyr:2029 iyr:2017 hcl:#733820
+
+iyr:2018 hcl:#ceb3a1 hgt:188cm cid:308
+pid:792826885 byr:1948 ecl:blu eyr:2028
+
+iyr:2017 cid:94 hcl:#95c7dc
+pid:231757803 eyr:2022
+byr:1992 hgt:153cm ecl:amb
+
+eyr:2027
+iyr:2011 hgt:186cm
+ecl:brn pid:996347346 hcl:#866857
+byr:1960
+
+eyr:2025 byr:2001
+ecl:blu pid:755715478 iyr:2019 hgt:61in
+
+ecl:gry
+eyr:2038
+hgt:81 hcl:z iyr:2028
+cid:214 byr:1965
+
+pid:412744447 byr:1979 hcl:#cfa07d ecl:blu
+eyr:2029 cid:157
+hgt:180in iyr:1948
+
+hgt:170cm
+pid:623557081 byr:1924 eyr:2024 hcl:98d623 iyr:2012 ecl:amb
+
+cid:311 ecl:grn
+iyr:2011 byr:1982
+eyr:2002 hcl:#ef318a
+pid:0548169957
+hgt:87
+
+eyr:2030 hcl:#733820 iyr:2016 pid:558470391
+byr:1936 ecl:oth hgt:185cm
+
+iyr:2019
+ecl:amb byr:1949
+pid:376468392
+hgt:178cm
+
+pid:019195245
+ecl:grn hgt:171cm
+byr:1978 iyr:2011 eyr:2022 hcl:#733820
+cid:134
+
+hcl:#623a2f hgt:192cm eyr:2026 byr:1977
+ecl:grn cid:308
+
+ecl:hzl pid:715816358 hgt:69in iyr:2014 hcl:#623a2f
+byr:1996
+eyr:2027
+
+iyr:1947
+ecl:#39a697
+hgt:183cm byr:2029
+eyr:2022 pid:7951883913
+hcl:z
+
+ecl:gry byr:1950
+hcl:#18171d hgt:168cm iyr:2020 pid:677187333 eyr:2027
+
+byr:1969 ecl:blu hcl:#18171d iyr:2011
+hgt:162cm
+pid:701349891
+
+cid:269 byr:1966
+iyr:2011
+pid:905940527 eyr:2023 hgt:190cm
+ecl:brn hcl:#ceb3a1
+
+eyr:2027 pid:454627395 ecl:brn
+hcl:#ceb3a1 cid:302 hgt:184cm
+byr:1959
+iyr:2015
+
+iyr:2011
+eyr:2028
+hgt:166cm
+hcl:#733820 byr:1938 ecl:blu pid:857984986
+
+hcl:#c0946f ecl:brn pid:226877822
+hgt:182cm byr:1998
+cid:160
+
+hgt:186in pid:26499164 byr:2017
+hcl:z
+iyr:1998 eyr:2026
+cid:331 ecl:#236556
+
+pid:328866543
+hgt:165cm eyr:2039 iyr:1987 ecl:amb byr:2018 hcl:z
+
+iyr:2016 eyr:2036 hcl:#888785 byr:1976 pid:160402352 hgt:76cm ecl:blu
+
+ecl:blu
+hcl:#fffffd eyr:2025 hgt:66in pid:979788527
+byr:1957 iyr:2013
+
+ecl:grn pid:279357265 iyr:2019 eyr:2021 byr:1953
+hgt:177cm hcl:#c0946f
+
+ecl:oth hcl:z eyr:2025 byr:1949 hgt:189cm iyr:2020 pid:901383503
+
+byr:2019 hcl:#733820
+pid:31022828 eyr:1929
+hgt:75cm iyr:2012 ecl:grn
+
+pid:080462937
+ecl:blu hcl:#866857
+cid:102
+iyr:2013 eyr:2025 byr:1975 hgt:64in
+
+iyr:2016
+eyr:2028
+cid:125
+byr:1979 hcl:#866857
+ecl:brn hgt:173cm pid:814947616
+
+hcl:z byr:2020 pid:#c3b54b hgt:174in eyr:2038
+iyr:2016
+ecl:gmt
+
+cid:132
+iyr:1958
+pid:61543452 hcl:z
+ecl:zzz eyr:2039 byr:2006
+
+cid:55 eyr:2022 byr:1954 iyr:2015
+hgt:188cm hcl:#a97842 pid:49143631 ecl:amb
+
+hgt:152cm
+byr:1982
+iyr:2013 ecl:blu
+hcl:#341e13
+eyr:2026 pid:440841976
+
+iyr:2019 ecl:blu pid:553456616 hcl:#733820 hgt:160cm byr:1932 eyr:2030
+
+byr:1980 hgt:169cm hcl:#7d3b0c cid:312 iyr:2010
+eyr:2026 pid:028550304 ecl:grn
+
+ecl:amb eyr:2021 iyr:2014 hgt:71in pid:986053283 byr:1981
+
+ecl:oth
+eyr:2023 hcl:#888785
+byr:1949
+iyr:2016 pid:699325656
+
+hgt:63cm cid:297 eyr:2020 pid:990390922
+hcl:#602927 ecl:lzr
+iyr:2012 byr:2016
+
+hcl:9ea2fa eyr:2023 pid:088680493
+byr:1998 iyr:2017 ecl:utc hgt:170cm cid:175
+
+cid:316 iyr:2016 eyr:2026 hcl:#79ff1d hgt:65in
+byr:1997 pid:215466710 ecl:oth
+
+cid:213 byr:1983 hcl:#888785 iyr:2016 pid:767747981 eyr:2025
+ecl:hzl hgt:168cm
+
+eyr:2030 byr:1972
+cid:282
+ecl:gry hgt:178cm
+hcl:#a97842
+iyr:2018
+
+hcl:#6b5442 ecl:amb
+eyr:2028 cid:104 hgt:159cm pid:446429120 iyr:2012
+byr:1938
+
+byr:1940 hgt:178cm ecl:oth
+hcl:#ceb3a1
+pid:845683663 iyr:2015 eyr:2024
+
+byr:1940 pid:496262233
+hgt:184cm hcl:#b6652a
+ecl:grn cid:152 iyr:2012 eyr:2029
+
+hgt:185cm pid:455744229 byr:1954 eyr:2022 ecl:gry hcl:#6b5442 iyr:2012
+
+hgt:182cm byr:1966 eyr:2028 ecl:#a5b7fc
+iyr:2029
+
+pid:343591896
+cid:58
+ecl:hzl
+eyr:2022 hgt:180in byr:2021
+hcl:#6b5442
+
+ecl:utc hcl:#b6652a
+pid:635147657 byr:2020
+eyr:2022 hgt:157cm iyr:2018
+
+ecl:grt cid:312 iyr:1959 pid:154262836
+hgt:171cm
+hcl:#fffffd
+eyr:2024
+byr:1982
+
+hcl:#7a12b4 pid:223424149 ecl:hzl hgt:175cm
+byr:1930 iyr:2010 eyr:2028
+
+hcl:#c0946f pid:633476454 eyr:2026 iyr:2011
+byr:1934
+hgt:186cm
+cid:289 ecl:gry
+
+hcl:#fffffd pid:376300524 hgt:155cm byr:1964 iyr:2017 eyr:2021 ecl:grn
+
+hcl:a5d4dc byr:2006 cid:165 ecl:#db800f iyr:2029 pid:0199789970 eyr:1961 hgt:61cm
+
+eyr:2027 hgt:170cm iyr:2010
+hcl:#c0946f
+ecl:grn pid:415726530
+byr:1985
+
+cid:197 byr:1957 hgt:192in hcl:#a97842 ecl:hzl eyr:2029 pid:958973455 iyr:2011
+
+iyr:2015 pid:933689314 hgt:162cm ecl:amb
+cid:122 eyr:2021
+hcl:#6b5442 byr:1973
+
+eyr:2026 hgt:172cm
+iyr:2012
+ecl:brn hcl:#733820 pid:004474632
+byr:2000
+
+hgt:191cm eyr:2030 byr:1999 pid:9155071477 iyr:2026 hcl:#602927 cid:315
+ecl:grn
+
+iyr:2010 pid:182884251 hcl:#18171d hgt:154cm
+eyr:2020
+byr:1926 ecl:oth
+
+iyr:2019 eyr:1920 pid:132839546
+cid:283 hgt:188in hcl:#efcc98 byr:2027
+
+iyr:2011 hgt:177cm
+cid:117 byr:1976
+ecl:gry
+hcl:#623a2f eyr:2030 pid:134592046
+
+byr:1968 hgt:146
+iyr:2013 hcl:eefdc4 eyr:2028
+ecl:xry pid:722120008
+
+iyr:2016 byr:1941 hgt:67cm cid:51 hcl:#b6652a ecl:hzl eyr:2034 pid:994005715
+
+hcl:#cfa07d ecl:oth
+hgt:182cm eyr:2021 pid:612583941
+byr:1983
+iyr:2019
+
+byr:1922
+hcl:#602927 hgt:161cm ecl:gry eyr:2020 pid:190170808 iyr:2013
+
+hgt:63cm cid:136
+iyr:1999
+pid:8235748647 hcl:z
+byr:2022 eyr:1933
+ecl:#304383
+
+cid:273 ecl:blu hcl:z
+iyr:2011 byr:2007
+eyr:2020
+pid:942473857 hgt:178in
+
+ecl:grt byr:2029 hgt:187in eyr:2030 cid:160
+hcl:#efcc98 pid:#39f22b
+iyr:1966
+
+byr:1978 ecl:oth iyr:2011 hgt:164cm eyr:2027 hcl:#cfa07d
+
+hgt:75cm hcl:#1e8137 byr:1986 ecl:blu eyr:2022 pid:796688423
+iyr:2012
+
+eyr:2026
+ecl:#3013af hcl:z pid:#e8597f hgt:123 iyr:2025 byr:1942
+
+hcl:z hgt:177in
+iyr:1993 pid:#4c9348 byr:2008 eyr:1989
+
+pid:123524366 byr:1935
+hgt:156cm hcl:#7d3b0c
+iyr:2020 ecl:brn eyr:2020
+
+hcl:z eyr:2038 pid:7663741757 ecl:gmt hgt:174
+byr:2008 iyr:1939
+cid:225
+
+hcl:#888785 hgt:172cm
+ecl:oth pid:500711541 eyr:2027
+byr:1931 iyr:2012
+
+pid:575447108 ecl:amb byr:1943
+hcl:#888785 hgt:173cm eyr:2024
+
+eyr:2021 iyr:2010 pid:178773264 hgt:157cm byr:1965 hcl:#bb7bcf ecl:amb
+
+iyr:2023 ecl:#35bd84 byr:2020
+hgt:72in
+eyr:2037
+hcl:#6b5442
+pid:421311669
+
+byr:1921 iyr:2011
+pid:146088688
+eyr:2023 hcl:#15ed24 hgt:183cm
+ecl:brn
+
+hcl:#b6652a cid:243
+byr:1993 eyr:2024
+iyr:2014 hgt:172cm
+pid:771275594
+
+eyr:2024
+hcl:#cfa07d pid:858807920 cid:293 hgt:157cm ecl:hzl iyr:2013 byr:1984
+
+ecl:blu hgt:193cm cid:73 hcl:#18171d eyr:2026
+iyr:2016 pid:124151812 byr:1945
+
+ecl:amb iyr:2018
+pid:214555737 hgt:157cm
+eyr:2028
+byr:1925 hcl:#866857
+
+pid:5633250409
+hcl:4ef7d8
+byr:2004 iyr:1958
+hgt:96
+eyr:2038 ecl:xry cid:274
+
+byr:1972 pid:401239851 hgt:184in hcl:z iyr:2017
+eyr:2030 ecl:#cb289a cid:140
+
+hgt:175cm
+byr:1926 hcl:#cfa07d eyr:2029 ecl:gry pid:325039730 iyr:2017
+
+cid:101 hgt:166cm byr:1986 ecl:amb
+hcl:#7d3b0c iyr:2013
+pid:413769688 eyr:2024
+
+hgt:159cm cid:311
+byr:1993 eyr:2028 pid:188cm ecl:oth hcl:#602927 iyr:2013
+
+pid:565831038
+ecl:amb
+hgt:155cm hcl:#fffffd cid:335 iyr:2016
+eyr:2029 byr:1997
+
+hgt:122
+byr:2022
+eyr:2028 ecl:blu iyr:2017 pid:269710626 hcl:#b6652a
+
+cid:196
+byr:1953 hcl:#6b5442 iyr:2010
+pid:216121215 hgt:188cm ecl:blu
+
+iyr:2011 hcl:98166c hgt:62cm
+byr:2028
+eyr:2024
+pid:792478385 ecl:grn
+
+hcl:#efcc98 iyr:2012 pid:020039675 eyr:2021 byr:1974 hgt:156cm
+ecl:hzl
+
+cid:123 hcl:#7d3b0c
+byr:2026 eyr:2004 iyr:2012 ecl:oth pid:349203133 hgt:160cm
+
+pid:085461475
+byr:1962 iyr:2020 hcl:#623a2f
+eyr:2024
+cid:80 ecl:brn
+hgt:154cm
+
+ecl:oth hgt:156cm iyr:2016
+hcl:#6b5442
+byr:1973
+eyr:2021 pid:539898580
+
+iyr:2026 hgt:191cm
+hcl:z
+byr:1930 pid:#abc2f0 ecl:blu cid:242 eyr:2024
+
+cid:167
+hgt:179cm
+iyr:2017 eyr:2021 pid:756797571 byr:1949 ecl:brn hcl:#a97842
+
+byr:1975 eyr:2030
+ecl:oth hgt:169in pid:4031206183 hcl:#733820 iyr:2017 cid:244
+
+ecl:#54cfeb hgt:152cm
+iyr:2026 hcl:36b4b9
+byr:2030
+pid:#fa1cb9 eyr:1964
+
+byr:1974 cid:99 hcl:9e3296
+eyr:2032
+pid:686747414
+iyr:1995
+ecl:amb
+
+iyr:2030 ecl:oth hcl:z byr:1979
+pid:114661006 hgt:191cm eyr:1941
+
+hcl:#341e13 iyr:2014 byr:1953
+pid:188326193 ecl:gry hgt:189cm cid:283
+eyr:2030
+
+byr:1975
+pid:092061576 hgt:73in eyr:2023
+ecl:brn cid:227 hcl:#5e9d91
+iyr:2011
+
+hcl:#7d3b0c hgt:167cm cid:141
+eyr:1957 byr:2012 ecl:gmt iyr:2019 pid:#1b7c8a
+
+hgt:168cm hcl:#c0946f pid:599500784 byr:1930 eyr:2023 ecl:hzl cid:113
+iyr:2013
+
+eyr:2030 hcl:#b4cb4f
+hgt:68in
+ecl:brn byr:1923 pid:699162086
+
+iyr:2013
+ecl:dne hcl:z eyr:1971
+pid:#580add byr:2020
+hgt:190cm
+
+hcl:#ceb3a1
+byr:1976 eyr:2020
+cid:162 iyr:2016
+hgt:168cm
+ecl:hzl
+
+pid:050478613 hgt:59cm
+iyr:2017
+ecl:grn byr:2030 hcl:#cfa07d eyr:2025
+
+pid:352943968 eyr:2025 byr:1980 iyr:2014 ecl:gry hcl:#c0946f
+hgt:193cm
+
+pid:328621931 cid:310 hgt:170cm
+hcl:#733820 byr:1955
+iyr:2016
+eyr:2028 ecl:hzl
+
+hcl:#866857
+pid:095858739 byr:1956
+iyr:2018 hgt:193cm
+ecl:hzl
+eyr:2029
+
+pid:70973661 eyr:2039 ecl:gry
+iyr:2016
+cid:291
+hcl:#623a2f hgt:97
+
+hcl:4d51a8
+eyr:1978
+ecl:gmt
+byr:2029 iyr:2022
+pid:34507041 hgt:61cm
+
+byr:1989 ecl:brn pid:769582914
+eyr:2026 cid:218
+iyr:2020 hcl:#866857 hgt:184cm
+
+ecl:brn
+iyr:1998 cid:227
+hgt:162in
+byr:2026
+hcl:#602927 eyr:2027 pid:236998728
+
+ecl:gry byr:1984 hgt:157 cid:295
+eyr:2020
+iyr:2018 hcl:#733820
+pid:037871534
+
+hgt:166cm hcl:#c0946f pid:412146401
+iyr:2011
+eyr:2022
+byr:1938
+ecl:brn
+
+ecl:brn cid:95 byr:1981 eyr:2030 hcl:#efcc98 pid:777041035 hgt:152cm iyr:2011
+
+eyr:2024 hgt:89 pid:3761913749 iyr:1939 byr:1967 hcl:a222f6 cid:165 ecl:#7fe574
+
+cid:339 hgt:156cm
+ecl:brn iyr:2013 byr:1951 hcl:#efcc98 eyr:2026
+pid:863566946
+
+ecl:brn hcl:#6b5442 eyr:2023
+pid:787129723 byr:1949 iyr:2015
+
+pid:#7f615a
+cid:202 hcl:#6b5442 eyr:2028
+ecl:#a5419c
+hgt:75cm
+iyr:2011
+byr:2001
+
+pid:864001133
+cid:236
+byr:1943 hcl:#733820 ecl:dne eyr:2025 hgt:171cm iyr:1989
+
+pid:193073684 ecl:grn byr:1962 iyr:2014
+hcl:#cfa07d hgt:189cm
+cid:321 eyr:2029
+
+byr:1959
+hcl:#b6652a
+eyr:2026
+hgt:159cm pid:815014918 iyr:2011 ecl:amb
+
+iyr:2017 hgt:182cm
+hcl:#a97842 eyr:2023 ecl:grn pid:656177536
+byr:1973
+
+eyr:1923 ecl:grn
+cid:138 iyr:2020
+hgt:164cm byr:1958 hcl:#c0946f pid:783366277
+
+iyr:1932 hgt:172 ecl:blu
+hcl:#733820 byr:1962 pid:554221464
+
+cid:169 pid:922622614
+byr:1942 hcl:#ceb3a1 hgt:169cm eyr:2024
+ecl:gry iyr:2017
+
+cid:219 ecl:grn
+hgt:156cm byr:1998 eyr:2021
+iyr:2017 hcl:#ceb3a1 pid:450186263
+
+ecl:amb hgt:179cm pid:768428582 iyr:2010 eyr:2023 byr:1952 hcl:#fffffd
+
+eyr:2024
+hgt:193cm
+iyr:2017 pid:469033795 byr:1979 hcl:#18171d cid:67 ecl:amb
+
+iyr:2016 byr:1937 pid:798267514 hgt:155cm hcl:#866857 eyr:2026
+ecl:oth
+
+hgt:172cm hcl:#866857 iyr:2018 pid:662186551
+byr:1996
+eyr:2025 ecl:amb
+
+pid:2854521962
+iyr:2021
+ecl:zzz
+hcl:12f1ba eyr:2037 hgt:159cm
+byr:1937
+
+ecl:oth pid:488050418 byr:1927 hcl:#a97842 hgt:153cm iyr:2013 eyr:2024
+
+pid:119536312 ecl:#2036ad
+hcl:543178 iyr:2020
+byr:2013
+hgt:177cm
+eyr:2022
+
+pid:788908662 hcl:#602927 eyr:2029
+ecl:oth byr:1930
+iyr:2020
+hgt:179cm
+
+byr:1972
+pid:053386972 iyr:2014 ecl:grn hgt:65in hcl:#cfa07d
+
+pid:9828921035 ecl:blu
+hcl:z hgt:152in
+eyr:1949 byr:2010
+
+cid:157 pid:097910554 byr:1999
+hgt:159cm hcl:#6b5442 ecl:blu eyr:2024
+iyr:2010
+
+hcl:#a97842
+eyr:2040 ecl:#f8ad77
+hgt:173cm
+byr:2019 iyr:2010
+pid:#d16a6e
+
+ecl:dne hgt:191cm iyr:2020 hcl:#b6652a
+eyr:2021 pid:571971509 byr:1983
+
+hcl:#18171d iyr:2016 pid:159074622
+eyr:2027 hgt:163cm byr:1954
+cid:257
+
+pid:243560302 cid:58
+hcl:53a4cf byr:2012
+ecl:#fdbfb8 eyr:1920 hgt:179 iyr:2026
+
+pid:040606106 eyr:2030 hgt:188cm
+byr:1969
+iyr:2012 hcl:#ceb3a1 ecl:amb
+
+eyr:2022
+hgt:175cm hcl:#b6652a byr:1967 pid:269969031
+iyr:2018
+
+hcl:#18171d cid:278 byr:1931
+pid:134809791
+eyr:2035 ecl:#44e6cd iyr:1993
+
+hgt:177in
+ecl:utc cid:289
+iyr:1923
+hcl:13a67a pid:3045345984 byr:2030 eyr:1944
+
+pid:839901650 eyr:2030
+ecl:grn
+byr:2015 iyr:2017 hgt:168 hcl:131f4e
+
+iyr:2015 pid:529736732 ecl:brn hgt:176cm
+eyr:2026 byr:1952 hcl:#6b5442
+
+hcl:#c0946f
+cid:323 pid:303966428 iyr:2019
+eyr:2027 hgt:170cm
+byr:2001
+ecl:brn
+
+pid:193678728 hgt:72in eyr:2027 iyr:2015 byr:1951 ecl:gry hcl:#18171d
+
+eyr:2026 cid:283
+iyr:1938 pid:687430885
+hgt:186cm
+byr:1949 ecl:#521638 hcl:d13b2f
+
+eyr:2024 hcl:#ceb3a1 iyr:2013 ecl:brn
+hgt:168cm pid:792088241
+
+hcl:#888785 ecl:amb
+byr:2009 iyr:2015
+hgt:151cm
+eyr:2020 pid:223927808
+
+byr:1926
+pid:717704850
+hcl:#623a2f eyr:2022 hgt:64in iyr:2018 ecl:gry
+
+eyr:2023 byr:1954
+hgt:169cm
+ecl:hzl
+iyr:2010 pid:116868997 hcl:#18171d
+
+ecl:hzl byr:1965 hcl:#a97842 iyr:2011 pid:506354451 hgt:172cm eyr:2029
+
+eyr:2022 pid:994565705
+iyr:2013 ecl:brn hcl:#623a2f
+byr:1979
+
+iyr:2011
+byr:1931 hgt:183cm hcl:#284f26 cid:306
+ecl:amb eyr:2021
+pid:977533079
+
+eyr:2027
+iyr:2011 ecl:gry
+byr:1993
+pid:272334781 hgt:161cm hcl:#9a35b6
+
+eyr:2026
+hcl:#602927 ecl:blu
+pid:212300161 byr:1946
+cid:193 iyr:2020 hgt:157cm
+
+pid:538594567 byr:1976 eyr:2027 hcl:#efcc98 iyr:2011 hgt:154cm ecl:oth
+
+byr:1949
+hcl:z ecl:#ce67aa
+eyr:1942 pid:7978941589 iyr:2025 hgt:161in
+
+hcl:#c0946f
+cid:55
+byr:1963 ecl:blu hgt:161cm
+pid:547120453 iyr:2015 eyr:2021
+
+hgt:173cm eyr:2022
+iyr:2016 byr:2001
+ecl:hzl pid:239803460
+
+hcl:#b6652a ecl:oth eyr:2021 hgt:167cm pid:401266644 iyr:1969 byr:1974
+
+eyr:2030 pid:581963885
+hcl:#64cb23
+ecl:blu
+byr:1928 hgt:181cm iyr:2018
+
+pid:186338247
+ecl:hzl hgt:193cm hcl:#ceb3a1
+eyr:2022 iyr:2010
+
+iyr:2015 ecl:gry hgt:159cm eyr:2027 hcl:#ceb3a1
+byr:1925 pid:715902111 cid:149
+
+iyr:2018 hcl:#623a2f eyr:2020 hgt:162cm ecl:grn cid:135
+byr:1922
+pid:373216777
+
+eyr:2020 pid:749899012 hcl:#888785 ecl:brn
+iyr:2010 cid:225 hgt:172cm
+byr:1972
+
+iyr:2020 hgt:178cm ecl:grn hcl:#18171d pid:613792489 cid:240
+eyr:2028
+byr:1972
+
+iyr:2015 byr:1938 eyr:2026
+cid:113 ecl:grn
+pid:846231640 hgt:161cm
+hcl:#b6652a
+
+ecl:gry
+hcl:#ceb3a1
+byr:1956 cid:338 pid:936012518
+hgt:62in
+eyr:2029 iyr:2016
+
+pid:730866353 ecl:brn byr:1986
+iyr:2014
+hgt:190cm
+eyr:2021 hcl:#a97842 cid:126
+
+eyr:2021
+cid:180 pid:958310635 ecl:brn iyr:2015 hgt:189cm hcl:#efcc98
+
+hgt:188cm ecl:hzl pid:179001863 iyr:2016 eyr:2029 hcl:#341e13 byr:1932
+
+cid:77 eyr:2027 hcl:#623a2f iyr:2016 ecl:brn hgt:170cm
+byr:1947
+
+hgt:66in pid:617518313 iyr:2013 byr:1977 hcl:#b6652a ecl:brn eyr:2025
+
+pid:787861420
+iyr:2014 hcl:#623a2f hgt:61in
+ecl:oth cid:78
+eyr:2022 byr:1975
+
+ecl:hzl
+iyr:2017 eyr:2028 hcl:#602927
+byr:1958 pid:985208714
+hgt:160cm
+
+byr:2002
+iyr:2013
+hcl:#341e13 pid:188110633 ecl:gry hgt:169cm
+eyr:2025
+
+byr:1981
+eyr:2028
+hcl:#341e13 ecl:amb hgt:160cm cid:121
+iyr:2015 pid:963848397
+
+iyr:2013 hcl:#866857 pid:#db8648 eyr:2021 ecl:gry
+byr:1975
+hgt:153cm cid:114
+
+hgt:109
+cid:287 hcl:#6b5442
+iyr:2028 byr:1926 eyr:2036 pid:2378208387
+ecl:#245a62
+
+pid:857722366
+byr:1975 eyr:2027
+ecl:grn iyr:2019 hcl:#0afad1
+hgt:66in
+
+byr:1935 hcl:#cfa07d hgt:173cm ecl:brn eyr:2021 iyr:2019
+
+cid:66 eyr:2024 hcl:#efcc98 byr:2002 iyr:2010
+hgt:176cm pid:697153153 ecl:amb
+
+iyr:2019
+hcl:#cfa07d ecl:blu
+pid:695914972
+eyr:2024
+hgt:158cm
+byr:1943
+
+ecl:xry hgt:62in
+pid:14733148 cid:148
+iyr:2016 byr:1925 hcl:#6b5442
+eyr:2028
+
+iyr:2025
+cid:53 hgt:132 ecl:gmt hcl:159b19
+pid:156cm
+byr:2025 eyr:2001
+
+hcl:#623a2f ecl:oth byr:1974 iyr:2018 hgt:161cm eyr:2029 pid:6826285172
+
+ecl:gry
+byr:1956 hcl:#7d3b0c hgt:170cm iyr:2020
+
+eyr:2020
+pid:#946a88 hgt:186cm hcl:#733820 byr:1946 ecl:#016645 iyr:2015
+
+hgt:181cm hcl:#888785 iyr:2013 pid:634152817
+byr:1982 cid:245 ecl:grn eyr:2021
+
+ecl:brn
+pid:737531770 iyr:2010
+eyr:2020
+byr:1929 hgt:189cm hcl:#c0946f
+
+cid:158 iyr:2019 hcl:#341e13 eyr:2027 ecl:amb
+byr:1986 pid:834976623
+
+pid:976934668 cid:61 eyr:2020 iyr:2020
+hgt:76in byr:1927 ecl:amb
+hcl:#e05ee3
+
+pid:526042518 iyr:2019 eyr:2027 hcl:#623a2f byr:1976 ecl:amb
+
+pid:279367290 hcl:#a97842 hgt:158cm
+eyr:2027
+byr:1959
+iyr:2020
+
+ecl:xry byr:2028
+pid:357216861 hcl:#a97842 eyr:2024 hgt:66cm
+iyr:2012
+
+hgt:188in
+ecl:lzr cid:64 eyr:1958 byr:2014 hcl:z pid:285207570 iyr:2026
+
+eyr:1973 iyr:2017 ecl:oth cid:282 pid:695814158
+hcl:z
+
+iyr:2010 pid:661168409
+hcl:#53c696
+hgt:186cm ecl:amb
+byr:1960
+eyr:2029
+
+eyr:1982 hgt:169cm
+iyr:2002 byr:2025 hcl:327f93 pid:831648100
+
+byr:1967 ecl:oth
+eyr:2021
+hcl:#602927 iyr:2014
+pid:274974402 hgt:183cm
diff --git a/2020/inputs/day_5.txt b/2020/inputs/day_5.txt
new file mode 100644
index 0000000..11800ca
--- /dev/null
+++ b/2020/inputs/day_5.txt
@@ -0,0 +1,901 @@
+BBFBBBBRRL
+FBFFFFBLRL
+FBFBBFFRLR
+FBFFFBFRLR
+FFBBFFFLRR
+FFBBBFFRRR
+BFBBFBFLRL
+BFFFBFFLRR
+FBBBFFBLLR
+BBFFBBFRRL
+BFBBBBBRLR
+FBBBBFFLLR
+FFBFFFBLLR
+FFBBFBFRRR
+BBFBFFFRRR
+FFBFFBBLLR
+FBBFFBBLRL
+FFBBBFBLLL
+FFBFFBBLRR
+FBFFBFBLLR
+FFFBBBFLLL
+BFBBFBFRLR
+BBFBBBFLLL
+FBBBFBBRLL
+FFBBBBFRRL
+BFBBBBFLRR
+BBFBBFBLRL
+FFBFFFBLRL
+BFBBBBBRRR
+FFFBFBFLLR
+BFBFBBBLLR
+FFBFBBBLRL
+FFFBFBBLRR
+BFFBFFFLLL
+BFFFBFBLRL
+BFBFFFBRLL
+BBFFFFBRLR
+FBBFFFBLRR
+BFFFFBFLLL
+BBBFFFFLLL
+BFBFFBBRLL
+BBFBFFFRRL
+BFBBFFFRLR
+BBFBFBFRRL
+FBBFFBFRRL
+BFBFBFFRRL
+FFBFFFFLLR
+FBBBFBBLLR
+BBFFBFBRLL
+BFFBFBBRLL
+FBBFFFFRRR
+BFFFBBBLRL
+FFBBFFBLLL
+FFFBBFFRRL
+FBFBBBBLRR
+FFBBBFFLLL
+FBFBFFBRRR
+FBBFFBBLLR
+FBFFBFFRLL
+BFBBBFFRLR
+FBFFBBBLRR
+FBFFFFBRLR
+BBFFBBFLRL
+FBFFBBFLRL
+FBFBBFFRRR
+BFBBBFBLRL
+FBFBFFFLLR
+FFFFBBBLLR
+BFBFFBBLLR
+BFFBBBFRLR
+BFBBBFFLRR
+BBFFFBBLLR
+BFFFBBFLRL
+FBFFBFBLRL
+FBBBFFFRRL
+FBFFFFBLLL
+BFBFFBBRLR
+BFBFBBBLRL
+BFFBFBBRLR
+FBBFBBBLLR
+FFBFBFFRLL
+FFFBBBBLRR
+BFBFFFFLLL
+BBFBFBBLLR
+BFFFBBBRLR
+FFBFFBFRLR
+FBBFBBBLRL
+BBFFFBBLLL
+FFBFFBBRRR
+FBBBBFBLLR
+BBFBBFFRLL
+BFBBBBFRLR
+BBFBFFBRLR
+FFBFFFFLLL
+BBFBFBFRLL
+FFBFFBBRLL
+FBBFFFFRLR
+FFBBBBBRRR
+BBFFBBBLRL
+BFFBBFBRLL
+BFFFBBFRLL
+BFFBFBFLRL
+FBFFFFFRRR
+BFFBFBBRRL
+FBFBBBFLLR
+FBFBFBBRLL
+BBBFFFFRRR
+BFBFBFFLRL
+FFFFBFBRLL
+FFBBFFBLRL
+BBFFBFBLLL
+BFFBBBBRLL
+BFFBBBBRRR
+BFBBBBFRRL
+BBBFFFBLRL
+FFBBFFFRRR
+BFFFFFBRLR
+FFFBBFBLLL
+BFBFBBFRLR
+FBBBFBFLRL
+BFBFBFFRLR
+BBFBBFFLRL
+BFFFBFBLLL
+BFFFFBBRLL
+FFBFFFFRRL
+BFFBFBBLLR
+FFFFBBBLLL
+FBBFFBBRRL
+BFBFFFFLLR
+FBFBFBFRLL
+FBBBBBBLRR
+BBFFFFBLRR
+FFFFBFBRRR
+FBBBBFBRLL
+BBFBFBBLRR
+FFBBFBFLLL
+BFBBFFBLRL
+FFFBBBBRRR
+BFBBFFFRLL
+BFBBBFBRRR
+FFFFBBFRLR
+FFBBFBFLRR
+FFFFFBBLLR
+BBFBBFBRLL
+FBFBBBBRLR
+BBFFFFBLRL
+FBBFFFBLLR
+FFBFFBBLLL
+FFFBBBFLLR
+FFFBBBFRRR
+FFBBBFBRRR
+FFFBBFFRRR
+FFBBFFBLLR
+BFBFFBFRRR
+FFBFBBFLLR
+BFFFFFFRRR
+FFBFFBFLRL
+BFFBFBBRRR
+FBFBFFFRLL
+BBBFFFBLLL
+BFBBFBFRRL
+BFFFFFBLRR
+FBBBBBFRRR
+FFBBBBFLRR
+BBFBBBBLRR
+BBFBFBFLLR
+FFFFBBFRRR
+FFBBBBBLLR
+BFFFBFBRLR
+FBBBFFBLLL
+FFFFFFFRRR
+FFFBFBFRRL
+BFBBFBBLRR
+FBBBBFBLRL
+FBBBBFBRRR
+BFFFFBFRRR
+BFFBBFFLLL
+FBBFBFBLRL
+BFBBFFFRRL
+FBFBFFBRLR
+FBFFBFFLRR
+BFFFBFBLLR
+BFBBFFBRRR
+BBFBBFBLLL
+BFFBFFFLRR
+FFFBBFFRLL
+BFBBFFFLLL
+BFFFBBBRLL
+FBFFBBFRRR
+FFBFBFBLLR
+FBFFFFBLRR
+FFBBFFFLLL
+FFFBBBBRRL
+BBFBFFFLLL
+BBFFBBFLLR
+BFBFBBBRRR
+FBBBBFBRRL
+FBFFFBFLLR
+FBFBBBFRRR
+BFFFBFBRRL
+FBFBBBFLRL
+BBFFBFFLRL
+BBFBBFFLLR
+FFFFBFFRLL
+FFFBBBBLRL
+FBBBFBFRLL
+BBFFFBBLRL
+FFFBFFBLRR
+BBFBFBBRRL
+FFFFBBBRRR
+FFBBBBBLRL
+FFFFFFBLLL
+FBFFFFFRRL
+FFFFFBBLRR
+BFFFBBBRRL
+FBBFFFFLRL
+FFFFFBBRLR
+FFBFFBFRLL
+FFFBBBFRRL
+BFBBBFFLRL
+FFFFFBFLRR
+BFBFBBBRLR
+FBFBBBFLLL
+BFBFFBFLRL
+FFBFBFFRRR
+FFBBFFFRLL
+BFBFBFFLLL
+FBFBFBBRLR
+BFFBBBFRRL
+FBFFBBBRRR
+FBFBFBBLRR
+BFBBBBFLLR
+FFFBFFFRLR
+BFBBFFBRRL
+BFFFBFFLRL
+BFBFBBFRRR
+FBBFFBFLLL
+FFFFFFBLRR
+FBFFBFBLRR
+FFBBBFFLRR
+FBBBFFBRLL
+BFFFBBBRRR
+FFBFFFFRLL
+BBFFFBFRRR
+BFFBFBBLLL
+BFBBFFBRLR
+FFBFBBBLRR
+FFFBFBBLLL
+FFFBBFFLLL
+FBBBBBBLRL
+BFBFBBBLLL
+BFBFFFFRRL
+FFBFBBFRRR
+FFBFBFBRRL
+FFFBBBBRLL
+BFFBFFBRLL
+BBFFFFBRRL
+FFBFBFBLLL
+FFBFBFBRLL
+FBFBBBFRRL
+FBFFBBFRLR
+BBBFFFFLRL
+FBFBFFFRRL
+FFFBFBFRLR
+FBFBFBBRRL
+BFBBFBBLLL
+FFBBBBBRLL
+BBFFBFBRRL
+FFFBFFFRRR
+FBBFBFBLLL
+BFFFBFFRLR
+FBFBFFBRLL
+BBFBBFFLLL
+FBBBBFFLRR
+FFBBBFFLRL
+FBBBFFBRRR
+FFBBFBBRLR
+FBFBBFFLLR
+BFBBBFFLLR
+FFFBBFFLRR
+FBFFBFFLRL
+BFBFBFFLRR
+BBFBFFFLLR
+FFFBBBBLLR
+FFBBFFBRLL
+BBBFFFBRLL
+FBFFBFBRRL
+BFBFFFFRLL
+FBFBFBFRLR
+BBFFFFFLLL
+FFBFBBBLLR
+FFBFBFFLRR
+FBBBBFBRLR
+FFBFBBBRLR
+BFFBBBBLRL
+FFBBBBBRLR
+BFBBBFFRRR
+FBFBBFBRLL
+FFBFFFBRRL
+BBFBFBFLLL
+BFBBBFBRLR
+BFBBFBFLLR
+FBBFBFFRLL
+FFBFBBFLRR
+BFFBFBFRLL
+FFBBFBBLRL
+FBFBFBBLRL
+BBFFFBFLLR
+BFBFBBBLRR
+BBFFBBBLLR
+BBFFFFBRRR
+BFFFFFBLRL
+FBBBFBBRRR
+BFBFFFBLLL
+FFFBBFFLLR
+BFFBBFFLLR
+BBFBBBBLRL
+FBBFBFFLRR
+FBFBFFBLLR
+BFFFFFFLLL
+BFFBBFFRLL
+BBFFFFFLLR
+FBFFBBFRRL
+FBBFFFFLLR
+BFBFFBBRRL
+FFBFFFBLLL
+BFFFFFBLLR
+FFBBBFBRRL
+FFBBBBFLLR
+BFBFFFBLLR
+FFFFBFFRLR
+BFBBFFBRLL
+FFBBBBBLLL
+FBBFBFFRRR
+BFFFFFFLLR
+FFBBBBBLRR
+FFFFFBFRRR
+BFFFBBBLLL
+BFFFBFFRRR
+FFBBBFBRLR
+BFFBBBBLRR
+BFBBBFFRRL
+BFBFBFFRRR
+BFBBFBBRLR
+BFBBBBFRLL
+FFBBBBFLLL
+FFFBBFBLRR
+FBBFBBFRLR
+BBFBBFFLRR
+FBBFBBBRRL
+BFFBFFFRRL
+BFFFFBFLRR
+FFBFBBFLLL
+FFBFBBBLLL
+FBFFBFBRRR
+FFFBFFBRLL
+BFFFFBFLRL
+FFFFBFFLLR
+BBFBBBBRLL
+FBFBBFBRRR
+BFFFBBBLRR
+FBFFFBFRLL
+FFBBBFBLRL
+FBFFFBBLRR
+FFBBFBFRLR
+FBBBBBFLRL
+FFFFBFBLRR
+BFBFBFBLRR
+FFBBFFFLRL
+BFFBBBFLLR
+FFFFFFBRLR
+FFBBBFBLRR
+FBFBBFFRLL
+BBFBFBFRLR
+FBBFFFFLLL
+BFBBFBFRRR
+BFFBBBFRRR
+FBFFFBFLRR
+FBBFFBFLRL
+BFBBFFFLRR
+FFBFFFFLRL
+BFFBFFBLLL
+FFFBFBBRRR
+BBFFBFFLRR
+BBBFFFFRRL
+FBBBFFBLRL
+FBBFFBBLRR
+FFBFBFFLLR
+FFFBBFFRLR
+FBBBFBBRLR
+FFFFBBBLRR
+BBFFBFBRRR
+FBFBBFFLRL
+FBBBBFFLLL
+FFBFFBBRLR
+BBFFFFFLRR
+FFBFBFBRLR
+FFBFBFBLRL
+FBBBFBBLRL
+FFFBFBBLRL
+FBFBFFFRRR
+BFFBFFFRLR
+BFBBFFBLLR
+BFBFFBFRLL
+FBFBFBFRRR
+FBFFFFBRLL
+FFFFFBBRRR
+FBBBFFFLRL
+FFFBFFBRLR
+BFBFFBFLRR
+FBBFBBFRRL
+BFBBBBFRRR
+BFFFFBBLRR
+FBFFFFFLLL
+BFBFFFBRRL
+FFFBFFBLRL
+FFBFFFBLRR
+FBBFFBFRLL
+BBFBFFBLLL
+BBFFBBFLLL
+FFBBBFFRLL
+BFBBFFFLRL
+FBBFBFFLLR
+FBFBFFBLLL
+FFBBBFFLLR
+FBBFFBFLRR
+FBBFBBFRRR
+BFFFFBBLLL
+FFFBFFBLLR
+FBFBFFFRLR
+FBFBFBBRRR
+FBFBBFBRRL
+BBFBBFBRRR
+FFFFBBBRLL
+FBFFBBBLRL
+BBBFFFFRLL
+FBFFFBFLRL
+BFFFFBFLLR
+FBFBBFFRRL
+BFFBFBBLRR
+FBFBBBBRRL
+FBFBFBBLLR
+FBFFBBFLRR
+FFFFBFFLLL
+BFBFFFFRRR
+BBFFBBBLRR
+FBFFFFFLLR
+BBFBFFFRLR
+BFFFFBBRLR
+FBFFFFFLRL
+FBBBFBBLRR
+BFFBBFBLLL
+BFFBFBBLRL
+BFFBBBFRLL
+FFBFFBFRRR
+BFBFBFBRLL
+BBFBBFBLLR
+FBFBBFBLRL
+FBFFFBBRLR
+BBFBFFBRLL
+BBFFFBFRLR
+FBBFFFBLLL
+BBFBBBBLLL
+BFFFFFFLRR
+FBBBBBFRLL
+BFFFBFBRRR
+BFFFFFFLRL
+FBBBBFBLRR
+FBFFBBBRLR
+FFBBFBFRRL
+FFBBFBBRRL
+FFFBFBFRRR
+FFBBBBFLRL
+BFBBFFFRRR
+FBFBBBBRLL
+FBFFBBFRLL
+FFBFFFFRRR
+BFFFFBBLLR
+FBFBBFBLLR
+BBFFBBBRRR
+FBBFBBBRLR
+BFBFBFFRLL
+BFFBBFBLRL
+BFFBFFFRRR
+FFBBBFBRLL
+FBFFBFFRRL
+FBBBBFFRRR
+FFFBBBFRLL
+BBFFFBBRLL
+BBFFFBBRLR
+FFBBFFFRRL
+BBFFBFBLRR
+BBFBFFBRRR
+BFBBBBBLRR
+BFFBBFFLRL
+BBFFFFBLLL
+FFFFBFBRRL
+FBBFFBBRRR
+FBBBFFFLRR
+FBBFBBFLRR
+FBBBFBBLLL
+FFFFBBFLRL
+FFFFFBBLLL
+BFBBBBBLLR
+BFBFFFFLRR
+FBFFFFBLLR
+BBFFBBBRLL
+FBFFBFFRRR
+FFBBFBFLLR
+BBFBBBFLRR
+FBBBBBBRLL
+FFFFFFBLLR
+FFFFFBFRLR
+FBFFBFBRLL
+BBFFBFFRRR
+BFFBFFFLLR
+FFBBFBBLRR
+BBFFBBBRLR
+FFBBFFBRRL
+FBBBBFFRRL
+BFBFFFFRLR
+BFBBBFBLLL
+BFBFFFBRRR
+FBBBFFFRLR
+BFBBFFBLRR
+BBFBBFFRLR
+BBFFFBBRRR
+FFFFBBBRRL
+FFBFBBFRLL
+FBFFFFBRRL
+FBBBFFBRLR
+FFBFFFBRRR
+FBBBBBBLLL
+BFFBFFBLRL
+FBFFBBBRLL
+BBFBBBFRLR
+BFBFBFBRLR
+BBFFFFBRLL
+FFBBFBBLLR
+FFBBFFBRLR
+BBFBBBBRLR
+BFBBBFBLLR
+FFFFBFFRRR
+BBFFFBFRRL
+FBBFBBBLLL
+FFFBFFFLRL
+BFFFFBBRRR
+FFFBFBFLRL
+BBFFBBFRRR
+FBBFFFFLRR
+FFFBBBFLRL
+BFFBBBFLLL
+BFBBFFBLLL
+FFFFFFBLRL
+FBFFBFFLLL
+FBBBBBBRRR
+FBBFFBBRLR
+BFFFBBBLLR
+BBFBBBBRRR
+BFBFBFFLLR
+BFBFFBFRLR
+FBBBFFFRRR
+FFBFBBFRLR
+FFFFFBFRLL
+FFBFBBBRRR
+BFBFFBBLLL
+FBBBBBFRLR
+FFBBFBBLLL
+BFBFFBBLRL
+FBBFBFBRRL
+BFFBBBBRRL
+FBBFFFBLRL
+FBBFBFBLLR
+FBBFBBBLRR
+BFBBBFBRRL
+FBBBFBFLLL
+BFFFBFFLLR
+FBBBFBFLRR
+FFBFFBBLRL
+BBFBBBBLLR
+BFFFBFFLLL
+FBFFFFFLRR
+BBFBFBBLRL
+BFBFBBFRRL
+FBFBFFBLRR
+BFFFFFFRRL
+BFFFFBFRLR
+BFBBFBBRLL
+BBFFFFFRLL
+FFBBFFFLLR
+FFFBFFFLRR
+FFFBFFBRRR
+BBFBFFBLLR
+BFFBFFFRLL
+FBFBFFBRRL
+BFBBBFFLLL
+BBFFBFBLRL
+FBFBBFFLRR
+FBBFBBBRRR
+FFFBBFBRLL
+FBBFBFBRRR
+BFFFBBFLLL
+FBBBFFBLRR
+BFBFFBBRRR
+FFFFFFBRLL
+BBFFFBFLRL
+BFBFBFBRRR
+BFFFBBFRLR
+BFBFFFBLRR
+FFFBFFBRRL
+BBFFFBBRRL
+BFBBBFBRLL
+BFBFFFBLRL
+FFFBFFFLLR
+BFFBFFFLRL
+BBFBBFBLRR
+FBBBFBBRRL
+FBBFBFFRLR
+FBFFFFFRLR
+FBBBBFFRLR
+BFBFBBFRLL
+BBFBFBFRRR
+BFBFBFBRRL
+FBBBBBBRLR
+BFBFBBFLLR
+BFFFBBFRRL
+BBBFFFFRLR
+BBBFFFBLLR
+FBFBBBFLRR
+FBFFFBBLRL
+FBFFBBBLLR
+BFBFBBFLRR
+BFBBFBBLRL
+BFFFFFBRRL
+FFBBFFFRLR
+BFFBBFFRLR
+BFBFBFBLRL
+BFFBFBFRLR
+FFBBFFBRRR
+BFBBBBBLLL
+BBFFFFFRRL
+BBFFFFFLRL
+FFFBBFFLRL
+BFBBFBFRLL
+FFFBBBBLLL
+FFFFFBFLRL
+FFFFBBFLRR
+FBFFFBFRRR
+BFFBBBBLLL
+BBFBBFFRRL
+BFFFBBFLLR
+FBBBFFFLLL
+FFBFFBBRRL
+BFBBBFBLRR
+BFFBBBFLRL
+BFBBBBBRLL
+FFFBBBFRLR
+FFFFBFFRRL
+FFBFBFFLLL
+BBFBFFFLRL
+BFFFBBFLRR
+FFFBFBFRLL
+BFBFFBBLRR
+FFFBFBBLLR
+BBFFFFFRLR
+FFBFBFFRRL
+FFFFFBBLRL
+FBBBFBFRRL
+FBBBBFBLLL
+FFFFBBBRLR
+FBBBBFFLRL
+BFBBBBBRRL
+BBFFBFBLLR
+FBFBFFFLRL
+FBFFFBFRRL
+FFFBBFBLRL
+BFFFFFBLLL
+BFFBFBFLLL
+FFFFBBFRRL
+FFFBFBBRLR
+FBFBBBBRRR
+FBFFBBBLLL
+FFBBBBFRRR
+BFFFFBFRLL
+BBFBFBBRLR
+BFFBBBFLRR
+FBBFBFFRRL
+FFFFFBFLLL
+BBFBFBFLRR
+FFBFBBFLRL
+BFFBBFBRLR
+FFBBBFFRLR
+FFFBBFBRLR
+FBFBBBBLLR
+BFFBBBBLLR
+BBFBFBFLRL
+BBFFFFFRRR
+FFFBFFFRRL
+FBBFFBFRRR
+BBFFBFFRLL
+FFBBFBFRLL
+FFFFBFBLLR
+BBFFBBFRLL
+BFBBBBFLRL
+FBFFBFFRLR
+BFBFBBFLLL
+FFFFBBFLLL
+BFBBBBBLRL
+FFBFBFBLRR
+BFFFFFBRRR
+FBFBBBBLRL
+FBBFBBFLLR
+FBBFFFFRRL
+FBFFFBFLLL
+FBFFBBBRRL
+FFBFFFFRLR
+FBBFBBBRLL
+FFFFBFBRLR
+FFBFBBBRRL
+BFFBFBFRRL
+FFBFFBFLLL
+BFFBFBFLRR
+BBFBFFBLRL
+BBFFBFFLLR
+BFBBBBFLLL
+BBFBBFFRRR
+BBFFFBBLRR
+BFBFFBFRRL
+FBBFBFBLRR
+BBFBBBFRRR
+FFFBBFBLLR
+FFFBFFFLLL
+FBBBFBFLLR
+BFBBFBFLLL
+BFBFBFBLLL
+BBFFBBFLRR
+FFFBFBFLRR
+BFFFFFFRLR
+BBFBFBBRRR
+BBFFFBFRLL
+FFFFBBFRLL
+FBBFBBFRLL
+FBFFFFBRRR
+FBFFBBFLLR
+BFFBFFBLLR
+FFBFFBFLRR
+FBFFBFBRLR
+FBFBBFFLLL
+FBBFFFBRRL
+FBFBFBFRRL
+FFBFBFBRRR
+FBFBFBFLRL
+FFFBFBBRLL
+FBBBFFFLLR
+FFBBBBFRLL
+FBFFFBBRLL
+BFFBFFBLRR
+FBBFBBFLRL
+FBFFFBBRRR
+FBFFFBBLLR
+BFFBFFBRRR
+FBBBFBFRRR
+FBFFFFFRLL
+BBFBBBFRLL
+FFFBFFBLLL
+FFBFFFFLRR
+FBFFFBBRRL
+BBFFBFFRLR
+FBFBFBBLLL
+FBBBBBBLLR
+FBFBBFBLLL
+BBFBFFFLRR
+BFFFFBBRRL
+BBFFFBFLRR
+FFBFFFBRLL
+FFFFBBBLRL
+BFBBBFFRLL
+BBFBFFFRLL
+FBFBBBBLLL
+BBFBBFBRLR
+BBFFBFBRLR
+BFBFFFFLRL
+FBBBFBFRLR
+FFBFFFBRLR
+FBBBBBFLLR
+FFBBBFBLLR
+BFFBBFBRRL
+BBFFBFFRRL
+FFFFFFBRRR
+FFBBFBBRRR
+FBBBBBBRRL
+BFFBBFFRRL
+FBBFBFBRLR
+FBBFFFFRLL
+FBBBBBFLLL
+FBBFFFBRRR
+BFFFFBBLRL
+FFFFBFBLLL
+FBFBFFFLLL
+FBFBBFBLRR
+FFFFBFFLRR
+FFFBBBFLRR
+FBFFBFFLLR
+BBFFBFFLLL
+FFBFFBFRRL
+BFBBFBBRRR
+BBFFFBFLLL
+FBFFBFBLLL
+BFFBFFBRRL
+BBFBFFBLRR
+FBFBFFFLRR
+BFBBFBBLLR
+BFFBBFFRRR
+FFFFFFBRRL
+BBBFFFFLLR
+BFBFFBFLLL
+FBBBBBFRRL
+BFFBBBBRLR
+FFBBFBFLRL
+FBFBFFBLRL
+FFBBBBFRLR
+BBFBBFBRRL
+FFFFFBFLLR
+FBFBFBFLLL
+BFBFBFBLLR
+FFFBFFFRLL
+BFFBBFBLLR
+FFBBFBBRLL
+FFFBBFBRRL
+FBBFFBBLLL
+FFFBBBBRLR
+FFFBBFBRRR
+BBFFBBBRRL
+FBBFBFFLRL
+FBBBBBFLRR
+BBFBFFBRRL
+FFFBFBFLLL
+FBBBFFFRLL
+BFFBFBFLLR
+FFBBBBBRRL
+BFFBBFFLRR
+FBBFBFBRLL
+BFFFBFFRRL
+BBFFFFBLLR
+BBFFBBFRLR
+BFFFBBFRRR
+FBFBBFBRLR
+FFFFFBBRLL
+FBBFFFBRLL
+BFFFFFBRLL
+BFFFBFBLRR
+BFFBFFBRLR
+FFFFBFBLRL
+FFBFFBFLLR
+FBBFBFFLLL
+BFFBFBFRRR
+BBFBBBFLRL
+BBBFFFFLRR
+BFBBFFFLLR
+FBBFFFBRLR
+FFFFFBFRRL
+FFFBFBBRRL
+BBBFFFBLRR
+FFBFBBFRRL
+FFBBFFBLRR
+BBFFBBBLLL
+BFBFBBBRRL
+BFFFBFBRLL
+FFBFBBBRLL
+FBFBFBFLRR
+FBFFFBBLLL
+FBBFFBFLLR
+BFFFFBFRRL
+FFBBBFFRRL
+FFBFBFFLRL
+BBFBBBFLLR
+FBBFFBFRLR
+FBBFFBBRLL
+BFBFFFBRLR
+BFFFBFFRLL
+BBFBFBBRLL
+BFFFFFFRLL
+FBFBBBFRLL
+BFBBFBFLRR
+BFBFBBBRLL
+BBFBBBFRRL
+BFFBBFBRRR
+BFBFFBFLLR
+FBFBFBFLLR
+FFFFFBBRRL
+FBFBBBFRLR
+FBFFBBFLLL
+FFBFBFFRLR
+BBFBFBBLLL
+FFFFBFFLRL
+FBBFBBFLLL
+BFBFBBFLRL
+FFFFBBFLLR
+BFBBFBBRRL
+FBBBFFBRRL
+FBBBBFFRLL
diff --git a/2020/inputs/day_6.txt b/2020/inputs/day_6.txt
new file mode 100644
index 0000000..ae67ede
--- /dev/null
+++ b/2020/inputs/day_6.txt
@@ -0,0 +1,2199 @@
+nvlyak
+nyvha
+yaen
+qynia
+
+kend
+endk
+
+atxcykpvmb
+pcvmthyxbak
+ayvpcbtkxm
+cvpkyabtmx
+typbmvckxa
+
+s
+s
+s
+s
+
+on
+aoqc
+owq
+coa
+
+pw
+wpi
+pwxlhqor
+pw
+
+nx
+xn
+
+dlevrzpucfmsq
+pceimlrfsquvd
+dpceruqsfmlv
+hgxudfpqyvbcslrjname
+
+kczmswvorg
+uryvlqaogmdixs
+rmostvg
+gsrmovb
+
+ref
+fer
+
+vmwdhgnlfiyoepsujbk
+epudykjwhignmfbovsl
+fjvuimnwbkogsldhpey
+ibmhuscpgeolfkynvdwj
+psjgubfvlhaknodeiywm
+
+fmnpljusix
+vqrefngyjdahclk
+lfjons
+
+y
+uiwl
+
+lsuqkmjinrzhgevfpwto
+gkmodihnsjtful
+ciguflhkojmtsn
+thkjnoufsimgl
+oskgmdfljntuhi
+
+gaktdwxhmqvfrpsuc
+hmtwkgipdvaurxqf
+akrmpxtughdqwfbv
+gumqniswhrdkvftaxp
+hagouqxpzrjlmedftywkv
+
+zkbyecw
+kczeybw
+wbeyakuzc
+
+iwdkjlarzfynvechgbxsq
+jetfxrzdbcksnavilmwgyh
+wvexlryjbizfgkhanqdcs
+
+vk
+kv
+kv
+vk
+
+yrguw
+rguyw
+pwuryg
+gnuwry
+
+dyhkusanvjwc
+ukaywncj
+uyqjknwac
+aknyjcuw
+jnukwaytxc
+
+toczmkldrevywiajgn
+jyldmgewcvrozinkat
+iynkmatdjerlogzwvc
+
+pthyrfjgqelxa
+qfejxtrynlh
+xwdfkuziyhejtqovrmlc
+
+osjrgc
+vohfpa
+goc
+gjo
+
+j
+jon
+j
+xdj
+
+bpqhmgwzakfrtjvuno
+eafupgombqnwrkzth
+frwqtdngpbhuaklzmo
+wgtnuchpkqibfzmravso
+mfbtvkghauzopnrwq
+
+xiocgdwpastbmyj
+rdzgcbtfaomsy
+dstgbcymozkqal
+
+xvc
+cvx
+xvc
+xvc
+
+dhvtlqkeniymjzoa
+eoazjnhvtkyqdlm
+koltmeyqjhzdva
+doumkhrlyzjqeagtcv
+
+mn
+mfhw
+
+kx
+x
+jm
+
+x
+xv
+
+tdhyubvwqfxejslpringc
+xqhvtbfwrygsdapjiulnec
+vnwbsurdiexghpjtlycqf
+
+pqtdgsmkolzryca
+qjguxdratfeclpmoy
+
+twnviyzmlk
+gknjmyqvziwl
+
+deoabzihqvycxn
+iqcxadpehvry
+
+dbflcxvnapwgei
+pchmodnafl
+hadcflpn
+dlcfanp
+
+tk
+kt
+
+peuroxtzyg
+iwdcnlqfskmbavjh
+
+mjfh
+ynkbrsdpwoqtagci
+lvx
+ujxez
+xl
+
+gyuszwb
+sioduawzrglb
+tsbumxwzg
+zwgeuxbs
+
+tujvkwpy
+tyvrpmjfk
+vwpkuyjt
+
+wdkqailvjmfcshugy
+qugwvlxdsikhfmyjac
+dkiscawvyfqhmjlug
+
+noblsu
+snloub
+sulobn
+lonubsm
+
+osecqjbfg
+fljbmiose
+ojesfbt
+
+zmctviabre
+ajzmicetrvb
+ctmivabzre
+yrztbmieavc
+mivcbtazer
+
+tyql
+osmjgxzrcakn
+iwftdbl
+
+nmqflphkvyjcatgbzd
+jxzemtvdknwqr
+
+ilxrytkdpmsevfjchozqw
+tpdrjxwihvlycozemsfkq
+hitwfmzvjpylcodbqxsrke
+
+flhp
+pflh
+
+ao
+a
+o
+o
+gljzn
+
+ajmkvwqu
+ogvjzwta
+whalvuj
+
+mhktpynfrjgblaqueox
+anmjxplvibukhztqersy
+tabljcpemkyrxhunwq
+
+lnkvfawqo
+nofpsqwavylz
+vofwalqen
+hcnowiaqlfv
+
+dofxbaqrtnyvkpljmhsu
+uklstfynmbxhapojqi
+tufmnpaqyojsklxhb
+oanlusqmxftkpjbhy
+
+tpjle
+the
+vtpez
+ytern
+ouecxwfkt
+
+jbna
+xepqbmufn
+ybjni
+
+jklhaxoqysbt
+tzwpcf
+tenfcvdmpzu
+
+kyqumgfrdiapzwojtvch
+fvczqjrgadiwhnpluomk
+dpwkmrjzauiqvfgcho
+nkpwrmzidfahcvjuogq
+azrkxioghpvcudmwqfj
+
+udjshwgpeaozimcl
+fylwnoevcza
+evlakborcfwz
+
+xhued
+iubgewo
+
+lywovcemagd
+ahveyomxsl
+oqzyfljavbe
+
+pkyn
+befycqpi
+pysk
+yp
+
+mgi
+mgi
+digm
+gmi
+
+cgdqeoyfjranxuv
+lwnkzeptsdqihvcujmg
+
+wzqrhgibdxuyl
+ludbwqxgiyr
+yruxibwdgql
+bgtwqxruylid
+buyrwlidgxq
+
+gqwvxspbl
+xvbwpsgql
+bspgxwvql
+cwlxsvqgpb
+sgpxqblwv
+
+camqk
+onaslperix
+jauw
+yatm
+
+z
+z
+z
+z
+z
+
+fx
+fxe
+
+goemcr
+roegm
+sgmxiero
+ogmert
+germo
+
+czgdxtiprhnwqeujkfl
+dyhmkanzwbv
+
+n
+e
+
+dkcjqbw
+o
+gp
+h
+
+zbwcu
+ubf
+mveurnab
+
+tqwbxuc
+qcwutxb
+ucbxwqt
+xqwutbc
+xqtuwcba
+
+uwhqrt
+wrtq
+trwq
+crtqw
+wrtqc
+
+rqfntm
+nrqm
+rqmn
+
+limsht
+alstikh
+ilhst
+uhitls
+lsahti
+
+oaex
+vsgyo
+lziu
+
+cwqdlxbst
+cdxtlwbsq
+
+hgqc
+hgdq
+qhg
+
+eh
+he
+eh
+
+zfutalwkxms
+ukxltsfzmwa
+
+zpklocsqgwyhb
+zobyqhlcksgpw
+zhspqwovjylkgbc
+
+ymkudfqethwgji
+emtuyfwghjdqki
+zwyeumktfhjdirgq
+wymqgifkudjteh
+
+edhqnrxtpz
+tqdxznrhep
+qzepndrthx
+exzrhnqptds
+zetyhrpdqunx
+
+vmleax
+valxum
+vpmlax
+axlpvumz
+clvamxbn
+
+ebt
+xr
+rl
+u
+
+vzny
+nz
+nz
+
+ywebzj
+ywefjzb
+bxwnjcyzkep
+zjeywfpb
+yldrbhsizajewvu
+
+hfd
+dmf
+fadh
+dvmf
+fcousnld
+
+egar
+hwnrgzcp
+bgofedjr
+jkruvsylg
+rdvgue
+
+jsge
+hesqg
+esug
+
+xaoz
+ocuqev
+fwgrlp
+otxv
+
+fzemjdhwb
+xhdmjzbe
+
+ytsfpumedxqvzhl
+fdteschymvxqlpz
+phyrfwtqlaxgvznesd
+hvlextsbqpzyfd
+jydlhetzoqfpsvix
+
+jxkrobp
+rsplxbgk
+yxmbpkorhj
+
+injbuyktrcs
+bcsriktuny
+skyrhbtnucxe
+
+duck
+cykuv
+osfcurnlwax
+uvmc
+
+vpt
+tpv
+pvt
+vpt
+vtp
+
+dacxvsi
+icaxsd
+xdihcneas
+
+nf
+nkf
+fn
+
+yrewaxckd
+wtydesfcr
+erdftwqyc
+
+hmfezapkqjyri
+ekqajhyzfpmri
+raikjeqmhfypz
+qjmyrekfzphai
+frtjeqkimhazpys
+
+ryxmsbqovuidphfwecajnz
+hdjmiqbxnpvouyfcewsazr
+vubyrcmqeswafxjzhinpdo
+cbjmnaoqurlhsifvwzdexyp
+
+iu
+ui
+isutlr
+iu
+iu
+
+lftaziorb
+rvamfeyjgqnx
+frtak
+aifr
+aftzr
+
+us
+schk
+
+bjafywgieth
+tifbhyjgwade
+imhwefbgatjy
+wgtyifejbah
+
+a
+yj
+b
+iab
+
+qkgazumerlhb
+syritxopfvd
+
+gdiakrne
+ygdpcwqfbmikzanver
+dolarkigen
+gtkanierdh
+
+axv
+axdvl
+
+erpjfh
+prgjfeh
+hrejpf
+pejfhr
+ejrhfp
+
+zijsrtcqdxmy
+mtxdfyji
+timydgxj
+jtmhvakxidyn
+iyjmwdvxnt
+
+rh
+har
+
+tdoyugpljirwenzx
+nurlzgjtyopide
+jnrlitgpzdoyue
+zlptnudjryogie
+pzgyeoliturnjd
+
+ivcyexsotkzqmr
+sgfjhqnpy
+
+omw
+joq
+mop
+
+welbhpzftgjinqyk
+gwpdjqacitshlbykfzmrx
+
+sygqwn
+fwyqsdg
+scgwqy
+
+gdjzwbhltxs
+dlkojzbq
+jfavyipcembun
+
+cydkuqlhan
+uavstnychbqxk
+azqntcuyhk
+
+k
+bf
+z
+w
+
+gyh
+e
+
+rhmpg
+pmhgr
+rpmhg
+
+pas
+vhtsaqfgnu
+kpjsa
+sab
+jcopska
+
+tsjabirpehudncx
+custniapedhxrb
+cepnuastxhdirb
+shbpetcdaxuinr
+dbtiepaucrshnx
+
+tuswfrqpgxk
+kprjsdtqxunf
+pxwfrtuqske
+xwskmfprqut
+pfrtxqskhu
+
+szirxjtu
+zuxjtsi
+jutsxiz
+usjitxz
+ijstxuz
+
+zqesxfbmrivokl
+mevkzirbfol
+fbkomeyvilrz
+
+rlwoeckxnh
+xebkornwcl
+xcoknwler
+wnlkrcoex
+kecronwxl
+
+fmdbraihnpxytkcgezu
+kbeyxmadczhritnpuf
+pnhfmubicxteadrzyk
+updrybtmhzefcnxkia
+kbezfjwmhytnixacudpr
+
+w
+w
+w
+w
+
+fgwdoctvpzymhbrkjxn
+yaqjctxvsrozmwk
+xkwozitrvmeqjcyl
+cwkazxtrmlijyov
+
+vnym
+bvmy
+yvm
+byvm
+vym
+
+mxjblongrfahycqvpu
+ncywhdpxefajbrgloqu
+
+sgukdmfqvbwcei
+zigahlxojdnpc
+
+fudobaklngyjqpstmiz
+psflydzmbtkiqaojgnu
+itgzqsfdyabnolpjkum
+sitlkyuqnjodzmpbagf
+ytdijopqublaksmngzf
+
+vhaobfn
+ohbnfav
+vahofbn
+naovhfb
+
+tfhsqwcbrv
+iqrbzspnwyhtfc
+
+pfbwotesuyhkvgx
+vnrlcxayzdmih
+
+nbyhpfklvtqo
+qbtjopfyk
+qpoeybfkt
+
+uvmgzs
+pvsmizrug
+ghvmszu
+mugszcv
+kusmvzg
+
+mua
+amu
+uma
+mua
+
+d
+m
+
+s
+s
+yuk
+s
+
+gtjqp
+pfotsh
+pshgbt
+wpeztyr
+bqjtplo
+
+zwbvestiaoljy
+gmnzshupfqre
+
+anvsdkbltiugc
+tqsdcanuibgvkl
+stkrvabegidclxun
+takcsgnuvmdibl
+cvqsklngiubadt
+
+txvfnuwcljpqkeryoamigd
+jgarvmodftpniekquxszcyhb
+
+htu
+hegb
+whf
+
+jn
+nj
+jn
+
+vcjlxekmqzoduphynw
+hkyeojlvndumcwzx
+ozhdnvjeckwlmuxy
+ujxdyznvlcmokhew
+vdywzekucjnhoxlm
+
+blxuhyvjrzow
+uzlwokmsripy
+
+rum
+mrl
+rbwfmz
+durmq
+
+obcpqvkitduelwf
+ahcrwiltpuedfobxkv
+cvijgzoukptwdfble
+kpqjduetilovfcbw
+
+irfqsp
+wifas
+
+xvgyrpq
+yrpqvhgzx
+fspxmrivkwgycnequ
+axhyqrpvgz
+xdygqvrpa
+
+xrlmcsibvea
+bdcveasxzip
+esvbclaxi
+vaxsbcei
+xaeibsvc
+
+songrtmwhpydqizlf
+halvzroefxcsubt
+
+uqozritygam
+kmtryqvz
+qfmjstkyrz
+
+rqtepcofhuylnxaj
+xoptqwruhijsmnzcylfe
+hxqcpyfjntleuro
+brjyuoetfxpndlvcqh
+
+prltixwohdmfjukgqzsv
+orluxtzpvjafdqwkhsgbe
+
+iyhuarewvbfjmlz
+vramijyfzhbew
+zyehbmwvifjra
+vjmweybazihrf
+
+duixtbqyhomsla
+suinmaxtlqdoyhb
+htiquxmaybosld
+
+pselyhov
+zhwpovekt
+snheopv
+ivxophe
+nhpoeuv
+
+amqcriebkojlwyuxnhfdptgzvs
+uovdszkygbjhanefqxplimtwcr
+
+ozngukih
+nvksbd
+
+grkotivmcxnyubwleqspjzhfad
+ekmqxnfabwiduopjsgclzvyhtr
+
+jzv
+wzxfivmjb
+zjvp
+zjv
+jzvs
+
+js
+evqis
+qxs
+swyct
+s
+
+n
+n
+zn
+
+udjtxws
+usdwixj
+
+lf
+l
+
+cdsaxzlv
+jcsxlnydtrzvk
+lvdqamzsxhc
+udlxwczvgs
+
+gutwbrhjxyeam
+jrleawgbsnxthimyu
+rbjexdythumwag
+hrwjmoexytqaubg
+uwymabxrhjqgdect
+
+vipjrlbsmcogxznty
+vetpngyzsbmoxcrijl
+hoxvbsnjlfygmrczpti
+pmlgzyasvxticjbrknod
+
+xzakbvtehnlciswmyufjdrgo
+kocmslwbgvuxijernzydfhat
+vcdxgkslnzoarmjwutyiefbh
+tzhugvbcnokyxsfliwardmej
+
+up
+u
+pu
+fu
+
+cbzjelmqivw
+ickezvjlqm
+
+srwnt
+nwrtj
+rswnt
+
+hfjxoskd
+dlpzeyjai
+
+mt
+tm
+mt
+mt
+tm
+
+rpxenfzmhwdvacbygiujkqot
+lhbvkwmpfyazrtojcquxind
+qtcjdairznhuwxmpsvyfkob
+
+apvk
+qvapk
+
+ujscpqtgbyezdfhnwoil
+bftognyujilpwhsqzdce
+zbhslwipdjeqntcfouyg
+tyuqdlfepgzshcoiwnbj
+dzqxjblenucpwshtoiyfg
+
+cdxtsaunbwkezlrp
+vbdpsuktlxczerwan
+pnxudwaclrtebksz
+
+tq
+t
+zt
+t
+jtqg
+
+fvmhiloanbgjzptryucdkxw
+jzhwtkbdpoxfacirngluyvm
+pwnybcjmgxurfzivoklhdta
+brtavopdklnhxwgzmifyjcu
+ncifvypdtgwxbzakhjrmulo
+
+kwhiguft
+uxyo
+ux
+
+ruyoe
+ezqhbi
+clndewsfta
+e
+qrke
+
+doa
+doa
+doa
+
+xt
+tx
+xt
+xt
+xt
+
+roxwktbmgiyc
+qtbejyxzlpcaighfod
+oscgtuyiwvrbkxn
+
+agcdevxkmbnzqjl
+jrdzmnclbgkvexqwa
+
+pqjtyenfmxdaorw
+qayjpxmfdterwon
+frdtlawxmjnoeqpy
+
+aze
+zea
+veaz
+yzxdequoa
+
+eq
+uetqs
+
+jsmezrk
+zskmer
+zmkers
+krezsm
+
+mfzqsukgcw
+cmskguzfqw
+gksucwfmqz
+uwqsgfzmck
+wfzucmgsqk
+
+wftx
+fwtd
+twf
+
+bizwg
+gzwosd
+afzqrwun
+cjpzwb
+
+qjntchmdbgpe
+nqtephjgmdbc
+qjeltdcphgbmn
+nqtbcjhepmdg
+
+g
+g
+gr
+g
+g
+
+yulnpwc
+uplcwn
+nplemufywc
+calkisogupw
+
+sigh
+igsh
+ghski
+
+naqpd
+xydrsjwlibzm
+qdevh
+cd
+
+mraejinsdp
+mierdjansp
+qpsmrianjde
+npirjedams
+ridpaejmns
+
+o
+o
+o
+o
+
+lhfqsxm
+xlmsqfh
+slfqmxh
+
+jhivsoabqlfpeuw
+fvxrelbhuncowqjtsz
+
+yajhetclfk
+jnqbylmpwgxcf
+azchyrsivjeltdf
+
+n
+n
+n
+n
+n
+
+hkuaq
+hkqua
+uakqh
+khqtalu
+ahxkuqy
+
+tguprf
+pfu
+ufp
+uofp
+
+lnmtjo
+njolmt
+
+qymzdw
+vjckmtl
+oipreghfausnxb
+
+niswjectqkldzyg
+wunjdetklisczyqg
+gldcysiqznjtekw
+iqwdczjsytkleng
+lgyiezdncjqktws
+
+dntm
+atm
+tma
+tm
+txm
+
+ntpcwask
+skcna
+nksac
+
+prai
+pria
+arpi
+irpa
+
+mzldgbrtovj
+tbjgldozmvr
+ogzvdlrjtbm
+
+ft
+fq
+
+jgstdlzarcemiopynukfw
+ywlhakgzeoxdnjmsirc
+moicgebadzlwkysrnxj
+
+jpeiqxbz
+xipjebzt
+
+rnpf
+fqhu
+agprm
+wedyzci
+bxur
+
+aynswjoklfeqzcitxudbrvh
+ihrbxwvdqsyoejpnfkzc
+
+hrqliwxtfbk
+qiwfrxbtkhl
+kihqxrftlwb
+wrhlxbtqkif
+tfbqriwlkhx
+
+bwdhnqk
+wbhkqtd
+qwbkhdx
+
+fpcboialrdgqkejntyzm
+lmieayocqpkznbrtdfgj
+mbtdrpozfljkeyangiqc
+pmdjlerfkybgnaoqzitc
+pganmcfbtedkrzloyqij
+
+zfrvn
+zfnr
+znrf
+
+nuq
+ltiuacgjs
+aug
+
+xj
+lyzixn
+eaxwuf
+
+aeywqjkl
+eanklwju
+kjelzaw
+ealjwtk
+azklwej
+
+ncqxulrmfvedao
+eodqxlvmrncu
+elrmnuqpcdoxv
+qloxudmvnecahr
+lcdxqwmurvznjeo
+
+aijnhvxemsqztfk
+xnvkehsiqmzft
+tehvxnfskiwqzm
+epsmzhixqvtnkfr
+htkinzvqefxmrs
+
+wgfzomlbhujxs
+ezvrxmkycafwob
+
+lhyrq
+ylfherq
+hlreyq
+wqlyerh
+hgsqlyru
+
+acnkurdevm
+duernacvm
+nteaducorvs
+
+hxvqtsjzgn
+iakeoyr
+
+id
+i
+di
+hkxi
+
+fqunm
+funxikw
+xfiuknz
+
+wvgpqlzxnui
+livzmwyqgpnu
+
+eanbkcjlxpsm
+ofmdwrqe
+
+w
+ws
+wr
+w
+w
+
+aylsbi
+lyaiqsgb
+vyeblmasuhi
+yblsia
+ylbsiaq
+
+fpbhozqdljytwcnxsvr
+zarwdgqhtvyxcnpbsofji
+dbzhsfwrvqnyjxtpoc
+qwxpbnycrfjsozvhtd
+tsoypwnmzfjhbvdxcqr
+
+bezfskqut
+egbpkdflqtmouzs
+kxzenfustqb
+tsebufkzq
+
+hoekryzuqt
+oreuqhyktz
+teorhukzqy
+kyqehortuz
+
+d
+uqwgitdaj
+dz
+vod
+fvd
+
+smjqnlt
+jsqmlnt
+ntsqlmj
+jqntslm
+
+saxdlkjwvyctqenrio
+wqnvsoyaextcilkrjd
+krdqwevyliojxcntas
+ywlnkcafdoirsvjxetq
+
+ryae
+yaq
+ya
+ya
+ya
+
+epvy
+nvyqu
+vnxy
+oyvh
+
+kschegfmla
+lgfmscaehk
+gshfalcemk
+lcgemshkfa
+mkgaselhctf
+
+bfxqtegnoismrk
+mnuivtxasgbjqyfkp
+mkxgrnltfiqbhsw
+
+s
+s
+s
+
+zoe
+eoz
+oze
+eoz
+
+q
+kuprd
+gvmbn
+vctx
+oi
+
+nbrjveycdlw
+jyhfcwnglerv
+
+vkoxqwfhubrcsnme
+bqkexhovswmntfrc
+
+aidoznexygkjlqs
+neysaiudmoqklgxzc
+
+ypsn
+eyp
+yp
+iyp
+
+gol
+olg
+
+rypjohwvxkisnldatuzfb
+btpxvolknwdhuryiafjsz
+vkahgbsitwdoyjplfruznx
+
+mipqtk
+nikqpvu
+
+kztifpne
+yzit
+rigtz
+zait
+
+jxgvt
+gfjoky
+kvygh
+dmwgqsrcp
+ounalgyze
+
+nypvuiseqtjwxchlbfogdamzr
+apqnbzhwmjldotfsvexruicyg
+bpyjzomwahcrgsutlefxkqdivn
+
+qumcbsvlpthfwyda
+hagwiucnvfdypqlzs
+
+tog
+otg
+gfto
+gto
+
+ctp
+uda
+
+vlbi
+swmiujf
+
+xbi
+upsdbi
+bizr
+
+ltw
+we
+wzavnymh
+iw
+wfe
+
+caqjdphelmtvyfbxo
+acxmtljedhoqbsfyp
+
+fyqthpe
+bmrceljqy
+eyqt
+
+frjdhuyqsgon
+krouhsfgydnj
+
+ltopekjnacgbms
+elngjotmpsca
+splcgnatmoej
+egjctspmlaon
+jtealcmpongs
+
+fvsmiotkb
+fbnupmcsxd
+fmkvjysb
+qbksmywrtf
+
+mklqnp
+mqnlk
+mwqnlke
+
+jykqrlaocvunfpix
+rcymsnwuafdtvgbqoieh
+
+c
+c
+ct
+c
+
+mlv
+lyfpq
+vsli
+vrdwl
+
+srtaq
+nuptlr
+
+hcfjdaqwo
+qmoefalzdh
+
+zxyksijbeahgvc
+xgvjhsczeyikba
+yxickjesbhgavz
+sjvgibeczxhkay
+hvgizjmaxsybcke
+
+wjmypxi
+jipmx
+pjmix
+bjivamxp
+
+dytnalmqkbpruef
+qplfuynbdaertm
+rbnetqdupamlwyf
+
+e
+e
+m
+p
+e
+
+b
+eb
+b
+b
+b
+
+yieovwqukxcnbfjpdg
+qjvunkgywpfoidbxec
+jupowqfbiknvdgeycx
+dqeicgjfpxonbukwvy
+gociquxvjbfdwnpkye
+
+lwrch
+huosc
+
+somiywgdbf
+fbmvdwgzsy
+ufrltkydsnwm
+
+epvfduyh
+vfpeyuhd
+epdchvyuf
+udeohyvpf
+evhpyufd
+
+b
+b
+
+szfgmlxwd
+eapoqydvi
+
+puedtjkqbwfznhvycxrolamsgi
+cvqeyszrwdfnkutjihxmlapbgo
+nfdpoukvizgctxwmeaqjrhlbys
+
+nuf
+je
+uieq
+ctodh
+sbx
+
+psrwqlgd
+lrwdqgpzs
+
+qheijmngzsrdawbvucolxpy
+vhqnlcouibjdarzxpmeygs
+edlixjhrquamovnpbsgycz
+
+jkphyr
+urycxn
+
+snbcyoe
+nuewpy
+
+gbnsoirkwyhp
+iogsqbkymwp
+fzbwkeyutdxp
+
+w
+w
+w
+
+jsbp
+bjsp
+jspb
+
+jfbdpv
+pfjvb
+
+wfhvsjloznb
+gmupxcnrakelfsvzqd
+
+dbsuoriacgnwxtzveyhqfkmp
+adwcifzvsgnkphyburtexomq
+wzbkmsdpfrhiaqxyecuonvgt
+athzyrgbwckvomqudsnexfip
+vidbhyqesancrzugkxfopwmt
+
+nl
+ln
+nl
+osnl
+
+iewcxgqtf
+gtwmfieqc
+icfvqwyhadgkn
+qcgwerfli
+
+wyj
+jy
+atycnje
+qyjg
+yzjsg
+
+ivjwfeuz
+jvcw
+mbhvwj
+rswvhjd
+
+zmjlpeia
+eimrlpzaj
+jmealyqpi
+
+zgkf
+gkz
+
+zuosdlvkxm
+tlxskcvpumo
+kuyomrxlvs
+uvosxmldyk
+
+yuilcqhgmazts
+swhvdcigltmakzuy
+stojxiflyghnazcpum
+gkhqtyciuwszmal
+
+nzhlyu
+hngc
+ngcah
+anch
+nvkhj
+
+xhfvwbkn
+nahwxfo
+fhgnwx
+dmfuxnht
+
+vbhpedluncftoxys
+cydfsolpejhbntux
+
+vkilx
+pvxskd
+
+hvwuecgs
+guvwcsh
+sgrwculmvhb
+wcpznuqsvghi
+vhwcsulg
+
+ndfapjlztc
+npoacfjtld
+
+jzd
+xaulvyksp
+zeh
+
+ck
+ck
+ck
+kc
+
+kiroh
+rh
+
+euxdrkvtfbqon
+ytfvurxwheokqn
+
+sirznatbxkghm
+skaiqzrmhnx
+ztgmhrsikanx
+hksxmairnez
+ywdiracnfsuzhjxmpk
+
+bacgwvmxrdfne
+pdcofwbza
+cfqdwuptzabo
+
+dqmp
+dqpm
+qvmpd
+
+kczxnlerm
+vqrzjmf
+
+qmuorwspx
+dywcxarilegkh
+
+gqzph
+qhapozk
+zhqp
+
+fastkjnl
+jsnafkt
+jfnacskt
+
+fxgpiadjrvhs
+smfwbejadh
+hjmfyaods
+fzdqsjham
+hlcbyfjkaunsdt
+
+dqlevpahscoyi
+iypldavhsqoce
+clhvyaisoepdq
+eayqiosdlpvch
+epodliqvhcsay
+
+nhxbmlqv
+qylkhmnxvbj
+xbnlvqmh
+vxmbhqln
+lbvhxsqmn
+
+exrtdq
+tderq
+djretq
+
+lwqj
+jmwlr
+zbswtx
+
+pxi
+ipx
+ixp
+xip
+
+vgfscwrqzdojxhe
+xfvqhzsjecgownd
+qdopyzjwegfsxchv
+gosqeckhvzdjfxw
+gszxpfveocjhqmdw
+
+gvlyuiscaewfpx
+gfwjtapuoynvqzi
+
+ycsdnbzjoki
+wfpvogmqhautlx
+
+tbjliqdfzgny
+zjwilpghqdyekc
+
+yftcnao
+ncfytaio
+conyfta
+
+yslactbwhjfvnomiue
+mbyiavojlwtunces
+eontumvircsalbjwy
+jguvcxylitsbmwenazo
+bayolijwqcevpmsktdun
+
+ynmki
+ykinm
+inymk
+iykmn
+yimnk
+
+vzjnpybg
+vjqfyno
+rnvity
+
+ilxkjhcfpdmeb
+hwdjleirc
+aiulechdj
+dljiwehc
+
+rptom
+ife
+nuli
+yized
+
+loe
+eg
+
+fprtvcgkwnasljebhm
+nvbltrckumfhpgjew
+grpuefzknmblovjw
+bjwgykpinqlemrd
+mrlegnjwbkp
+
+xtquyrjnszl
+ysrqzj
+zsqyjpr
+
+ft
+fjt
+ft
+tf
+
+ejli
+l
+l
+rl
+
+lwgrihbdvno
+ydbrvhgolniw
+rivdongwhlb
+ndhbrgwilov
+dwvrnlhbgio
+
+fc
+fc
+cqfo
+fc
+fc
+
+nhaoi
+nioha
+osijah
+
+hgrec
+gchre
+cehrg
+
+higmvfbtjre
+ikhxjbrefvq
+brjiefhvl
+ivfeqblhrj
+hrkifjvbe
+
+vsgqmibordtznkl
+dehupjlcxtsrnfawy
+
+t
+crfi
+
+nrai
+hjcmpzla
+dveria
+
+krp
+achvofx
+kbp
+
+vfdzhuskanm
+lhucb
+uh
+
+qu
+uqj
+quh
+qu
+
+tokmzyuxjsbvic
+zegday
+
+wqfxlhyapcdtv
+vctalwmjdpqyfh
+
+nqge
+vneiqt
+hqvfenwj
+nksqcrlmde
+vqgbone
+
+f
+w
+w
+f
+oq
+
+qziwcdjyepvhn
+wvypijednqzc
+
+uwjflbhoq
+dwxublig
+
+c
+lc
+ec
+c
+txcjrkd
+
+cglvpyadf
+rqfvgaplc
+kgpatsxuelvh
+oapgvliwc
+
+ln
+st
+bs
+
+sfra
+dskrnf
+mzhjrfpx
+
+phu
+uph
+uph
+hpu
+phu
+
+pcxhvbf
+hxbtyk
+
+jdzsaiwbphmftqxrlngcyoe
+mqbrsplojgyheznxcdtfwia
+pitajxzhsonwygrfblecmqd
+nyliauzgfbcprewhdtjmsxoq
+taxnylhvgjqewcksfpmzdbior
+
+h
+c
+om
+
+ruplsfnhyjqigwkzexbtoc
+newjivhyckdagob
+ywocjmnkbghie
+
+jdrtpbvohaxy
+dnjxyrfsv
+
+lq
+nsulxvmhj
+l
+lk
+
+fdsxhvqaiblt
+fihykrdlsoaqx
+laqgpznecjiuxfsdhmw
+
+capkzueqjmdv
+ckdvymqazu
+fklcmdbuxqarzv
+zkcsvmqhiadgeu
+jotqkuzndvciwam
+
+lzqbrgkp
+grvpntoz
+ozwvpg
+suefagcp
+pkjygd
+
+zbangyoqjlkdevrxti
+gzniebarjloykqtdxv
+
+xviqehycstgjladuoznfwp
+odwplyiqnxghutezcvsj
+ersxgqtcjouvdiznlyhwp
+cpshuoijtxvelqynwmdgz
+
+tnzkdmgqci
+mqkzgydtijn
+mtikzqdng
+
+d
+ad
+d
+
+k
+iof
+
+otkvualrqdsixf
+nkhwid
+dbkiwpj
+ikd
+ekziydgm
+
+wjvgqsxinfburh
+wxgqsurjvflnhbi
+
+hebmgftkpcq
+owektbpfhqcmg
+egtfbpckhmdq
+qmcetgpfkhb
+
+exukswmlgznjoqhvabid
+dkgmeoahtxpzflnwru
+
+lf
+fl
+lf
+fle
+
+zblhfjqpr
+rzp
+uprzo
+
+wmktipjq
+twmikp
+jmtwikyp
+azcempwtkiv
+itkmpw
+
+qwodjmelanykpxuh
+weqnajoxmupklyihd
+pjodermlyuknwxhqa
+mqbaoxylgdshtnjpwuvkfe
+lnaxijmwqhukodpye
+
+azxw
+xazw
+zwax
+wafqztx
+zaxw
+
+ydzmvpskfjiqneluabgtrw
+vyfdpqrkbistwlaxzjum
+ukortizjvdwhlpafycmqsb
+
+cno
+y
+no
+y
+bqe
+
+zlcotxyhfeij
+xtlvhifkszoj
+
+kczqegopj
+qupzjod
+
+hpclqaktjmbnyxw
+iqphxcamk
+
+rebc
+qcbra
+brc
+crb
+
+flkoiavp
+aduhjeqtyrmzkn
+cslwgfaokp
+
+qmnzcjb
+bmeqzjsc
+jxochgfbmwzvq
+zqcbmja
+
+deyifvsxw
+evdyw
+edbhzyuqv
+
+xmhknbcwdaztvl
+mruslxozyangpj
+xgszalnm
+aoqmleunizxs
+
+eh
+he
+eh
+nxeh
+eh
+
+cjbx
+jxsub
+
+yusezdlpgxtm
+dyrkmstuegpx
+pdxmyeutvkjsrhgaw
+
+ruz
+rzu
+zur
+zru
+
+wgbdctzlsmh
+peglstyhcd
+adtqlhcgvs
+tylndgrcujhsbx
+odltpshecg
+
+ylntchparijwfo
+wtrjpiaohylcf
+wlfyvrehcutapgko
+
+tkbpfhjzravmquxewgl
+goxphazbfvrqkijlwtm
+mkrbzqphvawtyjfxilg
+plhcnwgqmrxfvdzabjkt
+
+pfhtlqawckegij
+wjpaksdctfghlo
+
+jqctpgrvu
+qkvgjuprtc
+vutcqpgrj
+gpruvjtcq
+gvqprujct
+
+dkevisf
+kfei
+mlukicwfje
+
+nsoyjcwzife
+spnocteji
+
+cfuzsbtvdkq
+rcasmqzkpdxuo
+drxzwqckus
+zqsrndeukxic
+
+vkgpbz
+zkpvg
+zkvpg
+
+eqhpyasvnumzgclitofjw
+ofsgpaijzqmtvcuwhlbe
+ujiewctamfxqdghslpvzo
+qivnwtlfcmpgaeouhjzs
+
+lfahbowz
+ryxcwtvs
+mytucdivw
+
+lqetdskgyznojharxvufpwimbc
+kpcoqugdvxibftjmywzslnreh
+mxjgcinhobeldrwfukyvptqsz
+
+jxhc
+fjsqglzwhu
+mhcj
+hecj
+
+ihdsbckn
+
+siponk
+sikonp
+psinkfo
+
+qbvdrutoan
+qbcftunvoi
+qvkoxzbtushny
+qtwojubnv
+
+eu
+u
+xtujdms
+ehu
+
+jkqdoner
+eyxnkuaoqfg
+kqenxmyo
+
+wk
+wk
+ykw
+kw
+kw
+
+gvrebwq
+erkflnbjhagv
+givrybues
+itpvegsrbz
+
+hlykfbqnexots
+tqhgfonkzeyxsbl
+qkcybxtsnloefh
+fxalqkntsuobyech
+hvyjefkbitrqoplwxns
+
+paxu
+parnkxu
+pxua
+xupa
+uxpa
+
+ytzjokcqlmviha
+sykbmizchvq
+aocvizymhkq
+ivhkcqlzym
+iayelkzqmtchv
+
+aekxzstuc
+czetkxsau
+zqpakexsuct
+zuxtacske
+kuszetcax
+
+czlkiprvydnmsoxqwajgb
+byszdijkplawcvnm
+ikmwandcjzlvybsp
+nbvwlikjscdmpzay
+
+fpuxqtigly
+hpuqkfxigyt
+tifpygqkux
+uygqftwpxi
+
+gvdwnrefpj
+nwgapvedr
+egdvwnrp
+xshwezgipdvr
+
+joefgnu
+tknuhvfy
+
+rjo
+rpjyos
+rjo
+roj
+jro
+
+zxvatmfbujgryinokwehsc
+xjzdusehibgtvncmkflyao
+
+fpnkyo
+nopfky
+kpnyof
+ponkfy
+tnpfoyk
+
+mevhflgowbkqdjutrzys
+qrgmkeohvstnbwfdjluy
+
+pejhrgwtmcny
+hjangqtbprsmwe
+umiegvdprwtznhj
+nhgptresjwlm
+
+ohgmls
+othljm
+jmhtlso
+mhxlcnp
+
+dtufxjrbq
+rdfjxtqbu
+qjtdufbrx
+
+iexvaok
+kexu
+xkje
+xkfe
+
+dpursykgo
+ugkrsqpody
+sokpgyrdnu
+kwsuoyrpdg
+sovjiydkagmuptbrhcf
+
+mwxcqs
+mcwxqs
+mwxqsc
+tcswmxq
+
+cqatfowbvmirly
+woibncaylqgvsf
+
+bico
+izdt
+tiz
+
+af
+fkq
+f
+fyb
+f
+
+wxftpjclsrhm
+sdzuvanek
+
+jr
+rjp
+rj
+
+zhpknlosiadcfbjweuqvy
+ulbkhapqzisefdyonjc
+
+oivjy
+djvwbofy
+kvlqyxrj
+bsivdyjf
+
+kifcamqwgy
+amfkgicyq
+miygkcafq
+
+egslifrtvcnhk
+vymgiprjzcxasbqn
+
+gji
+g
+oar
+jgk
+
+gxtkohsqcvmrjzie
+jfghvuxokznqwsdmarcl
+
+xvlnpjdar
+vldnopxaj
+dtnpsayjvlc
+dgjvalnmp
+mfnvjdpal
+
+mnaxd
+xmda
+kdaxm
+
+szpeac
+ezpsac
+aesxpcz
+
+vgpldyruqmfbsehzkxjwa
+wrxmvtqgyjsdazlkbofeuhc
+ablmzyevqgswfnxkdrphuj
+
+aoedxnzjqsbyihtpkcfuwl
+dsbeyathwxjupozlqncikf
+
+mwzkrnhp
+okqj
+
+s
+s
+
+erjyvcwhuitdaogsnfb
+dculesyjotbwhavfirn
+swfbohtjdciaurenyv
+ubsvfamrjoynwchitdke
+
+yb
+yb
+by
+
+pbrhzvjcsgeylfxt
+sjcyezvxfgbhtplr
+
+rphvaxw
+zhjapvrxw
+xahvwspr
+lpdqrvwahmx
+
+rpmild
+vlrpswnb
+ylrezfpi
+pbraslm
+utxgqhpjkorl
+
+pizbmcxreftywhdq
+pqyezcxtidgmhfrw
+ixrctphwqydzfme
+fxdhpyctwrinmazqe
+pctzyrhdiqwmxef
+
+wasjdyzgfu
+zfdyujgwsa
+wbyzjgadufs
+afzswydguj
+
+zqanmksjruhx
+qljaunzmkrshx
+jrxqsmzknhua
+rjazknumxqhs
+kuzqxhjmasrn
+
+virdpbztchkgo
+hdiopebvzaw
+
+ziwscmotk
+jwmas
+
+h
+h
+h
+h
+h
+
+qhywbkuvnst
+zmynwxvufqarkbeht
+
+onfvrqxa
+xrvqnofa
+fiuarnvoxq
+qvzafonrx
+fqvxebnaolr
+
+kmfulryg
+bkswufgylmr
+myulgjrfk
+gouyxrlkmf
+
+skerjmgbvtcphdzafniyxo
+ljybizemsvhokxrdcagptnf
+
+oyt
+hytx
+mdtyjrslkczu
+bvyto
+
+mpwv
+acvbp
+
+m
+ftz
+
+kvtmidlngo
+edznioyvkx
+kofvirdn
diff --git a/2020/inputs/day_7.txt b/2020/inputs/day_7.txt
new file mode 100644
index 0000000..04950b5
--- /dev/null
+++ b/2020/inputs/day_7.txt
@@ -0,0 +1,594 @@
+striped white bags contain 4 drab silver bags.
+drab silver bags contain no other bags.
+pale plum bags contain 1 dark black bag.
+muted gold bags contain 1 wavy red bag, 3 mirrored violet bags, 5 bright gold bags, 5 plaid white bags.
+muted teal bags contain 2 pale beige bags, 5 clear beige bags, 2 dotted gold bags, 4 posh cyan bags.
+posh coral bags contain 1 light silver bag, 2 dull blue bags, 3 dim fuchsia bags, 2 dotted magenta bags.
+faded black bags contain 4 light silver bags.
+muted lavender bags contain 1 pale gold bag.
+clear fuchsia bags contain 1 dull gray bag, 2 shiny indigo bags, 3 posh olive bags, 5 vibrant plum bags.
+shiny olive bags contain 1 dotted gold bag, 5 bright violet bags.
+vibrant lavender bags contain 3 dotted aqua bags, 4 pale chartreuse bags, 5 mirrored blue bags.
+pale fuchsia bags contain 5 pale crimson bags, 2 dull teal bags.
+clear lavender bags contain 5 shiny fuchsia bags, 5 wavy teal bags.
+light chartreuse bags contain 5 mirrored yellow bags, 3 bright maroon bags.
+mirrored white bags contain 1 bright gray bag, 4 plaid blue bags.
+dark teal bags contain 4 bright maroon bags, 5 plaid bronze bags, 1 dark brown bag.
+wavy yellow bags contain 4 dim silver bags, 1 striped tomato bag, 5 clear chartreuse bags.
+dark turquoise bags contain 4 clear plum bags.
+posh gray bags contain 2 faded purple bags, 2 faded orange bags.
+wavy tomato bags contain 1 dark purple bag.
+vibrant gray bags contain 3 muted gray bags, 1 dark fuchsia bag, 5 posh white bags, 5 posh tomato bags.
+light crimson bags contain 2 dotted chartreuse bags.
+dull gray bags contain 4 muted brown bags, 2 shiny blue bags, 4 dim crimson bags.
+drab red bags contain 2 bright cyan bags, 1 pale brown bag.
+dotted salmon bags contain 5 mirrored indigo bags.
+vibrant green bags contain 2 dark coral bags.
+light magenta bags contain 4 clear bronze bags, 4 dull teal bags, 4 posh salmon bags.
+vibrant purple bags contain 4 posh plum bags, 2 bright gray bags.
+posh lime bags contain 3 plaid yellow bags, 4 posh salmon bags.
+bright white bags contain 4 dull aqua bags, 1 shiny silver bag.
+faded blue bags contain 5 muted cyan bags, 2 mirrored coral bags.
+dim green bags contain 2 posh lavender bags.
+faded gray bags contain 2 dark gold bags, 1 drab turquoise bag.
+wavy black bags contain 4 dim fuchsia bags, 1 muted orange bag, 4 drab salmon bags.
+plaid plum bags contain 5 dotted tomato bags, 1 shiny beige bag.
+bright tan bags contain 2 posh salmon bags.
+wavy gold bags contain 1 faded olive bag, 5 vibrant black bags, 3 dull orange bags.
+dull fuchsia bags contain 1 faded crimson bag, 5 vibrant white bags.
+shiny maroon bags contain 5 dull lavender bags, 1 dim white bag.
+wavy white bags contain 5 light teal bags, 4 dim salmon bags, 3 dotted red bags, 5 dark red bags.
+dim cyan bags contain 1 muted orange bag.
+muted cyan bags contain 4 dull turquoise bags, 5 posh gray bags, 5 clear turquoise bags, 1 shiny plum bag.
+posh violet bags contain 5 plaid crimson bags, 5 muted purple bags, 1 wavy beige bag, 2 mirrored orange bags.
+faded purple bags contain 3 plaid blue bags, 1 dull lavender bag, 1 muted orange bag, 2 dotted tomato bags.
+wavy beige bags contain 1 dotted beige bag.
+dim black bags contain 1 wavy blue bag, 1 plaid black bag, 3 pale lavender bags, 2 light violet bags.
+dotted lavender bags contain 1 plaid blue bag, 5 dim crimson bags.
+dark yellow bags contain 3 posh green bags.
+wavy salmon bags contain 1 clear aqua bag, 3 mirrored crimson bags, 3 pale magenta bags, 2 dull teal bags.
+clear silver bags contain 3 faded tan bags, 5 faded aqua bags, 1 clear tomato bag.
+vibrant bronze bags contain 1 faded maroon bag, 4 plaid indigo bags, 2 bright purple bags, 5 dim violet bags.
+pale brown bags contain 1 dull lavender bag, 2 clear turquoise bags.
+faded salmon bags contain 1 pale silver bag.
+dark gray bags contain 2 pale teal bags.
+posh red bags contain 3 faded black bags, 2 dull red bags.
+dim indigo bags contain 3 bright green bags, 2 dotted tomato bags, 5 bright magenta bags.
+dull maroon bags contain 5 light green bags.
+wavy teal bags contain 5 faded tan bags, 4 clear orange bags.
+pale chartreuse bags contain 5 bright blue bags, 3 light indigo bags, 3 shiny white bags, 3 wavy bronze bags.
+mirrored gray bags contain 4 vibrant tomato bags, 1 dark red bag, 5 drab silver bags, 3 posh magenta bags.
+dark lavender bags contain 4 dotted white bags, 5 vibrant chartreuse bags, 2 dim teal bags.
+shiny turquoise bags contain 3 dim lime bags, 5 bright cyan bags, 2 pale green bags.
+shiny indigo bags contain 2 dark fuchsia bags, 4 posh chartreuse bags.
+pale crimson bags contain 5 mirrored silver bags, 2 posh black bags.
+light salmon bags contain 2 vibrant orange bags, 2 dotted red bags.
+plaid orange bags contain 1 dotted turquoise bag, 4 vibrant brown bags.
+dim maroon bags contain 5 shiny gold bags, 4 mirrored maroon bags.
+muted green bags contain 1 plaid plum bag.
+faded indigo bags contain 3 faded purple bags, 4 vibrant indigo bags, 1 light coral bag.
+dull blue bags contain 5 dull salmon bags, 2 wavy magenta bags.
+vibrant black bags contain 1 light coral bag, 5 vibrant cyan bags, 3 dim magenta bags.
+striped lime bags contain 1 striped maroon bag, 2 vibrant brown bags.
+drab brown bags contain 1 faded olive bag, 5 dotted beige bags.
+dark plum bags contain 5 faded brown bags.
+clear olive bags contain 3 dull aqua bags, 5 drab yellow bags.
+wavy crimson bags contain 2 posh plum bags, 2 dull aqua bags, 5 shiny teal bags, 2 vibrant purple bags.
+mirrored olive bags contain 2 wavy gold bags.
+dim crimson bags contain no other bags.
+faded plum bags contain 1 plaid indigo bag.
+light maroon bags contain 3 vibrant orange bags, 2 clear olive bags, 3 clear brown bags, 1 pale black bag.
+posh white bags contain 3 dull green bags, 3 clear brown bags.
+drab black bags contain 2 shiny turquoise bags.
+light purple bags contain 2 pale black bags, 5 light silver bags, 1 drab coral bag.
+pale yellow bags contain 2 vibrant orange bags, 5 posh black bags, 2 vibrant tomato bags, 3 dotted lavender bags.
+dull cyan bags contain 5 wavy beige bags, 1 dull yellow bag, 3 drab lime bags, 3 drab chartreuse bags.
+drab lavender bags contain 2 plaid black bags, 4 dotted gray bags, 1 dim silver bag, 2 shiny gold bags.
+striped brown bags contain 5 light maroon bags, 3 light red bags, 3 clear indigo bags.
+drab tomato bags contain 2 light black bags, 2 clear salmon bags.
+dotted red bags contain 4 dim salmon bags, 5 striped indigo bags.
+vibrant teal bags contain 5 bright black bags, 1 dark purple bag, 2 bright turquoise bags.
+striped teal bags contain 4 mirrored silver bags.
+dull beige bags contain 4 clear olive bags, 4 light teal bags, 3 bright plum bags, 4 dotted lavender bags.
+light violet bags contain 2 dull lavender bags, 4 bright gray bags, 5 vibrant orange bags, 3 wavy magenta bags.
+dim brown bags contain 2 clear plum bags, 2 shiny teal bags, 2 posh salmon bags.
+striped magenta bags contain 4 posh turquoise bags, 3 pale cyan bags, 3 faded indigo bags.
+bright orange bags contain 4 plaid gray bags, 4 dark black bags, 4 faded red bags, 4 bright black bags.
+muted olive bags contain 2 dotted crimson bags, 4 faded lavender bags, 2 vibrant gray bags.
+plaid teal bags contain 2 light yellow bags, 4 drab cyan bags, 3 light green bags.
+faded fuchsia bags contain 1 posh silver bag, 4 drab chartreuse bags, 4 drab teal bags.
+dim silver bags contain 1 pale turquoise bag.
+bright lime bags contain 1 striped silver bag, 5 muted teal bags, 1 shiny tan bag, 1 dark silver bag.
+dotted green bags contain 3 posh green bags, 1 drab yellow bag.
+drab purple bags contain 5 bright violet bags, 1 posh tomato bag.
+dull bronze bags contain 4 mirrored black bags.
+striped tomato bags contain 1 posh gray bag, 2 posh magenta bags.
+bright crimson bags contain 2 light olive bags, 4 clear tan bags, 3 drab fuchsia bags.
+bright turquoise bags contain 4 pale teal bags, 3 drab silver bags.
+shiny lavender bags contain 2 striped lime bags, 2 plaid tomato bags, 1 faded orange bag, 5 wavy magenta bags.
+light tomato bags contain 5 dotted olive bags.
+wavy magenta bags contain no other bags.
+vibrant fuchsia bags contain 5 posh brown bags, 5 plaid indigo bags.
+dark tomato bags contain 3 shiny plum bags.
+pale bronze bags contain 5 plaid black bags, 5 vibrant brown bags, 2 dim lime bags, 4 muted bronze bags.
+striped fuchsia bags contain 3 muted brown bags, 2 pale chartreuse bags, 1 dim magenta bag.
+dark brown bags contain 4 clear bronze bags.
+posh teal bags contain 5 dotted plum bags, 2 drab gray bags, 3 dull fuchsia bags.
+wavy turquoise bags contain 1 dull lavender bag.
+striped maroon bags contain 4 muted yellow bags, 4 clear orange bags, 4 vibrant orange bags.
+shiny green bags contain 3 muted brown bags, 1 vibrant black bag, 4 wavy cyan bags, 3 posh brown bags.
+plaid salmon bags contain 4 mirrored indigo bags, 2 wavy white bags, 5 mirrored bronze bags, 3 light coral bags.
+dotted magenta bags contain 2 light olive bags, 2 dark red bags, 4 clear green bags, 3 dim plum bags.
+light orange bags contain 5 dark plum bags, 3 bright maroon bags, 2 dotted lime bags.
+clear brown bags contain 3 dim white bags, 2 posh magenta bags.
+vibrant turquoise bags contain 2 striped yellow bags, 1 mirrored crimson bag.
+muted coral bags contain 4 wavy gold bags, 2 dim tan bags, 1 shiny green bag.
+plaid crimson bags contain 1 dull aqua bag.
+vibrant plum bags contain 4 striped tomato bags, 1 striped turquoise bag.
+dark coral bags contain 5 posh black bags, 1 shiny beige bag, 3 pale brown bags.
+mirrored brown bags contain 1 clear blue bag, 1 dull indigo bag.
+bright blue bags contain 2 light violet bags, 1 dotted tomato bag.
+drab cyan bags contain 2 dim turquoise bags, 5 clear violet bags.
+dotted coral bags contain 3 dotted aqua bags.
+shiny yellow bags contain 1 wavy cyan bag.
+shiny red bags contain 5 shiny beige bags, 3 dotted lime bags, 5 dotted plum bags.
+muted lime bags contain 3 dark turquoise bags, 3 bright chartreuse bags.
+pale gray bags contain 5 dotted coral bags, 4 wavy teal bags, 2 clear aqua bags.
+pale blue bags contain 5 dull salmon bags, 3 posh bronze bags, 2 vibrant tomato bags.
+dim turquoise bags contain 4 posh aqua bags, 2 dark turquoise bags.
+pale turquoise bags contain 5 vibrant brown bags, 2 shiny maroon bags.
+dim gray bags contain 2 faded tomato bags, 2 faded indigo bags.
+clear aqua bags contain 1 light turquoise bag, 3 dotted turquoise bags.
+faded turquoise bags contain 5 muted lime bags.
+clear plum bags contain 2 plaid indigo bags, 5 drab yellow bags.
+vibrant white bags contain 2 bright violet bags, 4 dark plum bags, 1 dim plum bag, 4 plaid indigo bags.
+dark orange bags contain 3 posh purple bags, 5 clear orange bags, 1 dim white bag.
+light olive bags contain 3 drab green bags.
+muted salmon bags contain 4 muted cyan bags.
+clear maroon bags contain 2 muted yellow bags, 5 plaid crimson bags, 1 clear turquoise bag.
+wavy orange bags contain 4 vibrant blue bags, 4 posh brown bags, 2 pale turquoise bags, 5 shiny orange bags.
+dotted gold bags contain 3 posh magenta bags, 1 faded crimson bag, 3 dotted olive bags, 3 plaid olive bags.
+dull purple bags contain 5 drab salmon bags, 4 dim lavender bags.
+light bronze bags contain 2 wavy indigo bags.
+muted turquoise bags contain 5 clear turquoise bags, 4 plaid violet bags, 4 clear orange bags, 2 posh maroon bags.
+mirrored blue bags contain 4 clear chartreuse bags.
+drab tan bags contain 3 striped violet bags, 2 bright silver bags, 2 dark bronze bags, 1 mirrored black bag.
+dark maroon bags contain 1 vibrant orange bag.
+drab yellow bags contain 1 vibrant blue bag, 2 dim violet bags.
+light cyan bags contain 4 posh beige bags.
+vibrant salmon bags contain 3 wavy gold bags.
+muted orange bags contain 3 dotted tomato bags, 4 vibrant tomato bags, 5 dull lavender bags.
+dull turquoise bags contain 1 wavy white bag.
+dotted indigo bags contain 3 wavy bronze bags.
+dark red bags contain 4 wavy bronze bags, 5 wavy turquoise bags.
+light coral bags contain 4 clear tan bags, 2 vibrant beige bags, 1 dull lavender bag, 5 shiny white bags.
+mirrored turquoise bags contain 5 clear fuchsia bags, 3 mirrored black bags, 4 plaid tan bags.
+mirrored yellow bags contain 4 pale turquoise bags, 2 wavy orange bags, 3 drab coral bags, 4 dim chartreuse bags.
+dotted fuchsia bags contain 4 dim bronze bags, 4 striped indigo bags.
+dotted purple bags contain 5 posh maroon bags, 1 dim yellow bag.
+clear coral bags contain 5 dark olive bags, 2 wavy bronze bags, 3 light red bags.
+mirrored teal bags contain 3 drab yellow bags.
+faded green bags contain 2 dark purple bags.
+light lime bags contain 4 bright chartreuse bags, 5 clear tomato bags, 2 bright green bags, 2 faded teal bags.
+bright yellow bags contain 4 dull purple bags, 3 faded beige bags.
+bright maroon bags contain 2 vibrant blue bags, 5 bright violet bags, 5 plaid indigo bags, 3 vibrant orange bags.
+faded red bags contain 5 pale brown bags, 4 striped tomato bags, 2 bright green bags.
+muted maroon bags contain 1 dark tan bag, 5 drab teal bags, 4 dull maroon bags.
+plaid coral bags contain 5 bright blue bags, 1 dotted indigo bag.
+dotted brown bags contain 1 dull beige bag, 2 bright indigo bags, 2 striped chartreuse bags, 1 muted silver bag.
+wavy coral bags contain 2 clear cyan bags, 2 muted teal bags, 1 faded red bag, 2 mirrored silver bags.
+faded coral bags contain 3 bright green bags, 1 bright cyan bag, 3 plaid blue bags, 5 wavy lavender bags.
+dim gold bags contain 5 dim teal bags, 1 vibrant tomato bag, 5 pale chartreuse bags, 3 bright indigo bags.
+bright salmon bags contain 5 plaid chartreuse bags, 5 light tan bags, 5 vibrant maroon bags.
+wavy violet bags contain 4 bright green bags.
+mirrored lavender bags contain 5 drab plum bags, 2 drab turquoise bags, 2 dark magenta bags.
+faded aqua bags contain 3 faded teal bags, 1 dark red bag.
+muted yellow bags contain 1 mirrored silver bag, 1 striped white bag, 3 mirrored gold bags, 1 muted gray bag.
+pale coral bags contain 2 striped gray bags, 2 clear beige bags.
+mirrored cyan bags contain 1 pale beige bag, 4 dim crimson bags.
+dotted aqua bags contain 4 dim crimson bags, 3 vibrant beige bags.
+dark white bags contain 4 dim maroon bags, 1 light olive bag, 3 dull fuchsia bags, 4 mirrored maroon bags.
+dotted chartreuse bags contain 5 clear tan bags, 2 clear white bags, 2 dark coral bags, 4 faded brown bags.
+mirrored red bags contain 5 faded violet bags, 2 dark chartreuse bags.
+drab maroon bags contain 3 bright violet bags.
+dark violet bags contain 5 dark turquoise bags, 1 muted blue bag, 4 plaid bronze bags.
+dull silver bags contain 4 dotted lime bags, 3 dotted silver bags, 4 dull red bags, 3 pale white bags.
+striped lavender bags contain 5 drab silver bags.
+light yellow bags contain 3 posh plum bags, 3 bright olive bags, 4 wavy crimson bags.
+posh chartreuse bags contain 2 bright violet bags.
+pale green bags contain 5 shiny lime bags, 3 faded teal bags, 5 posh gray bags, 1 posh chartreuse bag.
+shiny lime bags contain 1 dull beige bag, 4 light aqua bags, 4 dotted tomato bags.
+plaid tan bags contain 1 mirrored chartreuse bag.
+drab coral bags contain 5 posh gray bags, 2 dull black bags.
+drab salmon bags contain 4 drab yellow bags, 3 mirrored green bags.
+faded yellow bags contain 2 mirrored beige bags, 1 bright turquoise bag, 1 vibrant black bag.
+bright tomato bags contain 4 clear brown bags.
+muted beige bags contain 1 clear turquoise bag.
+striped black bags contain 1 plaid chartreuse bag.
+bright cyan bags contain 5 clear tomato bags.
+striped coral bags contain 2 muted red bags.
+posh bronze bags contain 5 striped yellow bags.
+mirrored maroon bags contain 4 vibrant tomato bags, 5 bright green bags, 4 vibrant maroon bags, 4 striped violet bags.
+dotted turquoise bags contain 1 posh beige bag, 5 muted silver bags.
+bright purple bags contain 5 drab silver bags, 5 shiny blue bags, 2 plaid bronze bags, 4 faded magenta bags.
+posh plum bags contain 5 striped white bags, 2 pale brown bags, 1 wavy turquoise bag.
+dark crimson bags contain 1 dull black bag, 2 dull yellow bags, 1 posh white bag, 3 dotted lime bags.
+plaid bronze bags contain 5 striped indigo bags, 5 light indigo bags, 4 wavy magenta bags, 3 vibrant blue bags.
+clear red bags contain 4 posh silver bags, 1 dim aqua bag.
+striped salmon bags contain 3 bright violet bags, 4 faded olive bags, 5 dim turquoise bags.
+dim bronze bags contain no other bags.
+wavy brown bags contain 4 vibrant turquoise bags.
+wavy maroon bags contain 1 mirrored bronze bag, 2 posh fuchsia bags, 1 mirrored indigo bag.
+mirrored salmon bags contain 2 faded lavender bags.
+dark aqua bags contain 4 faded teal bags, 1 dim tomato bag.
+pale violet bags contain 5 clear blue bags, 3 plaid blue bags, 5 dim teal bags, 2 pale black bags.
+mirrored crimson bags contain 2 posh magenta bags, 2 dotted aqua bags, 1 dim bronze bag.
+bright indigo bags contain 4 bright violet bags.
+muted violet bags contain 4 mirrored maroon bags, 2 dull red bags, 4 plaid tomato bags, 1 pale yellow bag.
+shiny gold bags contain 3 vibrant blue bags, 5 plaid blue bags, 2 dark red bags, 1 dull green bag.
+clear green bags contain 4 dotted lavender bags.
+dark indigo bags contain 2 light lime bags, 3 wavy brown bags.
+muted fuchsia bags contain 3 plaid green bags.
+bright silver bags contain 4 dim tomato bags, 3 clear olive bags, 1 dull teal bag.
+plaid purple bags contain 4 dark silver bags, 1 vibrant crimson bag, 4 dark black bags, 3 faded magenta bags.
+clear chartreuse bags contain 4 posh plum bags.
+plaid tomato bags contain 2 wavy aqua bags, 3 striped indigo bags, 1 wavy magenta bag.
+posh cyan bags contain 3 drab green bags, 3 bright chartreuse bags, 3 muted gray bags, 2 light black bags.
+posh turquoise bags contain 5 wavy teal bags, 3 light tan bags, 1 dull gold bag.
+plaid olive bags contain 2 dim chartreuse bags.
+shiny orange bags contain 4 pale brown bags, 3 dim salmon bags.
+clear gray bags contain 4 bright salmon bags, 5 vibrant crimson bags.
+shiny brown bags contain 1 bright gold bag, 3 clear tomato bags.
+muted aqua bags contain 2 mirrored indigo bags, 1 dim tan bag.
+plaid red bags contain 1 clear plum bag.
+muted bronze bags contain 4 clear white bags, 3 dotted plum bags.
+plaid blue bags contain 2 dull lavender bags, 5 wavy magenta bags, 1 light indigo bag.
+shiny salmon bags contain 2 dotted black bags, 1 light magenta bag.
+shiny cyan bags contain 5 faded violet bags, 3 mirrored bronze bags, 4 dark maroon bags, 2 wavy lavender bags.
+drab magenta bags contain 2 light blue bags, 1 wavy orange bag, 5 posh chartreuse bags.
+dim violet bags contain 5 dark red bags, 4 light violet bags, 2 dotted fuchsia bags, 2 plaid tomato bags.
+faded crimson bags contain 3 clear silver bags, 1 vibrant beige bag.
+plaid fuchsia bags contain 3 plaid red bags, 4 drab purple bags, 4 clear lime bags, 3 dim turquoise bags.
+dull green bags contain 5 dotted beige bags, 4 drab silver bags, 4 posh magenta bags, 1 muted orange bag.
+wavy indigo bags contain 2 pale tan bags.
+plaid lavender bags contain 1 dark black bag.
+clear bronze bags contain 3 pale teal bags.
+clear blue bags contain 2 light teal bags, 5 dotted olive bags, 3 bright indigo bags.
+posh aqua bags contain 2 light violet bags, 2 dull salmon bags, 1 vibrant violet bag.
+dark gold bags contain 2 striped maroon bags.
+vibrant chartreuse bags contain 3 wavy silver bags.
+dark magenta bags contain 1 clear silver bag.
+dim red bags contain 3 wavy indigo bags, 2 muted teal bags.
+muted silver bags contain 5 pale crimson bags, 2 dotted tomato bags.
+mirrored tan bags contain 1 pale salmon bag.
+dull violet bags contain 2 dull black bags.
+striped beige bags contain 4 dark maroon bags, 2 wavy orange bags.
+striped turquoise bags contain 3 light indigo bags, 5 bright maroon bags, 1 light teal bag.
+pale gold bags contain 5 dotted teal bags.
+wavy olive bags contain 3 dotted fuchsia bags.
+clear violet bags contain 1 dotted lavender bag, 5 bright tan bags, 5 dim violet bags, 5 drab salmon bags.
+pale maroon bags contain 4 drab red bags, 1 wavy yellow bag, 1 muted green bag, 1 striped fuchsia bag.
+drab bronze bags contain 4 light gray bags, 3 posh magenta bags, 1 dull yellow bag.
+vibrant gold bags contain 4 dull violet bags, 3 clear white bags, 5 wavy chartreuse bags, 4 pale turquoise bags.
+clear beige bags contain 4 plaid blue bags, 3 shiny plum bags, 1 light silver bag.
+faded silver bags contain 5 drab turquoise bags, 4 plaid green bags, 4 posh yellow bags, 1 plaid blue bag.
+light brown bags contain 1 dark red bag, 1 dotted gray bag.
+shiny violet bags contain 5 posh cyan bags, 5 vibrant plum bags, 5 mirrored chartreuse bags, 4 plaid green bags.
+dark bronze bags contain 4 bright gold bags, 2 striped maroon bags, 4 dark aqua bags, 5 pale chartreuse bags.
+dull black bags contain 2 vibrant tomato bags, 1 vibrant blue bag, 3 pale yellow bags.
+dotted beige bags contain 5 dotted tomato bags, 1 striped indigo bag.
+clear indigo bags contain 3 dark violet bags.
+bright coral bags contain 1 dark indigo bag.
+drab turquoise bags contain 5 drab plum bags, 3 pale magenta bags, 5 drab red bags, 4 dull olive bags.
+shiny fuchsia bags contain 2 dull lavender bags, 5 striped tomato bags.
+dull indigo bags contain 3 pale turquoise bags, 3 faded tomato bags, 5 dim magenta bags, 3 drab indigo bags.
+dim aqua bags contain 4 faded brown bags, 1 mirrored lime bag.
+muted purple bags contain 3 dim salmon bags, 4 light violet bags, 2 striped turquoise bags, 2 shiny teal bags.
+dotted black bags contain 3 dotted cyan bags, 4 wavy magenta bags, 4 posh chartreuse bags.
+drab violet bags contain 4 dark gray bags, 5 dull chartreuse bags, 4 plaid gray bags.
+plaid green bags contain 3 dark red bags, 1 wavy crimson bag, 4 light coral bags, 4 striped indigo bags.
+faded brown bags contain 3 dark orange bags.
+light teal bags contain 3 striped indigo bags, 4 dim bronze bags.
+plaid black bags contain 2 mirrored crimson bags, 5 dim silver bags, 4 posh purple bags.
+shiny blue bags contain 2 plaid green bags, 4 plaid crimson bags, 2 faded plum bags.
+plaid lime bags contain 2 striped maroon bags.
+pale lavender bags contain 2 mirrored indigo bags, 1 pale green bag, 5 dim chartreuse bags, 3 pale white bags.
+drab chartreuse bags contain 1 bright salmon bag, 4 vibrant brown bags, 1 muted violet bag.
+light indigo bags contain no other bags.
+plaid violet bags contain 2 dim white bags, 4 faded lavender bags.
+drab gold bags contain 5 dotted aqua bags, 3 muted beige bags, 4 faded black bags, 5 dark red bags.
+mirrored bronze bags contain 2 plaid blue bags, 1 light orange bag.
+dim olive bags contain 1 striped silver bag.
+plaid white bags contain 5 pale turquoise bags, 4 mirrored orange bags, 2 vibrant aqua bags.
+wavy purple bags contain 3 dark silver bags, 1 dull white bag, 3 dotted magenta bags, 2 dim salmon bags.
+clear orange bags contain 5 striped indigo bags, 1 wavy bronze bag, 4 vibrant blue bags.
+plaid gray bags contain 1 dull aqua bag, 3 dull olive bags, 3 posh black bags.
+vibrant violet bags contain 2 vibrant maroon bags.
+pale olive bags contain 2 vibrant fuchsia bags.
+muted brown bags contain 5 pale teal bags, 2 light brown bags, 4 light tomato bags.
+posh lavender bags contain 4 bright indigo bags, 1 striped indigo bag, 5 dark purple bags.
+dotted blue bags contain 4 muted salmon bags, 3 mirrored red bags, 5 pale white bags, 3 clear red bags.
+dim purple bags contain 4 muted cyan bags.
+bright fuchsia bags contain 5 muted black bags.
+vibrant lime bags contain 3 posh purple bags, 1 drab aqua bag.
+wavy green bags contain 3 drab red bags, 2 faded brown bags, 2 wavy cyan bags.
+dull lime bags contain 3 bright salmon bags, 4 posh crimson bags, 1 drab salmon bag, 4 pale yellow bags.
+mirrored aqua bags contain 4 striped violet bags, 1 striped indigo bag, 2 striped tomato bags.
+striped tan bags contain 4 light blue bags, 4 dull beige bags.
+drab green bags contain 5 muted silver bags, 1 vibrant orange bag, 2 striped indigo bags, 4 striped tomato bags.
+dotted orange bags contain 5 mirrored white bags, 5 muted orange bags, 2 drab tomato bags, 2 dull white bags.
+dim tomato bags contain 2 dull lavender bags.
+dull magenta bags contain 3 faded brown bags, 5 faded teal bags.
+faded maroon bags contain 4 posh brown bags, 2 dotted aqua bags.
+plaid cyan bags contain 4 faded crimson bags, 4 light chartreuse bags, 1 light crimson bag, 1 posh fuchsia bag.
+dim salmon bags contain 1 dotted olive bag, 4 light indigo bags.
+faded chartreuse bags contain 4 bright gold bags, 4 clear silver bags.
+light plum bags contain 2 dotted chartreuse bags, 1 drab white bag.
+posh silver bags contain 3 mirrored black bags, 4 dull blue bags.
+dull salmon bags contain 4 dim white bags, 5 clear tomato bags, 2 mirrored maroon bags.
+light green bags contain 4 plaid chartreuse bags, 5 vibrant aqua bags.
+posh indigo bags contain 2 dull olive bags, 2 dotted lime bags, 1 drab red bag.
+dark blue bags contain 5 dotted green bags, 3 wavy crimson bags, 4 clear silver bags.
+bright black bags contain 5 posh bronze bags, 3 bright cyan bags, 5 muted black bags.
+bright lavender bags contain 1 shiny indigo bag, 1 dim yellow bag, 1 wavy yellow bag.
+faded white bags contain 1 dotted black bag, 5 wavy red bags.
+muted black bags contain 1 mirrored aqua bag, 4 dark red bags, 5 dull yellow bags.
+light turquoise bags contain 3 shiny plum bags.
+vibrant coral bags contain 2 shiny orange bags, 4 bright olive bags.
+vibrant aqua bags contain 2 wavy crimson bags, 2 muted orange bags.
+dotted tan bags contain 1 light indigo bag, 2 dim magenta bags.
+posh yellow bags contain 4 faded lavender bags.
+pale lime bags contain 4 mirrored orange bags, 3 dull gray bags, 1 muted magenta bag.
+drab white bags contain 2 faded tan bags, 3 wavy aqua bags.
+shiny tomato bags contain 4 dim coral bags, 3 dotted lime bags.
+wavy plum bags contain 1 bright orange bag.
+dull crimson bags contain 2 pale silver bags, 1 light beige bag, 4 wavy violet bags.
+dotted violet bags contain 4 light indigo bags, 1 dark black bag, 3 pale green bags.
+dark salmon bags contain 5 light tan bags, 4 dim chartreuse bags, 5 faded green bags, 3 light brown bags.
+dull brown bags contain 5 mirrored aqua bags, 5 dim magenta bags, 4 light brown bags, 5 plaid black bags.
+shiny chartreuse bags contain 5 wavy yellow bags, 3 faded aqua bags, 1 bright fuchsia bag, 5 drab plum bags.
+muted red bags contain 3 drab white bags, 5 dim beige bags, 4 bright olive bags.
+posh blue bags contain 1 dotted beige bag, 1 vibrant cyan bag, 4 vibrant brown bags, 2 clear turquoise bags.
+wavy bronze bags contain 4 wavy turquoise bags, 4 dim bronze bags, 3 shiny beige bags, 2 dull lavender bags.
+posh beige bags contain 3 muted gray bags, 4 light salmon bags, 5 striped turquoise bags.
+vibrant red bags contain 5 muted blue bags.
+dark olive bags contain 5 dark maroon bags.
+dotted gray bags contain 3 wavy magenta bags.
+vibrant cyan bags contain 5 dotted lavender bags, 3 vibrant orange bags.
+dark chartreuse bags contain 3 pale white bags, 1 dull lavender bag.
+faded lime bags contain 4 clear green bags, 3 shiny plum bags, 2 light green bags.
+vibrant blue bags contain 1 wavy turquoise bag, 4 dim salmon bags.
+dull tan bags contain 3 dim chartreuse bags, 1 plaid tomato bag, 4 dark brown bags.
+muted gray bags contain 4 clear tan bags, 3 wavy aqua bags, 5 dim white bags.
+clear yellow bags contain 1 drab white bag, 5 dark salmon bags, 2 dull yellow bags.
+clear tomato bags contain 2 dotted gray bags, 5 vibrant beige bags, 1 bright maroon bag, 2 drab green bags.
+shiny tan bags contain 5 posh lavender bags, 5 pale yellow bags.
+dark black bags contain 4 muted purple bags, 5 light gray bags, 5 drab red bags.
+striped plum bags contain 3 dull red bags, 1 dark tomato bag, 4 dark yellow bags, 5 plaid cyan bags.
+light gray bags contain 3 plaid chartreuse bags.
+light aqua bags contain 4 wavy magenta bags, 3 light black bags.
+vibrant brown bags contain 1 bright blue bag, 1 posh black bag.
+posh tomato bags contain 5 wavy magenta bags.
+dotted bronze bags contain 4 mirrored chartreuse bags.
+mirrored violet bags contain 2 clear maroon bags, 1 light red bag, 4 mirrored gray bags.
+dark purple bags contain 5 bright blue bags, 3 plaid blue bags.
+faded beige bags contain 4 plaid bronze bags, 5 vibrant turquoise bags, 3 pale orange bags, 5 mirrored aqua bags.
+mirrored green bags contain 1 dotted fuchsia bag, 5 light indigo bags, 3 shiny beige bags.
+striped violet bags contain 5 drab silver bags, 2 dim crimson bags, 3 plaid blue bags.
+mirrored tomato bags contain 5 light lavender bags.
+posh purple bags contain 3 pale orange bags.
+dim blue bags contain 5 dotted plum bags, 1 light orange bag, 4 dim maroon bags.
+dark cyan bags contain 4 vibrant white bags, 4 dull white bags, 1 posh purple bag.
+drab beige bags contain 5 dull purple bags.
+vibrant olive bags contain 5 light silver bags.
+plaid beige bags contain 3 muted silver bags, 4 vibrant orange bags.
+wavy silver bags contain 2 dim crimson bags, 4 shiny maroon bags, 4 pale indigo bags.
+posh crimson bags contain 2 light violet bags, 4 pale coral bags, 3 plaid bronze bags.
+vibrant crimson bags contain 3 dull red bags.
+dotted olive bags contain no other bags.
+mirrored beige bags contain 2 plaid gray bags, 5 mirrored yellow bags.
+bright brown bags contain 2 faded aqua bags, 1 dim tomato bag, 5 posh magenta bags.
+bright magenta bags contain 2 posh gray bags, 3 dim salmon bags.
+clear magenta bags contain 2 dim cyan bags, 3 clear red bags, 1 dull fuchsia bag, 4 wavy coral bags.
+clear lime bags contain 5 dull green bags, 2 shiny bronze bags, 2 faded orange bags, 1 bright beige bag.
+muted tan bags contain 4 vibrant maroon bags, 3 vibrant black bags, 5 shiny maroon bags, 5 vibrant turquoise bags.
+pale beige bags contain 3 light tomato bags.
+dark fuchsia bags contain 2 faded brown bags, 3 dotted lavender bags, 4 shiny teal bags, 2 bright blue bags.
+dim magenta bags contain 4 posh chartreuse bags.
+bright aqua bags contain 5 drab violet bags.
+striped crimson bags contain 2 bright green bags.
+dull chartreuse bags contain 4 plaid bronze bags, 2 shiny gray bags, 4 dull lavender bags.
+wavy chartreuse bags contain 1 vibrant tomato bag, 1 dim tomato bag, 3 pale green bags, 1 posh plum bag.
+dotted white bags contain 1 dark teal bag, 4 dotted violet bags, 5 bright beige bags, 3 dim silver bags.
+mirrored purple bags contain 1 posh green bag.
+faded bronze bags contain 4 dotted indigo bags.
+faded lavender bags contain 3 muted purple bags.
+clear turquoise bags contain 4 muted orange bags, 1 striped violet bag, 5 clear tan bags, 5 dim white bags.
+shiny plum bags contain 4 dim crimson bags.
+wavy fuchsia bags contain 3 dotted brown bags, 5 dark magenta bags, 2 dark bronze bags.
+faded olive bags contain 5 plaid indigo bags.
+mirrored orange bags contain 4 striped violet bags, 2 light violet bags, 4 shiny orange bags.
+pale indigo bags contain 3 shiny indigo bags.
+faded tan bags contain 3 shiny maroon bags, 5 posh aqua bags, 1 striped violet bag, 2 dim white bags.
+bright chartreuse bags contain 1 posh black bag, 5 bright gray bags, 3 plaid chartreuse bags.
+drab blue bags contain 1 pale violet bag, 4 vibrant green bags.
+posh tan bags contain 4 shiny lime bags.
+plaid maroon bags contain 2 dotted black bags.
+dull coral bags contain 4 posh coral bags, 1 dotted silver bag, 5 drab beige bags, 1 plaid red bag.
+striped yellow bags contain 1 plaid tomato bag, 1 dotted lavender bag.
+muted magenta bags contain 4 muted black bags.
+dotted cyan bags contain 1 vibrant tomato bag, 3 light indigo bags, 1 wavy turquoise bag.
+dim lavender bags contain 1 muted black bag, 4 pale white bags, 2 mirrored coral bags, 5 pale brown bags.
+bright gold bags contain 5 vibrant green bags.
+light white bags contain 2 striped lime bags, 2 muted lime bags, 5 muted brown bags, 4 bright green bags.
+wavy lavender bags contain 2 vibrant purple bags, 5 posh white bags.
+clear black bags contain 2 posh turquoise bags, 3 dotted orange bags, 3 faded teal bags.
+muted crimson bags contain 1 pale violet bag, 5 drab lavender bags.
+posh green bags contain 4 vibrant beige bags, 5 dark purple bags, 3 dim salmon bags, 3 light black bags.
+vibrant silver bags contain 3 posh coral bags, 4 posh white bags.
+dim coral bags contain 2 posh violet bags, 1 dark cyan bag, 3 shiny green bags, 3 vibrant cyan bags.
+striped red bags contain 5 muted olive bags, 4 wavy teal bags, 3 shiny gray bags, 1 mirrored coral bag.
+bright violet bags contain 3 shiny beige bags, 1 wavy magenta bag, 5 light indigo bags.
+vibrant magenta bags contain 4 striped salmon bags, 1 light tan bag.
+faded gold bags contain 5 light tomato bags, 1 wavy black bag, 4 faded maroon bags.
+muted plum bags contain 1 vibrant brown bag, 2 muted cyan bags, 4 muted salmon bags.
+plaid gold bags contain 5 shiny beige bags, 3 faded fuchsia bags, 5 vibrant cyan bags, 5 shiny gold bags.
+striped indigo bags contain no other bags.
+wavy gray bags contain 2 plaid indigo bags, 3 clear tomato bags, 4 dull blue bags.
+plaid silver bags contain 5 clear salmon bags, 5 faded lime bags, 4 shiny tan bags, 5 mirrored chartreuse bags.
+plaid yellow bags contain 4 shiny chartreuse bags, 1 light lime bag, 2 dull green bags.
+plaid turquoise bags contain 3 dotted aqua bags, 3 posh magenta bags.
+striped olive bags contain 2 faded aqua bags, 5 dotted orange bags, 5 dull turquoise bags, 1 pale violet bag.
+faded teal bags contain 3 striped indigo bags.
+dull red bags contain 1 mirrored gray bag, 4 drab coral bags, 2 bright plum bags, 1 dull green bag.
+dull gold bags contain 5 bright blue bags.
+shiny magenta bags contain 1 light white bag.
+striped green bags contain 1 clear blue bag.
+dull teal bags contain 3 dark purple bags, 4 dim lime bags, 5 clear chartreuse bags.
+faded magenta bags contain 4 shiny gray bags, 5 pale crimson bags, 5 light coral bags, 2 pale white bags.
+pale tomato bags contain 4 dull black bags, 1 posh chartreuse bag, 1 faded cyan bag.
+muted blue bags contain 5 striped white bags, 1 faded orange bag.
+light blue bags contain 4 posh white bags.
+plaid chartreuse bags contain 2 bright gray bags.
+dull aqua bags contain 5 clear tan bags, 5 dotted red bags, 5 vibrant tomato bags.
+light lavender bags contain 5 clear fuchsia bags, 1 striped olive bag.
+bright green bags contain 4 vibrant violet bags, 2 vibrant maroon bags.
+light beige bags contain 1 striped maroon bag.
+drab indigo bags contain 4 posh tomato bags, 5 faded brown bags.
+dotted yellow bags contain 3 wavy violet bags, 4 bright violet bags, 4 vibrant lime bags, 1 pale beige bag.
+striped gold bags contain 2 light indigo bags, 3 dull red bags, 5 vibrant beige bags.
+muted indigo bags contain 5 bright purple bags, 1 pale plum bag, 5 wavy black bags.
+dark lime bags contain 2 faded blue bags.
+shiny white bags contain 4 clear tan bags, 3 pale yellow bags, 5 plaid tomato bags, 4 wavy turquoise bags.
+vibrant maroon bags contain 4 dark red bags, 2 dull aqua bags, 5 wavy aqua bags.
+drab teal bags contain 3 shiny indigo bags.
+bright plum bags contain 2 plaid chartreuse bags.
+vibrant yellow bags contain 3 posh purple bags.
+posh salmon bags contain 4 dim plum bags, 1 pale yellow bag, 2 shiny gold bags.
+shiny black bags contain 3 dim magenta bags.
+bright gray bags contain no other bags.
+dull orange bags contain 3 dotted purple bags.
+pale purple bags contain 2 bright cyan bags, 2 drab teal bags, 2 dotted gold bags, 4 mirrored fuchsia bags.
+dull yellow bags contain 3 posh gray bags.
+muted tomato bags contain 3 faded orange bags.
+drab olive bags contain 4 dim maroon bags, 1 bright turquoise bag, 3 shiny indigo bags, 5 vibrant lavender bags.
+clear salmon bags contain 2 dim chartreuse bags, 2 shiny black bags, 5 dotted indigo bags, 3 dotted aqua bags.
+posh black bags contain 2 wavy turquoise bags, 2 shiny plum bags, 2 mirrored gold bags.
+light gold bags contain 5 shiny tomato bags, 4 light cyan bags.
+shiny coral bags contain 3 faded silver bags.
+plaid magenta bags contain 1 vibrant black bag, 2 bright blue bags.
+dotted teal bags contain 4 faded olive bags, 5 vibrant brown bags, 3 clear salmon bags.
+striped purple bags contain 5 shiny bronze bags.
+dim tan bags contain 2 light tan bags, 1 dotted gold bag, 3 shiny white bags.
+light silver bags contain 5 dotted cyan bags, 4 dotted aqua bags.
+dull white bags contain 5 striped turquoise bags.
+plaid aqua bags contain 3 dim bronze bags, 5 dull brown bags, 3 faded plum bags, 2 mirrored crimson bags.
+dotted silver bags contain 1 faded teal bag.
+dull olive bags contain 1 dark turquoise bag, 3 muted orange bags.
+clear purple bags contain 3 drab salmon bags.
+mirrored plum bags contain 1 vibrant lavender bag.
+bright beige bags contain 4 plaid magenta bags, 1 dull turquoise bag, 4 dim white bags, 1 light aqua bag.
+pale red bags contain 1 muted lavender bag, 2 vibrant teal bags, 4 plaid cyan bags, 5 dull orange bags.
+drab orange bags contain 3 bright plum bags, 5 vibrant chartreuse bags.
+mirrored gold bags contain 2 wavy magenta bags.
+posh maroon bags contain 3 dotted lime bags, 2 muted black bags, 3 faded green bags.
+clear white bags contain 4 pale black bags.
+pale silver bags contain 2 dim coral bags, 2 dull lavender bags, 2 dark teal bags, 3 wavy green bags.
+vibrant tomato bags contain 5 dull lavender bags.
+striped orange bags contain 5 shiny salmon bags, 1 pale gold bag, 4 mirrored gray bags, 1 plaid black bag.
+dim beige bags contain 5 dim salmon bags, 2 striped yellow bags, 5 shiny orange bags, 5 light salmon bags.
+clear gold bags contain 2 dim salmon bags, 4 vibrant cyan bags.
+dim teal bags contain 3 light indigo bags, 3 pale green bags, 5 muted bronze bags.
+shiny silver bags contain 3 drab red bags, 1 pale magenta bag, 3 plaid blue bags, 4 pale white bags.
+dark beige bags contain 4 posh black bags, 1 dark maroon bag.
+bright bronze bags contain 4 mirrored yellow bags, 1 vibrant salmon bag, 2 mirrored teal bags, 1 shiny beige bag.
+dotted maroon bags contain 1 clear tomato bag.
+bright olive bags contain 3 striped tomato bags, 3 plaid indigo bags, 3 posh magenta bags.
+faded tomato bags contain 5 bright violet bags.
+mirrored magenta bags contain 3 wavy coral bags, 4 dull tan bags, 3 wavy chartreuse bags.
+striped aqua bags contain 3 drab teal bags, 3 drab crimson bags, 5 plaid gold bags, 2 vibrant aqua bags.
+clear crimson bags contain 5 striped chartreuse bags, 5 vibrant blue bags.
+striped blue bags contain 4 dull red bags, 3 vibrant white bags, 4 posh black bags.
+posh olive bags contain 5 muted cyan bags.
+plaid indigo bags contain 5 dotted fuchsia bags, 2 plaid chartreuse bags, 3 vibrant blue bags.
+mirrored lime bags contain 2 dotted lavender bags, 2 wavy bronze bags.
+wavy blue bags contain 5 mirrored green bags, 5 faded tomato bags, 1 posh turquoise bag.
+light fuchsia bags contain 3 faded tomato bags, 5 muted beige bags, 2 faded beige bags, 4 wavy indigo bags.
+dull plum bags contain 4 dark blue bags, 5 shiny maroon bags, 3 pale gray bags, 5 drab lime bags.
+drab fuchsia bags contain 3 dark maroon bags.
+pale teal bags contain 4 vibrant blue bags, 1 bright green bag, 3 dim crimson bags, 1 posh salmon bag.
+dull tomato bags contain 3 dim maroon bags, 4 plaid gray bags, 5 striped gold bags, 5 striped white bags.
+pale orange bags contain 4 drab yellow bags.
+wavy aqua bags contain 1 dim bronze bag.
+dim chartreuse bags contain 2 bright violet bags.
+dotted crimson bags contain 5 vibrant orange bags, 4 wavy magenta bags.
+faded cyan bags contain 3 mirrored blue bags, 3 shiny fuchsia bags, 4 bright indigo bags.
+pale salmon bags contain 2 pale cyan bags, 2 muted lime bags, 2 vibrant plum bags.
+drab lime bags contain 2 drab yellow bags, 2 light magenta bags, 3 dotted fuchsia bags.
+shiny bronze bags contain 1 posh lavender bag.
+dim fuchsia bags contain 5 dotted gold bags, 5 vibrant indigo bags, 4 shiny teal bags, 2 dotted silver bags.
+dark green bags contain 2 shiny blue bags.
+bright red bags contain 2 pale brown bags, 3 plaid blue bags, 4 drab bronze bags, 3 dim yellow bags.
+clear teal bags contain 2 drab white bags, 3 muted beige bags.
+pale aqua bags contain 4 light tan bags.
+dull lavender bags contain 1 dim bronze bag, 5 dim crimson bags, 1 dotted olive bag.
+dotted plum bags contain 1 light black bag.
+shiny teal bags contain 3 light indigo bags.
+dotted lime bags contain 1 shiny gold bag, 3 plaid crimson bags.
+dark tan bags contain 5 faded tan bags.
+vibrant indigo bags contain 3 shiny fuchsia bags.
+light tan bags contain 4 pale yellow bags, 1 pale crimson bag, 3 light gray bags.
+drab plum bags contain 2 shiny turquoise bags, 2 vibrant yellow bags, 4 muted brown bags, 2 drab lavender bags.
+dim white bags contain 5 dark red bags, 5 dotted olive bags.
+light red bags contain 2 vibrant indigo bags, 1 wavy salmon bag, 3 dull brown bags.
+mirrored fuchsia bags contain 5 dotted tomato bags.
+mirrored indigo bags contain 5 pale lime bags, 5 light magenta bags, 4 light gray bags, 2 dull red bags.
+dim yellow bags contain 2 muted beige bags, 2 plaid olive bags, 3 faded aqua bags.
+shiny gray bags contain 1 drab yellow bag, 3 shiny lavender bags, 1 posh white bag.
+faded violet bags contain 2 bright olive bags, 5 clear gray bags, 2 dark orange bags, 1 pale magenta bag.
+mirrored black bags contain 4 clear blue bags.
+drab aqua bags contain 1 vibrant crimson bag, 4 clear fuchsia bags.
+pale black bags contain 5 pale turquoise bags, 4 striped yellow bags, 4 dotted beige bags.
+wavy cyan bags contain 1 vibrant brown bag.
+dark silver bags contain 3 light tomato bags, 5 dotted lavender bags, 3 bright turquoise bags.
+faded orange bags contain 3 clear turquoise bags, 3 mirrored gold bags, 2 plaid bronze bags, 2 dotted fuchsia bags.
+drab crimson bags contain 5 clear blue bags.
+posh magenta bags contain 1 bright violet bag, 2 dotted beige bags, 2 bright gray bags.
+posh brown bags contain 3 dim tomato bags, 1 dim chartreuse bag, 5 shiny orange bags.
+drab gray bags contain 3 striped violet bags.
+pale cyan bags contain 5 dotted aqua bags, 3 striped tomato bags.
+wavy tan bags contain 3 pale indigo bags.
+plaid brown bags contain 2 dotted indigo bags, 1 dull indigo bag, 2 light brown bags.
+vibrant beige bags contain 1 shiny teal bag, 3 vibrant cyan bags, 2 posh gray bags, 3 striped tomato bags.
+shiny aqua bags contain 2 vibrant black bags, 2 muted coral bags, 4 vibrant coral bags.
+mirrored silver bags contain 3 drab silver bags, 1 clear turquoise bag.
+pale tan bags contain 3 pale magenta bags.
+striped cyan bags contain 5 drab tomato bags.
+mirrored coral bags contain 1 mirrored crimson bag, 1 bright maroon bag.
+pale white bags contain 4 shiny beige bags, 1 shiny maroon bag, 5 dim bronze bags.
+shiny beige bags contain 3 mirrored gold bags.
+mirrored chartreuse bags contain 1 dotted tomato bag, 2 bright cyan bags.
+wavy red bags contain 1 posh lavender bag, 1 vibrant blue bag, 3 muted brown bags.
+muted chartreuse bags contain 3 dim lavender bags, 4 pale plum bags, 4 light magenta bags.
+shiny purple bags contain 4 muted green bags, 5 light white bags, 2 faded tan bags, 5 light beige bags.
+clear tan bags contain 3 dotted red bags, 1 striped violet bag, 4 plaid chartreuse bags.
+bright teal bags contain 1 faded black bag, 3 faded maroon bags.
+posh orange bags contain 5 light gold bags, 3 posh aqua bags.
+striped gray bags contain 2 bright plum bags, 2 shiny gray bags.
+dim lime bags contain 1 plaid blue bag.
+posh fuchsia bags contain 1 dull indigo bag, 2 plaid blue bags.
+dotted tomato bags contain no other bags.
+dim plum bags contain 1 dim chartreuse bag.
+dim orange bags contain 2 muted magenta bags, 5 faded aqua bags.
+posh gold bags contain 5 light maroon bags, 4 dark turquoise bags, 1 posh white bag, 5 wavy beige bags.
+striped bronze bags contain 1 dark magenta bag.
+wavy lime bags contain 4 mirrored lavender bags, 3 pale bronze bags, 1 dull white bag.
+pale magenta bags contain 2 dim crimson bags, 4 plaid plum bags, 5 muted silver bags, 2 dim yellow bags.
+striped chartreuse bags contain 5 light black bags, 3 bright fuchsia bags, 4 pale black bags.
+vibrant tan bags contain 2 dim tan bags.
+shiny crimson bags contain 5 pale beige bags, 3 clear purple bags, 2 pale violet bags, 4 dotted chartreuse bags.
+vibrant orange bags contain no other bags.
+striped silver bags contain 5 clear orange bags, 2 dotted fuchsia bags.
+clear cyan bags contain 5 muted gray bags, 3 wavy aqua bags.
+light black bags contain 1 striped yellow bag.
+muted white bags contain 3 muted tomato bags, 5 light black bags, 4 pale black bags, 5 shiny gold bags.
diff --git a/2020/inputs/day_8.txt b/2020/inputs/day_8.txt
new file mode 100644
index 0000000..5ef799e
--- /dev/null
+++ b/2020/inputs/day_8.txt
@@ -0,0 +1,626 @@
+acc +48
+nop +308
+acc +33
+acc +48
+jmp +379
+acc +27
+acc +23
+acc +29
+acc +3
+jmp +326
+acc -12
+nop +248
+nop +146
+jmp +293
+acc +8
+acc -16
+acc +18
+jmp +255
+jmp +390
+jmp +442
+acc +38
+jmp +451
+jmp +499
+acc +41
+acc +44
+nop +298
+acc +31
+jmp +337
+acc -3
+acc +34
+nop +266
+acc -19
+jmp +281
+jmp +232
+acc -9
+acc +25
+acc -8
+nop +228
+jmp +79
+jmp +58
+acc +38
+nop +318
+jmp +17
+acc +44
+jmp +298
+acc -4
+jmp +196
+jmp +249
+acc -9
+acc -3
+acc +17
+jmp +556
+jmp +1
+acc -15
+jmp +166
+acc +23
+acc +10
+acc +39
+jmp +475
+acc +28
+jmp +41
+jmp +322
+acc +48
+acc -11
+acc -13
+acc +12
+jmp +92
+jmp +1
+acc +9
+jmp -26
+acc +4
+acc -8
+nop +484
+acc -14
+jmp +526
+acc -13
+acc -2
+acc -13
+jmp +419
+acc +22
+acc -17
+jmp +1
+jmp +151
+acc +3
+acc +2
+acc -13
+acc -11
+jmp +352
+acc +24
+jmp -27
+nop +206
+acc +22
+nop +225
+jmp +360
+acc +48
+jmp +105
+jmp +80
+acc -16
+jmp +89
+acc +0
+jmp +339
+acc +37
+acc +41
+nop +156
+jmp +452
+jmp +208
+nop +60
+jmp +155
+acc -16
+jmp +274
+nop -77
+acc -16
+acc +21
+jmp +508
+acc -7
+acc -1
+jmp -83
+acc -11
+jmp +28
+acc +3
+acc +32
+acc -18
+jmp -89
+acc +4
+acc -14
+acc -1
+acc +33
+jmp -75
+nop +185
+acc +8
+acc +22
+acc +26
+jmp +164
+acc -19
+jmp +260
+jmp +174
+acc +2
+acc +34
+jmp -120
+acc -15
+acc +48
+jmp +165
+acc +5
+nop +240
+jmp -121
+jmp +114
+jmp -36
+nop +432
+jmp +1
+acc -18
+jmp +429
+acc +44
+nop +110
+jmp +198
+acc -18
+acc +32
+acc +41
+jmp +102
+nop +177
+acc +35
+acc +24
+acc +46
+jmp +121
+acc +20
+jmp +1
+jmp +407
+jmp +1
+acc +35
+acc +46
+nop -18
+jmp +6
+jmp +422
+acc -19
+jmp -85
+acc +33
+jmp -116
+nop +79
+jmp +284
+acc +3
+acc +49
+nop +317
+jmp +6
+acc +6
+jmp +295
+nop -141
+acc -4
+jmp -44
+nop +155
+acc +48
+acc -17
+jmp +188
+acc +22
+jmp +286
+nop +103
+acc -2
+acc +45
+jmp +20
+acc +21
+acc +37
+jmp +235
+jmp +42
+acc -11
+nop -15
+acc -5
+jmp +235
+jmp +178
+acc +12
+acc -15
+jmp +25
+acc +9
+acc +11
+nop +389
+acc +50
+jmp +146
+acc +26
+jmp +144
+acc -14
+jmp +304
+nop +254
+jmp +337
+jmp +17
+jmp +1
+acc +6
+acc -4
+acc +42
+jmp +117
+acc +25
+acc +50
+acc +45
+jmp -112
+acc +14
+acc +27
+jmp +347
+nop +15
+jmp +14
+acc +29
+jmp +236
+jmp -71
+acc -11
+acc +21
+nop +32
+jmp -162
+acc -15
+jmp +322
+acc -4
+acc +16
+jmp +1
+jmp +100
+jmp +1
+jmp -77
+acc +21
+nop -199
+acc +49
+acc -1
+jmp -231
+jmp +230
+acc -19
+jmp +1
+jmp -49
+jmp -11
+acc +6
+jmp -110
+jmp +331
+acc +44
+jmp +292
+acc -7
+acc -18
+acc +50
+jmp +221
+acc +33
+acc +7
+jmp -45
+jmp +342
+acc -19
+acc +36
+acc +15
+jmp -229
+nop -5
+jmp +57
+acc +26
+acc +43
+nop -175
+jmp +82
+acc +45
+jmp -161
+acc -16
+acc +35
+acc +46
+acc +43
+jmp +1
+nop +195
+acc +39
+acc +27
+acc +32
+jmp +227
+jmp -272
+nop +201
+acc +6
+acc +13
+acc +12
+jmp -177
+acc -9
+acc +46
+nop +199
+acc -1
+jmp +1
+jmp +3
+acc +42
+jmp +75
+jmp +305
+acc +49
+acc -16
+jmp -92
+acc +3
+nop +279
+jmp +54
+jmp +31
+acc +50
+jmp -125
+acc +21
+nop -178
+acc +40
+jmp +193
+acc +39
+acc -5
+jmp +261
+nop -3
+acc -13
+jmp -310
+acc +6
+acc -17
+acc +12
+acc +38
+jmp +267
+jmp -311
+acc -2
+jmp -7
+nop +77
+acc -2
+acc +39
+acc -16
+jmp +10
+nop +59
+jmp -296
+acc -4
+acc +41
+jmp -249
+acc +43
+nop +35
+jmp +95
+jmp +171
+acc +10
+nop +169
+acc -17
+jmp +47
+acc +49
+acc +38
+nop +199
+jmp +249
+jmp -53
+nop -194
+acc +19
+acc +18
+jmp -16
+acc +33
+jmp +194
+nop -194
+acc +49
+jmp +85
+acc +50
+nop -318
+acc -7
+jmp -49
+acc -6
+acc +48
+acc -13
+acc -14
+jmp +67
+acc +12
+acc +19
+acc +3
+jmp -371
+jmp -149
+acc +49
+nop -202
+jmp -315
+acc -6
+jmp -171
+acc -7
+jmp +113
+acc +34
+acc +36
+acc +17
+jmp -97
+acc +3
+jmp -244
+acc +25
+acc +30
+acc +25
+acc -19
+jmp +44
+nop +84
+jmp +124
+nop +17
+acc -11
+acc -8
+acc +4
+jmp +193
+jmp -388
+acc +36
+acc +17
+jmp +1
+acc -5
+jmp +166
+acc +39
+acc -10
+jmp -280
+acc +15
+jmp +1
+jmp -396
+jmp +113
+acc +37
+acc +13
+jmp -35
+nop +109
+acc +8
+acc +6
+acc +19
+jmp +39
+jmp +1
+jmp +1
+acc +39
+acc -14
+jmp -291
+acc +39
+acc +31
+jmp -231
+acc +41
+jmp -55
+nop -167
+jmp +105
+acc -8
+acc +34
+jmp -114
+nop +58
+jmp +1
+nop -270
+acc +31
+jmp -135
+acc +8
+acc +33
+jmp +1
+jmp -64
+acc +24
+acc +16
+jmp +117
+acc +35
+acc -11
+nop +44
+acc +18
+jmp +1
+jmp +88
+acc +29
+nop +34
+jmp +1
+nop -118
+jmp -404
+jmp -144
+acc -12
+nop -372
+acc -14
+jmp -209
+acc +12
+jmp +1
+acc -1
+jmp +132
+nop -93
+jmp -130
+acc +23
+acc +30
+acc +3
+jmp -209
+nop -381
+acc -19
+jmp +23
+nop +87
+jmp -277
+acc +39
+jmp -391
+acc +14
+acc +18
+acc +24
+nop -459
+jmp -267
+acc +35
+nop +84
+jmp -231
+acc +5
+acc +0
+acc +45
+jmp -210
+jmp -211
+acc +7
+acc +8
+nop -249
+jmp -8
+jmp -105
+nop -455
+acc -19
+acc +36
+jmp -368
+acc +33
+acc +10
+acc +9
+jmp -259
+nop +41
+acc -14
+acc +2
+jmp -336
+acc +46
+jmp -261
+nop -284
+acc +21
+nop -154
+jmp -485
+jmp -505
+acc +32
+nop -327
+acc +1
+nop +43
+jmp -23
+acc -7
+jmp -88
+acc +10
+jmp -440
+acc +12
+jmp -430
+jmp +1
+acc +46
+nop -105
+jmp -87
+acc +49
+acc -10
+acc -6
+jmp -411
+jmp -268
+acc +35
+acc +15
+jmp +45
+acc -14
+acc +0
+jmp -234
+nop -67
+acc +32
+acc +1
+jmp -476
+jmp -297
+nop -274
+jmp -435
+acc +36
+acc -2
+acc +33
+acc +9
+jmp -26
+jmp +50
+acc +23
+jmp -172
+jmp +1
+acc +34
+acc +32
+acc -4
+jmp -312
+acc -11
+acc +26
+jmp -150
+acc +41
+nop -79
+acc +25
+jmp -76
+acc -2
+acc +29
+acc +12
+jmp -549
+nop -357
+nop -438
+jmp -320
+acc +7
+acc -6
+jmp -149
+nop -74
+acc +7
+acc +45
+jmp -383
+acc -8
+acc +5
+acc +12
+jmp -463
+acc -17
+acc +5
+jmp -34
+jmp +1
+acc +18
+jmp -523
+acc +38
+acc +35
+nop -222
+jmp -424
+nop -365
+jmp -188
+acc +0
+acc +7
+nop -167
+acc +27
+jmp -351
+acc +26
+jmp -201
+nop -208
+nop -466
+acc +50
+nop -531
+jmp -273
+acc +21
+acc +25
+nop -397
+acc +29
+jmp +1
diff --git a/2020/inputs/day_9.txt b/2020/inputs/day_9.txt
new file mode 100644
index 0000000..31690cc
--- /dev/null
+++ b/2020/inputs/day_9.txt
@@ -0,0 +1,1000 @@
+37
+7
+16
+34
+48
+24
+5
+40
+30
+35
+2
+45
+19
+33
+36
+49
+32
+1
+44
+21
+25
+3
+11
+38
+15
+4
+6
+7
+8
+16
+9
+10
+5
+12
+13
+17
+14
+35
+18
+19
+20
+23
+36
+53
+22
+21
+41
+28
+11
+24
+15
+25
+26
+27
+29
+64
+50
+31
+30
+34
+32
+44
+33
+47
+74
+35
+66
+37
+36
+38
+45
+39
+40
+41
+42
+57
+51
+55
+68
+70
+71
+72
+61
+88
+65
+75
+140
+77
+73
+82
+110
+81
+74
+116
+86
+80
+112
+83
+92
+128
+141
+106
+120
+146
+126
+147
+133
+134
+138
+139
+156
+209
+162
+160
+154
+155
+233
+216
+163
+313
+298
+273
+189
+198
+226
+253
+232
+265
+259
+260
+316
+267
+272
+277
+449
+428
+314
+309
+471
+318
+379
+430
+458
+387
+683
+475
+415
+421
+486
+525
+544
+575
+532
+519
+632
+539
+590
+739
+586
+623
+627
+688
+696
+697
+804
+1072
+1119
+940
+808
+896
+836
+990
+907
+1107
+1436
+1114
+1129
+1051
+1058
+1754
+1385
+1644
+1459
+1250
+2686
+1324
+2442
+1504
+1501
+1612
+1704
+1915
+1715
+1732
+1826
+1897
+2048
+2431
+2109
+3004
+2165
+2825
+2301
+3039
+2862
+3145
+2574
+2709
+2751
+3447
+4043
+3005
+4198
+3113
+3612
+4910
+3629
+3541
+4306
+4157
+4466
+4349
+4274
+5113
+5027
+5446
+6186
+7889
+8522
+5436
+5854
+5283
+5864
+6292
+6118
+6546
+6617
+6742
+6654
+7241
+7170
+7698
+8431
+11231
+8506
+8623
+9301
+9387
+10140
+10310
+12518
+11137
+10719
+11147
+11290
+11401
+11575
+12156
+12410
+12664
+16757
+13271
+13396
+19611
+14411
+14868
+17129
+16937
+29793
+17807
+17924
+18688
+27532
+23665
+21029
+21866
+23954
+22009
+22976
+30217
+34022
+25986
+27807
+29601
+30400
+26667
+27682
+28264
+40602
+29279
+31805
+34066
+41472
+45606
+41589
+47696
+48711
+55214
+43038
+57543
+69154
+45963
+77223
+66588
+68866
+55265
+115299
+58207
+54349
+95816
+68284
+62330
+115750
+61084
+100312
+90012
+116995
+100820
+84627
+139841
+94674
+89001
+97387
+98303
+190490
+178080
+109614
+112556
+113472
+115433
+116349
+225364
+116679
+122633
+194241
+123414
+145711
+158471
+150085
+173628
+268085
+179301
+198099
+182014
+183675
+186388
+391499
+207001
+207917
+222170
+223086
+229235
+323350
+228905
+530351
+233028
+239312
+262390
+304647
+308556
+389397
+295796
+344859
+415293
+352929
+380113
+430087
+405100
+365689
+370063
+393389
+545520
+431003
+530726
+445256
+456114
+462263
+533552
+524701
+472340
+846296
+535108
+674245
+763452
+604352
+640655
+758059
+697788
+718618
+733042
+1129053
+759078
+838645
+876259
+824392
+918090
+887117
+893266
+907519
+901370
+1591316
+934603
+1469711
+1359500
+1742482
+1139460
+1175763
+1245007
+1302140
+1362411
+1338443
+1571687
+1416406
+1963852
+1557434
+1583470
+1597723
+1663037
+1769525
+2032726
+1780383
+1827869
+3212193
+1808889
+2351009
+2908044
+2538174
+2384467
+3385303
+3352070
+2315223
+2420770
+2547147
+2640583
+2778817
+3886910
+2973840
+2999876
+4336251
+3140904
+3181193
+5009062
+4606686
+4229659
+5601963
+3589272
+3636758
+4124112
+4159898
+4666232
+4699690
+4735993
+4805237
+6183905
+4862370
+4955806
+4967917
+5187730
+5419400
+7370563
+5973716
+6589148
+7226030
+6322097
+10580402
+6817951
+7713384
+11509827
+7749170
+7760870
+7796656
+8824488
+8860105
+8895891
+10281770
+12554407
+15536208
+9667607
+16645061
+13548127
+9923723
+13692660
+10607130
+22222014
+12295813
+14531335
+12911245
+20092469
+19476293
+14567121
+15678056
+15462554
+15510040
+18356300
+30972594
+19141875
+34623804
+17755996
+18563498
+19591330
+25386277
+20274737
+20530853
+27240787
+22902943
+22219536
+30198460
+30667241
+25207058
+26827148
+27442580
+43742577
+32323117
+30029675
+34158451
+33218550
+33266036
+33866340
+36112296
+37347326
+36319494
+52721949
+44977607
+38154828
+39866067
+40805590
+42494273
+43433796
+68014567
+45122479
+55485572
+58425608
+52034206
+52649638
+76652724
+57472255
+128686930
+95216222
+73666820
+66484586
+67084890
+69378332
+91338595
+72431790
+137710495
+74474322
+78020895
+127917362
+84988546
+84239386
+83299863
+85928069
+111607065
+132899930
+135078332
+186342970
+104683844
+109506461
+110121893
+123956841
+124557145
+161700808
+256917030
+186081387
+146906112
+136463222
+141810122
+150452685
+158713708
+207374252
+157774185
+167539249
+168288409
+193421756
+169227932
+269381250
+197535134
+229240989
+214190305
+244584793
+214805737
+219628354
+177777905
+246585115
+286915907
+261020367
+278273344
+311038054
+335827658
+283369334
+292262807
+360961005
+396780238
+437669659
+325313434
+365074383
+448869343
+361710165
+347005837
+608295280
+392583642
+422362698
+391968210
+397406259
+424363020
+456051249
+503091339
+461147239
+893720908
+561642678
+589311398
+570536151
+675337544
+619196992
+575632141
+639268644
+707966842
+708716002
+672319271
+687023599
+821769279
+754293807
+738974047
+739589479
+1483032306
+1031683390
+789374469
+1036779380
+1233961949
+880414269
+1133466510
+964238578
+1022789917
+1809594090
+2272406775
+1164943539
+1209804795
+1214900785
+1194829133
+1247951412
+1461693740
+1359342870
+1791073187
+1411908750
+1651262177
+1478563526
+1493883286
+1821057859
+1776368859
+1753613047
+1954318008
+2156256427
+1844652847
+1903204186
+3010605047
+1987028495
+2129182117
+2187733456
+3196833290
+3284956473
+2359772672
+2404633928
+2409729918
+2442780545
+2607294282
+2771251620
+2837906396
+3920255304
+2905792036
+3747857033
+3323216373
+3247496333
+4630514001
+4802553217
+3598265894
+4510498468
+4307838114
+3831681342
+4174761951
+4116210612
+7346122927
+4316915573
+4597463374
+5652130261
+4847414473
+4764406600
+6236315270
+5050074827
+5214032165
+7618666093
+6369517514
+8918763829
+6153288369
+6229008409
+6570712706
+6921482267
+7422258284
+7714476506
+7906104008
+7915181467
+8148596915
+11663038500
+8679095815
+8290972563
+8433126185
+8914378947
+9081322173
+11168176080
+9611821073
+13362629080
+9814481427
+10264106992
+11203363196
+12382296778
+14284698981
+12522805883
+12724001075
+16834819698
+23726169079
+13492194973
+17995701120
+15136734790
+15620580514
+15821285475
+22196778205
+16439569478
+16724098748
+23306676400
+17514448358
+17347505132
+18728860374
+18693143246
+19426302500
+19875928065
+21467470188
+21017844623
+32651183148
+24905102661
+28002877292
+31949108383
+31860833538
+40450267827
+29313480448
+28628929763
+38018063680
+33616281634
+34238547106
+31441865989
+59143411073
+33163668226
+36040648378
+34071603880
+48956314347
+36243308732
+60070795752
+49020721915
+55083751822
+39302230565
+40893772688
+70744096554
+45922947284
+52907979953
+54218583109
+59951985675
+63385084328
+57942410211
+62477148674
+93101815502
+61792597989
+65680413095
+64605534215
+93919014663
+67235272106
+69204316604
+69406976958
+70112252258
+70314912612
+75545539297
+110813319904
+88322952480
+80196003253
+150800101154
+118824117324
+110098089292
+98830927237
+100141530393
+112160993320
+114170568784
+129027870095
+157729929438
+199136272384
+124269746663
+186062344652
+127473011084
+130285947310
+133809850819
+136439588710
+183374885388
+138611293562
+139519229216
+250332549120
+194366572037
+204465749916
+316348291962
+168518955733
+210481950563
+314563839208
+232640778056
+238752823955
+198972457630
+212302523713
+250610157494
+438833585871
+251742757747
+266992240300
+266084304646
+705825826171
+257758958394
+270249439529
+264095798129
+272421144381
+404848522600
+441133843782
+278130522778
+308038184949
+362885527770
+367491413363
+379000906296
+380821479446
+502352915241
+409454408193
+411274981343
+431613235686
+437725281585
+478386828359
+484723668094
+633575718009
+509501716141
+703809586231
+523843263040
+852408825125
+521854756523
+528008397923
+534345237658
+766448713370
+653242623827
+778766394706
+586168707727
+641016050548
+688859664395
+730376941133
+869844328604
+889661809702
+790275887639
+820729389536
+841067643879
+842888217029
+955456498726
+1110011970767
+1070892375821
+1573265158162
+1227184758275
+1031356472664
+1056199994181
+1045698019563
+1252231697656
+1162870807071
+1169024448471
+1264722178791
+1479135552034
+1239411331554
+1275028372122
+1427236351606
+1510860379152
+2589147522801
+2054998066430
+2180904346588
+1611005277175
+1631343531518
+1776185888262
+1683955860908
+1798344715755
+2077054492227
+2087556466845
+2116590395384
+3761010353135
+2101898013744
+2194227279735
+2208568826634
+2402282138625
+3878083902006
+2331895255542
+4408949747769
+3458949458526
+2514439703676
+2666647683160
+2702264723728
+2938096730758
+3121865656327
+3460141749170
+3242348808693
+4325159222018
+5090292990044
+3315299392426
+3482300576663
+5330434482961
+3992571995490
+4631030099060
+6603177027504
+4218488409128
+4296125293479
+6148948259823
+4402796106369
+6364214465020
+5884582715288
+4846334959218
+4998542938702
+5181087386836
+6017564116154
+5216704427404
+9033826205429
+5640361454486
+8698921399848
+6582007405497
+6557648201119
+9936627949262
+7718095498795
+9199882107714
+7307871387916
+9961464582021
+8838906954708
+10215247366106
+9477365058278
+8514613702607
+20151875315368
+9142460252697
+9401339045071
+9583883493205
+15142551968857
+19249073571535
+11234268543558
+10179630325538
+10397791814240
+15983346450568
+26198593816674
+12198009655605
+12948232842402
+15781889513211
+15724467658194
+13865519589035
+15025966886711
+17679560080816
+15822485090523
+16146778342624
+25939715024300
+30924441482068
+24924349765908
+17657073955304
+18098497195812
+18543799297768
+28913828624374
+18985222538276
+19763513818743
+20577422139778
+31707814108762
+21413898869096
+34325688810979
+27922477313799
+25146242498007
+38256982220594
+32409318886803
+31545079669851
+28891486475746
+53838178390282
+29688004679558
+30848451977234
+39957698166864
+50472467153603
+33803852297928
+68570964349415
+57805315100120
+37083719734088
+35755571151116
+36642296493580
+63239517435353
+38748736357019
+66735007697782
+44909756316750
+79219213969216
+46560141367103
+49336376182895
+57555561384810
+64647057626862
+78706434523883
+115861510462796
+62097323566361
+114974785120332
+78227862658641
+60536456656792
+66771724413646
diff --git a/2020/src/bin/day_1.rs b/2020/src/bin/day_1.rs
new file mode 100644
index 0000000..68a570c
--- /dev/null
+++ b/2020/src/bin/day_1.rs
@@ -0,0 +1,83 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("mark")
+ .add_system_to_stage("mark", mark_sum_pair.system())
+ .add_system_to_stage("mark", mark_sum_triple.system())
+ .add_stage("report")
+ .add_system_to_stage("report", print_product_pair.system())
+ .add_system_to_stage("report", print_product_triple.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Expense(i32);
+struct FlaggedPair;
+struct FlaggedTriple;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_1.txt").unwrap(); // TODO: Error handling on systems?
+ for line in BufReader::new(f).lines() {
+ let expense = line.unwrap().trim().parse().unwrap();
+ commands.spawn((Expense(expense),));
+ }
+}
+
+fn mark_sum_pair(mut commands: Commands, expenses: Query<(Entity, &Expense)>) {
+ for (entity_1, expense_1) in expenses.iter() {
+ for (entity_2, expense_2) in expenses.iter() {
+ if expense_1.0 + expense_2.0 == 2020 {
+ commands.insert_one(entity_1, FlaggedPair);
+ commands.insert_one(entity_2, FlaggedPair);
+ }
+ }
+ }
+}
+
+fn mark_sum_triple(mut commands: Commands, expenses: Query<(Entity, &Expense)>) {
+ for (entity_1, expense_1) in expenses.iter() {
+ for (entity_2, expense_2) in expenses.iter() {
+ for (entity_3, expense_3) in expenses.iter() {
+ if expense_1.0 + expense_2.0 + expense_3.0 == 2020 {
+ commands.insert_one(entity_1, FlaggedTriple);
+ commands.insert_one(entity_2, FlaggedTriple);
+ commands.insert_one(entity_3, FlaggedTriple);
+ }
+ }
+ }
+ }
+}
+
+fn print_product_pair(flagged_expenses: Query<With<FlaggedPair, &Expense>>) {
+ let mut product = 1;
+ for expense in flagged_expenses.iter() {
+ product *= expense.0;
+ }
+ // TODO: Put it on the screen!
+ println!("Product Pair: {}", product);
+}
+
+fn print_product_triple(flagged_expenses: Query<With<FlaggedTriple, &Expense>>) {
+ let mut product = 1;
+ for expense in flagged_expenses.iter() {
+ product *= expense.0;
+ }
+ // TODO: Put it on the screen!
+ println!("Product Triple: {}", product);
+}
diff --git a/2020/src/bin/day_10.rs b/2020/src/bin/day_10.rs
new file mode 100644
index 0000000..7ef4fa2
--- /dev/null
+++ b/2020/src/bin/day_10.rs
@@ -0,0 +1,124 @@
+use bevy::{app::AppExit, prelude::*};
+use std::io::{BufRead, BufReader};
+use std::{collections::BTreeMap, fs::File};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_startup_stage("differences")
+ .add_startup_system_to_stage("differences", add_min_differences.system())
+ .add_startup_system_to_stage("differences", add_all_differences.system())
+ .add_startup_stage("report")
+ .add_startup_system_to_stage("report", print_difference_stats.system())
+ .add_system(add_next_paths_to_end_sum.system())
+ .add_system(report_full_paths_to_end.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, PartialOrd, Ord)]
+struct MinJoltDiff(i64);
+#[derive(Clone)]
+struct NextJolts(Vec<Entity>);
+struct Jolts(i64);
+struct PathsToEnd(u64);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_10.txt").unwrap();
+
+ commands.spawn((Jolts(0),));
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ let num = line.parse().unwrap();
+
+ commands.spawn((Jolts(num),));
+ }
+}
+
+fn add_min_differences(
+ mut commands: Commands,
+ jolts_query: Query<(Entity, &Jolts, Option<&MinJoltDiff>)>,
+) {
+ for (entity, jolts, jolt_diff) in jolts_query.iter() {
+ if jolt_diff.is_none() {
+ let min_increase = jolts_query
+ .iter()
+ .map(|(_, other_jolts, _)| other_jolts)
+ .filter(|other_jolts| other_jolts.0 > jolts.0)
+ .map(|other_jolts| MinJoltDiff(other_jolts.0 - jolts.0))
+ .min()
+ .unwrap_or(MinJoltDiff(3));
+ commands.insert_one(entity, min_increase);
+ }
+ }
+}
+
+fn add_all_differences(mut commands: Commands, jolts_query: Query<(Entity, &Jolts)>) {
+ for (entity, jolts) in jolts_query.iter() {
+ let next_entities = jolts_query
+ .iter()
+ .filter(|(_, other_jolts)| other_jolts.0 > jolts.0 && other_jolts.0 - jolts.0 <= 3)
+ .map(|(other_entity, _)| other_entity)
+ .collect();
+ commands.insert_one(entity, NextJolts(next_entities));
+ }
+}
+
+fn print_difference_stats(diffs: Query<&MinJoltDiff>) {
+ let mut buckets: BTreeMap<i64, usize> = BTreeMap::new();
+ for diff in diffs.iter() {
+ *buckets.entry(diff.0).or_insert(0) += 1;
+ }
+ println!("Buckets: {:?}", buckets);
+
+ println!(
+ "Bucket 1 * Bucket 3: {}",
+ buckets.get(&1).unwrap_or(&0) * buckets.get(&3).unwrap_or(&0)
+ );
+}
+
+fn add_next_paths_to_end_sum(
+ mut commands: Commands,
+ potential_to_add: Query<Without<PathsToEnd, (Entity, &NextJolts)>>,
+ already_added: Query<&PathsToEnd>,
+) {
+ for (entity, next) in potential_to_add.iter() {
+ if next.0.is_empty() {
+ commands.insert_one(entity, PathsToEnd(1));
+ } else {
+ let next_paths: Result<Vec<&PathsToEnd>, _> = next
+ .0
+ .iter()
+ .map(|next_entity| already_added.get(*next_entity))
+ .collect();
+ if let Ok(next_paths) = next_paths {
+ let sum = next_paths.iter().map(|paths| paths.0).sum();
+ commands.insert_one(entity, PathsToEnd(sum));
+ }
+ }
+ }
+}
+
+fn report_full_paths_to_end(
+ mut exit_events: ResMut<Events<AppExit>>,
+ jolts: &Jolts,
+ paths: &PathsToEnd,
+) {
+ if jolts.0 == 0 {
+ println!("Paths from the start to the end: {}", paths.0);
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_11.rs b/2020/src/bin/day_11.rs
new file mode 100644
index 0000000..82bb282
--- /dev/null
+++ b/2020/src/bin/day_11.rs
@@ -0,0 +1,209 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_event::<AdjacentStableEvent>()
+ .add_event::<LineOfSightStableEvent>()
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(iterate_adjacent_seats.system())
+ .add_system(iterate_line_of_sight_seats.system())
+ .add_system(report_adjacent_done.system())
+ .add_system(report_line_of_sight_done.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, Clone, Copy)]
+struct Position {
+ x: i32,
+ y: i32,
+}
+impl Position {
+ fn distance(&self, other: &Position) -> i32 {
+ (self.x - other.x).abs().max((self.y - other.y).abs())
+ }
+}
+impl std::ops::Add<&Position> for Position {
+ type Output = Position;
+ fn add(self, other: &Position) -> Self::Output {
+ Position {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ }
+ }
+}
+
+struct AdjacentSeat {
+ occupied: bool,
+}
+struct LineOfSightSeat {
+ occupied: bool,
+}
+
+struct AdjacentStableEvent;
+struct LineOfSightStableEvent;
+
+#[derive(Default)]
+struct Bounds {
+ min_x: i32,
+ max_x: i32,
+ min_y: i32,
+ max_y: i32,
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_11.txt").unwrap();
+ let mut bounds = Bounds::default();
+
+ for (y, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.unwrap();
+ let line = line.trim();
+ for (x, c) in line.chars().enumerate() {
+ if c == 'L' {
+ commands.spawn((
+ Position {
+ x: x as i32,
+ y: y as i32,
+ },
+ AdjacentSeat { occupied: false },
+ LineOfSightSeat { occupied: false },
+ ));
+ }
+ bounds.max_x = x as i32;
+ }
+
+ bounds.max_y = y as i32;
+ }
+ commands.insert_resource(bounds);
+}
+
+fn iterate_adjacent_seats(
+ mut commands: Commands,
+ mut stable_events: ResMut<Events<AdjacentStableEvent>>,
+ seats: Query<(Entity, &Position, &AdjacentSeat)>,
+) {
+ let mut changes: Vec<(Entity, AdjacentSeat)> = Vec::new();
+ for (entity, position, seat) in seats.iter() {
+ let surrounding_count = seats
+ .iter()
+ .filter(|(_, other_position, other_seat)| {
+ other_seat.occupied && position.distance(other_position) == 1
+ })
+ .count();
+ let change = if !seat.occupied && surrounding_count == 0 {
+ Some(true)
+ } else if seat.occupied && surrounding_count >= 4 {
+ Some(false)
+ } else {
+ None
+ };
+ if let Some(occupied) = change {
+ changes.push((entity, AdjacentSeat { occupied }));
+ }
+ }
+ if changes.is_empty() {
+ stable_events.send(AdjacentStableEvent);
+ }
+
+ for (entity, seat) in changes {
+ commands.insert_one(entity, seat);
+ }
+}
+
+fn iterate_line_of_sight_seats(
+ mut commands: Commands,
+ mut stable_events: ResMut<Events<LineOfSightStableEvent>>,
+ bounds: Res<Bounds>,
+ seats: Query<(Entity, &Position, &LineOfSightSeat)>,
+) {
+ let dir_vectors = [
+ Position { x: -1, y: 0 },
+ Position { x: -1, y: -1 },
+ Position { x: 0, y: -1 },
+ Position { x: 1, y: -1 },
+ Position { x: 1, y: 0 },
+ Position { x: 1, y: 1 },
+ Position { x: 0, y: 1 },
+ Position { x: -1, y: 1 },
+ ];
+
+ let mut changes: Vec<(Entity, LineOfSightSeat)> = Vec::new();
+ for (entity, position, seat) in seats.iter() {
+ let mut surrounding_count = 0;
+ for vec in dir_vectors.iter() {
+ let mut check = position.clone();
+ while check.x >= bounds.min_x
+ && check.x <= bounds.max_x
+ && check.y >= bounds.min_y
+ && check.y <= bounds.max_y
+ {
+ check = check + vec;
+ if let Some((_, _, other_seat)) =
+ seats.iter().find(|(_, other_pos, _)| other_pos == &&check)
+ {
+ if other_seat.occupied {
+ surrounding_count += 1;
+ }
+ break;
+ }
+ }
+ }
+
+ let change = if !seat.occupied && surrounding_count == 0 {
+ Some(true)
+ } else if seat.occupied && surrounding_count >= 5 {
+ Some(false)
+ } else {
+ None
+ };
+ if let Some(occupied) = change {
+ changes.push((entity, LineOfSightSeat { occupied }));
+ }
+ }
+ if changes.is_empty() {
+ stable_events.send(LineOfSightStableEvent);
+ }
+
+ for (entity, seat) in changes {
+ commands.insert_one(entity, seat);
+ }
+}
+
+fn report_adjacent_done(
+ stable_events: Res<Events<AdjacentStableEvent>>,
+ mut stable_event_reader: Local<EventReader<AdjacentStableEvent>>,
+ seats: Query<&AdjacentSeat>,
+) {
+ for _ in stable_event_reader.iter(&stable_events) {
+ let occupied = seats.iter().filter(|s| s.occupied).count();
+ println!("{} seats end up occupied in the adjacent model", occupied);
+ }
+}
+
+fn report_line_of_sight_done(
+ stable_events: Res<Events<LineOfSightStableEvent>>,
+ mut stable_event_reader: Local<EventReader<LineOfSightStableEvent>>,
+ seats: Query<&LineOfSightSeat>,
+) {
+ for _ in stable_event_reader.iter(&stable_events) {
+ let occupied = seats.iter().filter(|s| s.occupied).count();
+ println!(
+ "{} seats end up occupied in the line of sight model",
+ occupied
+ );
+ }
+}
diff --git a/2020/src/bin/day_12.rs b/2020/src/bin/day_12.rs
new file mode 100644
index 0000000..489cdca
--- /dev/null
+++ b/2020/src/bin/day_12.rs
@@ -0,0 +1,233 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::ops::Deref;
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(move_normal_ship.system())
+ .add_system(move_waypoint_ship.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, Clone, Copy)]
+struct Position {
+ x: i64,
+ y: i64,
+}
+impl Position {
+ fn manhattan_distance(&self, other: &Position) -> i64 {
+ (self.x - other.x).abs() + (self.y - other.y).abs()
+ }
+}
+impl std::ops::Add<&Position> for &Position {
+ type Output = Position;
+ fn add(self, other: &Position) -> Self::Output {
+ Position {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ }
+ }
+}
+impl std::ops::Mul<i64> for Position {
+ type Output = Position;
+ fn mul(self, other: i64) -> Self::Output {
+ Position {
+ x: self.x * other,
+ y: self.y * other,
+ }
+ }
+}
+
+enum Facing {
+ North,
+ South,
+ East,
+ West,
+}
+impl Facing {
+ fn right(&mut self) {
+ use Facing::*;
+ *self = match self {
+ North => East,
+ East => South,
+ South => West,
+ West => North,
+ }
+ }
+
+ fn reverse(&mut self) {
+ self.right();
+ self.right();
+ }
+
+ fn left(&mut self) {
+ self.reverse();
+ self.right();
+ }
+}
+
+struct Instructions(Vec<Instruction>);
+#[derive(Clone)]
+enum Instruction {
+ North(i64),
+ South(i64),
+ East(i64),
+ West(i64),
+ Left(i64),
+ Right(i64),
+ Forward(i64),
+}
+
+struct InstructionPointer(usize);
+
+struct Waypoint(Position);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_12.txt").unwrap();
+
+ let instructions: Vec<Instruction> = BufReader::new(f)
+ .lines()
+ .map(|line| {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let val: i64 = line[1..].parse().unwrap();
+ let instruction = match line.chars().next().unwrap() {
+ 'N' => Instruction::North(val),
+ 'S' => Instruction::South(val),
+ 'E' => Instruction::East(val),
+ 'W' => Instruction::West(val),
+ 'L' => Instruction::Left(val),
+ 'R' => Instruction::Right(val),
+ 'F' => Instruction::Forward(val),
+ other => panic!("Unknown instruction: {}", other),
+ };
+ instruction
+ })
+ .collect();
+
+ commands.spawn((
+ Instructions(instructions.clone()),
+ InstructionPointer(0),
+ Facing::East,
+ Position { x: 0, y: 0 },
+ ));
+
+ commands.spawn((
+ Waypoint(Position { x: 10, y: 1 }),
+ Instructions(instructions),
+ InstructionPointer(0),
+ Position { x: 0, y: 0 },
+ ));
+}
+
+fn move_normal_ship(
+ mut q: Query<
+ Without<
+ Waypoint,
+ (
+ &Instructions,
+ &mut InstructionPointer,
+ &mut Facing,
+ &mut Position,
+ ),
+ >,
+ >,
+) {
+ for (instructions, mut instruction_pointer, mut facing, mut position) in q.iter_mut() {
+ if let Some(instruction) = instructions.0.get(instruction_pointer.0) {
+ use Instruction::*;
+ match instruction {
+ North(val) => position.y += val,
+ South(val) => position.y -= val,
+ East(val) => position.x += val,
+ West(val) => position.x -= val,
+ Left(90) | Right(270) => facing.left(),
+ Left(180) | Right(180) => facing.reverse(),
+ Left(270) | Right(90) => facing.right(),
+ Left(val) | Right(val) => panic!("Unknown left/right val: {}", val),
+ Forward(val) => match facing.deref() {
+ Facing::North => position.y += val,
+ Facing::South => position.y -= val,
+ Facing::East => position.x += val,
+ Facing::West => position.x -= val,
+ },
+ };
+
+ instruction_pointer.0 += 1;
+ } else {
+ println!(
+ "Normal Ship at destination: {} x {}, Manhattan distance: {}",
+ position.x,
+ position.y,
+ position.manhattan_distance(&Position { x: 0, y: 0 })
+ );
+ }
+ }
+}
+
+fn move_waypoint_ship(
+ instructions: &Instructions,
+ mut waypoint: Mut<Waypoint>,
+ mut instruction_pointer: Mut<InstructionPointer>,
+ mut position: Mut<Position>,
+) {
+ if let Some(instruction) = instructions.0.get(instruction_pointer.0) {
+ use Instruction::*;
+ match instruction {
+ North(val) => waypoint.0.y += val,
+ South(val) => waypoint.0.y -= val,
+ East(val) => waypoint.0.x += val,
+ West(val) => waypoint.0.x -= val,
+ Left(90) | Right(270) => {
+ waypoint.0 = Position {
+ x: -waypoint.0.y,
+ y: waypoint.0.x,
+ }
+ }
+ Left(180) | Right(180) => {
+ waypoint.0 = Position {
+ x: -waypoint.0.x,
+ y: -waypoint.0.y,
+ }
+ }
+ Left(270) | Right(90) => {
+ waypoint.0 = Position {
+ x: waypoint.0.y,
+ y: -waypoint.0.x,
+ }
+ }
+ Left(val) | Right(val) => panic!("Unknown left/right val: {}", val),
+ Forward(val) => *position = position.deref() + &(waypoint.0 * *val),
+ };
+
+ // println!(
+ // "Position: {} x {}. Waypoint: {} x {}",
+ // position.x, position.y, waypoint.0.x, waypoint.0.y
+ // );
+
+ instruction_pointer.0 += 1;
+ } else {
+ println!(
+ "Waypoint Ship at destination: {} x {}, Manhattan distance: {}",
+ position.x,
+ position.y,
+ position.manhattan_distance(&Position { x: 0, y: 0 })
+ );
+ }
+}
diff --git a/2020/src/bin/day_2.rs b/2020/src/bin/day_2.rs
new file mode 100644
index 0000000..6c26647
--- /dev/null
+++ b/2020/src/bin/day_2.rs
@@ -0,0 +1,104 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("mark")
+ .add_system_to_stage("mark", validate_sled_passwords.system())
+ .add_system_to_stage("mark", validate_toboggan_passwords.system())
+ .add_stage("report")
+ .add_system_to_stage("report", count_valid_sled_passwords.system())
+ .add_system_to_stage("report", count_valid_toboggan_passwords.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct PasswordRule {
+ num_1: usize,
+ num_2: usize,
+ c: char,
+}
+struct Password(String);
+struct SledPasswordValidation(bool);
+struct TobogganPasswordValidation(bool);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_2.txt").expect("Failed to read file"); // TODO: Use the asset loading system to load this rather?
+ for line in BufReader::new(f).lines() {
+ let line = line.expect("Error reading file");
+ let line = line.trim();
+ let mut parts = line.split_whitespace();
+ let range = parts.next().expect("File was missing a range");
+ let chars = parts.next().expect("File was missing chars");
+ let password = parts.next().expect("File was missing a password");
+
+ let mut range_parts = range.split('-');
+
+ let rule = PasswordRule {
+ num_1: range_parts
+ .next()
+ .expect("Range did not have a minimum")
+ .parse()
+ .expect("Minimum was not a number"),
+ num_2: range_parts
+ .next()
+ .expect("Range did not have a maximum")
+ .parse()
+ .expect("Maximum was not a number"),
+ c: chars.chars().next().expect("File was missing chars"),
+ };
+ let password = Password(password.to_owned());
+
+ commands.spawn((rule, password));
+ }
+}
+
+fn validate_sled_passwords(
+ mut commands: Commands,
+ passwords: Query<Without<SledPasswordValidation, (Entity, &PasswordRule, &Password)>>,
+) {
+ for (entity, rule, password) in passwords.iter() {
+ let actual = password.0.chars().filter(|c| c == &rule.c).count();
+ let valid = actual >= rule.num_1 && actual <= rule.num_2;
+ commands.insert_one(entity, SledPasswordValidation(valid));
+ }
+}
+
+fn validate_toboggan_passwords(
+ mut commands: Commands,
+ passwords: Query<Without<TobogganPasswordValidation, (Entity, &PasswordRule, &Password)>>,
+) {
+ for (entity, rule, password) in passwords.iter() {
+ let actual_1 = password.0.chars().nth(rule.num_1 - 1);
+ let actual_2 = password.0.chars().nth(rule.num_2 - 1);
+ let actual_1_match = actual_1.map_or(false, |c| c == rule.c);
+ let actual_2_match = actual_2.map_or(false, |c| c == rule.c);
+
+ let valid = actual_1_match != actual_2_match;
+ commands.insert_one(entity, TobogganPasswordValidation(valid));
+ }
+}
+
+fn count_valid_sled_passwords(validation: Query<&SledPasswordValidation>) {
+ let count = validation.iter().filter(|v| v.0).count();
+ println!("Valid Sled Passwords: {}", count);
+}
+
+fn count_valid_toboggan_passwords(validation: Query<&TobogganPasswordValidation>) {
+ let count = validation.iter().filter(|v| v.0).count();
+ println!("Valid Toboggan Passwords: {}", count);
+}
diff --git a/2020/src/bin/day_3.rs b/2020/src/bin/day_3.rs
new file mode 100644
index 0000000..5e6f0bd
--- /dev/null
+++ b/2020/src/bin/day_3.rs
@@ -0,0 +1,205 @@
+use bevy::app::AppExit;
+use bevy::prelude::*;
+use bevy::render::camera::Camera;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_stage("game_entities")
+ .add_startup_system_to_stage("game_entities", read_input_file.system())
+ .add_system(move_tobogganist.system())
+ .add_system(collide_with_trees.system())
+ .add_system(clear_finished_tobogganists.system())
+ .add_system(end_of_slope.system())
+ .add_system(translate_positions.system())
+ .add_system(tobogganist_cam.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands, mut materials: ResMut<Assets<ColorMaterial>>) {
+ commands.spawn(Camera2dComponents::default());
+
+ commands.insert_resource(Materials {
+ tobogganist_material: materials.add(Color::rgb(0., 0., 255.).into()),
+ tree_material: materials.add(Color::rgb(0., 255., 0.).into()),
+ });
+}
+
+struct Materials {
+ tobogganist_material: Handle<ColorMaterial>,
+ tree_material: Handle<ColorMaterial>,
+}
+
+struct Tobogganist;
+
+struct Tree;
+#[derive(PartialEq, Eq)]
+struct Position {
+ x: usize,
+ y: usize,
+}
+struct Velocity {
+ x: usize,
+ y: usize,
+}
+struct MapSize {
+ width: usize,
+ height: usize,
+}
+struct TreeHitCount(usize);
+struct Score(usize);
+
+fn read_input_file(mut commands: Commands, materials: Res<Materials>) {
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 1, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 3, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 5, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 7, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 1, y: 2 })
+ .with(TreeHitCount(0));
+
+ let f = File::open("./inputs/day_3.txt").expect("Failed to read file"); // TODO: Use the asset loading system to load this rather?
+ let mut width = 0;
+ let mut height = 0;
+ for (y, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.expect("Error reading file");
+ let line = line.trim();
+ width = width.max(line.len());
+ for (x, c) in line.chars().enumerate() {
+ if c == '#' {
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tree_material.clone(),
+ ..Default::default()
+ })
+ .with(Tree)
+ .with(Position { x, y })
+ .with(TreeHitCount(0));
+ }
+ }
+ height = y + 1;
+ }
+ commands.insert_resource(MapSize { width, height });
+ commands.insert_resource(Score(1));
+}
+
+fn translate_positions(mut transform: Mut<Transform>, position: &Position) {
+ transform.translation = Vec3::new(position.x as f32 * 10., position.y as f32 * -10., 0.);
+}
+
+fn tobogganist_cam(
+ tobogganist: Query<With<Tobogganist, &Transform>>,
+ mut camera: Query<With<Camera, &mut Transform>>,
+) {
+ for mut camera_transform in camera.iter_mut() {
+ if let Some(tobogganist_transform) = tobogganist.iter().next() {
+ camera_transform.translation = Vec3::new(0., tobogganist_transform.translation.y(), 0.);
+ }
+ }
+}
+
+fn move_tobogganist(map_size: Res<MapSize>, mut position: Mut<Position>, velocity: &Velocity) {
+ position.x += velocity.x;
+ position.x %= map_size.width;
+ position.y += velocity.y;
+}
+
+fn collide_with_trees(
+ mut tobogganists: Query<With<Tobogganist, (&Position, &mut TreeHitCount)>>,
+ trees: Query<With<Tree, &Position>>,
+) {
+ for (tobogganist_position, mut tree_hit_count) in tobogganists.iter_mut() {
+ for tree_position in trees.iter() {
+ if *tree_position == *tobogganist_position {
+ tree_hit_count.0 += 1;
+ }
+ }
+ }
+}
+
+fn clear_finished_tobogganists(
+ mut commands: Commands,
+ map_size: Res<MapSize>,
+ mut score: ResMut<Score>,
+ tobogganists: Query<With<Tobogganist, (Entity, &Position, &Velocity, &TreeHitCount)>>,
+) {
+ for (entity, position, velocity, tree_hit_count) in tobogganists.iter() {
+ if position.y >= map_size.height {
+ println!(
+ "A tobogganist finished heading at incline {} x {}, after hitting {} trees",
+ velocity.x, velocity.y, tree_hit_count.0
+ );
+ score.0 *= tree_hit_count.0;
+ commands.despawn(entity);
+ }
+ }
+}
+
+fn end_of_slope(
+ score: Res<Score>,
+ mut exit_events: ResMut<Events<AppExit>>,
+ tobogganists: Query<&Tobogganist>,
+) {
+ if tobogganists.iter().count() == 0 {
+ println!("All tobogganists finished. Total score: {}", score.0);
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_4.rs b/2020/src/bin/day_4.rs
new file mode 100644
index 0000000..50b8eb5
--- /dev/null
+++ b/2020/src/bin/day_4.rs
@@ -0,0 +1,222 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::str::FromStr;
+use thiserror::Error;
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(count_valid.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(Error, Debug)]
+enum ValidationError {
+ #[error("{0}")]
+ FromIntError(#[from] std::num::ParseIntError),
+ #[error("value is out of range")]
+ OutOfRange,
+ #[error("value has an invalid unit")]
+ InvalidUnit,
+ #[error("value has an invalid characters")]
+ InvalidChars,
+}
+
+struct BirthYear(u32);
+impl FromStr for BirthYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 1920 && num <= 2002 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct IssueYear(u32);
+impl FromStr for IssueYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 2010 && num <= 2020 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct ExpirationYear(u32);
+impl FromStr for ExpirationYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 2020 && num <= 2030 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct Height(u32);
+impl FromStr for Height {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let inches = s.ends_with("in");
+ let centimeters = s.ends_with("cm");
+ if !inches && !centimeters {
+ return Err(ValidationError::InvalidUnit);
+ }
+
+ let num: u32 = s[0..s.len() - 2].parse()?;
+ let num_cm = if inches {
+ ((num as f32) * 2.54).round() as u32
+ } else {
+ num
+ };
+
+ if num_cm >= 150 && num_cm <= 193 {
+ Ok(Self(num_cm))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct HairColor(String);
+impl FromStr for HairColor {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if !s.starts_with("#") {
+ return Err(ValidationError::InvalidChars);
+ }
+ if s.len() != 7 {
+ return Err(ValidationError::InvalidChars);
+ }
+ if !s
+ .chars()
+ .skip(1)
+ .all(|c| (c >= 'a' && c <= 'f') || c >= '0' && c <= '9')
+ {
+ return Err(ValidationError::InvalidChars);
+ }
+
+ Ok(Self(s.to_string()))
+ }
+}
+
+struct EyeColor(String);
+impl FromStr for EyeColor {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let valid_vals = ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"];
+ if valid_vals.contains(&s) {
+ Ok(Self(s.to_string()))
+ } else {
+ Err(ValidationError::InvalidChars)
+ }
+ }
+}
+
+struct PassportId(String);
+impl FromStr for PassportId {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if s.len() != 9 {
+ return Err(ValidationError::InvalidChars);
+ }
+ if !s.chars().all(|c| c.is_ascii_digit()) {
+ return Err(ValidationError::InvalidChars);
+ }
+
+ Ok(Self(s.to_string()))
+ }
+}
+
+struct CountryId(String);
+impl FromStr for CountryId {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(Self(s.to_string()))
+ }
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_4.txt").expect("Failed to read file");
+
+ commands.spawn(());
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ if line.is_empty() {
+ commands.spawn(());
+ } else {
+ for section in line.split_whitespace() {
+ let mut section_parts = section.split(':');
+ let name = section_parts.next().unwrap();
+ let value = section_parts.next().unwrap();
+ match name {
+ "byr" => {
+ BirthYear::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "iyr" => {
+ IssueYear::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "eyr" => {
+ ExpirationYear::from_str(value)
+ .ok()
+ .map(|c| commands.with(c));
+ }
+ "hgt" => {
+ Height::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "hcl" => {
+ HairColor::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "ecl" => {
+ EyeColor::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "pid" => {
+ PassportId::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "cid" => {
+ CountryId::from_str(value).ok().map(|c| commands.with(c));
+ }
+ _ => {}
+ }
+ }
+ }
+ }
+}
+
+fn count_valid(
+ passports: Query<(
+ &BirthYear,
+ &IssueYear,
+ &ExpirationYear,
+ &Height,
+ &HairColor,
+ &EyeColor,
+ &PassportId,
+ )>,
+) {
+ let count = passports.iter().count();
+ println!("There are {} valid passports", count);
+}
diff --git a/2020/src/bin/day_5.rs b/2020/src/bin/day_5.rs
new file mode 100644
index 0000000..15c8a70
--- /dev/null
+++ b/2020/src/bin/day_5.rs
@@ -0,0 +1,157 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_startup_stage("search")
+ .add_startup_system_to_stage("search", find_unoccupied_seat.system())
+ .add_startup_stage("metadata")
+ .add_startup_system_to_stage("metadata", add_seat_ids.system())
+ .add_startup_system_to_stage("metadata", add_seat_sprites.system())
+ .add_startup_stage("report")
+ .add_startup_system_to_stage("report", print_highest_seat_id.system())
+ .add_startup_system_to_stage("report", print_my_seat_id.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands, mut materials: ResMut<Assets<ColorMaterial>>) {
+ commands.spawn(Camera2dComponents {
+ transform: Transform::from_translation(Vec3::new(80. / 2., 1280. / 2., 0.)),
+ ..Default::default()
+ });
+
+ commands.insert_resource(Materials {
+ my_seat_material: materials.add(Color::rgb(0., 0., 255.).into()),
+ seat_material: materials.add(Color::rgb(0., 255., 0.).into()),
+ });
+}
+
+struct Materials {
+ my_seat_material: Handle<ColorMaterial>,
+ seat_material: Handle<ColorMaterial>,
+}
+
+#[derive(PartialEq, Eq)]
+struct Position {
+ x: u32,
+ y: u32,
+}
+struct SeatId(u32);
+struct MySeat;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_5.txt").unwrap();
+ for line in BufReader::new(f).lines() {
+ let mut max_y = 128;
+ let mut min_y = 0;
+ let mut max_x = 8;
+ let mut min_x = 0;
+ for c in line.unwrap().trim().chars() {
+ let mid_x = (min_x + max_x) / 2;
+ let mid_y = (min_y + max_y) / 2;
+ match c {
+ 'F' => {
+ max_y = mid_y;
+ }
+ 'B' => {
+ min_y = mid_y;
+ }
+ 'L' => {
+ max_x = mid_x;
+ }
+ 'R' => {
+ min_x = mid_x;
+ }
+ _ => panic!("Unexpected character {}", c),
+ }
+ }
+
+ assert_eq!(max_y - min_y, 1);
+ assert_eq!(max_x - min_x, 1);
+
+ commands.spawn((Position { x: min_x, y: min_y },));
+ }
+}
+
+fn find_unoccupied_seat(mut commands: Commands, seats: Query<&Position>) {
+ for y in 1..127 {
+ for x in 0..8 {
+ let potential_position = Position { x, y };
+ let required_left = if x == 0 {
+ Position { x: 7, y: y - 1 }
+ } else {
+ Position { x: x - 1, y }
+ };
+ let required_right = if x == 7 {
+ Position { x: 0, y: y + 1 }
+ } else {
+ Position { x: x + 1, y }
+ };
+
+ let required_surrounds = [required_left, required_right];
+ if !seats.iter().any(|p| p == &potential_position) {
+ if required_surrounds
+ .iter()
+ .all(|required| seats.iter().any(|p| p == required))
+ {
+ commands.spawn((MySeat, potential_position));
+ }
+ }
+ }
+ }
+}
+
+fn add_seat_ids(mut commands: Commands, seats: Query<(Entity, &Position)>) {
+ for (entity, position) in seats.iter() {
+ let seat_id = position.y * 8 + position.x;
+ commands.insert_one(entity, SeatId(seat_id));
+ }
+}
+
+fn add_seat_sprites(
+ mut commands: Commands,
+ materials: Res<Materials>,
+ seats: Query<(Entity, &Position, Option<&MySeat>)>,
+) {
+ for (entity, position, my_seat) in seats.iter() {
+ commands.insert(
+ entity,
+ SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: if my_seat.is_some() {
+ materials.my_seat_material.clone()
+ } else {
+ materials.seat_material.clone()
+ },
+ transform: Transform::from_translation(Vec3::new(
+ position.x as f32 * 10.,
+ position.y as f32 * 10.,
+ 0.,
+ )),
+ ..Default::default()
+ },
+ );
+ }
+}
+
+fn print_highest_seat_id(seats: Query<&SeatId>) {
+ let max = seats.iter().map(|s| s.0).max();
+ println!("Max seat id: {:?}", max);
+}
+
+fn print_my_seat_id(seats: Query<With<MySeat, &SeatId>>) {
+ for seat_id in seats.iter() {
+ println!("My seat id: {}", seat_id.0);
+ }
+}
diff --git a/2020/src/bin/day_6.rs b/2020/src/bin/day_6.rs
new file mode 100644
index 0000000..68efbce
--- /dev/null
+++ b/2020/src/bin/day_6.rs
@@ -0,0 +1,102 @@
+use bevy::prelude::*;
+use std::collections::{BTreeMap, BTreeSet};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("calculate")
+ .add_system_to_stage("calculate", calculate_anyone_groups.system())
+ .add_system_to_stage("calculate", calculate_everyone_groups.system())
+ .add_stage("report")
+ .add_system_to_stage("report", count_anyone_group_sizes.system())
+ .add_system_to_stage("report", count_everyone_group_sizes.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Individual;
+struct Anyone;
+struct Everyone;
+
+struct Group(usize);
+struct Answers(BTreeSet<char>);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_6.txt").unwrap();
+
+ let mut current_group = 0;
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ if line.is_empty() {
+ current_group += 1;
+ } else {
+ let answers = line.chars().collect();
+ commands.spawn((Individual, Group(current_group), Answers(answers)));
+ }
+ }
+}
+
+fn calculate_anyone_groups(
+ mut commands: Commands,
+ individuals: Query<With<Individual, (&Group, &Answers)>>,
+) {
+ let mut anyone_groups = BTreeMap::new();
+ for (group_id, answer) in individuals.iter() {
+ let updated = anyone_groups
+ .entry(group_id.0)
+ .or_insert(BTreeSet::new())
+ .union(&answer.0)
+ .cloned()
+ .collect();
+ anyone_groups.insert(group_id.0, updated);
+ }
+
+ for (group_id, anyone) in anyone_groups.into_iter() {
+ commands.spawn((Anyone, Group(group_id), Answers(anyone)));
+ }
+}
+
+fn calculate_everyone_groups(
+ mut commands: Commands,
+ individuals: Query<With<Individual, (&Group, &Answers)>>,
+) {
+ let mut anyone_groups = BTreeMap::new();
+ for (group_id, answer) in individuals.iter() {
+ let updated = anyone_groups
+ .entry(group_id.0)
+ .or_insert(answer.0.clone())
+ .intersection(&answer.0)
+ .cloned()
+ .collect();
+ anyone_groups.insert(group_id.0, updated);
+ }
+
+ for (group_id, anyone) in anyone_groups.into_iter() {
+ commands.spawn((Everyone, Group(group_id), Answers(anyone)));
+ }
+}
+
+fn count_anyone_group_sizes(groups: Query<With<Anyone, &Answers>>) {
+ let sum: usize = groups.iter().map(|g| g.0.len()).sum();
+ println!("Anyone: {}", sum);
+}
+
+fn count_everyone_group_sizes(groups: Query<With<Everyone, &Answers>>) {
+ let sum: usize = groups.iter().map(|g| g.0.len()).sum();
+ println!("Everyone: {}", sum);
+}
diff --git a/2020/src/bin/day_7.rs b/2020/src/bin/day_7.rs
new file mode 100644
index 0000000..45cb9ee
--- /dev/null
+++ b/2020/src/bin/day_7.rs
@@ -0,0 +1,137 @@
+use bevy::prelude::*;
+use std::collections::{BTreeMap, BTreeSet};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(trim_empty_bags.system())
+ .add_system(add_known_sizes.system())
+ .add_system(report_gold_bag_known_size.system())
+ //.add_system(debug_print_bags.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+const TARGET_COLOUR: &str = "shiny gold";
+
+struct Bag {
+ colour: String,
+ required: BTreeMap<String, usize>,
+}
+struct CantContainShinyGold;
+#[derive(Clone)]
+struct KnownSize(usize);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_7.txt").unwrap();
+
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let (src_colour, contents) = split_2(line, "bags contain");
+ let contents_parts = contents
+ .trim_end_matches('.')
+ .split(',')
+ .filter(|part| part != &"no other bags")
+ .map(|part| {
+ let (quantity, colour) = split_2(
+ part.trim().trim_end_matches("bags").trim_end_matches("bag"),
+ " ",
+ );
+ (colour, quantity.parse().unwrap())
+ })
+ .collect();
+ commands.spawn((Bag {
+ colour: src_colour,
+ required: contents_parts,
+ },));
+ }
+}
+
+fn split_2(line: &str, split: &str) -> (String, String) {
+ let parts = line.splitn(2, split).collect::<Vec<_>>();
+ assert_eq!(parts.len(), 2);
+ (parts[0].trim().to_string(), parts[1].trim().to_string())
+}
+
+fn debug_print_bags(bags: Query<&Bag>) {
+ for bag in bags.iter() {
+ println!("{} requires {:?}", bag.colour, bag.required);
+ }
+}
+
+fn trim_empty_bags(
+ mut commands: Commands,
+ bags: Query<Without<CantContainShinyGold, (Entity, &Bag)>>,
+) {
+ let mut colours_cleared = BTreeSet::new();
+ for (entity, bag) in bags.iter() {
+ let required_not_relevant = bag.required.keys().all(|required| {
+ !bags
+ .iter()
+ .any(|can_contain_shiny_gold| &can_contain_shiny_gold.1.colour == required)
+ });
+ if required_not_relevant && bag.colour != TARGET_COLOUR {
+ colours_cleared.insert(bag.colour.clone());
+ commands.insert_one(entity, CantContainShinyGold);
+ }
+ }
+
+ if colours_cleared.is_empty() {
+ println!(
+ "{} bags can hold the shiny gold one",
+ bags.iter().count() - 1
+ );
+ }
+}
+
+fn add_known_sizes(mut commands: Commands, bags: Query<(Entity, &Bag, Option<&KnownSize>)>) {
+ for (entity, bag, size) in bags.iter() {
+ if size.is_some() {
+ continue;
+ }
+
+ let mut new_size = Some(0);
+ for (required_colour, required_quantity) in bag.required.iter() {
+ if new_size.is_none() {
+ break;
+ }
+
+ let inner_bag_size = bags
+ .iter()
+ .find(|(_, bag, _)| &bag.colour == required_colour)
+ .and_then(|(_, _, size)| size.clone());
+ new_size = new_size
+ .zip(inner_bag_size)
+ .map(|(a, b)| a + required_quantity * b.0)
+ }
+
+ if let Some(new_size) = new_size {
+ commands.insert_one(entity, KnownSize(new_size + 1));
+ }
+ }
+}
+
+fn report_gold_bag_known_size(bags: Query<(&Bag, &KnownSize)>) {
+ println!("{} have a known size", bags.iter().count());
+ for (bag, size) in bags.iter() {
+ if bag.colour == TARGET_COLOUR {
+ println!("The shiny gold bag must contain {} other bags!", size.0 - 1)
+ }
+ }
+}
diff --git a/2020/src/bin/day_8.rs b/2020/src/bin/day_8.rs
new file mode 100644
index 0000000..2c0c227
--- /dev/null
+++ b/2020/src/bin/day_8.rs
@@ -0,0 +1,154 @@
+use bevy::{app::AppExit, prelude::*};
+use std::convert::TryFrom;
+use std::io::{BufRead, BufReader};
+use std::{collections::BTreeSet, fs::File};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("check_line")
+ .add_system_to_stage("check_line", track_program_line_execution.system())
+ .add_system_to_stage("check_line", track_program_termination.system())
+ .add_stage("exec")
+ .add_system_to_stage("exec", tick_computer.system())
+ .add_system_to_stage("exec", exit.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Program {
+ ops: Vec<Op>,
+}
+#[derive(Clone)]
+enum Op {
+ Acc(i32),
+ Jmp(i32),
+ Nop(i32),
+}
+struct UnalteredProgram;
+#[derive(Default)]
+struct Computer {
+ program_counter: i32,
+ accumulator: i32,
+ termiated: bool,
+}
+#[derive(Default)]
+struct LineTracker(BTreeSet<i32>);
+
+impl Computer {
+ fn exec(&mut self, program: &Program) {
+ if self.termiated {
+ return;
+ }
+
+ let x = usize::try_from(self.program_counter).ok();
+ match x.and_then(|x| program.ops.get(x)) {
+ None => {}
+ Some(Op::Acc(val)) => {
+ self.accumulator += val;
+ self.program_counter += 1;
+ }
+ Some(Op::Jmp(val)) => {
+ self.program_counter += val;
+ }
+ Some(Op::Nop(_)) => {
+ self.program_counter += 1;
+ }
+ }
+ if self.program_counter >= program.ops.len() as i32 {
+ self.termiated = true;
+ }
+ }
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_8.txt").unwrap();
+
+ let ops: Vec<Op> = BufReader::new(f)
+ .lines()
+ .map(|line| {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let mut line_parts = line.split_whitespace();
+ let opcode = line_parts.next().unwrap();
+ let val: i32 = line_parts.next().unwrap().parse().unwrap();
+ let op = match opcode {
+ "acc" => Op::Acc(val),
+ "jmp" => Op::Jmp(val),
+ "nop" => Op::Nop(val),
+ _ => panic!("Invalid opcode"),
+ };
+ op
+ })
+ .collect();
+ commands.spawn((
+ UnalteredProgram,
+ Program { ops: ops.clone() },
+ Computer::default(),
+ LineTracker::default(),
+ ));
+
+ for i in 0..ops.len() {
+ let mut ops = ops.clone();
+ ops[i] = match ops[i] {
+ Op::Nop(v) => Op::Jmp(v),
+ Op::Jmp(v) => Op::Nop(v),
+ Op::Acc(v) => Op::Acc(v),
+ };
+ commands.spawn((
+ Program { ops: ops.clone() },
+ Computer::default(),
+ LineTracker::default(),
+ ));
+ }
+}
+
+fn track_program_line_execution(
+ mut commands: Commands,
+ entity: Entity,
+ mut line_tracker: Mut<LineTracker>,
+ computer: &Computer,
+ unaltered: Option<&UnalteredProgram>,
+) {
+ if line_tracker.0.contains(&computer.program_counter) {
+ if unaltered.is_some() {
+ println!(
+ "About to execute a line for the second time! Line {}. Accumulator: {}",
+ computer.program_counter, computer.accumulator
+ );
+ }
+ commands.despawn(entity);
+ } else {
+ line_tracker.0.insert(computer.program_counter);
+ }
+}
+
+fn track_program_termination(mut commands: Commands, entity: Entity, computer: &Computer) {
+ if computer.termiated {
+ println!("Program terminated! Accumulator: {}", computer.accumulator);
+ commands.despawn(entity);
+ }
+}
+
+fn tick_computer(mut computer: Mut<Computer>, program: &Program) {
+ computer.exec(program);
+}
+
+fn exit(mut exit_events: ResMut<Events<AppExit>>, computers: Query<&Computer>) {
+ if computers.iter().len() == 0 {
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_9.rs b/2020/src/bin/day_9.rs
new file mode 100644
index 0000000..b5a02e6
--- /dev/null
+++ b/2020/src/bin/day_9.rs
@@ -0,0 +1,120 @@
+use bevy::{app::AppExit, prelude::*};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("add")
+ .add_system_to_stage("add", check_next_num.system())
+ .add_stage("remove")
+ .add_system_to_stage("remove", remove_oldest_line.system())
+ .add_stage("find_range")
+ .add_system_to_stage("find_range", find_contiguous_range.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct LineNum(usize);
+#[derive(Clone)]
+struct Num(i64);
+struct Active;
+struct Invalid;
+struct Done;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_9.txt").unwrap();
+
+ for (line_num, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.unwrap();
+ let line = line.trim();
+ let num = line.parse().unwrap();
+ commands.spawn((LineNum(line_num), Num(num)));
+ if line_num < 25 {
+ commands.with(Active);
+ }
+ }
+}
+
+fn check_next_num(
+ mut commands: Commands,
+ active: Query<With<Active, &Num>>,
+ next: Query<Without<Done, Without<Active, (Entity, &LineNum, &Num)>>>,
+) {
+ if let Some((min_entity, line, num)) = next.iter().min_by_key(|(_, line, _)| line.0) {
+ let mut is_sum = false;
+ for active_1 in active.iter() {
+ for active_2 in active.iter() {
+ is_sum = is_sum || (num.0 == active_1.0 + active_2.0)
+ }
+ }
+ commands.insert_one(min_entity, Active);
+
+ if !is_sum {
+ commands.insert_one(min_entity, Invalid);
+ println!(
+ "{} on line {} was not a sum of the previous lot!",
+ num.0, line.0
+ );
+ }
+ }
+}
+
+fn remove_oldest_line(
+ mut commands: Commands,
+ line_nums: Query<Without<Done, With<Active, (Entity, &LineNum)>>>,
+) {
+ if let Some((min_entity, _)) = line_nums.iter().min_by_key(|(_, line)| line.0) {
+ commands.remove_one::<Active>(min_entity);
+ commands.insert_one(min_entity, Done);
+ } else {
+ println!("All numbers cleared");
+ }
+}
+
+fn find_contiguous_range(
+ mut exit_events: ResMut<Events<AppExit>>,
+ line_nums: Query<(&LineNum, &Num)>,
+ invalid: Query<With<Invalid, &Num>>,
+) {
+ for invalid in invalid.iter() {
+ let mut nums: Vec<(LineNum, Num)> = line_nums
+ .iter()
+ .map(|(line, num)| (line.clone(), num.clone()))
+ .collect();
+
+ nums.sort_by_key(|(line, _num)| line.clone());
+ let nums: Vec<i64> = nums.into_iter().map(|(_line, num)| num.0).collect();
+
+ for min in 0..nums.len() {
+ for max in min + 2..nums.len() + 1 {
+ let sum: i64 = nums[min..max].iter().sum();
+ if sum == invalid.0 {
+ let min_in_range = nums[min..max].iter().min().unwrap();
+ let max_in_range = nums[min..max].iter().max().unwrap();
+ println!(
+ "Range found! {} + {} = {}",
+ min_in_range,
+ max_in_range,
+ min_in_range + max_in_range
+ );
+ }
+ }
+ }
+
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/lib.rs b/2020/src/lib.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/2020/src/lib.rs
@@ -0,0 +1 @@
+
diff --git a/2020/src/main.rs b/2020/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/2020/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}