changeset 57:4a584287ebec

Day 10 Part 1
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 20 Dec 2023 20:55:26 +0100
parents 3175a3fe84e5
children 76994fea8568
files 2023/day05.ml 2023/day10.ml 2023/dune 2023/input/10.txt 2023/input/10_test1.txt
diffstat 5 files changed, 453 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/2023/day05.ml	Fri Dec 15 11:08:35 2023 +0100
+++ b/2023/day05.ml	Wed Dec 20 20:55:26 2023 +0100
@@ -6,6 +6,9 @@
 type rangemap = { dst_start : int; src_start : int; length : int }
 [@@deriving sexp]
 
+let compare_rangemap_in { src_start = src1; _ } { src_start = src2; _ } =
+  Int.compare src1 src2
+
 let compare_rangemap { dst_start = dst1; _ } { dst_start = dst2; _ } =
   Int.compare dst1 dst2
 
@@ -70,18 +73,18 @@
     Out_channel.print_endline (Sexp.to_string_hum (sexp_of_input inp))
 end
 
+let steps_names =
+  [
+    "seed-to-soil";
+    "soil-to-fertilizer";
+    "fertilizer-to-water";
+    "water-to-light";
+    "light-to-temperature";
+    "temperature-to-humidity";
+    "humidity-to-location";
+  ]
+
 module Part1 = struct
-  let steps_names =
-    [
-      "seed-to-soil";
-      "soil-to-fertilizer";
-      "fertilizer-to-water";
-      "water-to-light";
-      "light-to-temperature";
-      "temperature-to-humidity";
-      "humidity-to-location";
-    ]
-
   (* for a single step, resolve the number using the provided range maps. Return None if no mapping was found. *)
   let resolve_step_maybe { dst_start; src_start; length } number =
     if src_start <= number && number <= src_start + length then
@@ -128,39 +131,129 @@
 end
 
 module Part2 = struct
-  type range = { from : int; length : int } [@@deriving sexp]
+  let amend_rangemap rm =
+    let rm = List.sort ~compare:compare_rangemap_in rm in
+    let lst = List.last_exn rm in
+    let first_out =
+      List.fold ~init:10000000000
+        ~f:(fun min e -> Int.min min (e.src_start))
+        rm
+    in
+    let last_out =
+      List.fold ~init:0
+        ~f:(fun max e -> Int.max max (e.dst_start + e.length))
+        rm
+    in
+    ({ src_start = 0; dst_start = 0; length = first_out } :: rm)
+    @ [
+        {
+          src_start = lst.src_start + lst.length;
+          dst_start = last_out;
+          length = 10000000000;
+        };
+      ]
 
-  let _intersect { from = from1; length = length1 }
-      { from = from2; length = length2 } =
-    let f1, t1 = (from1, from1 + length1) in
-    let f2, t2 = (from2, from2 + length2) in
-    let newfrom = Int.max f1 f2 in
-    let newto = Int.min t1 t2 in
-    match (newfrom, newto) with
-    | a, b when a < b -> Some { from = a; length = b - a + 1 }
-    | _ -> None
+  let last_rangemap inp =
+    let last_step = List.last_exn steps_names in
+    let last =
+      List.sort ~compare:compare_rangemap_in
+      @@ Hashtbl.find_exn inp.maps last_step
+    in
+    amend_rangemap last
+
+  exception Range_overlap of (bool * bool * bool * bool * bool * bool)
+  [@@deriving sexp]
 
-  let _all_ranges maps =
-    let first = List.hd_exn maps in
-    let last = List.last_exn maps in
-    let range1 = { dst_start = 0; src_start = 0; length = first.dst_start } in
-    let range_last =
-      {
-        src_start = last.dst_start + last.length;
-        dst_start = last.dst_start + last.length;
-        length = Int.max_value - last.dst_start - last.length;
-      }
+  let translate ({ src_start = src1; dst_start = dst1; length = length1 } as rm)
+      ({ src_start = src2; dst_start = dst2; length = length2 } as transl) =
+    Out_channel.(
+      printf "%s @ %s\n"
+        (Sexp.to_string_hum (sexp_of_rangemap rm))
+        (Sexp.to_string_hum (sexp_of_rangemap transl)));
+    let starts_before = Int.(src1 < dst2) in
+    let starts_within = Int.(src1 >= dst2 && src1 < dst2 + length2) in
+    let starts_after = Int.(src1 >= dst2 + length2) in
+    let ends_before = Int.(src1 + length1 < dst2) in
+    let ends_within =
+      Int.(src1 + length1 >= dst2 && src1 + length1 <= dst2 + length2)
     in
-    let maps = if range1.length > 0 then range1 :: maps else maps in
-    if range_last.length > 0 then List.append maps [ range_last ] else maps
+    let ends_after = Int.(src1 + length1 >= dst2 + length2) in
+    if (starts_before && ends_before) || (starts_after && ends_after) then
+      (None, starts_after && ends_after, false)
+    else if starts_before && ends_within then (
+      let length' = src1 + length1 - dst2 in
+      let r =
+        { src_start = src2; dst_start = dst1 + (dst2 - src1); length = length' }
+      in
+      assert (Int.(length' > 0));
+      Out_channel.printf " => %s\n" (Sexp.to_string_hum (sexp_of_rangemap r));
+      (Some r, false, true))
+    else if starts_within && ends_within then (
+      let length' = length1 in
+      let r =
+        { src_start = src2 + (src1 - dst2); dst_start = dst1; length = length' }
+      in
+      assert (Int.(length' > 0));
+      Out_channel.printf " => %s\n" (Sexp.to_string_hum (sexp_of_rangemap r));
+      (Some r, false, true))
+    else if starts_within && ends_after then (
+      let length' = dst2 + length2 - src1 in
+      let r =
+        { src_start = src2 + (src1 - dst2); dst_start = dst1; length = length' }
+      in
+      assert (Int.(length' > 0));
+      Out_channel.printf " => %s\n" (Sexp.to_string_hum (sexp_of_rangemap r));
+      (Some r, true, false))
+    else if starts_before && ends_after then (
+      let length' = length2 in
+      let r =
+        { src_start = src2; dst_start = dst1 + (dst2 - src1); length = length' }
+      in
+      assert (Int.(length' > 0));
+      Out_channel.printf " => %s\n" (Sexp.to_string_hum (sexp_of_rangemap r));
+      (Some r, true, false))
+    else
+      raise
+        (Range_overlap
+           ( starts_before,
+             starts_within,
+             starts_after,
+             ends_before,
+             ends_within,
+             ends_after ))
 
-  type new_input = {
-    (* seed_ranges : range list; *)
-    _maps : (string, rangemap list) Hashtbl.t;
-  }
+  (* translate rangemap list rm into a new rangemap list using transl.
+     The result is a rangemap incorporating the effect of
+     both rangemaps. *)
+  let rec rangemap_backwards rm transl =
+    match (rm, transl) with
+    | rm' :: rms, transl' :: transls -> (
+        match translate rm' transl' with
+        | Some r, false, true -> r :: rangemap_backwards rms (transl' :: transls)
+        | Some r, true, false -> r :: rangemap_backwards (rm' :: rms) transls
+        | None, false, false -> rangemap_backwards rms transls
+        | None, true, false -> rangemap_backwards (rm' :: rms) transls
+        | _, _, _ -> assert false)
+    | [], _ | _, [] -> []
 
-  let _convert_new_seeds_to_old ({ maps = _maps; _ } : input) =
-    { (*seed_ranges = convert_list seeds;*) _maps }
+  let process ch =
+    let input = In_channel.input_all ch in
+    let input' = Parse.parse input in
+    let final = last_rangemap input' in
+    let maps =
+      List.map
+        ~f:(fun k -> amend_rangemap @@ Hashtbl.find_exn input'.maps k)
+        steps_names
+    in
+    let transls = List.take maps (List.length maps - 1) in
+    let translated =
+      List.fold
+        ~f:(fun current transl -> rangemap_backwards current transl)
+        ~init:final (List.rev transls)
+    in
+    Out_channel.(
+      print_endline
+        (Sexp.to_string_hum (List.sexp_of_t sexp_of_rangemap translated)))
 end
 
-let () = Part1._process In_channel.stdin
+let () = Part2.process In_channel.stdin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/day10.ml	Wed Dec 20 20:55:26 2023 +0100
@@ -0,0 +1,167 @@
+open Base
+open Core
+open Angstrom
+
+module Position = struct
+  (* x, y starting at top left corner. x is row, y is column. *)
+  type t = Position of int * int [@@deriving sexp, compare]
+
+  let hash (Position (x, y)) =
+    let h = Hash.create () in
+    let h = Hash.fold_int h x in
+    let h = Hash.fold_int h y in
+    Hash.get_hash_value h
+
+  let eq a b = 0 = compare a b
+end
+
+type pipe = Vert | Horiz | NE | NW | SW | SE | Ground | Start
+[@@deriving sexp, compare]
+
+type dir = N | E | S | W [@@deriving sexp]
+type field = { rows : int; cols : int; pipes : (Position.t, pipe) Hashtbl.t }
+
+let find_start field =
+  let f ~key ~data acc =
+    match acc with
+    | None -> if 0 = compare_pipe data Start then Some key else None
+    | x -> x
+  in
+  let maybe_start = Hashtbl.fold ~init:None ~f field in
+  Option.value_exn maybe_start
+
+let make_field rows cols =
+  { pipes = Hashtbl.create (module Position); rows; cols }
+
+let set_pipe field pos pipe = Hashtbl.add_exn field.pipes ~key:pos ~data:pipe
+let get_pipe field pos = Hashtbl.find_exn field.pipes pos
+
+exception Bad_pipe of char
+
+let pipe_of_char = function
+  | '|' -> Vert
+  | '-' -> Horiz
+  | 'L' -> NE
+  | 'J' -> NW
+  | '7' -> SW
+  | 'F' -> SE
+  | '.' -> Ground
+  | 'S' -> Start
+  | c -> raise (Bad_pipe c)
+
+module Part1 = struct
+  (* from current position, go one step in direction *)
+  let go field Position.(Position (x, y)) =
+    let open Position in
+    function
+    | N ->
+        assert (x > 0);
+        Position (x - 1, y)
+    | E ->
+        assert (y < field.cols - 1);
+        Position (x, y + 1)
+    | W ->
+        assert (y > 0);
+        Position (x, y - 1)
+    | S ->
+        assert (x < field.rows - 1);
+        Position (x + 1, y)
+
+  (* From current position, check for direction dir and pipe
+     located there if we can go to the field. *)
+  let viable dir pipe =
+    match (dir, pipe) with
+    | N, Vert | N, NW | N, NE -> true
+    | E, Horiz | E, NE | E, SE -> true
+    | S, Vert | S, SW | S, SE -> true
+    | W, Horiz | W, NW | W, SW -> true
+    | _, Start -> true
+    | _ -> false
+
+  (* would a step in direction dir onto a tile with pipe next be allowed? *)
+  let valid_step dir next =
+    match (dir, next) with
+    | N, Vert | N, SW | N, SE -> true
+    | E, Horiz | E, NW | E, SW -> true
+    | S, Vert | S, NW | S, NE -> true
+    | W, Horiz | W, NE | W, SE -> true
+    | _, Start -> true
+    | _ -> false
+
+  (* which directions can we go, given the current pipe? *)
+  let dir_candidates pipe =
+    let dirs = [ N; E; S; W ] in
+    let f d = viable d pipe in
+    List.filter ~f dirs
+
+  (* Which positions are reachable from the current pos given the field? *)
+  let next_candidates field pos =
+    let open Position in
+    let current = get_pipe field pos in
+    (* directions we can go based on the current pipe *)
+    let dir_cands = dir_candidates current in
+    (* neighbors we can transfer to based on the current pipe *)
+    let pos_cands =
+      List.map ~f:(fun dir -> (dir, go field pos dir)) dir_cands
+    in
+    (* neighbors that we can transfer to with a fitting pipe section *)
+    let good_neighbor_filter (dir, pos) =
+      if valid_step dir (get_pipe field pos) then Some pos else None
+    in
+    let pos_cands_good = List.filter_map ~f:good_neighbor_filter pos_cands in
+    assert (2 >= List.length pos_cands_good);
+    pos_cands_good
+
+  (* Beginning at start, discover the path, then return the path once back at the start. *)
+  let rec traverse field start current path =
+    let cands = next_candidates field current in
+    let empty_path = List.is_empty path
+    and at_start = Position.eq start current in
+    let finished = (not empty_path) && at_start in
+    if finished then path
+    else
+      match path with
+      | [] ->
+          (* start position *)
+          assert (0 = Position.compare start current);
+          assert (2 = List.length cands);
+          (* start with first candidate, arbitrarily *)
+          let first = List.hd_exn cands in
+          traverse field start first (current :: path)
+      | last :: _lasts ->
+          let not_last p = not (0 = Position.compare p last) in
+          let nexts = List.filter ~f:not_last cands in
+          let next = List.hd_exn nexts in
+          traverse field start next (current :: path)
+
+  (* Find start point and traverse path. *)
+  let find_path field =
+    let start = find_start field.pipes in
+    traverse field start start []
+end
+
+module Parse = struct
+  let parse_row str =
+    let chars = String.to_list str in
+    List.map ~f:pipe_of_char chars
+
+  let to_field parsed_rows =
+    let field =
+      make_field (List.length parsed_rows)
+        (List.length @@ List.hd_exn parsed_rows)
+    in
+    let insert_row r c p = set_pipe field (Position.Position (r, c)) p in
+    let f r row = List.iteri ~f:(insert_row r) row in
+    List.iteri ~f parsed_rows;
+    field
+
+  let parse_field rows =
+    let parsed_rows = List.map ~f:parse_row rows in
+    to_field parsed_rows
+end
+
+let () =
+  let input = In_channel.(input_lines stdin) in
+  let field = Parse.parse_field input in
+  let path = Part1.find_path field in
+  Out_channel.(printf "length: %d\n" (List.length path))
--- a/2023/dune	Fri Dec 15 11:08:35 2023 +0100
+++ b/2023/dune	Wed Dec 20 20:55:26 2023 +0100
@@ -74,3 +74,11 @@
  (modes byte exe)
  (preprocess
   (pps ppx_let ppx_sexp_conv)))
+
+(executable
+ (name day10)
+ (modules day10)
+ (libraries base core angstrom)
+ (modes byte exe)
+ (preprocess
+  (pps ppx_let ppx_sexp_conv ppx_compare)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/input/10.txt	Wed Dec 20 20:55:26 2023 +0100
@@ -0,0 +1,140 @@
+-7-|-J-F7F--7.|77.77FFJ7F77..7FJ-77-FF7FF-777F-77--L7FFJJF77FF|7F7F--FJ7-7-77-7-7.F-7--F7.F7F---7F7FF7FL|7-7-F--F7-FF7-|.|77LL-FFL7J7F-F-F7.
+|..FJ7F.LL|7L-J-LJ77F-J77.--F|FL7|LFLF|LL7||FJFJJ..L|FJ7.L777|L-JF7.LLJ7|L-JF7|-F|J7J7.||FJ|L--7L7---77..J7.7J7F-J-7J7J.L|-7||F7-L.LFLFJ7LJ7
+FF7|FFJF|F77J-||LL7-7-L|-7JJJ|7FF-7..|L-FJL7L7|JFF77|L--7FJL-7J.F|L-7L-F77|F|L777|L7-F-JLJFJ.F7|FJJLJJLL|7|.L|JLJ|.JJ|77.|LL-|-JLLJ7J.||7FLJ
+FJL7F-L-J7L-7.-JFJJ|JF|.|.|.-F7FL|.-.|..L-7|FJ|.JL77F|J-77||-F7FFJF-JF|||77|J.L|7--F-|F--7|F7||||F7|--7.-JF-7-.7J7F|.JJ--7FJF|.L.LLJ7FL---7|
+L7FJ||.|L77-|7LF|J.7|-J7|.FF.LJ.F|FF7|...|||L7L77J||7J.FJF7F7|L7|FJ7F--JL7L7LFF|J.F-7LJF7|||LJLJLJ|7-FJFJ|LJJLJ7J|-J7|.F7JF|L7-.F.|-LJ|F7||7
+|LL.|7FL-JL-LJF7JF7L7.LJJ--F.LF--F-J|F77FFJL-JFJF7|L---F7|||||FJ||F-JF-7FJF7-F-7FFJFJ-FJLJ|L-7F---JF-7JJ.F....LJ-L7J|77|.7|7|.L7LFJFJ.L-7JJ.
+-.|FL|.J--7LL.LF7-L-L-||.LFL-FJJ.|.F||F-7L---7L7|L7-|FL|LJ|||||FJLJF-J7LJJ||JL7L7|FJJ.L7F7L7FJL--7L|FJ7F||FJ7|-7J-LFJFJ|FF|LF-|JL-|7J|J..LLF
+L|LF7|FJF--7F7.LJ|7-7LLL|.|L|JF-77L-7F|FJF---JFJ|FJF77JL-7||LJ||F7FJFF-7F-JL7-L7||L--7FLJL7LJF--7L-JL7F-7JJ.LJ7LFJ|JF---7J|.F-7----JJJ-F7-J.
+|.-FJL7LFJ.JFF-|JLJ-F-|-|FJFJFJ.FL7F-7|L7L---7L-JL-J|F7F7||L7FJ||LJF7L7|L7F-J7FJLJF7FJF7F7L-7L7LL----J|FJLLF|..-J-7FJ|.F-J|7|F|.||LF|L---.|7
+F|F|F||F|F7.FJ||-7JJ|FFJ|F7|-L--LJFL7LJFJF7F-JF-7F--J|||LJL-JL7|L7L||FJ|L||LF-JF--JLJFJLJL-7|FJF77F7F-JL7-7FFL-|7|L-|-7FL-J|F7LF-L---7|7L.FF
+FJ|7-L|-.||F7|L|.J|||LLFJ|FF..FJLF7FJF7L-JLJF7L7LJF7.||L-----7LJFJFJ||FJFJL7L-7|F7JJFL7F7F7LJL-JL-JLJF7FJJLJ|J-JJ77|F-FJJ7FL-L.||.F-J-FJ|F7.
+LFLF.L|FJL-.L7L|7.|FL77LLJ.F-7F7-|||FJL---7FJL7L--J|FJL7FF-7JL-7L7|FJ||LL7FJF-JLJL7F7FJ|LJL----7F----J||77-FJJ.J-77J|J|7FJ-LFJF|-7L-7-||FJ|.
+-J||7--7--7FJ|-L-FF7LLF.|FFL7|||FJ|LJF77F7LJF-JF--7|L-7L7|FJF-7L7||L-JL-7||LL-7F--J||L-JJF--7F7||F7F7JLJF77|LLF7F||7L7||7|-LL.-JFF-7J-|J--7.
+LF-LJJ-JF|7FL777F-||7|LF7-F7|||LJFJF-JL7||-FJF7L-7LJF7|FJ||7|FJFJ||F----J|L7F7|L-7FJL7F-7L-7LJLJLJLJL---J|F7LFF7LL|J7.||77J|LFJL|J-J7.-7L|||
+F7J|..|-J-FJF77-F-||-F7||FJLJLJF-J-L--7LJ|FJFJL--JF-JLJL7||FJL7L7LJL--7F7L7LJLJF-J|F-JL7|F-JF---7F-------J||--|F7.||L--J.|F7-F7.||FJL-|7F7J7
+JL7-7F7.LJJFFF||JF||L|LJ|L--7F-JLF7|F7L-7|L7|F7F7LL-7F-7LJ||F7L7|F----J|L7|F--7L-7|L7F7||L--JF7J||F7LF-7F7||7LF7L|LJJ|..FJ--7L|-JLL-7.|LL|L-
+.FJJ|-|F-7L7.JJ-7J|L7L-7|F7FJL--7||FJ|F-JL-JLJ||L-7JLJ-L-7|LJL7LJ|F-7F-JFJLJF7L7FJL7||||L7F--JL7|||L7|FJ||||7-LF-F7J7|-|77-L77F.F--FJLL7LL-L
+FF7-||||.J7F-J7.LJL7L--JLJLJF7F-J||L7|L---7F-7LJF-JF7F7F7||JF7L-7LJFJL-7|F7FJ|-|L7FS||LJFJL--7FJ|||FJ||FJLJ|FF7F7.7J||.LF77.|||7F7.|7.FJ||L|
+J||..F777LJLJ.|7||FL-----7F-J||F7||FJ|F7F7LJFJF-JF-JLJLJ||L7||F7|F-JF7FJ|||L7|FJFJL7LJF-J|F-7||FJ||L7|||F--JFJLJL7-F-77-|L7-|J|FF77J7.|7LJ.J
+L77F.L-L-7F7|-|LF-FF7F-77LJF7|LJLJ|L7|||||F7L7L-7L-7F-7FJ|FJ|LJLJL--J|L7LJL7|||FJ7FJF7L7F7L7|||L7|L7LJLJL7F7|F---JJL7L7FJFJ-|F7FJ|J7F|L7.7-|
+|.JL-J|L-.LJ--|7LF7||L7|F7FJLJF7F-JFJ||||||L7|F-JF7LJFJL-JL7L---7F---JFJF--J||||F-JFJL-J|L-J|||FJ|FJF----J|||L7F7|F|L7LJFJLF-J||FJ--LL-F77-J
+|F|7J|LFJ7FJJJL-L|LJ|7||||L-7FJ||F7L7||||||FJ||F7||F7L--7F-JF7-FJL---7L7|F-7|||LJF-JJFF7L--7||||FJL7|7F7F7|||FJ|L77F7L7FJJ-L-7||||7||7.LF|7.
+L-LF-LJL|LLJ|-|.LL-7L7||||F7LJFJ|||FJLJ||||L-JLJLJLJL7F7|L7FJL7L7F---JFJLJFJ|||F-JF-7FJ|F7FJLJLJ|F-JL-JLJLJLJL-JFJFJL-J|F7F--J||L7F7-F-.L|J.
+F.||.L.L|7JFJF|7LF7L7||||||L-7L7|||L--7||LJF--7F-----J||L7|L-7L7||F7F7L--7L7|||L-7L7|L7|||L--7F-J|F7F7F7F7F7F7F-JJL7F-7LJ|L--7||FJ|L7J|.FJ-|
+L77|F.LJL7FJ-F|7F|L-JLJ|||L-7L-J|||F--JLJF-JF7LJFF----JL-J|F7L7LJLJLJ|F--JFJ|LJF-JFJ|FJ||L7F-JL--J|||||LJLJLJLJF--7||FJF-JF7FJLJL-JFJFJ77J.F
+.L-LJFJ-||JL-F--LL7F7F7LJL7FL--7|||L----7|F7|L7F7L--7F---7LJL7L-7F---JL--7L-JF7|F7L7|L7LJFJL--7F-7|LJ|L-7F-7F7L|F-JLJL7L7J|||F-----JJF..F7F|
+|J-L-J-FFLFF.|J.|LLJLJL-7FJF7F-J|||F7F7FJLJ||FJ||F7LLJF7FJF7FJF-JL-7F7JF7L7F7||||L-JL7L-7L7F--J|JLJF7|F-J|FJ|L7||F7LF7L7L7|LJL-------7---7-F
+F77L--FJFJ|L-J.F|J.F----JL7||L-7LJ||LJ|L7F-J|L7||||F7FJ|L-J||LL-7F-J||FJL7||LJLJL-7F-JF-JFJL--7L7F-J|LJF7|L7L7LJLJL7|L7|FJ|F---------J7L-LJ.
+LLJ7F7LF-7L--F--F--JF7F7F7LJL7F|F-JL-7L7|L77L7||||||||FJF--JL7F7||JFJ|L7FJ|L-7-F7J|L-7L-7L-7LFJFJL7FJF7|||FJFJF7F-7|L7LJL7|L7F7F7F----7-|JL-
+F|F-J77LFJ7-7JFLL---JLJLJL-7FJFJL7|F7L7|L7L7FJLJLJ||LJL7L--7FJ|LJL-JFJFJL-JF-JFJ|FJF-JF7L-7L7L7|F7|L7||||||J|FJLJFJ|J|F7FJ|FJ|||LJF---J7..-J
+L--7F||L|F7L|.|F|LF--7F----JL7L-7|FJ|FJL7L7LJF----JL7F-JF--J|LL7F--7L7L7F--JF-JFJL7L--J|F7L7|F||||L7||LJLJL7||F7JL-JFJ|LJFJ|7|LJF-JF77L|7J|.
+LLL|7|F.|JJ.FF.J--L-7|L---7F7L7J||L7||F7|FJF-JF--7F7|L-7|F-7|F7|L7JL-J-|L7F7L-7L7FJF---J|L7|L-J||L7||L--7F7LJ||L7FF7L7L--JFJFJF-JF7|L-7||.LL
+-.-.|7LFJJ.F||F|.LFFJL---7LJ|FJFJL7||||LJL7|F7|F-J|LJF-JLJ-|||||FJF7F7FJFJ||F7L7||FJF-7|L7|L--7|L7|||F--J||F-JL7L7||L|F---JFL7|F7|||F-J7-F7.
+|-|-L|777--|-LFJ-F7L----7L--JL7|F7LJLJL7F7|||||L7FJF-JF-7F-JLJLJL7||||L7L-J||L7|LJ|FJFJF7||F--JL7|LJ|L--7|LJF-7|FJ||FJL7F7F7L|LJLJLJL--7-J7J
+|.|.LF7L7JFLF.|..|L----7L--7F7||||F-7F-J||||||L7||FJF7L7|L---7F--J||||F|F--JL7|L7FJ|FJ|||||L--7FJ|F-JFF7|L--JFJ||||LJF-J||||FJF----7F--J|.-7
+|-F7-J7JL777F|LF7L7F7F7L---J|LJLJLJFJ|F7|||||L7||||FJL7|L7F-7|L7F7||||FJL7F7FJ|FJ|FJ|F7||||F7FJ|FJ|F-7|LJF---JFJ|FJF-JF-JLJLJFJF--7|L-7JF7FF
+|LLJJ-LF-F77FF7|L7LJLJL----7|F-7F7FJJ||LJ||||F||||||F-JL7||7LJFJ||||||L-7||||.||FJ|FJ|||||LJ|L7|L7|L7||F7L-7F7L7||FJFFJF----7L-JF7||F7|-7|FJ
+|.FJ7-FL7|L7FJLJFJ.F7F7F---J||FJ||L-7LJF-J||L7LJ||||L7F-J|L--7|FJ||LJ|F-J||||FJ|L7|L-J|||L77|FJL-J|FJ|||L--J||FJLJL-7L7|-F7|L-7FJLJLJLJJ||77
+7-7F7.7LFL7|L--7|F7|||LJF7F7LJL-JL--JF7L-7|L-JF-J|||FJL7J|F-7|||FJ|F-JL7FJ|||L7L7||-F-J|L-JFJL--7FJ|FJ|L---7|||F----JFJL7|L--7|L-7LLLF-7-FF7
+JJFL--FFF-JL---JLJLJ|L--JLJL-7F------J|F7|L7JFJF7|||L7FJFJL7|||||FJ|F7FJL7|||FJFJ|L7L-7L-7|L7F--JL7|L7|F--7||LJ|F7LF7L7FJ|F--JL-7L7J-L7L--J|
+LF7|7-7JL7F--7F-7F-7L7F7F---7LJF-----7LJ|L7L7|FJ||||FJL7L7FJ|||||L7LJ|L7FJ|||L7|FJFJF-JF7|F-JL7F--JL7LJ|F7LJ|F-J||FJL-JL-JL7F-7FJFJ-F-JF7F-J
+7-L|7L|L|LJFFJ|||L7L7LJLJF-7L--JF---7|F7|FJFJ|L7||||L7FJ-|L7LJ|||FJF-JFJL7|||FJ|L7L7L-7|||L-7FJL--7FJF-J||F-JL--JLJF7F7F7F7LJFJL-JF7|F-JLJ7|
+||7|J.J-F7F7L7|FJFJLL--7FJLL7F-7|F--JLJ||L7L7L7|LJ||FJL-7|FJF-J||L7L-7L-7||LJL7L7L7L-7LJ|L7FJL-7F-JL7L7FJLJF-7F7F--JLJLJLJL7FJF7F7|LJL---7--
+JJFJL7JFJLJ|FLJL-J|F7F7LJF--J|-LJL-7F77LJ7|FJFJL-7||L7F7||L7|F7||FJF-JF7|||F--JFJFJF-J7FJFJL7F-JL-7FJFJ|F-7L7LJ|L---------7LJ-|LJLJF7F7F-J|7
+.||J||LL--7|F-7F--7|LJL-7|F--JF----J|L7F-7|L7L7F7|LJFJ|||L7|LJ|||L7L-7|||||L--7|7L7L--7L-J|FJL---7LJ7L-JL7L-JF7|F-7F7F7F--JF--JF-7FJ|||L7.L7
+-LL-J.-LF7||L7LJF7|L---7|LJF7.L--7F7|FJ|FJL-J7LJ|L7JL7||L7||F7|||FJF-J|||||FF7|L7FJF--JF---JF7F7FJJF77F-7|7F7|||L7|||||L---JF-7L7LJ|LJL-J-.|
+L|FJ7.LFJLJL7L--J||F7F-J|F7||F7F7LJLJ|7||7.F7F-7L7|F7||L7||LJ|LJLJFJF7||||L7|LJFJL7L-7LL7F7FJ||||F-JL-JFJL-JLJ||FJ|||||F7F-7L7|FJF7JJFJ.|FL7
+.F7LF-FL-7F7L----JLJLJF7LJLJLJLJL----JFJL7FJLJFJJLJ|LJ|-|||F7L-7F7L7||||||FJL-7L7L|F-JF-J|||FJ|||L----7L------JLJ|LJLJLJLJ||FJ|L-J|JJ7.|F|FF
+FLJ-|-F--J||F7F7F7F-7FJL--7F----------JF7LJF7FJF--7|F7|FJ||||F7LJ|FJ|LJ||LJ7F-JFJFJ|F-JF7|LJL7|||F7-F7L--------7F---------7|L7|F7FJ.LL.|||F|
+L..--7L-7FJLJLJLJLJ.LJF--7LJF---------7|L7FJ|L-JF-JLJ||L7||||||F7||FJF-JL--7L7FJ7L7||F7||||F-J|LJ||FJL--------7LJF-7F-----JL-J|||L77F-7-LFFJ
+JFJ|L||||L7LF---------JF7L--JF-------7|L7||||F-7L---7||FJ|LJ|||||||L7|F--7FJFJL-7-LJ||LJ|L7L-7L7FJLJF-7F-----7L--JFJL----7F-7JLJ|FJFL7|||LJJ
+.|-|-F-FL-JJ|F---------J|F7F-JF7F----JL7||L7|||L7F--J||L7L7FJ|||||L7|||F-JL7L7F7L7F-J|FFJFJF-JFJL--7|FJ|7F7F7L---7L------J|FJF-7LJF77|L-|.F-
+.LF|-||F---7LJF77F7FF---J|||F-J|L----7L|||FJ|L7FJL--7|L7L7||FJLJ||FJ||||F7FJJ||L7||F7|FJFJFL7FJF---J|L7|FJLJL----JF-------JL-JFJ7|||J7JLLL|J
+F-F-.FFJF-7|.FJL-JL-JF---JLJL-7L----7L7LJLJJL7|L7F--J|FJFJ||L--7|||FJLJLJ||F7|L7||LJLJL7|F--JL7L--7FJ7LJL--7F-----JF-------7F7L7F-JL-7L7LLF.
+L77-J|L-JFJL-JF7F7F--JF---7F-7L----7L7L-7F--7||.LJF77LJ7L7|L-7FJ|||L7F---J|||L-JLJF----J||F7F-JF7FJ|F-7F7F7LJF7F---JF7-F7F7LJ|FJL-7F-J||F7L7
+LJ||LJ-|JL----JLJ||F7JL--7LJFJF----J|L--J|F-JLJF--JL----7LJ7FJL7||L-JL---7LJL--7F-JF7F7FJLJLJF7||L-JL7LJLJL7FJ|L-7F-JL-JLJL7|||F7-||JFFL|7||
+L-F7FL7|LF-7F---7LJ||F---JF7L-JF---------J|F7F7|F-------JFF-JF-J|L7JLLF--JF7F--J|F-JLJ|L7F-77|LJL----JF7F7-LJ7|F7LJF---7F-7L7LJ|L-J|F77JLL.|
+.L|L777-FJFJL--7|F7||L----JL---JF-7F-----7LJLJ||L--------7|F7||7|FJ.F-L-7FJ|L7F7LJF---JFJL7L-JF-7F7F-7||||F7F7LJ|F7L--7||7L-JF7|F--J|L7777.7
+FF|FJF7FL7|F7F7||||||F7F-7F---7FL7LJF7F7|L7F-7LJF-7F-----J||LJ7-||J7FL|J||JL7LJL77L---7|F-JF-7|FJ|||FLJLJLJLJ|F7LJL7F-JLJF---JLJL7F7|FJF7--|
+F-J|-||-FJLJ||LJLJ||||||FJL--7|F7L-7|LJL-7LJF|F-JFJL7F---7||JLL-LJ7FF.|FLJJJ|F--JFF7JFJ|L--JF||L-J||F-----7F7LJL--7|L7F7FJF-7F7F7LJLJ|||L7-J
+L-7L-JL-JF-7LJF7F7LJLJLJL--7FJLJ|F7LJF--7L--7||F7L--J|F--JLJ777|LJ77|7LLL-FFJ|F-7FJL7L-JF----JL-7JLJL----7||L-----JL-J||L7|FLJLJ|F7F7L-JFJ7J
+LFJF7F7F7|FJF7|LJL7F--7F--7|L--7|||F7L-7|F--J|LJ|F---JL-7F|.|JF|-|.LF-.|.LFL7LJFJ|F7L7F-JF7F-7F7|F7F-----J|L---7F-----JL-JL---7.LJ||L7F7L-7|
+.L7|LJLJLJL7|LJ|F7LJF7LJF-JL-7FJLJ||L--JLJF-7|F7LJF7F7F-JJ-||-7|F----JF|-FF-JF7L7LJL7LJF-J||FJ|LJ|LJF7F--7L-7F7LJF7F-7F7F7F7F7L--7LJLLJL7FJ-
+-7LJF----7-LJF7FJL--JL-7L7F-7LJF-7|L------JFJ||L7FJLJLJF7-F777|F|.L7FLF|--L-7||FJJ|-L--JLFJ|L7|F-JF7|||F-JF7LJ|F7||L7LJLJ||LJL---JJ7|FJ|LJF|
+LL7|L-7F7L---JLJF7F-7F7L-J|7|F-J7|L---7F-7FJJLJFJL-----JL-JL-7LL|F||F.FJ7FJ-LJLJJLFF7F---JFJLLJL--JLJLJL--JL-7||LJL7L---7|L--7F--7JFJ7--L7--
+.|L-JF|||F--7F7FJ||7LJL7F-JFJ|F--JF7F7LJFJL-7F7L7F7F-----7F--J.LLL-|J-F7LFJ-L..L7.FJ|L--7FJ.F----7F-7F--7F---JLJF--JF---JL7F7LJF-JFF-J7LLL-J
+-L-7LFJ|LJF7LJ||FJ|F---J|F-JFJL---JLJL7-L--7LJ|-|||L--7F-JL--77LLL.7--J7-||7|7-||FL7|F7JLJF7L---7|L7|L-7|L---7F7L--7L7F7JFLJ|F-J7-LJ-JF7J|F.
+||7LLL-J|FJL--J|L7|L7F--JL--JF----7F-7L---7|F7L7LJ|F7FJL7F--7|7F7|7L-77L-777J|F--LJ|LJL--7||F7F-JL-JL-7||F-7FJ|L--7L7LJL7F-7|L7J7.|L|.7J.LFJ
+FJ77|LJJLL-7F7FJ7||FJ|F---7F-JF7F7LJ||F-7FJLJL7L-7||||-|||.LLJJFL--.FLJ-JJJ|JFL7L|.L--7F7LJLJLJF-7F--7LJLJ|LJFJF7FJ.L---J|FJL-JFJ-J--7L7-|J.
+F.F7-7F7LF7LJLJF7LJL-JL--7LJF7|LJL--7|L7LJF--7L--JLJ|L-7LJ-7F|-L.-77.J-F|.LLF|LFF7F7F7LJL-7F---JLLJF7L-----7FJFJLJF-7F7F7||F---7|.|L|7LF-F-7
+F7||7F||FJL---7||JF7-F7F7|F7|||F----JL-JF-JF7L-7F7F7L--J7|-LFJLJ-LFFJJ.F|..FJ|FF|LJLJL7F--J|F--7F--JL------J|FJF7.L7||||LJLJF-7L77|.F|7.||L-
+LFJL7FJ|L-7F-7LJL-JL7||||LJ||||L---7F7F7L7FJL--J|LJ|F7F7F77|.7-|7F7|7|F7LF-7L77LL--7F7LJF7FJL-7|L------7F--7|L-JL7FJLJLJF--7L7L7|7J--.|77|L|
+|L-7|L7|F7LJFJF----7||LJL-7LJLJF7F7LJLJL7||F7F--JF-J|LJLJL77.-7JL-L7-7JJ.-.F-|F-|LL||L7FJ||F--JL----7F7LJF-J|F---J|F----JF7L7L7LJ|7||F|LJ7L-
+LF-JL-JLJL7LL-JF7F-J||F--7L-7F7|LJ|F7F-7LJLJ||F7FJLFJF-7F-JL||.7F7.|L|JLLJ7F-||L-J7LJFJ||LJL---7F--7LJL--JF7|L----JL--7F7|L7L-JFF7F7--77-|77
+.L7F-7F7F7L----JLJF7LJL7FL-7LJ|L-7LJ|L7L7F7FJ||LJF7|FJJLJF|---7|7.J7-|7.L|FJ|LLJL-JJ.L7L7F-----J|F-JF7F7F7|||F-7F7F7F-J|||FJLF77|||||.|LJ|J-
+F.||FJ|LJ|F7F--7F7||F-7|F-7L-7|F7L-7L7|JLJ|L7|L--JLJL-7FF-7J.LFL77F---J---J.7J7.|F77FLL-J|F-----JL-7|LJLJLJLJL7LJLJLJF-JLJL--JL-JLJL77J77LJJ
+--LJL7|-FJ||L7FJ|LJ||.LJL7L-7||||F7L7|L-7-L-J|F----7F-J7L7L-7--7|-|.F7.L7F|-7||-FF-7-F7F7LJF-------J|F----7F-7L--7F7.|F----7F7F7F7F7L7-L7JFF
+LFLLFJL7L7|L7|L-JF7LJF---JF7LJLJLJL-JL-7|F-7FJL---7||JJFFL7FJ7F|J.|-LF--J-7FJJJ-LL7L-JLJL--JF7F7F7F7||F--7LJ||F--J||FJL---7LJLJLJ||L-J7.|FL.
+.JJ-|F-J-LJ.LJJF7|L7-L----JL-------7F77LJL7||F----JLJ-F-7FJ|.F77|.|7|FJFLLFL7L.FF7|F--------J||LJLJLJLJF7L--7LJF--JLJF7F-7L7F-77JLJLLL|FFFL7
+JJ.FLJF7|F7F7F7|LJFJF7F7F7F7F----77LJL7F7FJLJL--7F-7F7L7LJFJFJ|F7.||F7F77F777FF7||LJ7F--7|F77LJF-7|F7F-JL--7L7F|F----JLJJL7||FJ-7L|||..L7-..
+.7-|J.|L-JLJLJ|L-7L-JLJLJLJLJF--7L----J|||F--7F7LJFJ||J|F-J|L7LJ|7-F|LJL7|L7-FF7||F-7|F7|FJ|F7.L7|FJLJF7F7LL7L-JL--7F7F--7|LJL77|FFJ-JFF|L77
+FLFJ|-L------7L--JF7F7F--7F7FJF-JF-----JLJL-7LJ|F7L7|L7|L--7J|F-J77LL--7LJFJ-F|LJ|L7|LJ||L7|||F7||L--7|LJL7-L-7F---J||L7FJL--7L7F-7J.|FJJ7.7
+||L-J7LJ-F---JF7F7|||LJF-J||||L--JF-----7F-7L-7LJL-J|FJ|F--JFJL--7F7FF7|F7L7FFL-7L7|L7L||FJ||LJLJL7JFJ|F--JF7-|L----JL-JL7|F7L7LJFJLF-F-7--J
+F|L|-LJ.FJF7F-J||||LJF-JF7||L7F--7L----7|L7|F7L--7F7|L7|L7|FJF---J||FJLJ|L-JF7F7L7LJFJFJ|L7|L7F--7|FJFJL---JL7L-7F7F--7F7L-JL7|F7L--77F7J|.7
+7.FF7LLF|FJLJF-J|LJF7L7FJ||L-JL-7L---7FJ|FJLJ|F--J|LJFJL7|FJFJ-F-7||L--7L7F7|LJL7L-7L7L7L7||FJ|F-J|L-J|F7F7F7L-7|||L7FJ|L7F7FJ|||F--JJJ|LF-7
+L-LJL-|FLJF7FJF7|F-JL-JL7||F-7F-JF-7JLJF|L--7|L-7-|F-J|FJ|L7|F7|FJ||F7FJFJ||L--7L7J|FJ-L7LJ|L-JL-7L-77FJLJLJL7FJ|||FJL7L7||LJ7LJ|L-7F|LJ7F|-
+F-F-.-F-7FJLJFJLJ|F7F---JLJL7LJF-JFL---7|F--JL--JFJL--7L7L-JLJLJ|FJ|||L7|FJ|F7-L7|FJ|F7LL-7|F7|F7|F-JFJF--7F7LJJLJLJ-FJFJ|L---7|L--J-|.L7LLJ
+--7J-LL7LJF7FJF-7||LJF7F7F-7L--JF-----7||L-7F7F7FJF---JFJF------JL7LJ|FJ||FJ||F-J|L7||L---JLJL-J||L7.L7|F-J|L-------7L-JFL----JF7F7F7L|||LLJ
+L|FJFFLL--JLJFL7|LJF7||||L7L--7LL----7||L--J|LJ|L7L--7FJFJF7F-7FF7L-7|L7||L7||L-7|7||L---------7LJFJF7LJL--JF-------JF---7F7-F7|||LJ|-LJ7--F
+L-J-77.||J7LF--JL--JLJLJL7L--7|F7F---JLJF7F7L7FJ.|F--J|FJFJ||FJFJ|F7|L-J||FJ||F-J|FJ|F--7F-----JF7L-JL-7F---JLF-----7|F--J|L-J||LJF-J-7LF-7J
+FJ--|.-FJ.-JL7F-----7F7F7L---J|||L---7F7||||FJL7FJL7F7||FJFJ|L7|FJ||L--7||L-J||F7LJFJ|F-JL-7F7F7||F-7F7|L--7F7|F---7||L-7FJF--J|F-JJ.L7.|--7
+|FJ|.FJL--7F|LJ.F---J||||F---7LJL----J|||||||F-JL-7||LJ|L7L7|FJ|L7||LF7|||F--JLJL-7|FJL7F7F||LJLJ||-|||L--7LJLJL--7LJ|F-J|FJF7L||F7-F|7-J.|7
+L|-F||7.F7F-77F7L--7FJLJ||F--JF-------JLJLJLJL-7F-JLJF-JFJFJ|L7|FJ||FJ||LJL-7F7F--J|L7FJ|L-J|F---JL7LJL7F7L-------JF7||F-JL-JL-JLJL77L77L|L7
+L|FFLF77|FL7L-JL---J|F--J|L-7FJF-------7F7F7F7FJL---7|F7|FJ-L7LJ|FJ|L7|L7F--J|||F-7L-JL7L7F-JL7F7F7|F-7LJL-7F7JF7F7|||||F7F7F7F---7L77LL-77|
+-JFL||L7F7.L---7F7F7|L---JF7LJ7L---7FF7LJLJ||LJF7F7FJ||LJL7F7|F-JL7L7||FJ||F7||||FJF---J7LJF--J|LJLJL7L---7LJL-JLJLJLJ|||LJLJ|L--7L7L77J.|-F
+|.-FFL7LJL----7LJLJ||F----JL-------JFJL--7FJ|F-JLJ|L7LJF7FJ|||L7JFJFJ||L7|FJLJ|||L7|F--7F7.|F-7|F----JF7F7L-7F7F------J|L---7|F7FJ-L7L7----7
+7..7LLL---7F-7L7JF7LJL--7F7F7F7F---7|F---JL7|L---7L7|F-JLJ||||FJFJFJ||L7|LJF--JLJFJLJF-J|L7LJFJ|L7F7F7|LJL-7|||L7F7F7LFJF7F7|LJ|L7F7L-JFF7.|
+L7.J-|-JJ7||-L7L-JL-7F7FLJLJ||||F-7LJL----7LJF-7JL7||L7F-7FJLJ|.|FJF7L7||F-JF-77FJF7FJF7|FJF7|FJ7LJ||LJF7F7|LJL7LJLJL-JFJLJLJF7L7LJL-7F-7JF-
+FFF7.-7JLFLJF7L----7|||F7F7LLJLJL7|F-7F---JF7L7|F-J|L7||FJL--7L7|L7|L7||||F7L7|FJFJLJFJLJ|FJ|LJF7F7LJF-JLJ|L-7FJF-7F7F7L-7FF-JL7L----JL7L-77
+|7.-7.|.FL.FJL7F---JLJLJLJL7F7F7FJLJFJL---7|L7||L-7L-JLJL7F7.|FJ|FJL7LJ||LJ|FJ||FJF7.L-7FJL7L77|||L7.L---7|F-J|FJFJ|LJ|F7L7|F--JF--77F-JF-J-
+.L7|.L-7.|FJF7LJF-7F--7F7F-J|LJ|L--7L-----J|FJ||F7L--7F--J||FJL7||F7L-7||F-JL7|||||L7JFJ|F7|FJFJ||FJF7F7FJLJF7|L7L7L7FJ|L-J||LF7L7FJFL-7||.L
+.|||..FF--L-JL-7|FJ|F7LJ||F7L-7|F-7L7F7F-7-|L-J|||F--JL7F-J|L-7LJLJL7J||||LF7|LJL7L7|FJFJ|||L7L7||L7|LJ|L7FFJ|L-JFJFJL7L--7|L-JL-J|F-7FJL777
+-JLF.J-|FF7JF-7LJL-J|L--JLJ|F7||L7L-J|||FJFJF--J||L--7FJL-7||FJF7F--JFJLJL7|||F--JL||L7|FJLJFJL|||FJL-7|FL7L7L--7L-JF7L7F-J|F-----J|FJ|F-JL|
+|7JFF7F--JL7L7|LF--7L----7FJ||||FL-7FJ||L7|FJLF7||F7FJ|F7FJ|FJFJLJF-7L-7F-J||||F-7FJ|FJ||F7FJ|FJ||L7F-J|F-JFJF--JF7FJL7|L--JL-7-F7FJL7||F7F|
+-L7.L-L---7L-JL7L-7|F----JL-JLJL---J|FJL7|||F7|||||||FJ||L7||FJF7-|FJF7||F7|||||FJL7|L7|||LJF7L7|L7|L7FJL--JFJF7F|LJF7|L7F-7F-JFJLJF7LJLJ|77
+|.L|.FLJ.L|F7F7L-7||L-7F--7F7F7F---7|L7FJ||LJ|||||||||FJ|FJ||L7|L7||FJLJ||||LJ||L7FJL7|||L7FJ|FJL7||FJ|F7F-7L-JL-JF-J||FJ|FJL--JF--J|F7F7L-7
+FJJ|-|L|-7LJLJL-7||L-7LJF7LJLJLJF--JL7||L||F-J|LJ||||LJFJL7LJFJ|.LJ|L7F-J||L7J|L7LJF-J||L7||FJ|F7||LJFJ|||FJF--7F-JF-J|L7|L-7F-7|F-7|||||F7|
+L|FL-|-|JFJF----JLJF7L-7||F-77F7L7F-7||L7||L-7L-7||||F-JF7|F7L-JF--JFJ|F7|L7L7L-JF-JF7|L7|LJL-J|LJL7LL7|LJL7L7FJL-7L-7L7||F-JL7|LJFJ||||||LJ
+LF-J7|L||.|L-----7FJ|F7|||L7L-JL-J|FJ||FJ|L-7L7FJLJ|||F7||LJL--7L7F7|||||L7L7L--7L-7|||.|L-7F--JF7FJF-JL--7L7|L7F-JF7L-J||L-7FJ|F7|-LJ||||||
+.7JF-7-J-FF7F7F--J|FJ||LJL-JF---7FJL-J|L7L7FJFJL-7.|||||||F7F-7L7|||L7|||FJFJF7FJF-J|||FJF-J|F-7|||7L-7F-7L7||FJL--JL--7|L-7|L7LJ||FJ-LJLJ-7
+F7.FF-FJLFJLJLJF7FJL-JL-7F-7|F--JL7F--JFJ.|L7L7F7L7LJLJLJ||LJFJFJLJ|FJ||LJF|FJ|L7L7FJ||L7L7FJ|FJ||L-7FJL7|FJLJL7F7F---7||F7|L7L-7LJ----||LL|
+LJF-LJJ.FL--7F-JLJF7F-7FJ|FJ||F7F7|L--7L-7|FJFJ|L7L--7FF-JL-7L-JF--J|FJL7F-J|||FJFJ|FJL7L7|L7|L7||F7|L7FJLJ.F7FJ||L-7FJ|||||FJF-J.|.|.F-|7.L
+.L-7|-FF-F--J|F--7||L7LJFJL7|LJ|||L7F-JF-JLJ|L7L7|F-7L7|F7F7L-77L7F7|L7FJ|F7L7||FJFJL--JJ||7LJFLJ||||FJL----J||FJ|F7||FJ||LJL7L7J-7.L|JF|77|
+7.L-JF.L-L7F7||F7LJL7L-7L-7||F-J||FJ|F7L-----7L7|||L|FJLJ|||F7L77LJ|L7||FJ||FJ|||FJF7F---JL--7F--J|LJ|F7F7F-7|||-LJ||LJF|L77F|FJ|LF7|L.|7FL-
+LJ7FFJ7J|.||LJLJL--7|FFJF-JLJL-7||L7LJL7F--7FJ7LJ|L7LJF--J||||FJF77L-JLJL7|||-||||.|||F--7F7FJL--7L7FJ|||||FJ||L-7FJL--7L7L7FJL--7||J.L|LFFJ
+L|FFF.L7L-LJF------JL-JFJJF7F7FJ|L7L7FFJL77|L7F--JFJF-JF-7||||L-JL---7F--J||L7||||FJ||L7FJ||L-7F7|FJ|FJ||LJL7||F7|L-7F7|7L7|L7F--J||77F|7JLJ
+.F|FJ-LLJL|.L---7F7F-7FJF-JLJLJFJ||FJFJF7L7L-JL--7L7|F7|F|||||F7F--7FJL--7||FJLJLJL7LJFJL7|L-7||LJL7||FJ|F7FJ|LJ|L-7|||L-7|L7||7F7||F7-F7L|J
+F7J||-|F-JL7FLF7||||FJ|-L7F-7F7L-7||LL-JL7L---7F-JFJLJ||FJ|LJ|||L-7|L7F--J||L7F7JF7L-7L-7LJF7|||F-7|||L7LJ||FJF-JF-J||L7FJ|FJ|L-JLJLJL-JL7LF
+|LFL7F-7-7LLF-JLJ|LJL7|F-JL7LJL7FJLJF----JF7F-J|F7L-7FJ|L7L7.|||F-JL7||F7FJL7LJ|FJL--JF7L7FJLJ|LJFJ|LJ-L7FJLJ7|F7L-7||.|L7||FJF7F-7F----7|.|
+J-JLF7F-.-7-L7F7FJJF7LJL-7FJ-F-JL-7.L-7F7FJ|L-7LJL7FJL7|FJFJFJ||L-7-||LJ|L-7|F7|L--7F-JL7|L--7L7-L7|7F7FJL--7FJ||F-JLJFJFJ|||FJ|L7LJJ.L|LJ7-
+|L-7J.|.F|J|LLJLJFFJ|F---J|F7|F7F7|F--J||L7L--J-F-JL-7||L7||L7||F7|FJL-7L-7|||LJF--JL--7||F--JFJF-JL-J|L7F7FJL7||L--7L|FJFJ||||L7L7.LLL7JF||
+|..|||-.||-7J-F--7L7|L-7F7LJ|||||||L--7|L7L----7|F7F7|||FJ|F-J|||||L7F7|F-J||L7JL-7F7F7|LJL--7|LL7F7F7L7||||F7|||F7FJFJL7L-JLJ-JL-J7F7F|||77
+J.7.LFJ7LLF-7-L-7|L|L--J||F-JLJ||||F--JL7|F----JLJ||LJLJL7|L7FJLJLJFJ||||F7|L-JF--J||||L7-F--JL7FJ||||FJLJ|LJ|LJ||LJ-|F-J|LJLJ.L|L.|LJ-L7|L|
+FFF-.L.FJ-LJF---JL7L7F7FJ|L---7||||L-7F7||L-7F7F--JL---7FJ|FJL--7F7L-J|||||L7FFL--7|LJ|FJFJF-7FJ|FJLJ|L-7FJF-JF-JL-7LLJ7FF.L|LF-|-7|F||7LJF|
+---.7.F|JL|FL----7L-J|||7L7F7FJ|||L7FJ||||F7LJ|L--7F-7FJL7|L7F-7LJL7F-J|||L7L7F---JL-7|L7L7|FJL7|L7F-JF7|L7L7LL-7F7L7JJF777FJ-J|L7L77F7-7LLL
+||.FL.-|-77|F----JF-7||L7-LJ||-LJL7||FJ|||||F7|F--JL7|L7LLJ-LJ-L7F-J|F7|||FJFJ|F7F7F-JL7L7||L7FJ|FJL-7||L7|FJ77FJ|L7L7-FF7FLJ7J|JJ..F-7.J|JJ
+.7F7J7J.|JF-L--7F7|FJ||FJF--JL-7F-J|LJFJ|||||||L7F7FJ|FJJ.LF----JL7FJ|||LJL7|FJ||||L--7L7|LJ7||L|L7-FJ|L7|||L|F|FJJL-J..J77--F.7LF-J|LJ-LL--
+FJF|-|FFFJLF---J|||L7|||FJF-7F-J|F7L7F|FJ||||LJFJ||L7LJJ7F|L--7F7FJL7||L7JLLJ|FJLJL7F-JFLJ-F-JL7|FJFJFJFJ|LJ-F-J|J7|-J-|.|-.LF-LF7JFJ..F||..
+J.LF.LL-|.LL-7F7|LJL|||||FJFJ|F-J||FJFJL7LJLJF-JFJ|FJJ|7F--F--J||L-7LJL7|JJL-||F7F-JL--7LJ.L-7FJ|L7L7L7L7L-7-L7FJ.|-.L-|F|.|J|L|||FJ777-LL77
+LF7L||-FFF.LLLJ||FF7||||LJJL7|L7FJ|L7L7FJJL|JL7FJFJL7.77L.FL-7FJ|F7|LJFLJ7..FLJ|LJF7F--J-7-F-J|L|FJFJFJFJF7|JJLJF7..F----L-7FL7-|7L|LF-.LLJ7
+.F|L|7-L-7J7J..LJ-|LJ|||7.LFJL7LJFJFJFJL77F|7LLJLL7FJ-L7FLJ.L||J||LJLF|7||7F-.L|F7||L-7JJF-L--J.LJLL-JJL-JLJ.F-L7LJ.|.|.||LJ7JJFL7F||JJFLLF|
+F|7.J|7...|F7F-JLF|F7|LJ-J7L-7|J7|FJFJF-J7JFJ|L|JLLJF|.L-|LJ|||FJL7|-L-|-LFL-7-LJLJ|F-JJ.J-JLJ-FJ.L|-L-7L.J--7|J.|.L7-7-LLJF|7F77.-L|-FF-F7J
+.||FL-J-77L-L|7.LF||||||7L7|-LJJ-|L7L7|J---JFL--.J||---..-|7LLJ|F7L-7JJ|7|||FFF7L|L|L7F--L7JLJ.F|7|LF7F-7L7F7LJ7F--|J.L.L|-LJ-J777LFL--JF-7.
+7.L7J7FFJFLL7L-FLFJ||L7-F7FJ7-|L|L7|-LJJ7LJL|JJ.|J|JF.LF.|L7LJLLJL--JL7J77.LJ||F-7JL7|J.7J|.|.F|FF-FJJ|F|.JLJ|.F-FF|.7.-|L-JF--JFJFJJ|J-FJL-
+J.|7-F7.LLJL|.77LL-JL-J7F-JLL7|.F7LJ7FL-J.FL|.|-.7.F|F-7.-7JJ|FL||-||.|7|-7-JJ|LLLJ|LJ7FJ.JFFL7JL--J-F77J-F77F-|-F.77.L.LF77FJ|LF-7.FJL-LJ|.
+|.7L-|JL.LF777F|.|J|.JJ-|.-.|L.FFJJ||-L-|7L7JF7.7JFJLF.|J|||LF--JJ7.7.J-L||.|FL7||-L7L--7FLL-7|77F7J-|.J7.L7JLFL.LF7FF|.F7F|.FFJ|FJF||.7J7.J
+|7|.FJ.J-.L|JF-JFJ.|.|LFJ-|FJFF7JJ.||LL7--J|FLJ7.LF-J|7L7L7J.LJF|7L-7-|JJ.FF-FL7-L7L|JLFL7.|F7JF-J-7FL7L7-|J77|LFF-|--J-F77JFL|.|J7.L7-JLJ7|
+-F7-||7JFFL|L|.|F-7L7J7JFFF---L7JJ.7-.FFJ7F.|LFJ--J.F7JFJJ.F-7--77.F|J|FF7LJF--7J|L7.|.FJLF-7LFJ|-|F-77.LF----7LLJL||.LLJLJFF7J7|-77.-.LJF-J
+LJ--|J7.LJFJ7|7FJ---L77LLF7J7.FJ7F7L77.J.FLF-FJJ.FL.F--FJ.F-FF7J|7FFJFF|-7|JLL--7J-J7|7LF7LLF---7F7--F7F-JL-.|7LF|7F|--.FJ.FJ|7F|-L77|L7FL-J
+|JL-JJ-|.FJ-LL7LF7-F-JL--LJL|---|JLJJJ.|-JLLJ|J.FJ.FLLJJLJ-J|L-.LF-J-LJLLJ-7.L--L..LLJ-.LJJFJ---JL7J.LFJLF-J7.|-JJLJ.|J-JJ|L7J|.|.LL-7.|J.-J
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/input/10_test1.txt	Wed Dec 20 20:55:26 2023 +0100
@@ -0,0 +1,5 @@
+.....
+.S-7.
+.|.|.
+.L-J.
+.....
\ No newline at end of file