Rickard's Projects

This site hosts my projects.

Projects

Recent events

2025-12-10 07:52 Rickard pushed to rlworkbench

commit c00bc60cc2663dd1d512ac40364519aa314c6b5e
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Wed Dec 10 07:45:24 2025 +0100

    Test parsing of goal pattern

diff --git a/src/examples/aoc202510/aoc202510.meta b/src/examples/aoc202510/aoc202510.meta
index 2b5c638..ff24a80 100644
--- a/src/examples/aoc202510/aoc202510.meta
+++ b/src/examples/aoc202510/aoc202510.meta
@@ -14,7 +14,21 @@ main = machine*:xs !. -> {
             $xs
         };
 
+        void print_bits(unsigned int number) {
+            if (number) {
+                print_bits(number >> 1);
+                if (number & 1) {
+                    printf("#");
+                } else {
+                    printf(".");
+                }
+            }
+        }
+
         int main() {
+            print_bits(machines[0].goal_pattern); printf("\n");
+            print_bits(machines[2].goal_pattern); printf("\n");
+            print_bits(machines[2].presses[1]); printf("\n");
             printf("Part 1 = ??\n");
             return 0;
         }

commit 046638c2102f28d6011f6567cfe9a199f7724d7c
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Wed Dec 10 07:38:52 2025 +0100

    Fix press digit calculation

diff --git a/src/examples/aoc202510/aoc202510.meta b/src/examples/aoc202510/aoc202510.meta
index 04a3962..2b5c638 100644
--- a/src/examples/aoc202510/aoc202510.meta
+++ b/src/examples/aoc202510/aoc202510.meta
@@ -49,8 +49,8 @@ joltage = pressDigit*;
 
 press = space '(' pressDigit*:xs ')' -> { "0" xs ",\n" };
 
-pressDigit = ','* number -> {
-    "|(1<<(" <size "-" W[2] "))"
+pressDigit = ','* number:x -> {
+    "|(1<<(" <size "-1-" x "))"
 };
 
 number = digit digit*;

commit 62edc0d08b837daa9f1fc3b6d30a19a1bcc3d048
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Wed Dec 10 07:14:05 2025 +0100

    Parse Day 10 part 1

diff --git a/make.sh b/make.sh
index c85d644..31be733 100755
--- a/make.sh
+++ b/make.sh
@@ -20,6 +20,7 @@ main() {
     example_aoc20257
     example_aoc20258
     example_aoc20259
+    example_aoc202510
 }
 
 dotall() {
@@ -169,6 +170,15 @@ example_aoc20259() {
     out/$input
 }
 
+example_aoc202510() {
+    meta_compile src/examples/aoc202510/aoc202510.meta out/aoc202510.c
+    c_compile out/aoc202510.c out/aoc202510
+    input=example
+    out/aoc202510 <src/examples/aoc202510/$input.aoc202510 >out/$input.c
+    c_compile out/$input.c out/$input
+    out/$input
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
diff --git a/src/examples/aoc202510/aoc202510.meta b/src/examples/aoc202510/aoc202510.meta
new file mode 100644
index 0000000..04a3962
--- /dev/null
+++ b/src/examples/aoc202510/aoc202510.meta
@@ -0,0 +1,60 @@
+main = machine*:xs !. -> {
+    $maxPresses
+    "#define MAX_PRESSES " <maxPresses "\n"
+    C{
+        #include <stdio.h>
+
+        typedef struct {
+            unsigned int goal_pattern;
+            unsigned int presses_count;
+            unsigned int presses[MAX_PRESSES];
+        } Machine;
+
+        static Machine machines[] = {
+            $xs
+        };
+
+        int main() {
+            printf("Part 1 = ??\n");
+            return 0;
+        }
+    }
+    >maxPresses { W[1] }
+};
+
+machine = '[' lights:x ']' press*:ys space '{' joltage '}\n' -> {
+    $size
+    #max(W[1] ys.count)
+    "{\n" >
+        x ",\n"
+        ys.count ",\n"
+        "{\n" >
+            ys
+        < "}\n"
+    < "},\n"
+};
+
+lights = light*:xs -> {
+    #set(W[2] 0)
+    "0" xs
+    >size { xs.count }
+};
+
+light =
+    | '.' -> { #inc(W[2] 1) "" }
+    | '#' -> { #inc(W[2] 1) "|(1<<(" <size "-" W[2] "))" }
+    ;
+
+joltage = pressDigit*;
+
+press = space '(' pressDigit*:xs ')' -> { "0" xs ",\n" };
+
+pressDigit = ','* number -> {
+    "|(1<<(" <size "-" W[2] "))"
+};
+
+number = digit digit*;
+
+digit = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
+
+space = ' '*;
diff --git a/src/examples/aoc202510/example.aoc202510 b/src/examples/aoc202510/example.aoc202510
new file mode 100644
index 0000000..dd91d7b
--- /dev/null
+++ b/src/examples/aoc202510/example.aoc202510
@@ -0,0 +1,3 @@
+[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}
+[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}
+[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}
diff --git a/src/meta.c b/src/meta.c
index dda1cdb..2c30f86 100644
--- a/src/meta.c
+++ b/src/meta.c
@@ -139,6 +139,10 @@ unsigned int meta_inc(unsigned int value, unsigned int amount) {
     return value + amount;
 }
 
+unsigned int meta_set(unsigned int value, unsigned int amount) {
+    return amount;
+}
+
 unsigned int meta_max(unsigned int a, unsigned int b) {
     return a > b ? a : b;
 }

2025-12-10 07:14 Rickard pushed to rlworkbench

commit 62edc0d08b837daa9f1fc3b6d30a19a1bcc3d048
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Wed Dec 10 07:14:05 2025 +0100

    Parse Day 10 part 1

diff --git a/make.sh b/make.sh
index c85d644..31be733 100755
--- a/make.sh
+++ b/make.sh
@@ -20,6 +20,7 @@ main() {
     example_aoc20257
     example_aoc20258
     example_aoc20259
+    example_aoc202510
 }
 
 dotall() {
@@ -169,6 +170,15 @@ example_aoc20259() {
     out/$input
 }
 
+example_aoc202510() {
+    meta_compile src/examples/aoc202510/aoc202510.meta out/aoc202510.c
+    c_compile out/aoc202510.c out/aoc202510
+    input=example
+    out/aoc202510 <src/examples/aoc202510/$input.aoc202510 >out/$input.c
+    c_compile out/$input.c out/$input
+    out/$input
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
diff --git a/src/examples/aoc202510/aoc202510.meta b/src/examples/aoc202510/aoc202510.meta
new file mode 100644
index 0000000..04a3962
--- /dev/null
+++ b/src/examples/aoc202510/aoc202510.meta
@@ -0,0 +1,60 @@
+main = machine*:xs !. -> {
+    $maxPresses
+    "#define MAX_PRESSES " <maxPresses "\n"
+    C{
+        #include <stdio.h>
+
+        typedef struct {
+            unsigned int goal_pattern;
+            unsigned int presses_count;
+            unsigned int presses[MAX_PRESSES];
+        } Machine;
+
+        static Machine machines[] = {
+            $xs
+        };
+
+        int main() {
+            printf("Part 1 = ??\n");
+            return 0;
+        }
+    }
+    >maxPresses { W[1] }
+};
+
+machine = '[' lights:x ']' press*:ys space '{' joltage '}\n' -> {
+    $size
+    #max(W[1] ys.count)
+    "{\n" >
+        x ",\n"
+        ys.count ",\n"
+        "{\n" >
+            ys
+        < "}\n"
+    < "},\n"
+};
+
+lights = light*:xs -> {
+    #set(W[2] 0)
+    "0" xs
+    >size { xs.count }
+};
+
+light =
+    | '.' -> { #inc(W[2] 1) "" }
+    | '#' -> { #inc(W[2] 1) "|(1<<(" <size "-" W[2] "))" }
+    ;
+
+joltage = pressDigit*;
+
+press = space '(' pressDigit*:xs ')' -> { "0" xs ",\n" };
+
+pressDigit = ','* number -> {
+    "|(1<<(" <size "-" W[2] "))"
+};
+
+number = digit digit*;
+
+digit = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
+
+space = ' '*;
diff --git a/src/examples/aoc202510/example.aoc202510 b/src/examples/aoc202510/example.aoc202510
new file mode 100644
index 0000000..dd91d7b
--- /dev/null
+++ b/src/examples/aoc202510/example.aoc202510
@@ -0,0 +1,3 @@
+[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}
+[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}
+[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}
diff --git a/src/meta.c b/src/meta.c
index dda1cdb..2c30f86 100644
--- a/src/meta.c
+++ b/src/meta.c
@@ -139,6 +139,10 @@ unsigned int meta_inc(unsigned int value, unsigned int amount) {
     return value + amount;
 }
 
+unsigned int meta_set(unsigned int value, unsigned int amount) {
+    return amount;
+}
+
 unsigned int meta_max(unsigned int a, unsigned int b) {
     return a > b ? a : b;
 }

2025-12-09 21:49 Rickard pushed to rlworkbench

commit 0643603002a286d46d6f2d827efde1c609ad016b
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 21:48:50 2025 +0100

    Early exit plus print (solved part 2 in ~6 minutes)

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 1b0c6c5..0024f26 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -114,21 +114,21 @@ main = position*:xs !. -> {
 
         int rectangle_is_inside(Position a, Position b) {
             unsigned long x, y;
-            for (x=min_x(a, b); x<=max_x(a, b); x++) {
-                if (!is_inside(x, min_y(a, b))) {
-                    return 0;
-                }
-                if (!is_inside(x, max_y(a, b))) {
-                    return 0;
-                }
+            unsigned long x1 = min_x(a, b);
+            unsigned long x2 = max_x(a, b);
+            unsigned long y1 = min_y(a, b);
+            unsigned long y2 = max_y(a, b);
+            if (!is_inside(x1, y1)) { return 0; }
+            if (!is_inside(x2, y1)) { return 0; }
+            if (!is_inside(x1, y2)) { return 0; }
+            if (!is_inside(x2, y2)) { return 0; }
+            for (x=x1+1; x<x2; x++) {
+                if (!is_inside(x, y1)) { return 0; }
+                if (!is_inside(x, y1)) { return 0; }
             }
-            for (y=min_y(a, b); y<=max_y(a, b); y++) {
-                if (!is_inside(min_x(a, b), y)) {
-                    return 0;
-                }
-                if (!is_inside(max_x(a, b), y)) {
-                    return 0;
-                }
+            for (y=y1+1; y<y2; y++) {
+                if (!is_inside(x1, y)) { return 0; }
+                if (!is_inside(x2, y)) { return 0; }
             }
             return 1;
         }
@@ -166,6 +166,12 @@ main = position*:xs !. -> {
             printf("Part 1 = %ld\n", pop_max_area().area);
             while (1) {
                 area = pop_max_area();
+                printf(
+                    "area = %ld, dx = %ld, dy = %ld\n",
+                    area.area,
+                    max_x(area.a, area.b)-min_x(area.a, area.b),
+                    max_y(area.a, area.b)-min_y(area.a, area.b)
+                );
                 if (rectangle_is_inside(area.a, area.b)) {
                     break;
                 }

commit 477e216261602c095bddd89f033fc3c205624059
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 21:17:21 2025 +0100

    Check areas in order big to small

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 802a005..1b0c6c5 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -11,7 +11,14 @@ main = position*:xs !. -> {
             unsigned long y;
         } Position;
 
+        typedef struct {
+            unsigned long area;
+            Position a;
+            Position b;
+        } Area;
+
         static Position tile_positions[COUNT] = {$xs};
+        static Area areas[COUNT][COUNT];
 
         unsigned long distance(unsigned long a, unsigned long b) {
             if (a < b) {
@@ -77,25 +84,32 @@ main = position*:xs !. -> {
 
         typedef int (*ValidFn)(Position, Position);
 
-        unsigned long max_area(ValidFn area_valid) {
+        void calc_areas() {
             int i, j;
-            unsigned long tmp_area, max_area = 0;
             for (i=0; i<COUNT; i++) {
                 for (j=0; j<COUNT; j++) {
-                    tmp_area = area(tile_positions[i], tile_positions[j]);
-                    if (
-                        tmp_area > max_area &&
-                        area_valid(tile_positions[i], tile_positions[j])
-                    ) {
-                        max_area = tmp_area;
-                    }
+                    areas[i][j].area = area(tile_positions[i], tile_positions[j]);
+                    areas[i][j].a = tile_positions[i];
+                    areas[i][j].b = tile_positions[j];
                 }
             }
-            return max_area;
         }
 
-        int always_valid(Position a, Position b) {
-            return 1;
+        Area pop_max_area() {
+            int i, j, max_i, max_j;
+            Area max_area;
+            max_area.area = 0;
+            for (i=0; i<COUNT; i++) {
+                for (j=0; j<COUNT; j++) {
+                    if (areas[i][j].area > max_area.area) {
+                        max_area = areas[i][j];
+                        max_i = i;
+                        max_j = j;
+                    }
+                }
+            }
+            areas[max_i][max_j].area = 0;
+            return max_area;
         }
 
         int rectangle_is_inside(Position a, Position b) {
@@ -146,9 +160,17 @@ main = position*:xs !. -> {
         }
 
         int main() {
+            Area area;
+            calc_areas();
             print_grid();
-            printf("Part 1 = %ld\n", max_area(always_valid));
-            printf("Part 2 = %ld\n", max_area(rectangle_is_inside));
+            printf("Part 1 = %ld\n", pop_max_area().area);
+            while (1) {
+                area = pop_max_area();
+                if (rectangle_is_inside(area.a, area.b)) {
+                    break;
+                }
+            }
+            printf("Part 2 = %ld\n", area.area);
             return 0;
         }
     }

commit 67249600d9fbe149e4c2bab0803f703da54dd86a
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 20:34:28 2025 +0100

    Check only border points, not the whole rectangle

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 61fd0ad..802a005 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -101,10 +101,19 @@ main = position*:xs !. -> {
         int rectangle_is_inside(Position a, Position b) {
             unsigned long x, y;
             for (x=min_x(a, b); x<=max_x(a, b); x++) {
-                for (y=min_y(a, b); y<=max_y(a, b); y++) {
-                    if (!is_inside(x, y)) {
-                        return 0;
-                    }
+                if (!is_inside(x, min_y(a, b))) {
+                    return 0;
+                }
+                if (!is_inside(x, max_y(a, b))) {
+                    return 0;
+                }
+            }
+            for (y=min_y(a, b); y<=max_y(a, b); y++) {
+                if (!is_inside(min_x(a, b), y)) {
+                    return 0;
+                }
+                if (!is_inside(max_x(a, b), y)) {
+                    return 0;
                 }
             }
             return 1;

commit 9a250ecf5af249f09db180182ec69ef0bdbb33df
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 20:29:03 2025 +0100

    Clean up

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index f450aed..61fd0ad 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -3,8 +3,8 @@ main = position*:xs !. -> {
     C{
         #include <stdio.h>
 
-        #define GRID_ROWS 9
-        #define GRID_COLS 14
+        #define GRID_ROWS 20
+        #define GRID_COLS 70
 
         typedef struct {
             unsigned long x;
@@ -25,10 +25,6 @@ main = position*:xs !. -> {
             return distance(a.x, b.x) * distance(a.y, b.y);
         }
 
-        int is_vertical(Position a, Position b) {
-            return a.x == b.x;
-        }
-
         unsigned long min_x(Position a, Position b) {
             return a.x < b.x ? a.x : b.x;
         }
@@ -52,11 +48,11 @@ main = position*:xs !. -> {
         int is_on_line(Position a, Position b, unsigned long x, unsigned long y) {
             if (a.x == b.x && a.x == x) {
                 return min_y(a, b) <= y && y <= max_y(a, b);
-            }
-            if (a.y == b.y && a.y == y) {
+            } else if (a.y == b.y && a.y == y) {
                 return min_x(a, b) <= x && x <= max_x(a, b);
+            } else {
+                return 0;
             }
-            return 0;
         }
 
         int is_inside(unsigned long x, unsigned long y) {
@@ -67,10 +63,12 @@ main = position*:xs !. -> {
                 if (is_on_line(previous, tile_positions[i], x, y)) {
                     return 1;
                 }
-                if (is_vertical(previous, tile_positions[i])) {
-                    if (previous.x > x && y_inside(previous, tile_positions[i], y)) {
-                        intersection_count++;
-                    }
+                if (
+                    previous.x == tile_positions[i].x &&
+                    previous.x > x &&
+                    y_inside(previous, tile_positions[i], y)
+                ) {
+                    intersection_count++;
                 }
                 previous = tile_positions[i];
             }
@@ -79,7 +77,7 @@ main = position*:xs !. -> {
 
         typedef int (*ValidFn)(Position, Position);
 
-        unsigned long max_area(ValidFn valid) {
+        unsigned long max_area(ValidFn area_valid) {
             int i, j;
             unsigned long tmp_area, max_area = 0;
             for (i=0; i<COUNT; i++) {
@@ -87,7 +85,7 @@ main = position*:xs !. -> {
                     tmp_area = area(tile_positions[i], tile_positions[j]);
                     if (
                         tmp_area > max_area &&
-                        valid(tile_positions[i], tile_positions[j])
+                        area_valid(tile_positions[i], tile_positions[j])
                     ) {
                         max_area = tmp_area;
                     }
@@ -101,23 +99,9 @@ main = position*:xs !. -> {
         }
 
         int rectangle_is_inside(Position a, Position b) {
-            unsigned long x_min, x_max, y_min, y_max, x, y;
-            if (a.x < b.x) {
-                x_min = a.x;
-                x_max = b.x;
-            } else {
-                x_min = b.x;
-                x_max = a.x;
-            }
-            if (a.y < b.y) {
-                y_min = a.y;
-                y_max = b.y;
-            } else {
-                y_min = b.y;
-                y_max = a.y;
-            }
-            for (x=x_min; x<=x_max; x++) {
-                for (y=y_min; y<=y_max; y++) {
+            unsigned long x, y;
+            for (x=min_x(a, b); x<=max_x(a, b); x++) {
+                for (y=min_y(a, b); y<=max_y(a, b); y++) {
                     if (!is_inside(x, y)) {
                         return 0;
                     }
@@ -126,34 +110,36 @@ main = position*:xs !. -> {
             return 1;
         }
 
-        int main() {
-            printf("Part 1 = %ld\n", max_area(always_valid));
-            printf("Part 2 = %ld\n", max_area(rectangle_is_inside));
-            {
-                int x, y;
-                char grid[GRID_ROWS][GRID_COLS];
-                for (y=0; y<GRID_ROWS; y++) {
-                    for (x=0; x<GRID_COLS; x++) {
-                        if (is_inside(x, y)) {
-                            grid[y][x] = 'x';
-                        } else {
-                            grid[y][x] = '.';
-                        }
+        void print_grid() {
+            int x, y;
+            char grid[GRID_ROWS][GRID_COLS];
+            for (y=0; y<GRID_ROWS; y++) {
+                for (x=0; x<GRID_COLS; x++) {
+                    if (is_inside(x, y)) {
+                        grid[y][x] = 'x';
+                    } else {
+                        grid[y][x] = '.';
                     }
                 }
-                for (y=0; y<COUNT; y++) {
-                    Position tile = tile_positions[y];
-                    if (tile.x < GRID_COLS && tile.y < GRID_ROWS) {
-                        grid[tile.y][tile.x] = '#';
-                    }
+            }
+            for (y=0; y<COUNT; y++) {
+                Position tile = tile_positions[y];
+                if (tile.x < GRID_COLS && tile.y < GRID_ROWS) {
+                    grid[tile.y][tile.x] = '#';
                 }
-                for (y=0; y<GRID_ROWS; y++) {
-                    for (x=0; x<GRID_COLS; x++) {
-                        printf("%c", grid[y][x]);
-                    }
-                    printf("\n");
+            }
+            for (y=0; y<GRID_ROWS; y++) {
+                for (x=0; x<GRID_COLS; x++) {
+                    printf("%c", grid[y][x]);
                 }
+                printf("\n");
             }
+        }
+
+        int main() {
+            print_grid();
+            printf("Part 1 = %ld\n", max_area(always_valid));
+            printf("Part 2 = %ld\n", max_area(rectangle_is_inside));
             return 0;
         }
     }

commit 8c05204f3cd5b18d7df89ac91bf3c4adbb3a494e
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 20:19:46 2025 +0100

    Got example right for part 2

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 1c102ca..f450aed 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -25,10 +25,58 @@ main = position*:xs !. -> {
             return distance(a.x, b.x) * distance(a.y, b.y);
         }
 
-        int is_inside(unsigned long x, unsigned long y) {
+        int is_vertical(Position a, Position b) {
+            return a.x == b.x;
+        }
+
+        unsigned long min_x(Position a, Position b) {
+            return a.x < b.x ? a.x : b.x;
+        }
+
+        unsigned long min_y(Position a, Position b) {
+            return a.y < b.y ? a.y : b.y;
+        }
+
+        unsigned long max_x(Position a, Position b) {
+            return a.x > b.x ? a.x : b.x;
+        }
+
+        unsigned long max_y(Position a, Position b) {
+            return a.y > b.y ? a.y : b.y;
+        }
+
+        int y_inside(Position a, Position b, unsigned int y) {
+            return min_y(a, b) <= y && y < max_y(a, b);
+        }
+
+        int is_on_line(Position a, Position b, unsigned long x, unsigned long y) {
+            if (a.x == b.x && a.x == x) {
+                return min_y(a, b) <= y && y <= max_y(a, b);
+            }
+            if (a.y == b.y && a.y == y) {
+                return min_x(a, b) <= x && x <= max_x(a, b);
+            }
             return 0;
         }
 
+        int is_inside(unsigned long x, unsigned long y) {
+            int i;
+            Position previous = tile_positions[COUNT-1];
+            int intersection_count = 0;
+            for (i=0; i<COUNT; i++) {
+                if (is_on_line(previous, tile_positions[i], x, y)) {
+                    return 1;
+                }
+                if (is_vertical(previous, tile_positions[i])) {
+                    if (previous.x > x && y_inside(previous, tile_positions[i], y)) {
+                        intersection_count++;
+                    }
+                }
+                previous = tile_positions[i];
+            }
+            return intersection_count % 2 == 1;
+        }
+
         typedef int (*ValidFn)(Position, Position);
 
         unsigned long max_area(ValidFn valid) {
@@ -53,6 +101,28 @@ main = position*:xs !. -> {
         }
 
         int rectangle_is_inside(Position a, Position b) {
+            unsigned long x_min, x_max, y_min, y_max, x, y;
+            if (a.x < b.x) {
+                x_min = a.x;
+                x_max = b.x;
+            } else {
+                x_min = b.x;
+                x_max = a.x;
+            }
+            if (a.y < b.y) {
+                y_min = a.y;
+                y_max = b.y;
+            } else {
+                y_min = b.y;
+                y_max = a.y;
+            }
+            for (x=x_min; x<=x_max; x++) {
+                for (y=y_min; y<=y_max; y++) {
+                    if (!is_inside(x, y)) {
+                        return 0;
+                    }
+                }
+            }
             return 1;
         }
 

commit ac1371fd6359974074d15fba7d7323cbf5917f62
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 19:48:20 2025 +0100

    Prepare for part 2

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 1ccd719..1c102ca 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -29,18 +29,36 @@ main = position*:xs !. -> {
             return 0;
         }
 
-        int main() {
+        typedef int (*ValidFn)(Position, Position);
+
+        unsigned long max_area(ValidFn valid) {
             int i, j;
             unsigned long tmp_area, max_area = 0;
             for (i=0; i<COUNT; i++) {
                 for (j=0; j<COUNT; j++) {
                     tmp_area = area(tile_positions[i], tile_positions[j]);
-                    if (tmp_area > max_area) {
+                    if (
+                        tmp_area > max_area &&
+                        valid(tile_positions[i], tile_positions[j])
+                    ) {
                         max_area = tmp_area;
                     }
                 }
             }
-            printf("Part 1 = %ld\n", max_area);
+            return max_area;
+        }
+
+        int always_valid(Position a, Position b) {
+            return 1;
+        }
+
+        int rectangle_is_inside(Position a, Position b) {
+            return 1;
+        }
+
+        int main() {
+            printf("Part 1 = %ld\n", max_area(always_valid));
+            printf("Part 2 = %ld\n", max_area(rectangle_is_inside));
             {
                 int x, y;
                 char grid[GRID_ROWS][GRID_COLS];

commit ea1c511a07948e7e87a1481184a20fcbb323108e
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 19:41:13 2025 +0100

    Prepare is_inside

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 2eae7bd..1ccd719 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -25,6 +25,10 @@ main = position*:xs !. -> {
             return distance(a.x, b.x) * distance(a.y, b.y);
         }
 
+        int is_inside(unsigned long x, unsigned long y) {
+            return 0;
+        }
+
         int main() {
             int i, j;
             unsigned long tmp_area, max_area = 0;
@@ -38,22 +42,26 @@ main = position*:xs !. -> {
             }
             printf("Part 1 = %ld\n", max_area);
             {
-                int i, j;
+                int x, y;
                 char grid[GRID_ROWS][GRID_COLS];
-                for (i=0; i<GRID_ROWS; i++) {
-                    for (j=0; j<GRID_COLS; j++) {
-                        grid[i][j] = '.';
+                for (y=0; y<GRID_ROWS; y++) {
+                    for (x=0; x<GRID_COLS; x++) {
+                        if (is_inside(x, y)) {
+                            grid[y][x] = 'x';
+                        } else {
+                            grid[y][x] = '.';
+                        }
                     }
                 }
-                for (i=0; i<COUNT; i++) {
-                    Position tile = tile_positions[i];
+                for (y=0; y<COUNT; y++) {
+                    Position tile = tile_positions[y];
                     if (tile.x < GRID_COLS && tile.y < GRID_ROWS) {
                         grid[tile.y][tile.x] = '#';
                     }
                 }
-                for (i=0; i<GRID_ROWS; i++) {
-                    for (j=0; j<GRID_COLS; j++) {
-                        printf("%c", grid[i][j]);
+                for (y=0; y<GRID_ROWS; y++) {
+                    for (x=0; x<GRID_COLS; x++) {
+                        printf("%c", grid[y][x]);
                     }
                     printf("\n");
                 }

2025-12-09 18:56 Rickard pushed to rlworkbench

commit caa4a45b382dfcc6a4a3b066782460be9daffac3
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 18:56:13 2025 +0100

    Print small grid

diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
index 7b0439a..2eae7bd 100644
--- a/src/examples/aoc20259/aoc20259.meta
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -3,6 +3,9 @@ main = position*:xs !. -> {
     C{
         #include <stdio.h>
 
+        #define GRID_ROWS 9
+        #define GRID_COLS 14
+
         typedef struct {
             unsigned long x;
             unsigned long y;
@@ -34,6 +37,27 @@ main = position*:xs !. -> {
                 }
             }
             printf("Part 1 = %ld\n", max_area);
+            {
+                int i, j;
+                char grid[GRID_ROWS][GRID_COLS];
+                for (i=0; i<GRID_ROWS; i++) {
+                    for (j=0; j<GRID_COLS; j++) {
+                        grid[i][j] = '.';
+                    }
+                }
+                for (i=0; i<COUNT; i++) {
+                    Position tile = tile_positions[i];
+                    if (tile.x < GRID_COLS && tile.y < GRID_ROWS) {
+                        grid[tile.y][tile.x] = '#';
+                    }
+                }
+                for (i=0; i<GRID_ROWS; i++) {
+                    for (j=0; j<GRID_COLS; j++) {
+                        printf("%c", grid[i][j]);
+                    }
+                    printf("\n");
+                }
+            }
             return 0;
         }
     }

commit 69c053b381173cfde398bdb5f802f410d8e6a11d
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 18:23:55 2025 +0100

    Ignore my input

diff --git a/.gitignore b/.gitignore
index 7151be7..42c4f77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 /out
 /tags
+rl.aoc2025*

2025-12-09 18:23 Rickard pushed to rlworkbench

commit e99dcf1b1fa238c7baf4b4990e4b503a86a272e8
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 18:23:15 2025 +0100

    Day 9 part 1

diff --git a/make.sh b/make.sh
index 9de5d10..c85d644 100755
--- a/make.sh
+++ b/make.sh
@@ -19,6 +19,7 @@ main() {
     example_aoc20256
     example_aoc20257
     example_aoc20258
+    example_aoc20259
 }
 
 dotall() {
@@ -159,6 +160,15 @@ example_aoc20258() {
     out/example
 }
 
+example_aoc20259() {
+    meta_compile src/examples/aoc20259/aoc20259.meta out/aoc20259.c
+    c_compile out/aoc20259.c out/aoc20259
+    input=example
+    out/aoc20259 <src/examples/aoc20259/$input.aoc20259 >out/$input.c
+    c_compile out/$input.c out/$input
+    out/$input
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
diff --git a/src/examples/aoc20259/aoc20259.meta b/src/examples/aoc20259/aoc20259.meta
new file mode 100644
index 0000000..7b0439a
--- /dev/null
+++ b/src/examples/aoc20259/aoc20259.meta
@@ -0,0 +1,48 @@
+main = position*:xs !. -> {
+    "#define COUNT " xs.count "\n"
+    C{
+        #include <stdio.h>
+
+        typedef struct {
+            unsigned long x;
+            unsigned long y;
+        } Position;
+
+        static Position tile_positions[COUNT] = {$xs};
+
+        unsigned long distance(unsigned long a, unsigned long b) {
+            if (a < b) {
+                return b - a + 1;
+            } else {
+                return a - b + 1;
+            }
+        }
+
+        unsigned long area(Position a, Position b) {
+            return distance(a.x, b.x) * distance(a.y, b.y);
+        }
+
+        int main() {
+            int i, j;
+            unsigned long tmp_area, max_area = 0;
+            for (i=0; i<COUNT; i++) {
+                for (j=0; j<COUNT; j++) {
+                    tmp_area = area(tile_positions[i], tile_positions[j]);
+                    if (tmp_area > max_area) {
+                        max_area = tmp_area;
+                    }
+                }
+            }
+            printf("Part 1 = %ld\n", max_area);
+            return 0;
+        }
+    }
+};
+
+position = number:x ',' number:y '\n' -> {C{
+    {$x, $y},
+}};
+
+number = digit digit*;
+
+digit = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
diff --git a/src/examples/aoc20259/example.aoc20259 b/src/examples/aoc20259/example.aoc20259
new file mode 100644
index 0000000..c8563ea
--- /dev/null
+++ b/src/examples/aoc20259/example.aoc20259
@@ -0,0 +1,8 @@
+7,1
+11,1
+11,7
+9,7
+9,5
+2,5
+2,3
+7,3

commit 1c9997d88d11fcf52e19b1d8647e58bcde0762fa
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 18:09:14 2025 +0100

    Clean up and run only example

diff --git a/make.sh b/make.sh
index c8cc1bd..9de5d10 100755
--- a/make.sh
+++ b/make.sh
@@ -154,12 +154,9 @@ example_aoc20257() {
 example_aoc20258() {
     meta_compile src/examples/aoc20258/aoc20258.meta out/aoc20258.c
     c_compile out/aoc20258.c out/aoc20258
-    #out/aoc20258 <src/examples/aoc20258/example.aoc20258 >out/example.c
-    #c_compile out/example.c out/example
-    #out/example
-    out/aoc20258 <src/examples/aoc20258/rl.aoc20258 >out/rl.c
-    c_compile out/rl.c out/rl
-    out/rl
+    out/aoc20258 <src/examples/aoc20258/example.aoc20258 >out/example.c
+    c_compile out/example.c out/example
+    out/example
 }
 
 example() {
diff --git a/src/examples/aoc20258/aoc20258.meta b/src/examples/aoc20258/aoc20258.meta
index e44eeed..91fd6e5 100644
--- a/src/examples/aoc20258/aoc20258.meta
+++ b/src/examples/aoc20258/aoc20258.meta
@@ -99,7 +99,6 @@ main = coordinate*:xs !. -> {
                     count++;
                 }
             }
-            printf("count = %d\n", count);
             return count;
         }
 
@@ -120,7 +119,7 @@ main = coordinate*:xs !. -> {
             int i;
             unsigned long x_product;
             calculate_distances();
-            for (i=0; i<1000; i++) {
+            for (i=0; i<10; i++) {
                 connect_closest();
             }
             calculate_circuits();
diff --git a/src/examples/aoc20258/rl.aoc20258 b/src/examples/aoc20258/rl.aoc20258
deleted file mode 100644
index e5da187..0000000
--- a/src/examples/aoc20258/rl.aoc20258
+++ /dev/null
@@ -1,1000 +0,0 @@
-93129,47506,29270
-94426,54960,55561
-37055,50004,72750
-80425,87410,25713
-92115,74827,88953
-96447,57989,5019
-19743,80900,23804
-16068,69163,58323
-4284,94214,85604
-21620,35382,61507
-42510,66823,18202
-17984,86199,46904
-50272,74570,55528
-86438,42653,59774
-9466,49730,97844
-956,77740,29407
-77341,68599,70943
-15289,22320,73603
-79327,68393,43029
-43455,28588,55417
-55982,95224,91318
-52005,259,20253
-14809,44821,89854
-97155,80132,13067
-75836,33112,59961
-49042,75445,76508
-69512,47913,33690
-51668,78109,11538
-82343,94953,59850
-36486,50647,53933
-48091,97843,18124
-81928,27360,67635
-22207,80299,50723
-78446,89424,22679
-33754,31795,28586
-28421,16480,68848
-46026,27246,40801
-44068,37090,91019
-97020,35195,3382
-70371,3577,64761
-3313,9033,98681
-16967,83292,64269
-11214,91556,60697
-11098,6352,14364
-47277,76285,54604
-7723,55677,36998
-82135,37388,22670
-31732,26803,84201
-93918,97486,44769
-16014,37605,48474
-3724,49851,12109
-5833,22968,26443
-87782,34392,10303
-63806,79277,27438
-28718,97131,55260
-41353,50390,46637
-61830,33061,14985
-20047,87521,10133
-67441,52872,57266
-8460,66378,7622
-23677,59517,7453
-96480,12964,68660
-21044,3885,23884
-69812,75617,72999
-98501,48631,37365
-79465,17954,86080
-13804,57271,92620
-93749,14,14474
-39585,19653,77255
-94128,79262,53291
-6499,713,53786
-57797,55787,40866
-21034,88031,87522
-75233,16780,914
-67269,64970,92993
-39117,92337,30930
-30056,34224,49348
-48332,14838,69510
-13704,36720,63216
-6618,89116,41
-15369,81602,36180
-39746,23880,33211
-59840,33869,99542
-34989,66134,15155
-47145,60106,78867
-23687,65459,36960
-42245,75151,61969
-29961,61483,10285
-36307,54880,31175
-48389,67326,65183
-21770,96487,30620
-4464,84721,93164
-17106,41941,63384
-33919,93073,825
-71913,13452,69446
-62608,10733,74426
-47651,20231,2404
-5540,3588,46906
-54110,31913,15149
-9653,25911,74806
-45284,52707,21211
-76223,57814,98481
-26603,27126,70448
-6293,41740,59703
-75310,12193,30960
-57483,75947,68878
-41928,59218,78293
-61281,13052,29535
-16294,91265,91368
-1640,8508,80442
-12056,64196,5518
-11739,25885,29199
-57663,22769,73489
-32757,74577,33662
-86997,52619,61243
-71623,87777,80610
-56416,78689,51129
-34553,7955,18915
-27648,91359,43149
-49123,69780,43613
-10720,72632,79295
-37886,22832,48666
-5715,20155,30892
-98799,21322,56914
-56892,4652,29567
-98996,33811,73409
-30192,26649,3536
-6833,36316,41354
-80873,18440,81247
-23292,27297,27883
-51705,38558,30949
-22720,70313,81518
-60411,18994,24958
-63477,32290,3172
-2476,86465,97775
-80324,46050,62082
-35010,44900,81846
-80343,14020,90477
-83291,97217,43738
-69617,88950,75458
-88565,41836,10135
-79398,60258,21046
-50825,27279,12544
-69269,78894,45318
-36722,23240,93002
-36087,30044,78600
-3452,73789,71450
-63180,12276,13852
-35426,78156,33032
-60920,31419,72501
-24438,74131,8271
-91879,34810,11637
-78151,34918,22192
-77144,18034,85640
-54337,42988,7082
-25655,24957,89573
-71607,69787,89706
-36217,84367,97130
-14558,99251,8681
-50402,97866,19186
-79659,61163,28577
-58552,72223,89371
-49670,8508,48554
-82129,26610,17140
-94327,99061,63975
-91603,14212,87784
-53785,44665,41327
-41260,80542,82930
-34084,24896,546
-37056,56298,22020
-76479,45723,14708
-35316,98107,46266
-21945,74128,91625
-30888,55257,4856
-94883,72621,42334
-97136,4542,48011
-58763,42032,30808
-11393,8081,81275
-92671,50010,48925
-76728,63673,50752
-66310,76003,17747
-82530,69917,29820
-4414,76972,64079
-76556,660,21983
-26810,93956,86765
-54559,71955,92603
-88812,1969,45016
-83034,30774,13935
-23027,31934,73304
-6865,88593,53234
-59340,97344,21892
-79086,83394,93457
-79284,72084,92358
-84889,88011,73936
-71265,86768,865
-13657,73891,46856
-98320,98460,1433
-84596,56655,87765
-84488,45991,85076
-61267,75997,96810
-71986,68995,52884
-43928,26699,28940
-59493,40045,97952
-77362,9212,49641
-41688,90837,15200
-6207,77976,76624
-15276,84659,58713
-59731,28568,24097
-84489,98519,66527
-29673,89560,4490
-72822,37418,19474
-71602,85112,60261
-75899,83010,66771
-29617,99662,31925
-13649,75647,15642
-93677,85571,36221
-14859,19440,75396
-73711,215,91869
-11392,98728,56135
-18787,88026,27910
-10114,24366,52874
-30617,59629,86056
-5432,77370,22914
-18991,19764,85650
-1158,14144,14824
-50044,85217,29420
-12260,41439,7083
-28449,34855,693
-88040,75809,73388
-37062,17644,72021
-44546,60369,63744
-40738,57097,32580
-50409,34580,22543
-62159,91860,76944
-84785,90402,63540
-3442,91532,29109
-61005,58416,98656
-13705,11244,66014
-43614,84601,84587
-59649,71498,15484
-17092,73303,69014
-72891,9124,79182
-99440,33358,64791
-81804,22718,58033
-85694,33058,86735
-49807,20583,27158
-41439,3203,97469
-31388,29738,25348
-56568,47152,66814
-19137,49177,16983
-21078,2984,40111
-63884,39757,10446
-28065,88810,24352
-96292,90861,55357
-5656,41551,40061
-55042,14724,30637
-83996,95286,10395
-90237,9789,60542
-41464,67231,95977
-16565,73165,56095
-8509,11868,44701
-3192,47385,58626
-93591,43595,40215
-79212,50580,7184
-96352,91838,87916
-45075,72843,89172
-76533,19927,75642
-73110,51823,7644
-48897,34839,1508
-21549,46612,76058
-15922,79796,47809
-20433,94775,43691
-64092,56335,94008
-98483,947,26538
-51329,83233,7647
-58180,23930,95453
-79419,28964,51905
-56670,36707,41729
-66193,72868,84720
-29392,51311,19403
-69797,12351,56433
-22508,72691,59132
-99997,62594,71301
-62979,4433,40329
-32449,98717,20720
-91745,53214,98408
-94589,18709,23621
-15498,94654,85776
-63823,96476,70560
-82377,47629,59010
-59470,33137,40471
-75279,80269,70898
-91711,69630,85629
-42380,49321,77799
-16553,60444,38026
-49830,76593,28600
-21521,55787,13415
-60739,74389,19378
-33612,84293,22149
-33224,48195,19180
-78083,25886,36446
-53443,56059,56388
-55930,13501,69633
-10340,17608,41007
-23008,92315,83740
-16765,49601,33602
-49635,6485,83380
-20356,300,74049
-38145,54333,22395
-9896,85392,72578
-28284,38867,34486
-11411,60605,1226
-34807,17914,86130
-79189,1392,4589
-20477,70277,59016
-52214,9538,77892
-58415,86054,8831
-2898,28761,51856
-72838,20480,36849
-72464,88010,21645
-52803,71973,45713
-84163,9238,62151
-65591,24237,53564
-22152,1662,16680
-56764,95434,19152
-71480,65014,32138
-41229,20663,78938
-27292,73249,17915
-68045,28053,5223
-39964,81779,91119
-28276,23004,93100
-75643,30923,78000
-2999,19945,39020
-28478,75020,11231
-47830,65035,45737
-57119,54513,38294
-40842,73351,18492
-31217,95976,32418
-60152,91720,47745
-68442,4727,35295
-92997,1424,8080
-77126,65368,52496
-79849,45097,7143
-46153,82502,94360
-14396,87257,13484
-65194,54588,13159
-22824,36956,31629
-34313,27117,59598
-44985,21615,19434
-31909,30669,83348
-55760,22914,14532
-8439,4466,44409
-66893,71871,53935
-12065,44430,90045
-83002,27642,95582
-42867,52602,62515
-2658,11084,88975
-73693,32863,4126
-7817,77856,75587
-19341,4389,543
-90539,98418,81512
-99702,75249,52973
-50538,92306,57964
-67193,60227,36021
-17870,51325,45514
-95119,46746,92156
-48476,50331,69832
-3808,23568,59430
-97412,28886,70108
-91676,48292,32681
-28808,10986,71065
-4503,73157,75806
-45447,65023,28211
-27419,13617,37507
-61545,11720,17795
-86801,37073,95091
-85367,52014,70457
-4524,44730,87649
-13810,21747,94501
-919,61272,55516
-14415,98836,60399
-84497,59472,82921
-36652,23463,39129
-98859,59766,99834
-52338,36915,66733
-7206,37131,11194
-92091,12586,42752
-23832,73295,59113
-43585,46984,98254
-14115,70638,60901
-40390,41263,29207
-51755,543,16592
-24478,56135,7108
-91844,12003,99755
-48258,29752,91721
-1899,50986,77968
-44878,42087,29029
-9354,77982,25615
-89042,72864,49843
-55543,75356,72393
-62496,62889,7466
-10402,48181,57896
-367,3165,68725
-13789,80735,37927
-5166,52353,16734
-6352,81072,66528
-56256,9629,67788
-39013,28382,98627
-31327,24481,61544
-36902,24447,84351
-35859,68593,11749
-52215,37614,39703
-56644,71144,63158
-76387,45667,64162
-14376,23367,84503
-60674,96283,8948
-60974,15570,21736
-39129,30253,86689
-22005,54648,67103
-19549,73506,73352
-36843,66304,69015
-11903,31857,6295
-70340,50428,82434
-56860,83098,359
-90907,61000,42602
-27389,25786,9762
-12926,397,99795
-25478,94422,4446
-2384,72386,43764
-6950,55990,25214
-16135,74988,66671
-67387,92630,46984
-76811,88313,3887
-91042,41855,35070
-70327,76532,17990
-55740,62404,25703
-95472,58977,23313
-42775,57164,43283
-69755,72811,6305
-7441,91513,69422
-46802,4827,51363
-35905,26176,14538
-56932,99532,61823
-63805,44663,23453
-68819,92800,12332
-8907,28643,25123
-35452,85425,77212
-16926,49269,85321
-24382,53361,12336
-97461,30649,42904
-50401,54127,77702
-4743,16649,23194
-53307,30140,72274
-19101,85976,30127
-61757,62753,77193
-15549,21674,78973
-87480,24206,57930
-26019,94052,48027
-61154,74645,91805
-82107,6726,52886
-3247,29342,27505
-19886,76883,38783
-22354,39647,25534
-23171,10666,69191
-6821,8817,96514
-20494,6345,87900
-20030,80442,11150
-14751,47960,96249
-76352,60728,60058
-37198,93164,90487
-88317,98605,72032
-70763,47791,5637
-2694,73070,91701
-27468,44351,86978
-31125,14611,16934
-50850,77207,1456
-99890,13276,8576
-63725,21937,19018
-595,17161,25393
-27353,8819,84017
-76850,4487,4291
-21458,44140,22698
-61411,98545,73214
-61265,93310,63002
-40500,53705,78868
-56095,72418,4776
-88774,3953,67654
-2832,74684,40185
-15824,48942,60391
-41057,22698,85596
-61876,87727,54140
-33447,54640,6403
-33214,84405,12315
-86897,35299,80186
-16309,92484,49884
-55350,8323,62195
-23370,97755,47639
-73639,80821,83494
-84963,96157,94997
-60700,61562,76508
-35050,71655,43947
-81814,74391,26299
-63289,85840,64914
-35240,18201,47741
-23057,15827,38021
-58795,10191,41470
-79962,48432,96284
-79486,31611,60839
-50298,75134,14616
-66727,14818,84668
-85709,29372,65218
-35004,27530,32155
-77175,15678,29271
-17447,90628,65138
-11791,19304,55791
-49756,34245,69241
-28219,3530,80986
-53712,78426,79012
-14861,31388,38276
-86885,63124,19280
-95228,80779,87128
-9821,98378,84808
-59239,30828,71372
-99933,7999,40525
-59388,49260,93428
-8178,25398,95916
-82090,54347,67902
-55878,19810,64018
-54147,24434,57972
-80990,52997,82596
-6275,96816,46629
-69251,35695,55398
-94251,17979,84966
-62174,91215,13032
-72605,60872,97982
-16768,45021,81260
-23208,37810,5410
-67658,9046,23380
-44394,33353,43155
-75499,3078,3099
-76725,65437,34498
-71029,60200,86729
-27334,20081,74928
-78868,23873,91133
-79291,32347,5370
-14159,49285,63737
-55285,92467,56285
-16072,12803,76572
-26754,85677,34397
-51961,90745,19096
-24068,60297,76917
-31630,27544,55147
-12675,17802,12057
-79361,58406,605
-41204,23842,46490
-74340,69209,57828
-18773,60227,6348
-94214,3187,16441
-78192,94171,41575
-28099,17156,11806
-59974,77623,81880
-9210,50596,43332
-15482,26550,35573
-51913,89583,1347
-87833,78072,69936
-90496,58911,28137
-9266,41511,79256
-1467,71649,83656
-59157,8111,13989
-2079,90334,49206
-57502,19318,75792
-80264,34865,28923
-51936,70652,76035
-9140,98878,15668
-22543,33864,6448
-22524,31256,486
-1721,76983,34555
-5951,83809,53205
-75199,33698,20799
-82487,86828,14333
-67683,74979,71391
-5411,71128,47138
-54231,2920,53037
-52818,18232,65485
-59178,30522,17250
-57598,28217,47844
-3853,19784,69964
-57604,29704,60450
-36901,41188,62138
-58766,60174,42320
-25887,32265,88343
-29648,13377,82756
-84928,36356,94570
-4532,87915,28466
-2396,48728,22250
-45870,22058,55226
-54197,38444,92057
-20614,36330,7450
-46761,88833,73733
-34777,30644,65355
-38378,91234,73772
-87900,328,62145
-3955,69455,35909
-29688,85093,46458
-64256,70102,97516
-93294,46584,84574
-48801,42800,53374
-45863,49823,27087
-33916,97781,74715
-75156,37327,8552
-73650,30004,93413
-37240,35284,34418
-45214,5681,26732
-82122,70503,50967
-77633,68602,91143
-2471,41546,78772
-39837,76426,84639
-61392,90828,87641
-66911,3327,10503
-26536,95028,90938
-5984,58355,15097
-37053,43977,45337
-56374,36347,41689
-30288,37963,61225
-49066,17452,66182
-16231,13352,42764
-13572,68878,48671
-97175,15751,76146
-94567,93399,10702
-31449,96890,95447
-89066,89952,54909
-41892,12906,58982
-61795,25883,84746
-3849,97559,68416
-26016,51676,79164
-64725,22861,31268
-10703,58470,63391
-65241,25502,23753
-70456,1816,53731
-13098,1785,2877
-54890,70078,69689
-78080,9567,51087
-27313,2643,93524
-52263,80717,80430
-47765,78018,45848
-10554,88208,8261
-57817,1782,59611
-46002,15016,16976
-60690,37457,61704
-51867,45998,17462
-66055,86687,28371
-16452,73590,43661
-61667,76517,22934
-31463,13764,26180
-17274,23386,45253
-2304,93405,58096
-80003,36616,14374
-49940,93589,30012
-2101,74510,97787
-64528,94816,49581
-70839,77457,59297
-51895,70304,79609
-59761,7360,78306
-7693,10640,21814
-17045,84818,47387
-8058,49119,31451
-92901,33776,44805
-37849,83312,6298
-73509,27150,28768
-10986,14783,12414
-6872,87976,5041
-70733,29668,19807
-48344,20372,52097
-83361,45864,22799
-39821,11946,851
-28726,27965,5926
-60005,16269,46993
-7441,72899,9123
-86298,20401,17642
-24277,5810,61236
-21375,51741,87723
-88568,30488,65007
-68057,96462,78903
-60292,76145,1905
-98664,17882,91039
-93509,89634,20376
-50446,86527,52774
-83810,99843,95545
-21698,99521,78447
-57731,41445,21129
-12290,28348,22254
-93998,32670,8950
-84221,28406,96360
-35150,39759,84829
-39987,43124,82414
-25494,19079,95654
-93210,56438,4948
-63081,32452,86340
-57137,87440,32535
-7795,96401,14908
-76759,49206,80748
-16768,43617,78998
-11168,54713,9272
-32240,2393,72788
-96374,11703,46093
-92837,89568,42700
-31366,63888,54638
-46815,23827,82922
-67345,29594,83020
-84516,18516,79153
-42411,73513,60729
-7152,56631,87882
-60058,33646,95496
-75511,26379,46063
-6417,29071,6842
-18402,88002,85277
-30055,98510,93743
-79651,497,93041
-80648,83851,32649
-55801,12577,1259
-27618,15396,39813
-76964,78598,32400
-87333,92700,19039
-19996,65372,75409
-23730,80832,52568
-92801,40095,37759
-18521,40787,67802
-68173,37309,29499
-49306,87829,73951
-37805,63348,86759
-93330,54641,85802
-59759,76422,41006
-56890,29260,26333
-93484,56855,57038
-90344,41185,81237
-31384,11689,68049
-36051,91449,92914
-84732,58234,74297
-2347,24315,49910
-1785,76201,57771
-90233,43189,65471
-4649,26162,20197
-91705,96167,15502
-58458,16507,58917
-464,24762,92062
-62386,77894,31642
-54633,80401,29933
-97802,98911,80626
-14318,49460,41953
-85939,41745,56114
-53374,62801,94900
-56267,10249,33656
-52864,31404,86155
-89661,60213,87693
-23772,86162,33080
-57131,77971,33720
-87505,6441,74301
-82324,47653,61373
-67835,23625,83646
-4921,35564,76459
-8150,74402,6656
-53246,46299,68865
-58126,40271,80481
-34419,46682,32982
-56830,41015,42998
-99881,47677,15156
-3522,65635,68557
-84674,92423,97984
-1596,5079,26758
-4726,32159,23167
-99746,29446,42545
-39460,67661,19192
-56426,23117,6709
-97623,98719,23815
-38029,45200,36981
-97034,26186,78199
-38367,90023,12896
-53111,98231,23779
-1117,57505,36786
-94926,41665,95673
-84497,24284,46262
-33149,77521,5254
-97168,32106,5154
-84302,98425,26112
-12533,12454,10192
-41979,85540,85959
-82907,55622,79675
-86324,8247,52654
-555,95532,89208
-70701,77451,7313
-1643,4565,71007
-56161,37391,15647
-26804,13915,37367
-69676,84206,51075
-7992,30599,7629
-63829,71861,20270
-59703,35459,3016
-52917,43715,35347
-97460,17492,18697
-83193,3321,90242
-23974,88902,94071
-52156,31377,58516
-88522,81943,90119
-67821,67621,23862
-10274,2010,89619
-52064,91365,41983
-79880,88731,89693
-15359,51619,83935
-5233,88446,70422
-40969,81397,39963
-93725,14288,50227
-59081,20841,18880
-53025,70944,6769
-13755,42140,57261
-28475,34011,83709
-59038,29000,94714
-93839,11117,31159
-86317,89389,84561
-40507,53808,58156
-13548,58774,94959
-78561,51315,4998
-5583,12554,97510
-93656,44296,56861
-51967,57689,3842
-85105,1512,35558
-60086,51940,91706
-78954,16387,46712
-47594,78462,33464
-94388,55650,40898
-3413,91213,87893
-91692,19169,41913
-6806,55111,74881
-30300,21372,14530
-84545,19523,18427
-23225,39013,66598
-59238,42519,26215
-99745,15599,13194
-73770,66169,12143
-28845,89919,20848
-39582,38920,50960
-16475,37197,3679
-29677,32693,192
-94014,68320,75067
-19333,43237,55592
-95828,85096,34360
-74290,68220,97907
-40661,94360,52454
-89161,26104,15247
-55866,26554,79393
-26825,34119,11833
-75800,95573,39449
-71917,86361,72934
-70306,46022,37666
-17260,52695,15247
-47083,65988,14525
-48105,49227,57556
-41788,19707,97711
-95304,10054,35346
-81145,50795,11084
-65862,70071,99248
-63587,83237,37920
-54891,59034,7953
-98512,64157,65753
-77780,45969,13407
-81556,58794,57017
-76360,31637,29027
-93747,31037,33532
-76099,89777,55163
-19526,24220,27690
-22240,19409,89940
-29783,70839,90171
-79673,71952,55899
-36329,67585,42531
-12429,19899,60052
-86489,87241,97773
-70935,67101,21955
-79263,37662,47524
-57387,2422,9034
-13414,15109,45379
-34647,83333,43640
-31017,5942,59083
-74876,38930,8657
-65071,58603,98584
-84645,90161,50462
-19125,1632,42268
-49814,83236,47031
-34057,80213,40305
-96049,55731,95852
-24752,24987,40065
-84364,72406,13321
-56754,29695,36218
-88353,73171,41052
-45638,245,21694
-196,67381,82865
-27619,23754,63833
-76225,46773,69849
-26680,19930,40720
-41003,59772,69011
-78611,56990,63202
-91303,6636,19809
-54851,54912,46113
-48490,89011,66066
-85623,50527,10055
-57658,24152,78577
-1566,56259,79424
-81226,1189,82627
-7779,91244,92251
-32600,60896,98760
-62180,68906,29188
-20519,31014,64649
-41540,10556,11215
-43689,33280,18116
-11722,87418,86709
-11746,58299,29702
-46274,75823,70962
-58248,19653,89181
-34335,30242,79730
-2216,73529,99474
-64986,96369,26430
-30989,48375,91119
-91557,44829,69825
-31527,51912,12911
-44294,62697,91088
-20442,6491,64723
-54408,66396,2325
-67104,79762,94975
-4594,89447,59340
-33163,11911,15397
-62439,27640,82226
-19006,83320,79549
-79200,42664,97693
-27694,46134,8743
-52192,22465,19830
-14366,47502,14545
-8930,61396,45826
-87585,67641,58375
-64827,33655,27774
-64760,54304,78297
-17459,42508,69411
-40214,3422,18368
-99736,73445,81113
-20078,20748,9888
-91116,29035,50710
-52121,25050,34526
-9068,73958,65567
-93890,32269,64526
-75139,8240,50042
-4763,51039,43909
-13298,29362,19731
-40370,87053,96594
-74630,90966,35339
-40271,15515,3803
-7109,32096,6500
-2412,62403,52039
-44586,8775,65971
-77301,36277,63525
-26212,54815,58133
-54772,93202,90065
-95329,24058,24487
-19844,8424,22481
-70450,50307,63922
-44295,9494,74873
-56172,32263,21563
-41646,38321,67177
-78052,88415,26045
-6093,2256,57262
-44271,1496,13331
-64890,223,29834
-1243,61133,27474
-12649,90476,65510
-36913,16649,61265
-38153,49485,76660
-57646,27523,54529
-97648,66947,71528
-46335,84153,3888
-76772,53203,8192
-61537,48373,71860
-30883,96625,59518
-57611,13848,26091
-81035,83803,43588
-78483,16859,46009
-71367,63638,51633
-23829,27093,61612
-53099,90329,8189
-21346,25942,50796
-93321,50101,7320
-3845,91414,18399
-97868,55142,72200
-46442,90648,86235
-76370,32059,73477
-32431,25861,78088
-54680,57702,18893
-63648,35627,67846
-8060,86158,80161
-72221,98773,51273
-5185,6113,18812
-2752,11445,93492
-58386,47749,572
-15674,57768,67266
-62012,4430,96603

commit 72c92ce036e2c29ecfc5e1db521ef901e8e168d1
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 18:03:08 2025 +0100

    Part 2

diff --git a/make.sh b/make.sh
index 93f477a..c8cc1bd 100755
--- a/make.sh
+++ b/make.sh
@@ -154,9 +154,9 @@ example_aoc20257() {
 example_aoc20258() {
     meta_compile src/examples/aoc20258/aoc20258.meta out/aoc20258.c
     c_compile out/aoc20258.c out/aoc20258
-    out/aoc20258 <src/examples/aoc20258/example.aoc20258 >out/example.c
-    c_compile out/example.c out/example
-    out/example
+    #out/aoc20258 <src/examples/aoc20258/example.aoc20258 >out/example.c
+    #c_compile out/example.c out/example
+    #out/example
     out/aoc20258 <src/examples/aoc20258/rl.aoc20258 >out/rl.c
     c_compile out/rl.c out/rl
     out/rl
diff --git a/src/examples/aoc20258/aoc20258.meta b/src/examples/aoc20258/aoc20258.meta
index 9f9fa75..e44eeed 100644
--- a/src/examples/aoc20258/aoc20258.meta
+++ b/src/examples/aoc20258/aoc20258.meta
@@ -2,6 +2,7 @@ main = coordinate*:xs !. -> {
     "#define COUNT " xs.count "\n"
     C{
         #include <stdio.h>
+        #include <stdlib.h>
 
         typedef struct {
             unsigned long x;
@@ -38,14 +39,14 @@ main = coordinate*:xs !. -> {
             }
         }
 
-        void connect_closest() {
+        unsigned long connect_closest() {
             int i, j;
             int min_i, min_j;
             unsigned int min;
             int hit = 0;
             for (i=0; i<COUNT; i++) {
                 for (j=0; j<COUNT; j++) {
-                    if (i < j && !connected[i][j] && (!hit || distances[i][j] < min)) {
+                    if (i < j && !connected[i][j] && (!hit || distances[i][j] <= min)) {
                         min_i = i;
                         min_j = j;
                         min = distances[i][j];
@@ -53,8 +54,13 @@ main = coordinate*:xs !. -> {
                     }
                 }
             }
+            if (!hit) {
+                printf("no small found\n");
+                exit(1);
+            }
             connected[min_i][min_j] = 1;
             connected[min_j][min_i] = 1;
+            return points[min_i].x * points[min_j].x;
         }
 
         unsigned long calculate_circuit(int i) {
@@ -75,11 +81,28 @@ main = coordinate*:xs !. -> {
 
         void calculate_circuits() {
             int i;
+            for (i=0; i<COUNT; i++) {
+                circuits[i] = 0;
+                visited[i] = 0;
+            }
             for (i=0; i<COUNT; i++) {
                 circuits[i] = calculate_circuit(i);
             }
         }
 
+        int count_circuits() {
+            int i;
+            int count = 0;
+            calculate_circuits();
+            for (i=0; i<COUNT; i++) {
+                if (circuits[i]) {
+                    count++;
+                }
+            }
+            printf("count = %d\n", count);
+            return count;
+        }
+
         unsigned long pop_largest_curcuit() {
             int i, largest_i = 0;
             unsigned long largest = 0;
@@ -95,12 +118,17 @@ main = coordinate*:xs !. -> {
 
         int main() {
             int i;
+            unsigned long x_product;
             calculate_distances();
             for (i=0; i<1000; i++) {
                 connect_closest();
             }
             calculate_circuits();
             printf("Part 1 = %ld\n", pop_largest_curcuit()*pop_largest_curcuit()*pop_largest_curcuit());
+            while (count_circuits() > 1) {
+                x_product = connect_closest();
+            }
+            printf("Part 2 = %ld\n", x_product);
             return 0;
         }
     }

commit 4cae8b897c198b663da8a5e25b1f4743b94a24c7
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 17:45:27 2025 +0100

    Clean up

diff --git a/src/examples/aoc20258/aoc20258.meta b/src/examples/aoc20258/aoc20258.meta
index f293594..9f9fa75 100644
--- a/src/examples/aoc20258/aoc20258.meta
+++ b/src/examples/aoc20258/aoc20258.meta
@@ -100,25 +100,6 @@ main = coordinate*:xs !. -> {
                 connect_closest();
             }
             calculate_circuits();
-            {
-                int i, j;
-                for (i=0; i<COUNT; i++) {
-                    for (j=0; j<COUNT; j++) {
-                        if (connected[i][j]) {
-                            printf("x");
-                        } else {
-                            printf(".");
-                        }
-                    }
-                    printf("\n");
-                }
-            }
-            {
-                int i;
-                for (i=0; i<COUNT; i++) {
-                    printf("circuit[%d] = %ld\n", i, circuits[i]);
-                }
-            }
             printf("Part 1 = %ld\n", pop_largest_curcuit()*pop_largest_curcuit()*pop_largest_curcuit());
             return 0;
         }

commit ff804a80898d94e7268dc1c9935e575985e8aadc
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 17:43:18 2025 +0100

    Day 8 part 1

diff --git a/make.sh b/make.sh
index 5a380af..93f477a 100755
--- a/make.sh
+++ b/make.sh
@@ -18,6 +18,7 @@ main() {
     example_aoc20255
     example_aoc20256
     example_aoc20257
+    example_aoc20258
 }
 
 dotall() {
@@ -150,6 +151,17 @@ example_aoc20257() {
     out/rl
 }
 
+example_aoc20258() {
+    meta_compile src/examples/aoc20258/aoc20258.meta out/aoc20258.c
+    c_compile out/aoc20258.c out/aoc20258
+    out/aoc20258 <src/examples/aoc20258/example.aoc20258 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20258 <src/examples/aoc20258/rl.aoc20258 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
diff --git a/src/examples/aoc20258/aoc20258.meta b/src/examples/aoc20258/aoc20258.meta
new file mode 100644
index 0000000..f293594
--- /dev/null
+++ b/src/examples/aoc20258/aoc20258.meta
@@ -0,0 +1,134 @@
+main = coordinate*:xs !. -> {
+    "#define COUNT " xs.count "\n"
+    C{
+        #include <stdio.h>
+
+        typedef struct {
+            unsigned long x;
+            unsigned long y;
+            unsigned long z;
+        } Point;
+
+        static Point points[COUNT] = {
+            $xs
+        };
+        static unsigned long distances[COUNT][COUNT];
+        static unsigned char connected[COUNT][COUNT];
+        static unsigned long circuits[COUNT];
+        static unsigned char visited[COUNT];
+
+        unsigned long distance2(unsigned long a, unsigned long b) {
+            return (unsigned long)((long)(a-b)*(a-b));
+        }
+
+        unsigned long point_distance2(Point a, Point b) {
+            return (
+                distance2(a.x, b.x) +
+                distance2(a.y, b.y) +
+                distance2(a.z, b.z)
+            );
+        }
+
+        void calculate_distances() {
+            int i, j;
+            for (i=0; i<COUNT; i++) {
+                for (j=0; j<COUNT; j++) {
+                    distances[i][j] = point_distance2(points[i], points[j]);
+                }
+            }
+        }
+
+        void connect_closest() {
+            int i, j;
+            int min_i, min_j;
+            unsigned int min;
+            int hit = 0;
+            for (i=0; i<COUNT; i++) {
+                for (j=0; j<COUNT; j++) {
+                    if (i < j && !connected[i][j] && (!hit || distances[i][j] < min)) {
+                        min_i = i;
+                        min_j = j;
+                        min = distances[i][j];
+                        hit = 1;
+                    }
+                }
+            }
+            connected[min_i][min_j] = 1;
+            connected[min_j][min_i] = 1;
+        }
+
+        unsigned long calculate_circuit(int i) {
+            if (visited[i]) {
+                return 0;
+            } else {
+                int j;
+                unsigned long result = 1;
+                visited[i] = 1;
+                for (j=0; j<COUNT; j++) {
+                    if (connected[i][j]) {
+                        result += calculate_circuit(j);
+                    }
+                }
+                return result;
+            }
+        }
+
+        void calculate_circuits() {
+            int i;
+            for (i=0; i<COUNT; i++) {
+                circuits[i] = calculate_circuit(i);
+            }
+        }
+
+        unsigned long pop_largest_curcuit() {
+            int i, largest_i = 0;
+            unsigned long largest = 0;
+            for (i=0; i<COUNT; i++) {
+                if (circuits[i] > largest) {
+                    largest = circuits[i];
+                    largest_i = i;
+                }
+            }
+            circuits[largest_i] = 0;
+            return largest;
+        }
+
+        int main() {
+            int i;
+            calculate_distances();
+            for (i=0; i<1000; i++) {
+                connect_closest();
+            }
+            calculate_circuits();
+            {
+                int i, j;
+                for (i=0; i<COUNT; i++) {
+                    for (j=0; j<COUNT; j++) {
+                        if (connected[i][j]) {
+                            printf("x");
+                        } else {
+                            printf(".");
+                        }
+                    }
+                    printf("\n");
+                }
+            }
+            {
+                int i;
+                for (i=0; i<COUNT; i++) {
+                    printf("circuit[%d] = %ld\n", i, circuits[i]);
+                }
+            }
+            printf("Part 1 = %ld\n", pop_largest_curcuit()*pop_largest_curcuit()*pop_largest_curcuit());
+            return 0;
+        }
+    }
+};
+
+coordinate = number:x ',' number:y ',' number:z '\n' -> {C{
+    {$x, $y, $z},
+}};
+
+number = digit digit*;
+
+digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
diff --git a/src/examples/aoc20258/example.aoc20258 b/src/examples/aoc20258/example.aoc20258
new file mode 100644
index 0000000..e98a3b6
--- /dev/null
+++ b/src/examples/aoc20258/example.aoc20258
@@ -0,0 +1,20 @@
+162,817,812
+57,618,57
+906,360,560
+592,479,940
+352,342,300
+466,668,158
+542,29,236
+431,825,988
+739,650,466
+52,470,668
+216,146,977
+819,987,18
+117,168,530
+805,96,715
+346,949,466
+970,615,88
+941,993,340
+862,61,35
+984,92,344
+425,690,689
diff --git a/src/examples/aoc20258/rl.aoc20258 b/src/examples/aoc20258/rl.aoc20258
new file mode 100644
index 0000000..e5da187
--- /dev/null
+++ b/src/examples/aoc20258/rl.aoc20258
@@ -0,0 +1,1000 @@
+93129,47506,29270
+94426,54960,55561
+37055,50004,72750
+80425,87410,25713
+92115,74827,88953
+96447,57989,5019
+19743,80900,23804
+16068,69163,58323
+4284,94214,85604
+21620,35382,61507
+42510,66823,18202
+17984,86199,46904
+50272,74570,55528
+86438,42653,59774
+9466,49730,97844
+956,77740,29407
+77341,68599,70943
+15289,22320,73603
+79327,68393,43029
+43455,28588,55417
+55982,95224,91318
+52005,259,20253
+14809,44821,89854
+97155,80132,13067
+75836,33112,59961
+49042,75445,76508
+69512,47913,33690
+51668,78109,11538
+82343,94953,59850
+36486,50647,53933
+48091,97843,18124
+81928,27360,67635
+22207,80299,50723
+78446,89424,22679
+33754,31795,28586
+28421,16480,68848
+46026,27246,40801
+44068,37090,91019
+97020,35195,3382
+70371,3577,64761
+3313,9033,98681
+16967,83292,64269
+11214,91556,60697
+11098,6352,14364
+47277,76285,54604
+7723,55677,36998
+82135,37388,22670
+31732,26803,84201
+93918,97486,44769
+16014,37605,48474
+3724,49851,12109
+5833,22968,26443
+87782,34392,10303
+63806,79277,27438
+28718,97131,55260
+41353,50390,46637
+61830,33061,14985
+20047,87521,10133
+67441,52872,57266
+8460,66378,7622
+23677,59517,7453
+96480,12964,68660
+21044,3885,23884
+69812,75617,72999
+98501,48631,37365
+79465,17954,86080
+13804,57271,92620
+93749,14,14474
+39585,19653,77255
+94128,79262,53291
+6499,713,53786
+57797,55787,40866
+21034,88031,87522
+75233,16780,914
+67269,64970,92993
+39117,92337,30930
+30056,34224,49348
+48332,14838,69510
+13704,36720,63216
+6618,89116,41
+15369,81602,36180
+39746,23880,33211
+59840,33869,99542
+34989,66134,15155
+47145,60106,78867
+23687,65459,36960
+42245,75151,61969
+29961,61483,10285
+36307,54880,31175
+48389,67326,65183
+21770,96487,30620
+4464,84721,93164
+17106,41941,63384
+33919,93073,825
+71913,13452,69446
+62608,10733,74426
+47651,20231,2404
+5540,3588,46906
+54110,31913,15149
+9653,25911,74806
+45284,52707,21211
+76223,57814,98481
+26603,27126,70448
+6293,41740,59703
+75310,12193,30960
+57483,75947,68878
+41928,59218,78293
+61281,13052,29535
+16294,91265,91368
+1640,8508,80442
+12056,64196,5518
+11739,25885,29199
+57663,22769,73489
+32757,74577,33662
+86997,52619,61243
+71623,87777,80610
+56416,78689,51129
+34553,7955,18915
+27648,91359,43149
+49123,69780,43613
+10720,72632,79295
+37886,22832,48666
+5715,20155,30892
+98799,21322,56914
+56892,4652,29567
+98996,33811,73409
+30192,26649,3536
+6833,36316,41354
+80873,18440,81247
+23292,27297,27883
+51705,38558,30949
+22720,70313,81518
+60411,18994,24958
+63477,32290,3172
+2476,86465,97775
+80324,46050,62082
+35010,44900,81846
+80343,14020,90477
+83291,97217,43738
+69617,88950,75458
+88565,41836,10135
+79398,60258,21046
+50825,27279,12544
+69269,78894,45318
+36722,23240,93002
+36087,30044,78600
+3452,73789,71450
+63180,12276,13852
+35426,78156,33032
+60920,31419,72501
+24438,74131,8271
+91879,34810,11637
+78151,34918,22192
+77144,18034,85640
+54337,42988,7082
+25655,24957,89573
+71607,69787,89706
+36217,84367,97130
+14558,99251,8681
+50402,97866,19186
+79659,61163,28577
+58552,72223,89371
+49670,8508,48554
+82129,26610,17140
+94327,99061,63975
+91603,14212,87784
+53785,44665,41327
+41260,80542,82930
+34084,24896,546
+37056,56298,22020
+76479,45723,14708
+35316,98107,46266
+21945,74128,91625
+30888,55257,4856
+94883,72621,42334
+97136,4542,48011
+58763,42032,30808
+11393,8081,81275
+92671,50010,48925
+76728,63673,50752
+66310,76003,17747
+82530,69917,29820
+4414,76972,64079
+76556,660,21983
+26810,93956,86765
+54559,71955,92603
+88812,1969,45016
+83034,30774,13935
+23027,31934,73304
+6865,88593,53234
+59340,97344,21892
+79086,83394,93457
+79284,72084,92358
+84889,88011,73936
+71265,86768,865
+13657,73891,46856
+98320,98460,1433
+84596,56655,87765
+84488,45991,85076
+61267,75997,96810
+71986,68995,52884
+43928,26699,28940
+59493,40045,97952
+77362,9212,49641
+41688,90837,15200
+6207,77976,76624
+15276,84659,58713
+59731,28568,24097
+84489,98519,66527
+29673,89560,4490
+72822,37418,19474
+71602,85112,60261
+75899,83010,66771
+29617,99662,31925
+13649,75647,15642
+93677,85571,36221
+14859,19440,75396
+73711,215,91869
+11392,98728,56135
+18787,88026,27910
+10114,24366,52874
+30617,59629,86056
+5432,77370,22914
+18991,19764,85650
+1158,14144,14824
+50044,85217,29420
+12260,41439,7083
+28449,34855,693
+88040,75809,73388
+37062,17644,72021
+44546,60369,63744
+40738,57097,32580
+50409,34580,22543
+62159,91860,76944
+84785,90402,63540
+3442,91532,29109
+61005,58416,98656
+13705,11244,66014
+43614,84601,84587
+59649,71498,15484
+17092,73303,69014
+72891,9124,79182
+99440,33358,64791
+81804,22718,58033
+85694,33058,86735
+49807,20583,27158
+41439,3203,97469
+31388,29738,25348
+56568,47152,66814
+19137,49177,16983
+21078,2984,40111
+63884,39757,10446
+28065,88810,24352
+96292,90861,55357
+5656,41551,40061
+55042,14724,30637
+83996,95286,10395
+90237,9789,60542
+41464,67231,95977
+16565,73165,56095
+8509,11868,44701
+3192,47385,58626
+93591,43595,40215
+79212,50580,7184
+96352,91838,87916
+45075,72843,89172
+76533,19927,75642
+73110,51823,7644
+48897,34839,1508
+21549,46612,76058
+15922,79796,47809
+20433,94775,43691
+64092,56335,94008
+98483,947,26538
+51329,83233,7647
+58180,23930,95453
+79419,28964,51905
+56670,36707,41729
+66193,72868,84720
+29392,51311,19403
+69797,12351,56433
+22508,72691,59132
+99997,62594,71301
+62979,4433,40329
+32449,98717,20720
+91745,53214,98408
+94589,18709,23621
+15498,94654,85776
+63823,96476,70560
+82377,47629,59010
+59470,33137,40471
+75279,80269,70898
+91711,69630,85629
+42380,49321,77799
+16553,60444,38026
+49830,76593,28600
+21521,55787,13415
+60739,74389,19378
+33612,84293,22149
+33224,48195,19180
+78083,25886,36446
+53443,56059,56388
+55930,13501,69633
+10340,17608,41007
+23008,92315,83740
+16765,49601,33602
+49635,6485,83380
+20356,300,74049
+38145,54333,22395
+9896,85392,72578
+28284,38867,34486
+11411,60605,1226
+34807,17914,86130
+79189,1392,4589
+20477,70277,59016
+52214,9538,77892
+58415,86054,8831
+2898,28761,51856
+72838,20480,36849
+72464,88010,21645
+52803,71973,45713
+84163,9238,62151
+65591,24237,53564
+22152,1662,16680
+56764,95434,19152
+71480,65014,32138
+41229,20663,78938
+27292,73249,17915
+68045,28053,5223
+39964,81779,91119
+28276,23004,93100
+75643,30923,78000
+2999,19945,39020
+28478,75020,11231
+47830,65035,45737
+57119,54513,38294
+40842,73351,18492
+31217,95976,32418
+60152,91720,47745
+68442,4727,35295
+92997,1424,8080
+77126,65368,52496
+79849,45097,7143
+46153,82502,94360
+14396,87257,13484
+65194,54588,13159
+22824,36956,31629
+34313,27117,59598
+44985,21615,19434
+31909,30669,83348
+55760,22914,14532
+8439,4466,44409
+66893,71871,53935
+12065,44430,90045
+83002,27642,95582
+42867,52602,62515
+2658,11084,88975
+73693,32863,4126
+7817,77856,75587
+19341,4389,543
+90539,98418,81512
+99702,75249,52973
+50538,92306,57964
+67193,60227,36021
+17870,51325,45514
+95119,46746,92156
+48476,50331,69832
+3808,23568,59430
+97412,28886,70108
+91676,48292,32681
+28808,10986,71065
+4503,73157,75806
+45447,65023,28211
+27419,13617,37507
+61545,11720,17795
+86801,37073,95091
+85367,52014,70457
+4524,44730,87649
+13810,21747,94501
+919,61272,55516
+14415,98836,60399
+84497,59472,82921
+36652,23463,39129
+98859,59766,99834
+52338,36915,66733
+7206,37131,11194
+92091,12586,42752
+23832,73295,59113
+43585,46984,98254
+14115,70638,60901
+40390,41263,29207
+51755,543,16592
+24478,56135,7108
+91844,12003,99755
+48258,29752,91721
+1899,50986,77968
+44878,42087,29029
+9354,77982,25615
+89042,72864,49843
+55543,75356,72393
+62496,62889,7466
+10402,48181,57896
+367,3165,68725
+13789,80735,37927
+5166,52353,16734
+6352,81072,66528
+56256,9629,67788
+39013,28382,98627
+31327,24481,61544
+36902,24447,84351
+35859,68593,11749
+52215,37614,39703
+56644,71144,63158
+76387,45667,64162
+14376,23367,84503
+60674,96283,8948
+60974,15570,21736
+39129,30253,86689
+22005,54648,67103
+19549,73506,73352
+36843,66304,69015
+11903,31857,6295
+70340,50428,82434
+56860,83098,359
+90907,61000,42602
+27389,25786,9762
+12926,397,99795
+25478,94422,4446
+2384,72386,43764
+6950,55990,25214
+16135,74988,66671
+67387,92630,46984
+76811,88313,3887
+91042,41855,35070
+70327,76532,17990
+55740,62404,25703
+95472,58977,23313
+42775,57164,43283
+69755,72811,6305
+7441,91513,69422
+46802,4827,51363
+35905,26176,14538
+56932,99532,61823
+63805,44663,23453
+68819,92800,12332
+8907,28643,25123
+35452,85425,77212
+16926,49269,85321
+24382,53361,12336
+97461,30649,42904
+50401,54127,77702
+4743,16649,23194
+53307,30140,72274
+19101,85976,30127
+61757,62753,77193
+15549,21674,78973
+87480,24206,57930
+26019,94052,48027
+61154,74645,91805
+82107,6726,52886
+3247,29342,27505
+19886,76883,38783
+22354,39647,25534
+23171,10666,69191
+6821,8817,96514
+20494,6345,87900
+20030,80442,11150
+14751,47960,96249
+76352,60728,60058
+37198,93164,90487
+88317,98605,72032
+70763,47791,5637
+2694,73070,91701
+27468,44351,86978
+31125,14611,16934
+50850,77207,1456
+99890,13276,8576
+63725,21937,19018
+595,17161,25393
+27353,8819,84017
+76850,4487,4291
+21458,44140,22698
+61411,98545,73214
+61265,93310,63002
+40500,53705,78868
+56095,72418,4776
+88774,3953,67654
+2832,74684,40185
+15824,48942,60391
+41057,22698,85596
+61876,87727,54140
+33447,54640,6403
+33214,84405,12315
+86897,35299,80186
+16309,92484,49884
+55350,8323,62195
+23370,97755,47639
+73639,80821,83494
+84963,96157,94997
+60700,61562,76508
+35050,71655,43947
+81814,74391,26299
+63289,85840,64914
+35240,18201,47741
+23057,15827,38021
+58795,10191,41470
+79962,48432,96284
+79486,31611,60839
+50298,75134,14616
+66727,14818,84668
+85709,29372,65218
+35004,27530,32155
+77175,15678,29271
+17447,90628,65138
+11791,19304,55791
+49756,34245,69241
+28219,3530,80986
+53712,78426,79012
+14861,31388,38276
+86885,63124,19280
+95228,80779,87128
+9821,98378,84808
+59239,30828,71372
+99933,7999,40525
+59388,49260,93428
+8178,25398,95916
+82090,54347,67902
+55878,19810,64018
+54147,24434,57972
+80990,52997,82596
+6275,96816,46629
+69251,35695,55398
+94251,17979,84966
+62174,91215,13032
+72605,60872,97982
+16768,45021,81260
+23208,37810,5410
+67658,9046,23380
+44394,33353,43155
+75499,3078,3099
+76725,65437,34498
+71029,60200,86729
+27334,20081,74928
+78868,23873,91133
+79291,32347,5370
+14159,49285,63737
+55285,92467,56285
+16072,12803,76572
+26754,85677,34397
+51961,90745,19096
+24068,60297,76917
+31630,27544,55147
+12675,17802,12057
+79361,58406,605
+41204,23842,46490
+74340,69209,57828
+18773,60227,6348
+94214,3187,16441
+78192,94171,41575
+28099,17156,11806
+59974,77623,81880
+9210,50596,43332
+15482,26550,35573
+51913,89583,1347
+87833,78072,69936
+90496,58911,28137
+9266,41511,79256
+1467,71649,83656
+59157,8111,13989
+2079,90334,49206
+57502,19318,75792
+80264,34865,28923
+51936,70652,76035
+9140,98878,15668
+22543,33864,6448
+22524,31256,486
+1721,76983,34555
+5951,83809,53205
+75199,33698,20799
+82487,86828,14333
+67683,74979,71391
+5411,71128,47138
+54231,2920,53037
+52818,18232,65485
+59178,30522,17250
+57598,28217,47844
+3853,19784,69964
+57604,29704,60450
+36901,41188,62138
+58766,60174,42320
+25887,32265,88343
+29648,13377,82756
+84928,36356,94570
+4532,87915,28466
+2396,48728,22250
+45870,22058,55226
+54197,38444,92057
+20614,36330,7450
+46761,88833,73733
+34777,30644,65355
+38378,91234,73772
+87900,328,62145
+3955,69455,35909
+29688,85093,46458
+64256,70102,97516
+93294,46584,84574
+48801,42800,53374
+45863,49823,27087
+33916,97781,74715
+75156,37327,8552
+73650,30004,93413
+37240,35284,34418
+45214,5681,26732
+82122,70503,50967
+77633,68602,91143
+2471,41546,78772
+39837,76426,84639
+61392,90828,87641
+66911,3327,10503
+26536,95028,90938
+5984,58355,15097
+37053,43977,45337
+56374,36347,41689
+30288,37963,61225
+49066,17452,66182
+16231,13352,42764
+13572,68878,48671
+97175,15751,76146
+94567,93399,10702
+31449,96890,95447
+89066,89952,54909
+41892,12906,58982
+61795,25883,84746
+3849,97559,68416
+26016,51676,79164
+64725,22861,31268
+10703,58470,63391
+65241,25502,23753
+70456,1816,53731
+13098,1785,2877
+54890,70078,69689
+78080,9567,51087
+27313,2643,93524
+52263,80717,80430
+47765,78018,45848
+10554,88208,8261
+57817,1782,59611
+46002,15016,16976
+60690,37457,61704
+51867,45998,17462
+66055,86687,28371
+16452,73590,43661
+61667,76517,22934
+31463,13764,26180
+17274,23386,45253
+2304,93405,58096
+80003,36616,14374
+49940,93589,30012
+2101,74510,97787
+64528,94816,49581
+70839,77457,59297
+51895,70304,79609
+59761,7360,78306
+7693,10640,21814
+17045,84818,47387
+8058,49119,31451
+92901,33776,44805
+37849,83312,6298
+73509,27150,28768
+10986,14783,12414
+6872,87976,5041
+70733,29668,19807
+48344,20372,52097
+83361,45864,22799
+39821,11946,851
+28726,27965,5926
+60005,16269,46993
+7441,72899,9123
+86298,20401,17642
+24277,5810,61236
+21375,51741,87723
+88568,30488,65007
+68057,96462,78903
+60292,76145,1905
+98664,17882,91039
+93509,89634,20376
+50446,86527,52774
+83810,99843,95545
+21698,99521,78447
+57731,41445,21129
+12290,28348,22254
+93998,32670,8950
+84221,28406,96360
+35150,39759,84829
+39987,43124,82414
+25494,19079,95654
+93210,56438,4948
+63081,32452,86340
+57137,87440,32535
+7795,96401,14908
+76759,49206,80748
+16768,43617,78998
+11168,54713,9272
+32240,2393,72788
+96374,11703,46093
+92837,89568,42700
+31366,63888,54638
+46815,23827,82922
+67345,29594,83020
+84516,18516,79153
+42411,73513,60729
+7152,56631,87882
+60058,33646,95496
+75511,26379,46063
+6417,29071,6842
+18402,88002,85277
+30055,98510,93743
+79651,497,93041
+80648,83851,32649
+55801,12577,1259
+27618,15396,39813
+76964,78598,32400
+87333,92700,19039
+19996,65372,75409
+23730,80832,52568
+92801,40095,37759
+18521,40787,67802
+68173,37309,29499
+49306,87829,73951
+37805,63348,86759
+93330,54641,85802
+59759,76422,41006
+56890,29260,26333
+93484,56855,57038
+90344,41185,81237
+31384,11689,68049
+36051,91449,92914
+84732,58234,74297
+2347,24315,49910
+1785,76201,57771
+90233,43189,65471
+4649,26162,20197
+91705,96167,15502
+58458,16507,58917
+464,24762,92062
+62386,77894,31642
+54633,80401,29933
+97802,98911,80626
+14318,49460,41953
+85939,41745,56114
+53374,62801,94900
+56267,10249,33656
+52864,31404,86155
+89661,60213,87693
+23772,86162,33080
+57131,77971,33720
+87505,6441,74301
+82324,47653,61373
+67835,23625,83646
+4921,35564,76459
+8150,74402,6656
+53246,46299,68865
+58126,40271,80481
+34419,46682,32982
+56830,41015,42998
+99881,47677,15156
+3522,65635,68557
+84674,92423,97984
+1596,5079,26758
+4726,32159,23167
+99746,29446,42545
+39460,67661,19192
+56426,23117,6709
+97623,98719,23815
+38029,45200,36981
+97034,26186,78199
+38367,90023,12896
+53111,98231,23779
+1117,57505,36786
+94926,41665,95673
+84497,24284,46262
+33149,77521,5254
+97168,32106,5154
+84302,98425,26112
+12533,12454,10192
+41979,85540,85959
+82907,55622,79675
+86324,8247,52654
+555,95532,89208
+70701,77451,7313
+1643,4565,71007
+56161,37391,15647
+26804,13915,37367
+69676,84206,51075
+7992,30599,7629
+63829,71861,20270
+59703,35459,3016
+52917,43715,35347
+97460,17492,18697
+83193,3321,90242
+23974,88902,94071
+52156,31377,58516
+88522,81943,90119
+67821,67621,23862
+10274,2010,89619
+52064,91365,41983
+79880,88731,89693
+15359,51619,83935
+5233,88446,70422
+40969,81397,39963
+93725,14288,50227
+59081,20841,18880
+53025,70944,6769
+13755,42140,57261
+28475,34011,83709
+59038,29000,94714
+93839,11117,31159
+86317,89389,84561
+40507,53808,58156
+13548,58774,94959
+78561,51315,4998
+5583,12554,97510
+93656,44296,56861
+51967,57689,3842
+85105,1512,35558
+60086,51940,91706
+78954,16387,46712
+47594,78462,33464
+94388,55650,40898
+3413,91213,87893
+91692,19169,41913
+6806,55111,74881
+30300,21372,14530
+84545,19523,18427
+23225,39013,66598
+59238,42519,26215
+99745,15599,13194
+73770,66169,12143
+28845,89919,20848
+39582,38920,50960
+16475,37197,3679
+29677,32693,192
+94014,68320,75067
+19333,43237,55592
+95828,85096,34360
+74290,68220,97907
+40661,94360,52454
+89161,26104,15247
+55866,26554,79393
+26825,34119,11833
+75800,95573,39449
+71917,86361,72934
+70306,46022,37666
+17260,52695,15247
+47083,65988,14525
+48105,49227,57556
+41788,19707,97711
+95304,10054,35346
+81145,50795,11084
+65862,70071,99248
+63587,83237,37920
+54891,59034,7953
+98512,64157,65753
+77780,45969,13407
+81556,58794,57017
+76360,31637,29027
+93747,31037,33532
+76099,89777,55163
+19526,24220,27690
+22240,19409,89940
+29783,70839,90171
+79673,71952,55899
+36329,67585,42531
+12429,19899,60052
+86489,87241,97773
+70935,67101,21955
+79263,37662,47524
+57387,2422,9034
+13414,15109,45379
+34647,83333,43640
+31017,5942,59083
+74876,38930,8657
+65071,58603,98584
+84645,90161,50462
+19125,1632,42268
+49814,83236,47031
+34057,80213,40305
+96049,55731,95852
+24752,24987,40065
+84364,72406,13321
+56754,29695,36218
+88353,73171,41052
+45638,245,21694
+196,67381,82865
+27619,23754,63833
+76225,46773,69849
+26680,19930,40720
+41003,59772,69011
+78611,56990,63202
+91303,6636,19809
+54851,54912,46113
+48490,89011,66066
+85623,50527,10055
+57658,24152,78577
+1566,56259,79424
+81226,1189,82627
+7779,91244,92251
+32600,60896,98760
+62180,68906,29188
+20519,31014,64649
+41540,10556,11215
+43689,33280,18116
+11722,87418,86709
+11746,58299,29702
+46274,75823,70962
+58248,19653,89181
+34335,30242,79730
+2216,73529,99474
+64986,96369,26430
+30989,48375,91119
+91557,44829,69825
+31527,51912,12911
+44294,62697,91088
+20442,6491,64723
+54408,66396,2325
+67104,79762,94975
+4594,89447,59340
+33163,11911,15397
+62439,27640,82226
+19006,83320,79549
+79200,42664,97693
+27694,46134,8743
+52192,22465,19830
+14366,47502,14545
+8930,61396,45826
+87585,67641,58375
+64827,33655,27774
+64760,54304,78297
+17459,42508,69411
+40214,3422,18368
+99736,73445,81113
+20078,20748,9888
+91116,29035,50710
+52121,25050,34526
+9068,73958,65567
+93890,32269,64526
+75139,8240,50042
+4763,51039,43909
+13298,29362,19731
+40370,87053,96594
+74630,90966,35339
+40271,15515,3803
+7109,32096,6500
+2412,62403,52039
+44586,8775,65971
+77301,36277,63525
+26212,54815,58133
+54772,93202,90065
+95329,24058,24487
+19844,8424,22481
+70450,50307,63922
+44295,9494,74873
+56172,32263,21563
+41646,38321,67177
+78052,88415,26045
+6093,2256,57262
+44271,1496,13331
+64890,223,29834
+1243,61133,27474
+12649,90476,65510
+36913,16649,61265
+38153,49485,76660
+57646,27523,54529
+97648,66947,71528
+46335,84153,3888
+76772,53203,8192
+61537,48373,71860
+30883,96625,59518
+57611,13848,26091
+81035,83803,43588
+78483,16859,46009
+71367,63638,51633
+23829,27093,61612
+53099,90329,8189
+21346,25942,50796
+93321,50101,7320
+3845,91414,18399
+97868,55142,72200
+46442,90648,86235
+76370,32059,73477
+32431,25861,78088
+54680,57702,18893
+63648,35627,67846
+8060,86158,80161
+72221,98773,51273
+5185,6113,18812
+2752,11445,93492
+58386,47749,572
+15674,57768,67266
+62012,4430,96603

commit 23812b9774a6a26ea7e180242d79ceb11baa36d3
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 17:04:09 2025 +0100

    Clean up

diff --git a/src/examples/aoc20257/aoc20257.meta b/src/examples/aoc20257/aoc20257.meta
index b324fd9..fd7d69b 100644
--- a/src/examples/aoc20257/aoc20257.meta
+++ b/src/examples/aoc20257/aoc20257.meta
@@ -22,14 +22,14 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
     int is_type(int row, int col, Type type) {
         return is_valid(row, col) && board[row][col].type == type;
     }
-    void set_beam(int row, int col, Number count) {
+    void add_beam(int row, int col, Number count) {
         if (is_valid(row, col)) {
             board[row][col].type = BEAM;
             board[row][col].count += count;
         }
     }
-    void beam_down(int row, int col, int offset_col) {
-        set_beam(row+1, col+offset_col, board[row][col].count);
+    void continue_beam(int row, int col, int col_offset) {
+        add_beam(row+1, col+col_offset, board[row][col].count);
     }
     int main(void) {
         int row, col;
@@ -39,11 +39,11 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
             for (col=0; col<$cols; col++) {
                 if (is_type(row, col, BEAM)) {
                     if (is_type(row+1, col, SPLITTER)) {
-                        beam_down(row, col, -1);
-                        beam_down(row, col, 1);
+                        continue_beam(row, col, -1);
+                        continue_beam(row, col, 1);
                         count++;
                     } else {
-                        beam_down(row, col, 0);
+                        continue_beam(row, col, 0);
                     }
                 }
                 if (row == $rows-1) {

commit 491a8b62e14218cfbc39b4e57620d419574e98a7
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 07:42:48 2025 +0100

    Clean up

diff --git a/src/examples/aoc20257/aoc20257.meta b/src/examples/aoc20257/aoc20257.meta
index ae073f1..b324fd9 100644
--- a/src/examples/aoc20257/aoc20257.meta
+++ b/src/examples/aoc20257/aoc20257.meta
@@ -1,5 +1,6 @@
 main = grid:x dummyRows:rows dummyCols:cols -> {C{
     #include <stdio.h>
+    typedef unsigned long Number;
     typedef enum {
         EMPTY,
         SPLITTER,
@@ -7,7 +8,7 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
     } Type;
     typedef struct {
         Type type;
-        unsigned long count;
+        Number count;
     } Cell;
     $x
     int is_valid(int row, int col) {
@@ -18,31 +19,31 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
             col<$cols
         );
     }
-    int is(int row, int col, Type type) {
+    int is_type(int row, int col, Type type) {
         return is_valid(row, col) && board[row][col].type == type;
     }
-    unsigned long current_count(int row, int col) {
-        return board[row][col].count;
-    }
-    void set(int row, int col, Type type, unsigned long count) {
+    void set_beam(int row, int col, Number count) {
         if (is_valid(row, col)) {
-            board[row][col].type = type;
+            board[row][col].type = BEAM;
             board[row][col].count += count;
         }
     }
+    void beam_down(int row, int col, int offset_col) {
+        set_beam(row+1, col+offset_col, board[row][col].count);
+    }
     int main(void) {
         int row, col;
-        unsigned long count = 0;
-        unsigned long timelines = 0;
+        Number count = 0;
+        Number timelines = 0;
         for (row=0; row<$rows; row++) {
             for (col=0; col<$cols; col++) {
-                if (is(row, col, BEAM)) {
-                    if (is(row+1, col, SPLITTER)) {
-                        set(row+1, col-1, BEAM, current_count(row, col));
-                        set(row+1, col+1, BEAM, current_count(row, col));
+                if (is_type(row, col, BEAM)) {
+                    if (is_type(row+1, col, SPLITTER)) {
+                        beam_down(row, col, -1);
+                        beam_down(row, col, 1);
                         count++;
                     } else {
-                        set(row+1, col, BEAM, current_count(row, col));
+                        beam_down(row, col, 0);
                     }
                 }
                 if (row == $rows-1) {
@@ -70,15 +71,12 @@ grid = row*:xs -> {
 };
 
 row = cell*:xs '\n' -> {
-    #set(W[2] 0)
     "{" xs "},\n"
     #max(W[3] xs.count)
-    #inc(W[1] 1)
 };
 
 cell = cellType:x -> {
     x
-    #inc(W[2] 1)
 };
 
 cellType =
diff --git a/src/meta.c b/src/meta.c
index a63096c..dda1cdb 100644
--- a/src/meta.c
+++ b/src/meta.c
@@ -143,8 +143,4 @@ unsigned int meta_max(unsigned int a, unsigned int b) {
     return a > b ? a : b;
 }
 
-unsigned int meta_set(unsigned int old_value, unsigned int new_value) {
-    return new_value;
-}
-
 typedef MetaAction (*MetaParseFunction)(MetaParseState* parse_state);

commit b35bbfdfb8e72c19e22b8c191a0aaaab218d6a60
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Tue Dec 9 07:29:11 2025 +0100

    Part 2

diff --git a/src/examples/aoc20257/aoc20257.meta b/src/examples/aoc20257/aoc20257.meta
index 0993342..ae073f1 100644
--- a/src/examples/aoc20257/aoc20257.meta
+++ b/src/examples/aoc20257/aoc20257.meta
@@ -5,6 +5,10 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
         SPLITTER,
         BEAM
     } Type;
+    typedef struct {
+        Type type;
+        unsigned long count;
+    } Cell;
     $x
     int is_valid(int row, int col) {
         return (
@@ -15,33 +19,39 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
         );
     }
     int is(int row, int col, Type type) {
-        return is_valid(row, col) && board[row][col] == type;
+        return is_valid(row, col) && board[row][col].type == type;
     }
-    void set(int row, int col, Type type) {
+    unsigned long current_count(int row, int col) {
+        return board[row][col].count;
+    }
+    void set(int row, int col, Type type, unsigned long count) {
         if (is_valid(row, col)) {
-            board[row][col] = type;
+            board[row][col].type = type;
+            board[row][col].count += count;
         }
     }
-    unsigned long part1(void) {
+    int main(void) {
         int row, col;
         unsigned long count = 0;
+        unsigned long timelines = 0;
         for (row=0; row<$rows; row++) {
             for (col=0; col<$cols; col++) {
                 if (is(row, col, BEAM)) {
                     if (is(row+1, col, SPLITTER)) {
-                        set(row+1, col-1, BEAM);
-                        set(row+1, col+1, BEAM);
+                        set(row+1, col-1, BEAM, current_count(row, col));
+                        set(row+1, col+1, BEAM, current_count(row, col));
                         count++;
                     } else {
-                        set(row+1, col, BEAM);
+                        set(row+1, col, BEAM, current_count(row, col));
                     }
                 }
+                if (row == $rows-1) {
+                    timelines += board[row][col].count;
+                }
             }
         }
-        return count;
-    }
-    int main(void) {
-        printf("Part 1: %ld\n", part1());
+        printf("Part 1: %ld\n", count);
+        printf("Part 2: %ld\n", timelines);
         return 0;
     }
 }};
@@ -52,7 +62,7 @@ dummyCols = -> { <cols };
 grid = row*:xs -> {
     $rows
     $cols
-    "static Type board[" <rows "][" <cols "] = {\n" >
+    "static Cell board[" <rows "][" <cols "] = {\n" >
         xs
     < "};\n"
     >rows { xs.count }
@@ -72,7 +82,7 @@ cell = cellType:x -> {
 };
 
 cellType =
-    | '.' -> { "EMPTY, " }
-    | '^' -> { "SPLITTER, " }
-    | 'S' -> { "BEAM, " }
+    | '.' -> { "{EMPTY, 0}," }
+    | '^' -> { "{SPLITTER, 0}," }
+    | 'S' -> { "{BEAM, 1}," }
     ;

commit 30bbbbb164770e246f47d6ea3fb00ac6516b1deb
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 19:35:50 2025 +0100

    Clean up

diff --git a/src/examples/aoc20257/aoc20257.meta b/src/examples/aoc20257/aoc20257.meta
index 109e863..0993342 100644
--- a/src/examples/aoc20257/aoc20257.meta
+++ b/src/examples/aoc20257/aoc20257.meta
@@ -22,7 +22,7 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
             board[row][col] = type;
         }
     }
-    int main(void) {
+    unsigned long part1(void) {
         int row, col;
         unsigned long count = 0;
         for (row=0; row<$rows; row++) {
@@ -38,7 +38,10 @@ main = grid:x dummyRows:rows dummyCols:cols -> {C{
                 }
             }
         }
-        printf("Part 1: %ld\n", count);
+        return count;
+    }
+    int main(void) {
+        printf("Part 1: %ld\n", part1());
         return 0;
     }
 }};

2025-12-08 19:31 Rickard pushed to rlworkbench

commit 7adcf163614a437e83c983ff7613b283ac3a7f57
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 19:30:54 2025 +0100

    Day 7, part 1

diff --git a/make.sh b/make.sh
index e66c585..5a380af 100755
--- a/make.sh
+++ b/make.sh
@@ -17,6 +17,7 @@ main() {
     example_aoc20254
     example_aoc20255
     example_aoc20256
+    example_aoc20257
 }
 
 dotall() {
@@ -138,6 +139,17 @@ example_aoc20256() {
     out/rl
 }
 
+example_aoc20257() {
+    meta_compile src/examples/aoc20257/aoc20257.meta out/aoc20257.c
+    c_compile out/aoc20257.c out/aoc20257
+    out/aoc20257 <src/examples/aoc20257/example.aoc20257 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20257 <src/examples/aoc20257/rl.aoc20257 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
diff --git a/src/examples/aoc20257/aoc20257.meta b/src/examples/aoc20257/aoc20257.meta
new file mode 100644
index 0000000..109e863
--- /dev/null
+++ b/src/examples/aoc20257/aoc20257.meta
@@ -0,0 +1,75 @@
+main = grid:x dummyRows:rows dummyCols:cols -> {C{
+    #include <stdio.h>
+    typedef enum {
+        EMPTY,
+        SPLITTER,
+        BEAM
+    } Type;
+    $x
+    int is_valid(int row, int col) {
+        return (
+            row >= 0 &&
+            row<$rows && 
+            col >= 0 &&
+            col<$cols
+        );
+    }
+    int is(int row, int col, Type type) {
+        return is_valid(row, col) && board[row][col] == type;
+    }
+    void set(int row, int col, Type type) {
+        if (is_valid(row, col)) {
+            board[row][col] = type;
+        }
+    }
+    int main(void) {
+        int row, col;
+        unsigned long count = 0;
+        for (row=0; row<$rows; row++) {
+            for (col=0; col<$cols; col++) {
+                if (is(row, col, BEAM)) {
+                    if (is(row+1, col, SPLITTER)) {
+                        set(row+1, col-1, BEAM);
+                        set(row+1, col+1, BEAM);
+                        count++;
+                    } else {
+                        set(row+1, col, BEAM);
+                    }
+                }
+            }
+        }
+        printf("Part 1: %ld\n", count);
+        return 0;
+    }
+}};
+
+dummyRows = -> { <rows };
+dummyCols = -> { <cols };
+
+grid = row*:xs -> {
+    $rows
+    $cols
+    "static Type board[" <rows "][" <cols "] = {\n" >
+        xs
+    < "};\n"
+    >rows { xs.count }
+    >cols { W[3] }
+};
+
+row = cell*:xs '\n' -> {
+    #set(W[2] 0)
+    "{" xs "},\n"
+    #max(W[3] xs.count)
+    #inc(W[1] 1)
+};
+
+cell = cellType:x -> {
+    x
+    #inc(W[2] 1)
+};
+
+cellType =
+    | '.' -> { "EMPTY, " }
+    | '^' -> { "SPLITTER, " }
+    | 'S' -> { "BEAM, " }
+    ;
diff --git a/src/examples/aoc20257/example.aoc20257 b/src/examples/aoc20257/example.aoc20257
new file mode 100644
index 0000000..57a2466
--- /dev/null
+++ b/src/examples/aoc20257/example.aoc20257
@@ -0,0 +1,16 @@
+.......S.......
+...............
+.......^.......
+...............
+......^.^......
+...............
+.....^.^.^.....
+...............
+....^.^...^....
+...............
+...^.^...^.^...
+...............
+..^...^.....^..
+...............
+.^.^.^.^.^...^.
+...............
diff --git a/src/examples/aoc20257/rl.aoc20257 b/src/examples/aoc20257/rl.aoc20257
new file mode 100644
index 0000000..ac6411f
--- /dev/null
+++ b/src/examples/aoc20257/rl.aoc20257
@@ -0,0 +1,142 @@
+......................................................................S......................................................................
+.............................................................................................................................................
+......................................................................^......................................................................
+.............................................................................................................................................
+.....................................................................^.^.....................................................................
+.............................................................................................................................................
+....................................................................^...^....................................................................
+.............................................................................................................................................
+...................................................................^.^.^.^...................................................................
+.............................................................................................................................................
+..................................................................^.^...^.^..................................................................
+.............................................................................................................................................
+.................................................................^.^...^...^.................................................................
+.............................................................................................................................................
+................................................................^.^...^.^...^................................................................
+.............................................................................................................................................
+...............................................................^...^.^.^.^...^...............................................................
+.............................................................................................................................................
+..............................................................^.^.....^.....^.^..............................................................
+.............................................................................................................................................
+.............................................................^.....^...^.^...^.^.............................................................
+.............................................................................................................................................
+............................................................^.^.^.^.^.^.......^.^............................................................
+.............................................................................................................................................
+...........................................................^...^.....^.......^.^.^...........................................................
+.............................................................................................................................................
+..........................................................^.^...^...^...^...^.^.^.^..........................................................
+.............................................................................................................................................
+.........................................................^.^...^.^.^.^...^.......^.^.........................................................
+.............................................................................................................................................
+........................................................^.^.^.^.^.^.....^...^.^.^...^........................................................
+.............................................................................................................................................
+.......................................................^.^.^.^...^...^.^.......^.^.^.^.......................................................
+.............................................................................................................................................
+......................................................^.....^...^.^...^.^...^...^.^...^......................................................
+.............................................................................................................................................
+.....................................................^.^.^.............^.^.^.^.^.^.....^.....................................................
+.............................................................................................................................................
+....................................................^.^.^.^.^.^.^.^...^.......^.^.^.^...^....................................................
+.............................................................................................................................................
+...................................................^.^.^.^.^...^.^.^...^...^.....^.^.^...^...................................................
+.............................................................................................................................................
+..................................................^.^.^.....^.........^.^.^.^...^.....^.^.^..................................................
+.............................................................................................................................................
+.................................................^...^.....^.......^.^.^.^...^.^.^.^.^.^.^.^.................................................
+.............................................................................................................................................
+................................................^.^.^...^.......^.^.^.^.......^...^.^.^.^...^................................................
+.............................................................................................................................................
+...............................................^.^.^...........^.^.^.^.^...^.^.....^...^.....^...............................................
+.............................................................................................................................................
+..............................................^.^.....^.^.^.^...^.^...^.^.^.^.^.^.^.^.......^.^..............................................
+.............................................................................................................................................
+.............................................^.^.....^.^.^...^.^...^.^...^.^.....^.^...^.^...^.^.............................................
+.............................................................................................................................................
+............................................^.^.....^.^.^.^.^...^.^.^.^.^.^.....^...^.^...^...^.^............................................
+.............................................................................................................................................
+...........................................^.^.^.^...^.^.....^...^...^.^.^.^.^.^.........^...^.^.^...........................................
+.............................................................................................................................................
+..........................................^.^...^.^.^...^.^.^.^...^.^...^.^.^...^...^...^.^.^.^.^.^..........................................
+.............................................................................................................................................
+.........................................^.^.^.^...^.^...^.^.^.....^.^.....^.^.^...^.....^.^.^...^.^.........................................
+.............................................................................................................................................
+........................................^.^.....^.^.^...^...^.^.^...^.^.^.^.^...^.^.^.^.....^.^.^.^.^........................................
+.............................................................................................................................................
+.......................................^...^.^.........^.^.....^.^.^...^...^.^.^.^.^...^.^.^.^.^.^.^.^.......................................
+.............................................................................................................................................
+......................................^.^...^.^...^.....^...^.^.^.^.....^.^.^...^.^.^.^.^.....^.^.....^......................................
+.............................................................................................................................................
+.....................................^.^.^...^.^.^.^.^...^.^.^...^...^.^.^...^.^.^.^...^...^.^.^...^...^.....................................
+.............................................................................................................................................
+....................................^.^.^...^.^.............^...^.^.^...^...^.^...^.^.^...^.^.^...^.^.^.^....................................
+.............................................................................................................................................
+...................................^.^.^...^...^.....^.......^.....^.^.^.^...^...^.^...^.^.^.^.^.....^...^...................................
+.............................................................................................................................................
+..................................^.^...^...^.^.^...^...^.^.....^.^.^...^.........^.....^...^.^.^.^...^...^..................................
+.............................................................................................................................................
+.................................^.^.^.......^.^.^.......^.^...^.^.^...^...^.^.....^.^.^.^.^.^...^.^.^.^.^.^.................................
+.............................................................................................................................................
+................................^.^.^...^.^.......^...^.^.^.....^.^.^.^.....^.^.^.^...^.^.^...^.^.^...^...^.^................................
+.............................................................................................................................................
+...............................^.^...^.......^.^.^.^.^.^.^.^.......^.^.^.............^.^.^...^.^.^.^...^...^.^...............................
+.............................................................................................................................................
+..............................^.^.^...^.^.^...^.^.....^.....^.^.^.^.^.^.^.....^.^.^...^.^...^...^.^.^.^.^.^.^.^..............................
+.............................................................................................................................................
+.............................^.^.^.^.^.^.^...^.^.^.^...^.^.^.^...^.^.^.^.^.........^...^.......^.^...^.^.^.^.^.^.............................
+.............................................................................................................................................
+............................^...^.^.....^.^.^.........^.^.^.....^.^...^.^.^.....^.^.^.^...^.^.^.^.^.^.^.........^............................
+.............................................................................................................................................
+...........................^...^...^.......^...^.^.....^...^.^.^.^...^.^...^.^.^.^...^...^.^.........^...^...^...^...........................
+.............................................................................................................................................
+..........................^.^.^.^.^.....^.^.^.^.....^.....^...^.^...^...^.^.^.^...^.^.......^.^.^.^...^...^.^.^.^.^..........................
+.............................................................................................................................................
+.........................^.^.^.^...^.^.^.......^.^.....^.^...^...^.^.^.^...^...^...^...^.....^.^.^.^...^.^.^...^.^.^.........................
+.............................................................................................................................................
+........................^.^...^.^.....^.^.^...........^.^.^...^.^...^.......^.......^...^.^.^.^...^.^.^.^.^.^.^.^.^.^........................
+.............................................................................................................................................
+.......................^...........^...^.^.........^.^.^.........^...^.....^.^...^.^.^.^.^.^...^.^.^.^...^...^.^.....^.......................
+.............................................................................................................................................
+......................^.^.^...^.^...^...^.^.........^...^.^.^.^.^...^.^.^.^.^...^.^.^.........^.^...^.^.^.^.....^.^...^......................
+.............................................................................................................................................
+.....................^...^.^.^.^.^.^...^.^...^.....^...^.^...^.^...^.....^.^.^.^.^.^.^.....^.^.^...^.^...^.^.^.^...^.^.^.....................
+.............................................................................................................................................
+....................^.^...^...^.^...^.^.^.....^...^.^.^...^.^.^.^.^.....^.^.^...^.....^.^.^...^.^.^.^.^.^.^.^.^.^.......^....................
+.............................................................................................................................................
+...................^.^...^.^.^...^.^...^.^.^.^...^.^.^.....^.^.^...^.^.......^.^...^.^...^.^...^.^...^...^.....^.....^.^.^...................
+.............................................................................................................................................
+..................^.^.^.^...^...^...^.^...^.^...^.^.^.....^...^.^...^.^.^.^.^.^.^.^.^.^.^.^...^.....^.^.^.^.^.^.^...^.^.^.^..................
+.............................................................................................................................................
+.................^.^.^.^.^.^.^...^.^.^.^.............^.^...^...^.^...^.........^.....^.^...^.....^.^...^.....^...^...^.^.^.^.................
+.............................................................................................................................................
+................^...^.^.^.^.^.^.^...^...^.^.^.^.^...^.^.^.^...^.......^.^.^.^.^.....^.^.^.^.^.^...^.....^...^.^...^.^.^.^...^................
+.............................................................................................................................................
+...............^.^.^.^.^...^.^.^.^.^...^.......^.^.^...^.^...^.^.......^.^.....^.^.^...^...^.^...^.....^.^...^.^.^.^.^.^.^.^.^...............
+.............................................................................................................................................
+..............^.^.^.^.^.....^.^.......^.^.^.^...^.^...^...^.^.^.^.^.^.^.....^.^.^.^.^.^.......^.^.^.^.^...^.^...^.....^...^.^.^..............
+.............................................................................................................................................
+.............^.^.^.....^.^.^.^...^...^.^.......^.^...^.^.......^.^.....^.^...^.^.^.^.^.^.....^.^.^.^.......^.^.^.^.....^.^.^.^.^.............
+.............................................................................................................................................
+............^.^...^.^.....^.^.^.^...^.^.^.^.....^.^.^.^.......^...^.^...^.^.^.^...^.^.^.^.^.^.^...^.^.^...^.^...^.^.^.^.^.....^.^............
+.............................................................................................................................................
+...........^.^.^.^.^.^...^.^.....^...^.^.^.^.^...^...^.^.^.^.^.^.^.....^.^.^.......^.^.^.^.^...^.^.^.^.....^.^.^.^.^.^.....^.^.^.^...........
+.............................................................................................................................................
+..........^...^.^.^...^.^.^.^.^.^.^.^.^.....^.^...^.^.^.^...^.^.^...^.............^.^.......^.^.^.^...^...^.^.^...^.^...^.^.......^..........
+.............................................................................................................................................
+.........^.^.^.^.^.^.^...^.^.^...^...^...^.^.^.^.....^...^.^...^.^.....^.^.^.^.^.^.^.^...^...^.^.^.^.^.^.^...^.^.^.^...^.....^.....^.........
+.............................................................................................................................................
+........^.^.^...^.....^.^...^...^.....^.....^.^.^...^.^.^...^...^...^.^...^.^...^...^.....^.^.^.^...^.......^...^.....^.^.^...^.^...^........
+.............................................................................................................................................
+.......^.......^...^.....^.^...^.^.^.^.^.^.^.............^.^.^...^...^.^.^.^.^.^.^.......^.....^.^.^.^.^.^.^.....^.^.^.^.^.^.^...^...^.......
+.............................................................................................................................................
+......^.^.^.^.^.^...^.^.^.^...^...^.^.^.^.^.......^.....^.^...^...^.^.....^...^.^.^.^...^.^.^...^.^.^.^.^.....^.....^.......^.......^.^......
+.............................................................................................................................................
+.....^...^.^.^.^.^...^.....^.^.....^.^.......^.^.^...^.^.^.^...^.^.^...^.^.^...^.^.^...^.^.^.............^.....^.^.^.^.^.^.......^.^.^.^.....
+.............................................................................................................................................
+....^.......^.^...^.^...^...^.^.^.^.^.^.^...^.^.^.^...^.^.....^.^.^.^.^.^...^.^.^.^.^.^.^.^.^.^.^.^.......^...........^.....^...^.^.^.^.^....
+.............................................................................................................................................
+...^.^.^.^.....^...^.^.....^.........^.^.^...^...^.^.^...^.^.^.^.^.^...^.......^.^.....^...^...^.^.^.^.^.^.^...^...^.^...^.^.^.^.........^...
+.............................................................................................................................................
+..^.^.^...^.....^.....^.^...^.^.^.^.^.^.^.^.^...^...^...^.^.^.^...^.^.^...^.^.^.^.^...^...^.^.^.^...^...^.^.....^.^.....^...^...^.^.......^..
+.............................................................................................................................................
+.^.^.^.^.^.^...^.^.^...^...^.....^...^.^.^.....^.....^.^.^.^.......^.^...^.^...^.^.^.^...^.^...^.^...^.^.^.....^.^.^.^.^...^.^.......^.^.^.^.
+.............................................................................................................................................
diff --git a/src/meta.c b/src/meta.c
index dda1cdb..a63096c 100644
--- a/src/meta.c
+++ b/src/meta.c
@@ -143,4 +143,8 @@ unsigned int meta_max(unsigned int a, unsigned int b) {
     return a > b ? a : b;
 }
 
+unsigned int meta_set(unsigned int old_value, unsigned int new_value) {
+    return new_value;
+}
+
 typedef MetaAction (*MetaParseFunction)(MetaParseState* parse_state);

commit 03483cd48cbb8a7129e11401c9f548e1745b3436
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 18:55:58 2025 +0100

    First take of more convenient generation of C code

diff --git a/src/examples/aoc20256/aoc20256_2.meta b/src/examples/aoc20256/aoc20256_2.meta
index 799712e..a96fa65 100644
--- a/src/examples/aoc20256/aoc20256_2.meta
+++ b/src/examples/aoc20256/aoc20256_2.meta
@@ -1,28 +1,28 @@
-main = section*:xs space !. -> {
-    "#include <stdio.h>\n"
-    "typedef unsigned long Number;\n"
-    "typedef Number (*Op)(Number, Number);\n"
-    "Number op_add(Number a, Number b) { return a + b; }\n"
-    "Number op_times(Number a, Number b) { return a * b; }\n"
-    "Number reverse(Number in) {\n" >
-        "Number out = 0;\n"
-        "while (in) {\n" >
-            "out *= 10;\n"
-            "out += in % 10;\n"
-            "in /= 10;\n"
-        < "}\n"
-        "return out;\n"
-    < "}\n"
-    "int main() {\n" >
-        "Number grand_total = 0;\n"
-        "Number total;\n"
-        "Number number;\n"
-        "Op op;\n"
-        xs
-        "printf(\"Part 2: %ld\\n\", grand_total);\n"
-        "return 0;\n"
-    < "}\n"
-};
+main = section*:xs space !. -> {C{
+    #include <stdio.h>
+    typedef unsigned long Number;
+    typedef Number (*Op)(Number, Number);
+    Number op_add(Number a, Number b) { return a + b; }
+    Number op_times(Number a, Number b) { return a * b; }
+    Number reverse(Number in) {
+        Number out = 0;
+        while (in) {
+            out *= 10;
+            out += in % 10;
+            in /= 10;
+        }
+        return out;
+    }
+    int main() {
+        Number grand_total = 0;
+        Number total;
+        Number number;
+        Op op;
+        $xs
+        printf("Part 2: %ld\n", grand_total);
+        return 0;
+    }
+}};
 
 section = space plusTimes:x number*:ys -> {
     x
diff --git a/src/meta/language_meta.c b/src/meta/language_meta.c
index 73a5ff0..3cf1675 100644
--- a/src/meta/language_meta.c
+++ b/src/meta/language_meta.c
@@ -345,191 +345,239 @@ static String language_meta_string_301 = {26, "->current_string_builder, "};
 static String language_meta_string_302 = {29, "->arena, string_from_integer("};
 static String language_meta_string_303 = {9, "->arena, "};
 static String language_meta_string_304 = {13, "), 0, NULL);\n"};
-static String language_meta_string_305 = {17, "meta_action_run(&"};
-static String language_meta_string_306 = {11, ", runtime, "};
-static String language_meta_string_307 = {26, "->current_string_builder, "};
-static String language_meta_string_308 = {10, "->arena);\n"};
-static String language_meta_string_309 = {17, "void placeholder_"};
-static String language_meta_string_310 = {34, "(void* runtime, void* variables);\n"};
-static String language_meta_string_311 = {17, "void placeholder_"};
-static String language_meta_string_312 = {35, "(void* runtime, void* variables) {\n"};
-static String language_meta_string_313 = {2, "}\n"};
-static String language_meta_string_314 = {1, "\n"};
-static String language_meta_string_315 = {31, "StringBuilder* string_builder;\n"};
-static String language_meta_string_316 = {31, "StringBuilder* string_builder;\n"};
-static String language_meta_string_317 = {39, "string_builder = string_builder_create("};
-static String language_meta_string_318 = {10, "->arena);\n"};
-static String language_meta_string_319 = {24, "meta_placeholder_append("};
-static String language_meta_string_320 = {9, "->arena, "};
-static String language_meta_string_321 = {63, "->placeholders, string_builder, meta_action_create(placeholder_"};
-static String language_meta_string_322 = {27, ", variables, NULL, 0, 0));\n"};
-static String language_meta_string_323 = {22, "string_builder_append("};
-static String language_meta_string_324 = {26, "->current_string_builder, "};
-static String language_meta_string_325 = {35, "->arena, NULL, 0, string_builder);\n"};
+static String language_meta_string_305 = {2, "C{"};
+static String language_meta_string_306 = {1, " "};
+static String language_meta_string_307 = {1, "}"};
+static String language_meta_string_308 = {17, "meta_action_run(&"};
+static String language_meta_string_309 = {11, ", runtime, "};
+static String language_meta_string_310 = {26, "->current_string_builder, "};
+static String language_meta_string_311 = {10, "->arena);\n"};
+static String language_meta_string_312 = {17, "void placeholder_"};
+static String language_meta_string_313 = {34, "(void* runtime, void* variables);\n"};
+static String language_meta_string_314 = {17, "void placeholder_"};
+static String language_meta_string_315 = {35, "(void* runtime, void* variables) {\n"};
+static String language_meta_string_316 = {2, "}\n"};
+static String language_meta_string_317 = {1, "\n"};
+static String language_meta_string_318 = {31, "StringBuilder* string_builder;\n"};
+static String language_meta_string_319 = {31, "StringBuilder* string_builder;\n"};
+static String language_meta_string_320 = {39, "string_builder = string_builder_create("};
+static String language_meta_string_321 = {10, "->arena);\n"};
+static String language_meta_string_322 = {24, "meta_placeholder_append("};
+static String language_meta_string_323 = {9, "->arena, "};
+static String language_meta_string_324 = {63, "->placeholders, string_builder, meta_action_create(placeholder_"};
+static String language_meta_string_325 = {27, ", variables, NULL, 0, 0));\n"};
 static String language_meta_string_326 = {22, "string_builder_append("};
 static String language_meta_string_327 = {26, "->current_string_builder, "};
-static String language_meta_string_328 = {9, "->arena, "};
-static String language_meta_string_329 = {12, ", 0, NULL);\n"};
-static String language_meta_string_330 = {1, "#"};
-static String language_meta_string_331 = {1, "("};
-static String language_meta_string_332 = {1, " "};
-static String language_meta_string_333 = {1, ")"};
-static String language_meta_string_334 = {4, "->W_"};
-static String language_meta_string_335 = {8, " = meta_"};
-static String language_meta_string_336 = {1, "("};
+static String language_meta_string_328 = {35, "->arena, NULL, 0, string_builder);\n"};
+static String language_meta_string_329 = {22, "string_builder_append("};
+static String language_meta_string_330 = {26, "->current_string_builder, "};
+static String language_meta_string_331 = {9, "->arena, "};
+static String language_meta_string_332 = {12, ", 0, NULL);\n"};
+static String language_meta_string_333 = {1, "#"};
+static String language_meta_string_334 = {1, "("};
+static String language_meta_string_335 = {1, " "};
+static String language_meta_string_336 = {1, ")"};
 static String language_meta_string_337 = {4, "->W_"};
-static String language_meta_string_338 = {3, " ? "};
-static String language_meta_string_339 = {4, "->W_"};
-static String language_meta_string_340 = {6, " : 0, "};
-static String language_meta_string_341 = {3, ");\n"};
-static String language_meta_string_342 = {1, ">"};
-static String language_meta_string_343 = {1, "<"};
-static String language_meta_string_344 = {22, "string_builder_append("};
-static String language_meta_string_345 = {26, "->current_string_builder, "};
-static String language_meta_string_346 = {25, "->arena, NULL, 1, NULL);\n"};
+static String language_meta_string_338 = {8, " = meta_"};
+static String language_meta_string_339 = {1, "("};
+static String language_meta_string_340 = {4, "->W_"};
+static String language_meta_string_341 = {3, " ? "};
+static String language_meta_string_342 = {4, "->W_"};
+static String language_meta_string_343 = {6, " : 0, "};
+static String language_meta_string_344 = {3, ");\n"};
+static String language_meta_string_345 = {1, ">"};
+static String language_meta_string_346 = {1, "<"};
 static String language_meta_string_347 = {22, "string_builder_append("};
 static String language_meta_string_348 = {26, "->current_string_builder, "};
-static String language_meta_string_349 = {26, "->arena, NULL, -1, NULL);\n"};
-static String language_meta_string_350 = {36, "StringBuilder* named_string_builder_"};
-static String language_meta_string_351 = {2, ";\n"};
-static String language_meta_string_352 = {1, "0"};
-static String language_meta_string_353 = {1, "1"};
-static String language_meta_string_354 = {1, "2"};
-static String language_meta_string_355 = {1, "3"};
-static String language_meta_string_356 = {1, "4"};
-static String language_meta_string_357 = {1, "5"};
-static String language_meta_string_358 = {1, "6"};
-static String language_meta_string_359 = {1, "7"};
-static String language_meta_string_360 = {1, "8"};
-static String language_meta_string_361 = {1, "9"};
-static String language_meta_string_362 = {1, "{"};
-static String language_meta_string_363 = {1, "*"};
-static String language_meta_string_364 = {1, "}"};
-static String language_meta_string_365 = {7, "int i;\n"};
-static String language_meta_string_366 = {7, "int i;\n"};
-static String language_meta_string_367 = {14, "for (i=0; i < "};
-static String language_meta_string_368 = {9, "; i++) {\n"};
-static String language_meta_string_369 = {22, "string_builder_append("};
-static String language_meta_string_370 = {26, "->current_string_builder, "};
-static String language_meta_string_371 = {9, "->arena, "};
-static String language_meta_string_372 = {12, ", 0, NULL);\n"};
-static String language_meta_string_373 = {2, "}\n"};
-static String language_meta_string_374 = {1, "("};
-static String language_meta_string_375 = {4, "->W_"};
-static String language_meta_string_376 = {3, " ? "};
-static String language_meta_string_377 = {4, "->W_"};
-static String language_meta_string_378 = {5, " : 0)"};
-static String language_meta_string_379 = {1, "("};
-static String language_meta_string_380 = {1, "-"};
-static String language_meta_string_381 = {1, ")"};
-static String language_meta_string_382 = {2, "(("};
-static String language_meta_string_383 = {4, "->W_"};
-static String language_meta_string_384 = {3, " ? "};
-static String language_meta_string_385 = {4, "->W_"};
-static String language_meta_string_386 = {6, " : 0)-"};
-static String language_meta_string_387 = {1, ")"};
-static String language_meta_string_388 = {7, "number("};
-static String language_meta_string_389 = {1, ")"};
-static String language_meta_string_390 = {2, "(0"};
-static String language_meta_string_391 = {1, ")"};
-static String language_meta_string_392 = {25, "+(meta_action_first_byte("};
-static String language_meta_string_393 = {1, ")"};
-static String language_meta_string_394 = {1, ")"};
-static String language_meta_string_395 = {2, "<<"};
-static String language_meta_string_396 = {1, "\""};
-static String language_meta_string_397 = {1, "\""};
-static String language_meta_string_398 = {14, "static String "};
-static String language_meta_string_399 = {7, "string_"};
-static String language_meta_string_400 = {4, " = {"};
-static String language_meta_string_401 = {3, ", \""};
-static String language_meta_string_402 = {4, "\"};\n"};
-static String language_meta_string_403 = {2, "(&"};
-static String language_meta_string_404 = {7, "string_"};
-static String language_meta_string_405 = {1, ")"};
-static String language_meta_string_406 = {1, "("};
-static String language_meta_string_407 = {1, ")"};
-static String language_meta_string_408 = {10, "(((struct "};
-static String language_meta_string_409 = {6, "Action"};
-static String language_meta_string_410 = {18, "Vars*)variables)->"};
-static String language_meta_string_411 = {1, ")"};
-static String language_meta_string_412 = {4, ".len"};
-static String language_meta_string_413 = {15, "meta_action_len"};
-static String language_meta_string_414 = {6, ".count"};
-static String language_meta_string_415 = {17, "meta_action_count"};
-static String language_meta_string_416 = {2, "W["};
-static String language_meta_string_417 = {1, "]"};
-static String language_meta_string_418 = {15, "unsigned int W_"};
-static String language_meta_string_419 = {2, ";\n"};
-static String language_meta_string_420 = {1, "\""};
-static String language_meta_string_421 = {1, "\'"};
-static String language_meta_string_422 = {1, "\'"};
-static String language_meta_string_423 = {14, "static String "};
-static String language_meta_string_424 = {7, "string_"};
-static String language_meta_string_425 = {4, " = {"};
-static String language_meta_string_426 = {3, ", \""};
-static String language_meta_string_427 = {4, "\"};\n"};
-static String language_meta_string_428 = {2, "(&"};
-static String language_meta_string_429 = {7, "string_"};
-static String language_meta_string_430 = {1, ")"};
-static String language_meta_string_431 = {1, "\""};
-static String language_meta_string_432 = {2, "\\\""};
-static String language_meta_string_433 = {1, "\'"};
-static String language_meta_string_434 = {1, "\\"};
-static String language_meta_string_435 = {5, "rule_"};
-static String language_meta_string_436 = {1, "a"};
-static String language_meta_string_437 = {1, "b"};
-static String language_meta_string_438 = {1, "c"};
-static String language_meta_string_439 = {1, "d"};
-static String language_meta_string_440 = {1, "e"};
-static String language_meta_string_441 = {1, "f"};
-static String language_meta_string_442 = {1, "g"};
-static String language_meta_string_443 = {1, "h"};
-static String language_meta_string_444 = {1, "i"};
-static String language_meta_string_445 = {1, "j"};
-static String language_meta_string_446 = {1, "k"};
-static String language_meta_string_447 = {1, "l"};
-static String language_meta_string_448 = {1, "m"};
-static String language_meta_string_449 = {1, "n"};
-static String language_meta_string_450 = {1, "o"};
-static String language_meta_string_451 = {1, "p"};
-static String language_meta_string_452 = {1, "q"};
-static String language_meta_string_453 = {1, "r"};
-static String language_meta_string_454 = {1, "s"};
-static String language_meta_string_455 = {1, "t"};
-static String language_meta_string_456 = {1, "u"};
-static String language_meta_string_457 = {1, "v"};
-static String language_meta_string_458 = {1, "w"};
-static String language_meta_string_459 = {1, "x"};
-static String language_meta_string_460 = {1, "y"};
-static String language_meta_string_461 = {1, "z"};
-static String language_meta_string_462 = {1, "A"};
-static String language_meta_string_463 = {1, "B"};
-static String language_meta_string_464 = {1, "C"};
-static String language_meta_string_465 = {1, "D"};
-static String language_meta_string_466 = {1, "E"};
-static String language_meta_string_467 = {1, "F"};
-static String language_meta_string_468 = {1, "G"};
-static String language_meta_string_469 = {1, "H"};
-static String language_meta_string_470 = {1, "I"};
-static String language_meta_string_471 = {1, "J"};
-static String language_meta_string_472 = {1, "K"};
-static String language_meta_string_473 = {1, "L"};
-static String language_meta_string_474 = {1, "M"};
-static String language_meta_string_475 = {1, "N"};
-static String language_meta_string_476 = {1, "O"};
-static String language_meta_string_477 = {1, "P"};
-static String language_meta_string_478 = {1, "Q"};
-static String language_meta_string_479 = {1, "R"};
-static String language_meta_string_480 = {1, "S"};
-static String language_meta_string_481 = {1, "T"};
-static String language_meta_string_482 = {1, "U"};
-static String language_meta_string_483 = {1, "V"};
-static String language_meta_string_484 = {1, "W"};
-static String language_meta_string_485 = {1, "X"};
-static String language_meta_string_486 = {1, "Y"};
-static String language_meta_string_487 = {1, "Z"};
-static String language_meta_string_488 = {1, " "};
-static String language_meta_string_489 = {1, "\n"};
+static String language_meta_string_349 = {25, "->arena, NULL, 1, NULL);\n"};
+static String language_meta_string_350 = {22, "string_builder_append("};
+static String language_meta_string_351 = {26, "->current_string_builder, "};
+static String language_meta_string_352 = {26, "->arena, NULL, -1, NULL);\n"};
+static String language_meta_string_353 = {1, "{"};
+static String language_meta_string_354 = {1, " "};
+static String language_meta_string_355 = {1, "}"};
+static String language_meta_string_356 = {22, "string_builder_append("};
+static String language_meta_string_357 = {26, "->current_string_builder, "};
+static String language_meta_string_358 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_359 = {27, "->arena, \"{\\n\"), 0, NULL);\n"};
+static String language_meta_string_360 = {22, "string_builder_append("};
+static String language_meta_string_361 = {26, "->current_string_builder, "};
+static String language_meta_string_362 = {25, "->arena, NULL, 1, NULL);\n"};
+static String language_meta_string_363 = {22, "string_builder_append("};
+static String language_meta_string_364 = {26, "->current_string_builder, "};
+static String language_meta_string_365 = {26, "->arena, NULL, -1, NULL);\n"};
+static String language_meta_string_366 = {22, "string_builder_append("};
+static String language_meta_string_367 = {26, "->current_string_builder, "};
+static String language_meta_string_368 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_369 = {27, "->arena, \"}\\n\"), 0, NULL);\n"};
+static String language_meta_string_370 = {1, "$"};
+static String language_meta_string_371 = {17, "meta_action_run(&"};
+static String language_meta_string_372 = {11, ", runtime, "};
+static String language_meta_string_373 = {26, "->current_string_builder, "};
+static String language_meta_string_374 = {10, "->arena);\n"};
+static String language_meta_string_375 = {1, "\n"};
+static String language_meta_string_376 = {1, " "};
+static String language_meta_string_377 = {22, "string_builder_append("};
+static String language_meta_string_378 = {26, "->current_string_builder, "};
+static String language_meta_string_379 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_380 = {26, "->arena, \"\\n\"), 0, NULL);\n"};
+static String language_meta_string_381 = {1, "\""};
+static String language_meta_string_382 = {22, "string_builder_append("};
+static String language_meta_string_383 = {26, "->current_string_builder, "};
+static String language_meta_string_384 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_385 = {26, "->arena, \"\\\"\"), 0, NULL);\n"};
+static String language_meta_string_386 = {1, "\\"};
+static String language_meta_string_387 = {22, "string_builder_append("};
+static String language_meta_string_388 = {26, "->current_string_builder, "};
+static String language_meta_string_389 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_390 = {26, "->arena, \"\\\\\"), 0, NULL);\n"};
+static String language_meta_string_391 = {1, "{"};
+static String language_meta_string_392 = {1, "}"};
+static String language_meta_string_393 = {22, "string_builder_append("};
+static String language_meta_string_394 = {26, "->current_string_builder, "};
+static String language_meta_string_395 = {35, "->arena, string_alloc_from_cstring("};
+static String language_meta_string_396 = {10, "->arena, \""};
+static String language_meta_string_397 = {14, "\"), 0, NULL);\n"};
+static String language_meta_string_398 = {36, "StringBuilder* named_string_builder_"};
+static String language_meta_string_399 = {2, ";\n"};
+static String language_meta_string_400 = {1, "0"};
+static String language_meta_string_401 = {1, "1"};
+static String language_meta_string_402 = {1, "2"};
+static String language_meta_string_403 = {1, "3"};
+static String language_meta_string_404 = {1, "4"};
+static String language_meta_string_405 = {1, "5"};
+static String language_meta_string_406 = {1, "6"};
+static String language_meta_string_407 = {1, "7"};
+static String language_meta_string_408 = {1, "8"};
+static String language_meta_string_409 = {1, "9"};
+static String language_meta_string_410 = {1, "{"};
+static String language_meta_string_411 = {1, "*"};
+static String language_meta_string_412 = {1, "}"};
+static String language_meta_string_413 = {7, "int i;\n"};
+static String language_meta_string_414 = {7, "int i;\n"};
+static String language_meta_string_415 = {14, "for (i=0; i < "};
+static String language_meta_string_416 = {9, "; i++) {\n"};
+static String language_meta_string_417 = {22, "string_builder_append("};
+static String language_meta_string_418 = {26, "->current_string_builder, "};
+static String language_meta_string_419 = {9, "->arena, "};
+static String language_meta_string_420 = {12, ", 0, NULL);\n"};
+static String language_meta_string_421 = {2, "}\n"};
+static String language_meta_string_422 = {1, "("};
+static String language_meta_string_423 = {4, "->W_"};
+static String language_meta_string_424 = {3, " ? "};
+static String language_meta_string_425 = {4, "->W_"};
+static String language_meta_string_426 = {5, " : 0)"};
+static String language_meta_string_427 = {1, "("};
+static String language_meta_string_428 = {1, "-"};
+static String language_meta_string_429 = {1, ")"};
+static String language_meta_string_430 = {2, "(("};
+static String language_meta_string_431 = {4, "->W_"};
+static String language_meta_string_432 = {3, " ? "};
+static String language_meta_string_433 = {4, "->W_"};
+static String language_meta_string_434 = {6, " : 0)-"};
+static String language_meta_string_435 = {1, ")"};
+static String language_meta_string_436 = {7, "number("};
+static String language_meta_string_437 = {1, ")"};
+static String language_meta_string_438 = {2, "(0"};
+static String language_meta_string_439 = {1, ")"};
+static String language_meta_string_440 = {25, "+(meta_action_first_byte("};
+static String language_meta_string_441 = {1, ")"};
+static String language_meta_string_442 = {1, ")"};
+static String language_meta_string_443 = {2, "<<"};
+static String language_meta_string_444 = {1, "\""};
+static String language_meta_string_445 = {1, "\""};
+static String language_meta_string_446 = {14, "static String "};
+static String language_meta_string_447 = {7, "string_"};
+static String language_meta_string_448 = {4, " = {"};
+static String language_meta_string_449 = {3, ", \""};
+static String language_meta_string_450 = {4, "\"};\n"};
+static String language_meta_string_451 = {2, "(&"};
+static String language_meta_string_452 = {7, "string_"};
+static String language_meta_string_453 = {1, ")"};
+static String language_meta_string_454 = {1, "("};
+static String language_meta_string_455 = {1, ")"};
+static String language_meta_string_456 = {10, "(((struct "};
+static String language_meta_string_457 = {6, "Action"};
+static String language_meta_string_458 = {18, "Vars*)variables)->"};
+static String language_meta_string_459 = {1, ")"};
+static String language_meta_string_460 = {4, ".len"};
+static String language_meta_string_461 = {15, "meta_action_len"};
+static String language_meta_string_462 = {6, ".count"};
+static String language_meta_string_463 = {17, "meta_action_count"};
+static String language_meta_string_464 = {2, "W["};
+static String language_meta_string_465 = {1, "]"};
+static String language_meta_string_466 = {15, "unsigned int W_"};
+static String language_meta_string_467 = {2, ";\n"};
+static String language_meta_string_468 = {1, "\""};
+static String language_meta_string_469 = {1, "\'"};
+static String language_meta_string_470 = {1, "\'"};
+static String language_meta_string_471 = {14, "static String "};
+static String language_meta_string_472 = {7, "string_"};
+static String language_meta_string_473 = {4, " = {"};
+static String language_meta_string_474 = {3, ", \""};
+static String language_meta_string_475 = {4, "\"};\n"};
+static String language_meta_string_476 = {2, "(&"};
+static String language_meta_string_477 = {7, "string_"};
+static String language_meta_string_478 = {1, ")"};
+static String language_meta_string_479 = {1, "\""};
+static String language_meta_string_480 = {2, "\\\""};
+static String language_meta_string_481 = {1, "\'"};
+static String language_meta_string_482 = {1, "\\"};
+static String language_meta_string_483 = {5, "rule_"};
+static String language_meta_string_484 = {1, "a"};
+static String language_meta_string_485 = {1, "b"};
+static String language_meta_string_486 = {1, "c"};
+static String language_meta_string_487 = {1, "d"};
+static String language_meta_string_488 = {1, "e"};
+static String language_meta_string_489 = {1, "f"};
+static String language_meta_string_490 = {1, "g"};
+static String language_meta_string_491 = {1, "h"};
+static String language_meta_string_492 = {1, "i"};
+static String language_meta_string_493 = {1, "j"};
+static String language_meta_string_494 = {1, "k"};
+static String language_meta_string_495 = {1, "l"};
+static String language_meta_string_496 = {1, "m"};
+static String language_meta_string_497 = {1, "n"};
+static String language_meta_string_498 = {1, "o"};
+static String language_meta_string_499 = {1, "p"};
+static String language_meta_string_500 = {1, "q"};
+static String language_meta_string_501 = {1, "r"};
+static String language_meta_string_502 = {1, "s"};
+static String language_meta_string_503 = {1, "t"};
+static String language_meta_string_504 = {1, "u"};
+static String language_meta_string_505 = {1, "v"};
+static String language_meta_string_506 = {1, "w"};
+static String language_meta_string_507 = {1, "x"};
+static String language_meta_string_508 = {1, "y"};
+static String language_meta_string_509 = {1, "z"};
+static String language_meta_string_510 = {1, "A"};
+static String language_meta_string_511 = {1, "B"};
+static String language_meta_string_512 = {1, "C"};
+static String language_meta_string_513 = {1, "D"};
+static String language_meta_string_514 = {1, "E"};
+static String language_meta_string_515 = {1, "F"};
+static String language_meta_string_516 = {1, "G"};
+static String language_meta_string_517 = {1, "H"};
+static String language_meta_string_518 = {1, "I"};
+static String language_meta_string_519 = {1, "J"};
+static String language_meta_string_520 = {1, "K"};
+static String language_meta_string_521 = {1, "L"};
+static String language_meta_string_522 = {1, "M"};
+static String language_meta_string_523 = {1, "N"};
+static String language_meta_string_524 = {1, "O"};
+static String language_meta_string_525 = {1, "P"};
+static String language_meta_string_526 = {1, "Q"};
+static String language_meta_string_527 = {1, "R"};
+static String language_meta_string_528 = {1, "S"};
+static String language_meta_string_529 = {1, "T"};
+static String language_meta_string_530 = {1, "U"};
+static String language_meta_string_531 = {1, "V"};
+static String language_meta_string_532 = {1, "W"};
+static String language_meta_string_533 = {1, "X"};
+static String language_meta_string_534 = {1, "Y"};
+static String language_meta_string_535 = {1, "Z"};
+static String language_meta_string_536 = {1, " "};
+static String language_meta_string_537 = {1, "\n"};
 MetaAction language_meta_rule_main(MetaParseState* parse_state);
 struct language_meta_Action1Vars {
     MetaAction xs;
@@ -666,8 +714,7 @@ struct language_meta_Action49Vars {
     MetaAction runtime;
 };
 struct language_meta_Action50Vars {
-    MetaAction x;
-    MetaAction runtime;
+    MetaAction xs;
 };
 struct language_meta_Action51Vars {
     MetaAction x;
@@ -678,80 +725,106 @@ struct language_meta_Action52Vars {
     MetaAction runtime;
 };
 struct language_meta_Action53Vars {
+    MetaAction x;
+    MetaAction runtime;
+};
+struct language_meta_Action54Vars {
     MetaAction x;
     MetaAction y;
     MetaAction z;
     MetaAction runtime;
 };
-struct language_meta_Action54Vars {
+struct language_meta_Action55Vars {
+    MetaAction xs;
+    MetaAction runtime;
+};
+MetaAction language_meta_rule_cFragment(MetaParseState* parse_state);
+struct language_meta_Action56Vars {
     MetaAction xs;
     MetaAction runtime;
 };
+struct language_meta_Action57Vars {
+    MetaAction x;
+    MetaAction runtime;
+};
+struct language_meta_Action58Vars {
+    MetaAction runtime;
+};
+struct language_meta_Action59Vars {
+    MetaAction runtime;
+};
+struct language_meta_Action60Vars {
+    MetaAction runtime;
+};
+struct language_meta_Action61Vars {
+    MetaAction x;
+    MetaAction runtime;
+};
 MetaAction language_meta_rule_stringBuilderName(MetaParseState* parse_state);
-struct language_meta_Action55Vars {
+struct language_meta_Action62Vars {
     MetaAction x;
 };
 MetaAction language_meta_rule_actionPrimitiveExpression(MetaParseState* parse_state);
-struct language_meta_Action56Vars {
+struct language_meta_Action63Vars {
     MetaAction x;
 };
 MetaAction language_meta_rule_digit(MetaParseState* parse_state);
 MetaAction language_meta_rule_placeholder(MetaParseState* parse_state);
-struct language_meta_Action68Vars {
+struct language_meta_Action75Vars {
     MetaAction x;
     MetaAction y;
     MetaAction runtime;
 };
 MetaAction language_meta_rule_expr(MetaParseState* parse_state);
-struct language_meta_Action69Vars {
+struct language_meta_Action76Vars {
     MetaAction x;
     MetaAction runtime;
 };
-struct language_meta_Action70Vars {
+struct language_meta_Action77Vars {
     MetaAction x;
     MetaAction y;
     MetaAction runtime;
 };
-struct language_meta_Action71Vars {
+struct language_meta_Action78Vars {
     MetaAction y;
 };
-struct language_meta_Action72Vars {
+struct language_meta_Action79Vars {
     MetaAction xs;
 };
 MetaAction language_meta_rule_numberPart(MetaParseState* parse_state);
-struct language_meta_Action73Vars {
+struct language_meta_Action80Vars {
     MetaAction x;
     MetaAction y;
 };
 MetaAction language_meta_rule_maybeShift(MetaParseState* parse_state);
 MetaAction language_meta_rule_string(MetaParseState* parse_state);
-struct language_meta_Action76Vars {
+struct language_meta_Action83Vars {
     MetaAction xs;
     MetaAction runtime;
 };
 MetaAction language_meta_rule_dotname(MetaParseState* parse_state);
-struct language_meta_Action77Vars {
+struct language_meta_Action84Vars {
     MetaAction x;
     MetaAction y;
 };
 MetaAction language_meta_rule_nameAsActionLookup(MetaParseState* parse_state);
-struct language_meta_Action78Vars {
+struct language_meta_Action85Vars {
     MetaAction x;
 };
 MetaAction language_meta_rule_nextname(MetaParseState* parse_state);
 MetaAction language_meta_rule_wvar(MetaParseState* parse_state);
-struct language_meta_Action81Vars {
+struct language_meta_Action88Vars {
     MetaAction x;
 };
 MetaAction language_meta_rule_stringInner(MetaParseState* parse_state);
 MetaAction language_meta_rule_charString(MetaParseState* parse_state);
-struct language_meta_Action84Vars {
+struct language_meta_Action91Vars {
     MetaAction xs;
 };
 MetaAction language_meta_rule_charStringInner(MetaParseState* parse_state);
 MetaAction language_meta_rule_stringEscape(MetaParseState* parse_state);
 MetaAction language_meta_rule_ruleName(MetaParseState* parse_state);
-struct language_meta_Action89Vars {
+struct language_meta_Action96Vars {
     MetaAction x;
 };
 MetaAction language_meta_rule_variableName(MetaParseState* parse_state);
@@ -1454,109 +1527,193 @@ void language_meta_action_49(void* runtime, void* variables) {
 }
 
 void language_meta_action_50(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_305), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action50Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_306), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action50Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_307), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action50Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_308), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action50Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
 void language_meta_action_51(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_308), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_309), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_310), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_311), 0, NULL);
+}
+
+void language_meta_action_52(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     ((language_meta_Runtime*)runtime)->W_1 = meta_inc(((language_meta_Runtime*)runtime)->W_1 ? ((language_meta_Runtime*)runtime)->W_1 : 0, 1);
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_fileDeclarations;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_309), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_312), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_1 ? ((language_meta_Runtime*)runtime)->W_1 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_310), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_313), 0, NULL);
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_placeholders;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_311), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_314), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_1 ? ((language_meta_Runtime*)runtime)->W_1 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_312), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_315), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 1, NULL);
     string_builder = string_builder_create(((language_meta_Runtime*)runtime)->arena);
     ((language_meta_Runtime*)runtime)->named_string_builder_placeholderVars = string_builder;
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_placeholderVars);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action52Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, -1, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_313), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_314), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_316), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_317), 0, NULL);
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_actionDeclarations;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, (&language_meta_string_315))) {
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_316), 0, NULL);
+    if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, (&language_meta_string_318))) {
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_319), 0, NULL);
     }
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_317), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_318), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_319), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_320), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action52Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_321), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_1 ? ((language_meta_Runtime*)runtime)->W_1 : 0)), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_322), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action52Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_323), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action52Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_324), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action51Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_1 ? ((language_meta_Runtime*)runtime)->W_1 : 0)), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_325), 0, NULL);
-}
-
-void language_meta_action_52(void* runtime, void* variables) {
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_326), 0, NULL);
     meta_action_run(&(((struct language_meta_Action52Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_327), 0, NULL);
     meta_action_run(&(((struct language_meta_Action52Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_328), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action52Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_329), 0, NULL);
 }
 
 void language_meta_action_53(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_329), 0, NULL);
     meta_action_run(&(((struct language_meta_Action53Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_334), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_335), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_336), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_330), 0, NULL);
     meta_action_run(&(((struct language_meta_Action53Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_331), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_332), 0, NULL);
+}
+
+void language_meta_action_54(void* runtime, void* variables) {
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_337), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_338), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_339), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_340), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action53Vars*)variables)->z), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_341), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_342), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_343), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->z), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_344), 0, NULL);
 }
 
-void language_meta_action_54(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_344), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_345), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_346), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+void language_meta_action_55(void* runtime, void* variables) {
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_347), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_348), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action54Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_349), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_350), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_351), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_352), 0, NULL);
 }
 
-void language_meta_action_55(void* runtime, void* variables) {
+void language_meta_action_56(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_356), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_357), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_358), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_359), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_360), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_361), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_362), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_363), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_364), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_365), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_366), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_367), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_368), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_369), 0, NULL);
+}
+
+void language_meta_action_57(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_371), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action57Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_372), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action57Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_373), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action57Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_374), 0, NULL);
+}
+
+void language_meta_action_58(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_377), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action58Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_378), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action58Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_379), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action58Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_380), 0, NULL);
+}
+
+void language_meta_action_59(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_382), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action59Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_383), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action59Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_384), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action59Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_385), 0, NULL);
+}
+
+void language_meta_action_60(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_387), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action60Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_388), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action60Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_389), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action60Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_390), 0, NULL);
+}
+
+void language_meta_action_61(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_393), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action61Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_394), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action61Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_395), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action61Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_396), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action61Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_397), 0, NULL);
+}
+
+void language_meta_action_62(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     MetaAction action;
@@ -1564,143 +1721,143 @@ void language_meta_action_55(void* runtime, void* variables) {
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_runtimeStruct;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    action = (((struct language_meta_Action55Vars*)variables)->x);
+    action = (((struct language_meta_Action62Vars*)variables)->x);
     string_slice(action.input_buffer, action.start, action.end, &slice);
     if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, &slice)) {
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_350), 0, NULL);
-        meta_action_run(&(((struct language_meta_Action55Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_351), 0, NULL);
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_398), 0, NULL);
+        meta_action_run(&(((struct language_meta_Action62Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_399), 0, NULL);
     }
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    meta_action_run(&(((struct language_meta_Action55Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action62Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
-void language_meta_action_56(void* runtime, void* variables) {
-    meta_action_run(&(((struct language_meta_Action56Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+void language_meta_action_63(void* runtime, void* variables) {
+    meta_action_run(&(((struct language_meta_Action63Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
-void language_meta_action_68(void* runtime, void* variables) {
+void language_meta_action_75(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_placeholderVars;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, (&language_meta_string_365))) {
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_366), 0, NULL);
+    if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, (&language_meta_string_413))) {
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_414), 0, NULL);
     }
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_367), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action68Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_368), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_415), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action75Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_416), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 1, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_369), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action68Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_370), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action68Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_371), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action68Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_372), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_417), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action75Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_418), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action75Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_419), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action75Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_420), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, -1, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_373), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_421), 0, NULL);
 }
 
-void language_meta_action_69(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_374), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action69Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_375), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action69Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_376), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action69Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_377), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action69Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_378), 0, NULL);
+void language_meta_action_76(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_422), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action76Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_423), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action76Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_424), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action76Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_425), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action76Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_426), 0, NULL);
 }
 
-void language_meta_action_70(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_382), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action70Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_383), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action70Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_384), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action70Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_385), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action70Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_386), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action70Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_387), 0, NULL);
+void language_meta_action_77(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_430), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_431), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_432), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->runtime), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_433), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_434), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_435), 0, NULL);
 }
 
-void language_meta_action_71(void* runtime, void* variables) {
-    meta_action_run(&(((struct language_meta_Action71Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+void language_meta_action_78(void* runtime, void* variables) {
+    meta_action_run(&(((struct language_meta_Action78Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
-void language_meta_action_72(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_390), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action72Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_391), 0, NULL);
+void language_meta_action_79(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_438), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action79Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_439), 0, NULL);
 }
 
-void language_meta_action_73(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_392), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action73Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_393), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action73Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_394), 0, NULL);
+void language_meta_action_80(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_440), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action80Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_441), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action80Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_442), 0, NULL);
 }
 
-void language_meta_action_75(void* runtime, void* variables) {
+void language_meta_action_82(void* runtime, void* variables) {
 }
 
-void language_meta_action_76(void* runtime, void* variables) {
+void language_meta_action_83(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     ((language_meta_Runtime*)runtime)->W_2 = meta_inc(((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0, 1);
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_symbols;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_398), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_446), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_399), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_447), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_400), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, meta_action_count((((struct language_meta_Action76Vars*)variables)->xs))), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_401), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action76Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_402), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_448), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, meta_action_count((((struct language_meta_Action83Vars*)variables)->xs))), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_449), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action83Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_450), 0, NULL);
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_403), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_451), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_404), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_452), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_405), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_453), 0, NULL);
 }
 
-void language_meta_action_77(void* runtime, void* variables) {
-    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_406), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action77Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_407), 0, NULL);
+void language_meta_action_84(void* runtime, void* variables) {
+    meta_action_run(&(((struct language_meta_Action84Vars*)variables)->y), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_454), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action84Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_455), 0, NULL);
 }
 
-void language_meta_action_78(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_408), 0, NULL);
+void language_meta_action_85(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_456), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_409), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_457), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_0 ? ((language_meta_Runtime*)runtime)->W_0 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_410), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action78Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_411), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_458), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action85Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_459), 0, NULL);
 }
 
-void language_meta_action_79(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_413), 0, NULL);
+void language_meta_action_86(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_461), 0, NULL);
 }
 
-void language_meta_action_80(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_415), 0, NULL);
+void language_meta_action_87(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_463), 0, NULL);
 }
 
-void language_meta_action_81(void* runtime, void* variables) {
+void language_meta_action_88(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     MetaAction action;
@@ -1708,49 +1865,49 @@ void language_meta_action_81(void* runtime, void* variables) {
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_runtimeStruct;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    action = (((struct language_meta_Action81Vars*)variables)->x);
+    action = (((struct language_meta_Action88Vars*)variables)->x);
     string_slice(action.input_buffer, action.start, action.end, &slice);
     if (!string_builder_contains(((language_meta_Runtime*)runtime)->current_string_builder, &slice)) {
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_418), 0, NULL);
-        meta_action_run(&(((struct language_meta_Action81Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_419), 0, NULL);
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_466), 0, NULL);
+        meta_action_run(&(((struct language_meta_Action88Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+        string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_467), 0, NULL);
     }
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    meta_action_run(&(((struct language_meta_Action81Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    meta_action_run(&(((struct language_meta_Action88Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
-void language_meta_action_84(void* runtime, void* variables) {
+void language_meta_action_91(void* runtime, void* variables) {
     StringBuilder* last_string_builder;
     StringBuilder* string_builder;
     ((language_meta_Runtime*)runtime)->W_2 = meta_inc(((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0, 1);
     last_string_builder = ((language_meta_Runtime*)runtime)->current_string_builder;
     string_builder = ((language_meta_Runtime*)runtime)->named_string_builder_symbols;
     ((language_meta_Runtime*)runtime)->current_string_builder = string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_423), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_471), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_424), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_472), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_425), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, meta_action_count((((struct language_meta_Action84Vars*)variables)->xs))), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_426), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action84Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_427), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_473), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, meta_action_count((((struct language_meta_Action91Vars*)variables)->xs))), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_474), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action91Vars*)variables)->xs), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_475), 0, NULL);
     ((language_meta_Runtime*)runtime)->current_string_builder = last_string_builder;
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_428), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_476), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_429), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_477), 0, NULL);
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, string_from_integer(((language_meta_Runtime*)runtime)->arena, (((language_meta_Runtime*)runtime)->W_2 ? ((language_meta_Runtime*)runtime)->W_2 : 0)), 0, NULL);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_430), 0, NULL);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_478), 0, NULL);
 }
 
-void language_meta_action_86(void* runtime, void* variables) {
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_432), 0, NULL);
+void language_meta_action_93(void* runtime, void* variables) {
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_480), 0, NULL);
 }
 
-void language_meta_action_89(void* runtime, void* variables) {
+void language_meta_action_96(void* runtime, void* variables) {
     string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, NULL, 0, ((language_meta_Runtime*)runtime)->named_string_builder_prefix);
-    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_435), 0, NULL);
-    meta_action_run(&(((struct language_meta_Action89Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
+    string_builder_append(((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena, (&language_meta_string_483), 0, NULL);
+    meta_action_run(&(((struct language_meta_Action96Vars*)variables)->x), runtime, ((language_meta_Runtime*)runtime)->current_string_builder, ((language_meta_Runtime*)runtime)->arena);
 }
 
 MetaAction language_meta_rule_main(MetaParseState* parse_state) {
@@ -2750,6 +2907,7 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     void* vars52 = NULL;
     void* vars53 = NULL;
     void* vars54 = NULL;
+    void* vars55 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
@@ -3055,14 +3213,60 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     vars50 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action50Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
-        _ = language_meta_rule_nameAsActionLookup(parse_state);
-        ((struct language_meta_Action50Vars*)vars50)->x = _;
+        data = (&language_meta_string_305);
+        string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+        if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+            parse_state->pos += data->size;
+            _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+        } else {
+            _ = meta_action_create_invalid();
+        }
         if (_.valid) {
-            _ = language_meta_rule_genRuntime(parse_state);
-            ((struct language_meta_Action50Vars*)vars50)->runtime = _;
+            star_start_pos = parse_state->pos;
+            while (1) {
+                star_pos = parse_state->pos;
+                data = (&language_meta_string_306);
+                string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+                if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+                    parse_state->pos += data->size;
+                    _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+                } else {
+                    _ = meta_action_create_invalid();
+                }
+                if (!_.valid) {
+                    meta_parse_state_backtrack(parse_state, star_pos);
+                    break;
+                }
+            }
+            _ = meta_action_create(NULL, NULL, parse_state->input_buffer, star_start_pos, parse_state->pos);
             if (_.valid) {
-                meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                return meta_action_create(language_meta_action_50, vars50, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                star_variables = list_create(parse_state->arena);
+                star_start_pos = parse_state->pos;
+                while (1) {
+                    star_pos = parse_state->pos;
+                    _ = language_meta_rule_cFragment(parse_state);
+                    if (!_.valid) {
+                        meta_parse_state_backtrack(parse_state, star_pos);
+                        break;
+                    }
+                    list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
+                }
+                _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
+                ((struct language_meta_Action50Vars*)vars50)->xs = _;
+                if (_.valid) {
+                    data = (&language_meta_string_307);
+                    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+                    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+                        parse_state->pos += data->size;
+                        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+                    } else {
+                        _ = meta_action_create_invalid();
+                    }
+                    if (_.valid) {
+                        meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                        return meta_action_create(language_meta_action_50, vars50, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                    }
+                }
             }
         }
     }
@@ -3071,7 +3275,7 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     vars51 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action51Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
-        _ = language_meta_rule_placeholder(parse_state);
+        _ = language_meta_rule_nameAsActionLookup(parse_state);
         ((struct language_meta_Action51Vars*)vars51)->x = _;
         if (_.valid) {
             _ = language_meta_rule_genRuntime(parse_state);
@@ -3087,7 +3291,7 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     vars52 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action52Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
-        _ = language_meta_rule_string(parse_state);
+        _ = language_meta_rule_placeholder(parse_state);
         ((struct language_meta_Action52Vars*)vars52)->x = _;
         if (_.valid) {
             _ = language_meta_rule_genRuntime(parse_state);
@@ -3103,7 +3307,23 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     vars53 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action53Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
-        data = (&language_meta_string_330);
+        _ = language_meta_rule_string(parse_state);
+        ((struct language_meta_Action53Vars*)vars53)->x = _;
+        if (_.valid) {
+            _ = language_meta_rule_genRuntime(parse_state);
+            ((struct language_meta_Action53Vars*)vars53)->runtime = _;
+            if (_.valid) {
+                meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                return meta_action_create(language_meta_action_53, vars53, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            }
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars54 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action54Vars));
+    _ = language_meta_rule_space(parse_state);
+    if (_.valid) {
+        data = (&language_meta_string_333);
         string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
         if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
             parse_state->pos += data->size;
@@ -3113,9 +3333,9 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
         }
         if (_.valid) {
             _ = language_meta_rule_name(parse_state);
-            ((struct language_meta_Action53Vars*)vars53)->x = _;
+            ((struct language_meta_Action54Vars*)vars54)->x = _;
             if (_.valid) {
-                data = (&language_meta_string_331);
+                data = (&language_meta_string_334);
                 string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                 if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                     parse_state->pos += data->size;
@@ -3125,9 +3345,9 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
                 }
                 if (_.valid) {
                     _ = language_meta_rule_wvar(parse_state);
-                    ((struct language_meta_Action53Vars*)vars53)->y = _;
+                    ((struct language_meta_Action54Vars*)vars54)->y = _;
                     if (_.valid) {
-                        data = (&language_meta_string_332);
+                        data = (&language_meta_string_335);
                         string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                         if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                             parse_state->pos += data->size;
@@ -3137,9 +3357,9 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
                         }
                         if (_.valid) {
                             _ = language_meta_rule_actionPrimitiveExpression(parse_state);
-                            ((struct language_meta_Action53Vars*)vars53)->z = _;
+                            ((struct language_meta_Action54Vars*)vars54)->z = _;
                             if (_.valid) {
-                                data = (&language_meta_string_333);
+                                data = (&language_meta_string_336);
                                 string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                                 if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                                     parse_state->pos += data->size;
@@ -3149,10 +3369,10 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
                                 }
                                 if (_.valid) {
                                     _ = language_meta_rule_genRuntime(parse_state);
-                                    ((struct language_meta_Action53Vars*)vars53)->runtime = _;
+                                    ((struct language_meta_Action54Vars*)vars54)->runtime = _;
                                     if (_.valid) {
                                         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                                        return meta_action_create(language_meta_action_53, vars53, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                                        return meta_action_create(language_meta_action_54, vars54, parse_state->input_buffer, action_start_pos, parse_state->pos);
                                     }
                                 }
                             }
@@ -3164,10 +3384,10 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars54 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action54Vars));
+    vars55 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action55Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
-        data = (&language_meta_string_342);
+        data = (&language_meta_string_345);
         string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
         if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
             parse_state->pos += data->size;
@@ -3188,11 +3408,11 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
                 list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
             }
             _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
-            ((struct language_meta_Action54Vars*)vars54)->xs = _;
+            ((struct language_meta_Action55Vars*)vars55)->xs = _;
             if (_.valid) {
                 _ = language_meta_rule_space(parse_state);
                 if (_.valid) {
-                    data = (&language_meta_string_343);
+                    data = (&language_meta_string_346);
                     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                         parse_state->pos += data->size;
@@ -3202,10 +3422,10 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
                     }
                     if (_.valid) {
                         _ = language_meta_rule_genRuntime(parse_state);
-                        ((struct language_meta_Action54Vars*)vars54)->runtime = _;
+                        ((struct language_meta_Action55Vars*)vars55)->runtime = _;
                         if (_.valid) {
                             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                            return meta_action_create(language_meta_action_54, vars54, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                            return meta_action_create(language_meta_action_55, vars55, parse_state->input_buffer, action_start_pos, parse_state->pos);
                         }
                     }
                 }
@@ -3215,21 +3435,256 @@ MetaAction language_meta_rule_actionexpr(MetaParseState* parse_state) {
     return meta_action_create_invalid();
 }
 
+MetaAction language_meta_rule_cFragment(MetaParseState* parse_state) {
+    unsigned int or_backtrack_pos;
+    unsigned int action_start_pos;
+    Highlight highlight = Highlight_None;
+    String* data;
+    String slice;
+    MetaAction _;
+    unsigned int star_pos;
+    unsigned int star_start_pos;
+    List* star_variables;
+    void* vars56 = NULL;
+    void* vars57 = NULL;
+    void* vars58 = NULL;
+    void* vars59 = NULL;
+    void* vars60 = NULL;
+    unsigned int nlookahead_pos;
+    void* vars61 = NULL;
+    or_backtrack_pos = parse_state->pos;
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars56 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action56Vars));
+    data = (&language_meta_string_353);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        star_start_pos = parse_state->pos;
+        while (1) {
+            star_pos = parse_state->pos;
+            data = (&language_meta_string_354);
+            string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+            if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+                parse_state->pos += data->size;
+                _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+            } else {
+                _ = meta_action_create_invalid();
+            }
+            if (!_.valid) {
+                meta_parse_state_backtrack(parse_state, star_pos);
+                break;
+            }
+        }
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, star_start_pos, parse_state->pos);
+        if (_.valid) {
+            star_variables = list_create(parse_state->arena);
+            star_start_pos = parse_state->pos;
+            while (1) {
+                star_pos = parse_state->pos;
+                _ = language_meta_rule_cFragment(parse_state);
+                if (!_.valid) {
+                    meta_parse_state_backtrack(parse_state, star_pos);
+                    break;
+                }
+                list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
+            }
+            _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
+            ((struct language_meta_Action56Vars*)vars56)->xs = _;
+            if (_.valid) {
+                data = (&language_meta_string_355);
+                string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+                if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+                    parse_state->pos += data->size;
+                    _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+                } else {
+                    _ = meta_action_create_invalid();
+                }
+                if (_.valid) {
+                    _ = language_meta_rule_genRuntime(parse_state);
+                    ((struct language_meta_Action56Vars*)vars56)->runtime = _;
+                    if (_.valid) {
+                        meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                        return meta_action_create(language_meta_action_56, vars56, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                    }
+                }
+            }
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars57 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action57Vars));
+    data = (&language_meta_string_370);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        _ = language_meta_rule_nameAsActionLookup(parse_state);
+        ((struct language_meta_Action57Vars*)vars57)->x = _;
+        if (_.valid) {
+            _ = language_meta_rule_genRuntime(parse_state);
+            ((struct language_meta_Action57Vars*)vars57)->runtime = _;
+            if (_.valid) {
+                meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                return meta_action_create(language_meta_action_57, vars57, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            }
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars58 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action58Vars));
+    data = (&language_meta_string_375);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        star_start_pos = parse_state->pos;
+        while (1) {
+            star_pos = parse_state->pos;
+            data = (&language_meta_string_376);
+            string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+            if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+                parse_state->pos += data->size;
+                _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+            } else {
+                _ = meta_action_create_invalid();
+            }
+            if (!_.valid) {
+                meta_parse_state_backtrack(parse_state, star_pos);
+                break;
+            }
+        }
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, star_start_pos, parse_state->pos);
+        if (_.valid) {
+            _ = language_meta_rule_genRuntime(parse_state);
+            ((struct language_meta_Action58Vars*)vars58)->runtime = _;
+            if (_.valid) {
+                meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                return meta_action_create(language_meta_action_58, vars58, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            }
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars59 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action59Vars));
+    data = (&language_meta_string_381);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        _ = language_meta_rule_genRuntime(parse_state);
+        ((struct language_meta_Action59Vars*)vars59)->runtime = _;
+        if (_.valid) {
+            meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+            return meta_action_create(language_meta_action_59, vars59, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars60 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action60Vars));
+    data = (&language_meta_string_386);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        _ = language_meta_rule_genRuntime(parse_state);
+        ((struct language_meta_Action60Vars*)vars60)->runtime = _;
+        if (_.valid) {
+            meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+            return meta_action_create(language_meta_action_60, vars60, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        }
+    }
+    meta_parse_state_backtrack(parse_state, or_backtrack_pos);
+    action_start_pos = parse_state->pos;
+    vars61 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action61Vars));
+    nlookahead_pos = parse_state->pos;
+    data = (&language_meta_string_391);
+    string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+    if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+        parse_state->pos += data->size;
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+    } else {
+        _ = meta_action_create_invalid();
+    }
+    if (_.valid) {
+        _ = meta_action_create_invalid();
+    } else {
+        _ = meta_action_create(NULL, NULL, parse_state->input_buffer, 0, 0);
+    }
+    meta_parse_state_backtrack(parse_state, nlookahead_pos);
+    if (_.valid) {
+        nlookahead_pos = parse_state->pos;
+        data = (&language_meta_string_392);
+        string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
+        if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
+            parse_state->pos += data->size;
+            _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-data->size, parse_state->pos);
+        } else {
+            _ = meta_action_create_invalid();
+        }
+        if (_.valid) {
+            _ = meta_action_create_invalid();
+        } else {
+            _ = meta_action_create(NULL, NULL, parse_state->input_buffer, 0, 0);
+        }
+        meta_parse_state_backtrack(parse_state, nlookahead_pos);
+        if (_.valid) {
+            if (parse_state->pos < parse_state->input_buffer->size) {
+                parse_state->pos += 1;
+                _ = meta_action_create(NULL, NULL, parse_state->input_buffer, parse_state->pos-1, parse_state->pos);
+            } else {
+                _ = meta_action_create_invalid();
+            }
+            ((struct language_meta_Action61Vars*)vars61)->x = _;
+            if (_.valid) {
+                _ = language_meta_rule_genRuntime(parse_state);
+                ((struct language_meta_Action61Vars*)vars61)->runtime = _;
+                if (_.valid) {
+                    meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
+                    return meta_action_create(language_meta_action_61, vars61, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                }
+            }
+        }
+    }
+    return meta_action_create_invalid();
+}
+
 MetaAction language_meta_rule_stringBuilderName(MetaParseState* parse_state) {
     unsigned int or_backtrack_pos;
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars55 = NULL;
+    void* vars62 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars55 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action55Vars));
+    vars62 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action62Vars));
     _ = language_meta_rule_name(parse_state);
-    ((struct language_meta_Action55Vars*)vars55)->x = _;
+    ((struct language_meta_Action62Vars*)vars62)->x = _;
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_55, vars55, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_62, vars62, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     return meta_action_create_invalid();
 }
@@ -3239,16 +3694,16 @@ MetaAction language_meta_rule_actionPrimitiveExpression(MetaParseState* parse_st
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars56 = NULL;
+    void* vars63 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars56 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action56Vars));
+    vars63 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action63Vars));
     _ = language_meta_rule_dotname(parse_state);
-    ((struct language_meta_Action56Vars*)vars56)->x = _;
+    ((struct language_meta_Action63Vars*)vars63)->x = _;
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_56, vars56, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_63, vars63, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
@@ -3270,7 +3725,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_352);
+    data = (&language_meta_string_400);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3284,7 +3739,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_353);
+    data = (&language_meta_string_401);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3298,7 +3753,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_354);
+    data = (&language_meta_string_402);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3312,7 +3767,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_355);
+    data = (&language_meta_string_403);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3326,7 +3781,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_356);
+    data = (&language_meta_string_404);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3340,7 +3795,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_357);
+    data = (&language_meta_string_405);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3354,7 +3809,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_358);
+    data = (&language_meta_string_406);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3368,7 +3823,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_359);
+    data = (&language_meta_string_407);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3382,7 +3837,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_360);
+    data = (&language_meta_string_408);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3396,7 +3851,7 @@ MetaAction language_meta_rule_digit(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_361);
+    data = (&language_meta_string_409);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3418,12 +3873,12 @@ MetaAction language_meta_rule_placeholder(MetaParseState* parse_state) {
     String* data;
     String slice;
     MetaAction _;
-    void* vars68 = NULL;
+    void* vars75 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars68 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action68Vars));
-    data = (&language_meta_string_362);
+    vars75 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action75Vars));
+    data = (&language_meta_string_410);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3435,9 +3890,9 @@ MetaAction language_meta_rule_placeholder(MetaParseState* parse_state) {
         _ = language_meta_rule_space(parse_state);
         if (_.valid) {
             _ = language_meta_rule_string(parse_state);
-            ((struct language_meta_Action68Vars*)vars68)->x = _;
+            ((struct language_meta_Action75Vars*)vars75)->x = _;
             if (_.valid) {
-                data = (&language_meta_string_363);
+                data = (&language_meta_string_411);
                 string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                 if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                     parse_state->pos += data->size;
@@ -3447,11 +3902,11 @@ MetaAction language_meta_rule_placeholder(MetaParseState* parse_state) {
                 }
                 if (_.valid) {
                     _ = language_meta_rule_expr(parse_state);
-                    ((struct language_meta_Action68Vars*)vars68)->y = _;
+                    ((struct language_meta_Action75Vars*)vars75)->y = _;
                     if (_.valid) {
                         _ = language_meta_rule_space(parse_state);
                         if (_.valid) {
-                            data = (&language_meta_string_364);
+                            data = (&language_meta_string_412);
                             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                                 parse_state->pos += data->size;
@@ -3461,10 +3916,10 @@ MetaAction language_meta_rule_placeholder(MetaParseState* parse_state) {
                             }
                             if (_.valid) {
                                 _ = language_meta_rule_genRuntime(parse_state);
-                                ((struct language_meta_Action68Vars*)vars68)->runtime = _;
+                                ((struct language_meta_Action75Vars*)vars75)->runtime = _;
                                 if (_.valid) {
                                     meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                                    return meta_action_create(language_meta_action_68, vars68, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                                    return meta_action_create(language_meta_action_75, vars75, parse_state->input_buffer, action_start_pos, parse_state->pos);
                                 }
                             }
                         }
@@ -3481,33 +3936,33 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars69 = NULL;
+    void* vars76 = NULL;
     String* data;
     String slice;
-    void* vars70 = NULL;
-    void* vars71 = NULL;
+    void* vars77 = NULL;
+    void* vars78 = NULL;
     List* star_variables;
     unsigned int star_pos;
     unsigned int star_start_pos;
-    void* vars72 = NULL;
+    void* vars79 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars69 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action69Vars));
+    vars76 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action76Vars));
     _ = language_meta_rule_wvar(parse_state);
-    ((struct language_meta_Action69Vars*)vars69)->x = _;
+    ((struct language_meta_Action76Vars*)vars76)->x = _;
     if (_.valid) {
         _ = language_meta_rule_genRuntime(parse_state);
-        ((struct language_meta_Action69Vars*)vars69)->runtime = _;
+        ((struct language_meta_Action76Vars*)vars76)->runtime = _;
         if (_.valid) {
             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-            return meta_action_create(language_meta_action_69, vars69, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            return meta_action_create(language_meta_action_76, vars76, parse_state->input_buffer, action_start_pos, parse_state->pos);
         }
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars70 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action70Vars));
-    data = (&language_meta_string_379);
+    vars77 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action77Vars));
+    data = (&language_meta_string_427);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3517,9 +3972,9 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
     }
     if (_.valid) {
         _ = language_meta_rule_wvar(parse_state);
-        ((struct language_meta_Action70Vars*)vars70)->x = _;
+        ((struct language_meta_Action77Vars*)vars77)->x = _;
         if (_.valid) {
-            data = (&language_meta_string_380);
+            data = (&language_meta_string_428);
             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                 parse_state->pos += data->size;
@@ -3529,9 +3984,9 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
             }
             if (_.valid) {
                 _ = language_meta_rule_dotname(parse_state);
-                ((struct language_meta_Action70Vars*)vars70)->y = _;
+                ((struct language_meta_Action77Vars*)vars77)->y = _;
                 if (_.valid) {
-                    data = (&language_meta_string_381);
+                    data = (&language_meta_string_429);
                     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
                     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                         parse_state->pos += data->size;
@@ -3541,10 +3996,10 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
                     }
                     if (_.valid) {
                         _ = language_meta_rule_genRuntime(parse_state);
-                        ((struct language_meta_Action70Vars*)vars70)->runtime = _;
+                        ((struct language_meta_Action77Vars*)vars77)->runtime = _;
                         if (_.valid) {
                             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                            return meta_action_create(language_meta_action_70, vars70, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                            return meta_action_create(language_meta_action_77, vars77, parse_state->input_buffer, action_start_pos, parse_state->pos);
                         }
                     }
                 }
@@ -3553,17 +4008,17 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars71 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action71Vars));
+    vars78 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action78Vars));
     _ = language_meta_rule_dotname(parse_state);
-    ((struct language_meta_Action71Vars*)vars71)->y = _;
+    ((struct language_meta_Action78Vars*)vars78)->y = _;
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_71, vars71, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_78, vars78, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars72 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action72Vars));
-    data = (&language_meta_string_388);
+    vars79 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action79Vars));
+    data = (&language_meta_string_436);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3584,9 +4039,9 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
             list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
         }
         _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
-        ((struct language_meta_Action72Vars*)vars72)->xs = _;
+        ((struct language_meta_Action79Vars*)vars79)->xs = _;
         if (_.valid) {
-            data = (&language_meta_string_389);
+            data = (&language_meta_string_437);
             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                 parse_state->pos += data->size;
@@ -3596,7 +4051,7 @@ MetaAction language_meta_rule_expr(MetaParseState* parse_state) {
             }
             if (_.valid) {
                 meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                return meta_action_create(language_meta_action_72, vars72, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                return meta_action_create(language_meta_action_79, vars79, parse_state->input_buffer, action_start_pos, parse_state->pos);
             }
         }
     }
@@ -3608,21 +4063,21 @@ MetaAction language_meta_rule_numberPart(MetaParseState* parse_state) {
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars73 = NULL;
+    void* vars80 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars73 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action73Vars));
+    vars80 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action80Vars));
     _ = language_meta_rule_space(parse_state);
     if (_.valid) {
         _ = language_meta_rule_nameAsActionLookup(parse_state);
-        ((struct language_meta_Action73Vars*)vars73)->x = _;
+        ((struct language_meta_Action80Vars*)vars80)->x = _;
         if (_.valid) {
             _ = language_meta_rule_maybeShift(parse_state);
-            ((struct language_meta_Action73Vars*)vars73)->y = _;
+            ((struct language_meta_Action80Vars*)vars80)->y = _;
             if (_.valid) {
                 meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                return meta_action_create(language_meta_action_73, vars73, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                return meta_action_create(language_meta_action_80, vars80, parse_state->input_buffer, action_start_pos, parse_state->pos);
             }
         }
     }
@@ -3636,11 +4091,11 @@ MetaAction language_meta_rule_maybeShift(MetaParseState* parse_state) {
     String* data;
     String slice;
     MetaAction _;
-    void* vars75 = NULL;
+    void* vars82 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_395);
+    data = (&language_meta_string_443);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3658,7 +4113,7 @@ MetaAction language_meta_rule_maybeShift(MetaParseState* parse_state) {
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
     meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-    return meta_action_create(language_meta_action_75, vars75, parse_state->input_buffer, action_start_pos, parse_state->pos);
+    return meta_action_create(language_meta_action_82, vars82, parse_state->input_buffer, action_start_pos, parse_state->pos);
     return meta_action_create_invalid();
 }
 
@@ -3672,12 +4127,12 @@ MetaAction language_meta_rule_string(MetaParseState* parse_state) {
     List* star_variables;
     unsigned int star_pos;
     unsigned int star_start_pos;
-    void* vars76 = NULL;
+    void* vars83 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars76 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action76Vars));
-    data = (&language_meta_string_396);
+    vars83 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action83Vars));
+    data = (&language_meta_string_444);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3698,9 +4153,9 @@ MetaAction language_meta_rule_string(MetaParseState* parse_state) {
             list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
         }
         _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
-        ((struct language_meta_Action76Vars*)vars76)->xs = _;
+        ((struct language_meta_Action83Vars*)vars83)->xs = _;
         if (_.valid) {
-            data = (&language_meta_string_397);
+            data = (&language_meta_string_445);
             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                 parse_state->pos += data->size;
@@ -3710,10 +4165,10 @@ MetaAction language_meta_rule_string(MetaParseState* parse_state) {
             }
             if (_.valid) {
                 _ = language_meta_rule_genRuntime(parse_state);
-                ((struct language_meta_Action76Vars*)vars76)->runtime = _;
+                ((struct language_meta_Action83Vars*)vars83)->runtime = _;
                 if (_.valid) {
                     meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                    return meta_action_create(language_meta_action_76, vars76, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                    return meta_action_create(language_meta_action_83, vars83, parse_state->input_buffer, action_start_pos, parse_state->pos);
                 }
             }
         }
@@ -3726,19 +4181,19 @@ MetaAction language_meta_rule_dotname(MetaParseState* parse_state) {
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars77 = NULL;
+    void* vars84 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars77 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action77Vars));
+    vars84 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action84Vars));
     _ = language_meta_rule_nameAsActionLookup(parse_state);
-    ((struct language_meta_Action77Vars*)vars77)->x = _;
+    ((struct language_meta_Action84Vars*)vars84)->x = _;
     if (_.valid) {
         _ = language_meta_rule_nextname(parse_state);
-        ((struct language_meta_Action77Vars*)vars77)->y = _;
+        ((struct language_meta_Action84Vars*)vars84)->y = _;
         if (_.valid) {
             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-            return meta_action_create(language_meta_action_77, vars77, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            return meta_action_create(language_meta_action_84, vars84, parse_state->input_buffer, action_start_pos, parse_state->pos);
         }
     }
     return meta_action_create_invalid();
@@ -3749,16 +4204,16 @@ MetaAction language_meta_rule_nameAsActionLookup(MetaParseState* parse_state) {
     unsigned int action_start_pos;
     Highlight highlight = Highlight_None;
     MetaAction _;
-    void* vars78 = NULL;
+    void* vars85 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars78 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action78Vars));
+    vars85 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action85Vars));
     _ = language_meta_rule_variableName(parse_state);
-    ((struct language_meta_Action78Vars*)vars78)->x = _;
+    ((struct language_meta_Action85Vars*)vars85)->x = _;
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_78, vars78, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_85, vars85, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     return meta_action_create_invalid();
 }
@@ -3771,12 +4226,12 @@ MetaAction language_meta_rule_nextname(MetaParseState* parse_state) {
     String slice;
     MetaAction _;
     unsigned int nlookahead_pos;
-    void* vars79 = NULL;
-    void* vars80 = NULL;
+    void* vars86 = NULL;
+    void* vars87 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_412);
+    data = (&language_meta_string_460);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3795,12 +4250,12 @@ MetaAction language_meta_rule_nextname(MetaParseState* parse_state) {
         meta_parse_state_backtrack(parse_state, nlookahead_pos);
         if (_.valid) {
             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-            return meta_action_create(language_meta_action_79, vars79, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            return meta_action_create(language_meta_action_86, vars86, parse_state->input_buffer, action_start_pos, parse_state->pos);
         }
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_414);
+    data = (&language_meta_string_462);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3819,7 +4274,7 @@ MetaAction language_meta_rule_nextname(MetaParseState* parse_state) {
         meta_parse_state_backtrack(parse_state, nlookahead_pos);
         if (_.valid) {
             meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-            return meta_action_create(language_meta_action_80, vars80, parse_state->input_buffer, action_start_pos, parse_state->pos);
+            return meta_action_create(language_meta_action_87, vars87, parse_state->input_buffer, action_start_pos, parse_state->pos);
         }
     }
     return meta_action_create_invalid();
@@ -3832,12 +4287,12 @@ MetaAction language_meta_rule_wvar(MetaParseState* parse_state) {
     String* data;
     String slice;
     MetaAction _;
-    void* vars81 = NULL;
+    void* vars88 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars81 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action81Vars));
-    data = (&language_meta_string_416);
+    vars88 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action88Vars));
+    data = (&language_meta_string_464);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3852,9 +4307,9 @@ MetaAction language_meta_rule_wvar(MetaParseState* parse_state) {
         } else {
             _ = meta_action_create_invalid();
         }
-        ((struct language_meta_Action81Vars*)vars81)->x = _;
+        ((struct language_meta_Action88Vars*)vars88)->x = _;
         if (_.valid) {
-            data = (&language_meta_string_417);
+            data = (&language_meta_string_465);
             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                 parse_state->pos += data->size;
@@ -3864,7 +4319,7 @@ MetaAction language_meta_rule_wvar(MetaParseState* parse_state) {
             }
             if (_.valid) {
                 meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                return meta_action_create(language_meta_action_81, vars81, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                return meta_action_create(language_meta_action_88, vars88, parse_state->input_buffer, action_start_pos, parse_state->pos);
             }
         }
     }
@@ -3890,7 +4345,7 @@ MetaAction language_meta_rule_stringInner(MetaParseState* parse_state) {
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
     nlookahead_pos = parse_state->pos;
-    data = (&language_meta_string_420);
+    data = (&language_meta_string_468);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3929,12 +4384,12 @@ MetaAction language_meta_rule_charString(MetaParseState* parse_state) {
     List* star_variables;
     unsigned int star_pos;
     unsigned int star_start_pos;
-    void* vars84 = NULL;
+    void* vars91 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars84 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action84Vars));
-    data = (&language_meta_string_421);
+    vars91 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action91Vars));
+    data = (&language_meta_string_469);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -3955,9 +4410,9 @@ MetaAction language_meta_rule_charString(MetaParseState* parse_state) {
             list_append(parse_state->arena, star_variables, arena_copy(parse_state->arena, sizeof(_), (unsigned char*)&_));
         }
         _ = meta_action_create(NULL, (void*)star_variables, parse_state->input_buffer, star_start_pos, parse_state->pos);
-        ((struct language_meta_Action84Vars*)vars84)->xs = _;
+        ((struct language_meta_Action91Vars*)vars91)->xs = _;
         if (_.valid) {
-            data = (&language_meta_string_422);
+            data = (&language_meta_string_470);
             string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
             if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
                 parse_state->pos += data->size;
@@ -3967,7 +4422,7 @@ MetaAction language_meta_rule_charString(MetaParseState* parse_state) {
             }
             if (_.valid) {
                 meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-                return meta_action_create(language_meta_action_84, vars84, parse_state->input_buffer, action_start_pos, parse_state->pos);
+                return meta_action_create(language_meta_action_91, vars91, parse_state->input_buffer, action_start_pos, parse_state->pos);
             }
         }
     }
@@ -3981,7 +4436,7 @@ MetaAction language_meta_rule_charStringInner(MetaParseState* parse_state) {
     MetaAction _;
     String* data;
     String slice;
-    void* vars86 = NULL;
+    void* vars93 = NULL;
     unsigned int nlookahead_pos;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
@@ -3993,7 +4448,7 @@ MetaAction language_meta_rule_charStringInner(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_431);
+    data = (&language_meta_string_479);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4003,12 +4458,12 @@ MetaAction language_meta_rule_charStringInner(MetaParseState* parse_state) {
     }
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_86, vars86, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_93, vars93, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
     nlookahead_pos = parse_state->pos;
-    data = (&language_meta_string_433);
+    data = (&language_meta_string_481);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4047,7 +4502,7 @@ MetaAction language_meta_rule_stringEscape(MetaParseState* parse_state) {
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_434);
+    data = (&language_meta_string_482);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4075,16 +4530,16 @@ MetaAction language_meta_rule_ruleName(MetaParseState* parse_state) {
     unsigned int action_start_pos;
     Highlight highlight = Highlight_RuleName;
     MetaAction _;
-    void* vars89 = NULL;
+    void* vars96 = NULL;
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    vars89 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action89Vars));
+    vars96 = arena_alloc(parse_state->arena, sizeof(struct language_meta_Action96Vars));
     _ = language_meta_rule_name(parse_state);
-    ((struct language_meta_Action89Vars*)vars89)->x = _;
+    ((struct language_meta_Action96Vars*)vars96)->x = _;
     if (_.valid) {
         meta_highlight_register(parse_state, action_start_pos, parse_state->pos, highlight);
-        return meta_action_create(language_meta_action_89, vars89, parse_state->input_buffer, action_start_pos, parse_state->pos);
+        return meta_action_create(language_meta_action_96, vars96, parse_state->input_buffer, action_start_pos, parse_state->pos);
     }
     return meta_action_create_invalid();
 }
@@ -4198,7 +4653,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_436);
+    data = (&language_meta_string_484);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4212,7 +4667,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_437);
+    data = (&language_meta_string_485);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4226,7 +4681,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_438);
+    data = (&language_meta_string_486);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4240,7 +4695,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_439);
+    data = (&language_meta_string_487);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4254,7 +4709,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_440);
+    data = (&language_meta_string_488);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4268,7 +4723,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_441);
+    data = (&language_meta_string_489);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4282,7 +4737,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_442);
+    data = (&language_meta_string_490);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4296,7 +4751,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_443);
+    data = (&language_meta_string_491);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4310,7 +4765,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_444);
+    data = (&language_meta_string_492);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4324,7 +4779,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_445);
+    data = (&language_meta_string_493);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4338,7 +4793,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_446);
+    data = (&language_meta_string_494);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4352,7 +4807,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_447);
+    data = (&language_meta_string_495);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4366,7 +4821,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_448);
+    data = (&language_meta_string_496);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4380,7 +4835,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_449);
+    data = (&language_meta_string_497);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4394,7 +4849,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_450);
+    data = (&language_meta_string_498);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4408,7 +4863,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_451);
+    data = (&language_meta_string_499);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4422,7 +4877,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_452);
+    data = (&language_meta_string_500);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4436,7 +4891,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_453);
+    data = (&language_meta_string_501);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4450,7 +4905,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_454);
+    data = (&language_meta_string_502);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4464,7 +4919,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_455);
+    data = (&language_meta_string_503);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4478,7 +4933,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_456);
+    data = (&language_meta_string_504);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4492,7 +4947,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_457);
+    data = (&language_meta_string_505);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4506,7 +4961,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_458);
+    data = (&language_meta_string_506);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4520,7 +4975,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_459);
+    data = (&language_meta_string_507);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4534,7 +4989,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_460);
+    data = (&language_meta_string_508);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4548,7 +5003,7 @@ MetaAction language_meta_rule_lower(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_461);
+    data = (&language_meta_string_509);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4573,7 +5028,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_462);
+    data = (&language_meta_string_510);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4587,7 +5042,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_463);
+    data = (&language_meta_string_511);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4601,7 +5056,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_464);
+    data = (&language_meta_string_512);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4615,7 +5070,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_465);
+    data = (&language_meta_string_513);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4629,7 +5084,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_466);
+    data = (&language_meta_string_514);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4643,7 +5098,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_467);
+    data = (&language_meta_string_515);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4657,7 +5112,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_468);
+    data = (&language_meta_string_516);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4671,7 +5126,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_469);
+    data = (&language_meta_string_517);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4685,7 +5140,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_470);
+    data = (&language_meta_string_518);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4699,7 +5154,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_471);
+    data = (&language_meta_string_519);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4713,7 +5168,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_472);
+    data = (&language_meta_string_520);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4727,7 +5182,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_473);
+    data = (&language_meta_string_521);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4741,7 +5196,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_474);
+    data = (&language_meta_string_522);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4755,7 +5210,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_475);
+    data = (&language_meta_string_523);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4769,7 +5224,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_476);
+    data = (&language_meta_string_524);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4783,7 +5238,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_477);
+    data = (&language_meta_string_525);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4797,7 +5252,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_478);
+    data = (&language_meta_string_526);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4811,7 +5266,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_479);
+    data = (&language_meta_string_527);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4825,7 +5280,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_480);
+    data = (&language_meta_string_528);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4839,7 +5294,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_481);
+    data = (&language_meta_string_529);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4853,7 +5308,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_482);
+    data = (&language_meta_string_530);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4867,7 +5322,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_483);
+    data = (&language_meta_string_531);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4881,7 +5336,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_484);
+    data = (&language_meta_string_532);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4895,7 +5350,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_485);
+    data = (&language_meta_string_533);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4909,7 +5364,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_486);
+    data = (&language_meta_string_534);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -4923,7 +5378,7 @@ MetaAction language_meta_rule_upper(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_487);
+    data = (&language_meta_string_535);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -5005,7 +5460,7 @@ MetaAction language_meta_rule_spacechar(MetaParseState* parse_state) {
     or_backtrack_pos = parse_state->pos;
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_488);
+    data = (&language_meta_string_536);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
@@ -5019,7 +5474,7 @@ MetaAction language_meta_rule_spacechar(MetaParseState* parse_state) {
     }
     meta_parse_state_backtrack(parse_state, or_backtrack_pos);
     action_start_pos = parse_state->pos;
-    data = (&language_meta_string_489);
+    data = (&language_meta_string_537);
     string_slice(parse_state->input_buffer, parse_state->pos, parse_state->pos+data->size, &slice);
     if (parse_state->input_buffer->size-parse_state->pos >= data->size && string_compare(data, &slice)) {
         parse_state->pos += data->size;
diff --git a/src/meta/meta.meta b/src/meta/meta.meta
index 448aefb..14f92ac 100644
--- a/src/meta/meta.meta
+++ b/src/meta/meta.meta
@@ -391,6 +391,9 @@ actionexpr =
     | space expr:x genRuntime:runtime -> {
         "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_from_integer(" runtime "->arena, " x "), 0, NULL);\n"
     }
+    | space 'C{' ' '* cFragment*:xs '}' -> {
+        xs
+    }
     | space nameAsActionLookup:x genRuntime:runtime -> {
         "meta_action_run(&" x ", runtime, " runtime "->current_string_builder, " runtime "->arena);\n"
     }
@@ -427,6 +430,31 @@ actionexpr =
     }
     ;
 
+cFragment =
+    | '{' ' '* cFragment*:xs '}' genRuntime:runtime -> {
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"{\\n\"), 0, NULL);\n"
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, NULL, 1, NULL);\n"
+        xs
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, NULL, -1, NULL);\n"
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"}\\n\"), 0, NULL);\n"
+    }
+    | '$' nameAsActionLookup:x genRuntime:runtime -> {
+        "meta_action_run(&" x ", runtime, " runtime "->current_string_builder, " runtime "->arena);\n"
+    }
+    | '\n' ' '* genRuntime:runtime -> {
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"\\n\"), 0, NULL);\n"
+    }
+    | '"' genRuntime:runtime -> {
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"\\\"\"), 0, NULL);\n"
+    }
+    | '\\' genRuntime:runtime -> {
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"\\\\\"), 0, NULL);\n"
+    }
+    | !'{' !'}' .:x genRuntime:runtime -> {
+        "string_builder_append(" runtime "->current_string_builder, " runtime "->arena, string_alloc_from_cstring(" runtime "->arena, \"" x "\"), 0, NULL);\n"
+    }
+    ;
+
 stringBuilderName = name:x -> {
     >runtimeStruct {
         unseen(x) -> {
diff --git a/src/string.c b/src/string.c
index d67c92e..246f1e0 100644
--- a/src/string.c
+++ b/src/string.c
@@ -48,6 +48,13 @@ String string_from_cstring(char* cstring) {
     }
 }
 
+String* string_alloc_from_cstring(Arena* arena, char* cstring) {
+    String* string = arena_alloc(arena, sizeof(String));
+    string->size = strlen(cstring);
+    string->buffer = arena_copy(arena, string->size, (unsigned char*)cstring);
+    return string;
+}
+
 char* string_to_cstring(String string, Arena* arena) {
     char* cstring = arena_alloc(arena, string.size+1);
     size_t index;

commit 0e911d7131e518d50dacb1e99b85cb26808e264f
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 17:57:01 2025 +0100

    Part 2

diff --git a/make.sh b/make.sh
index b9a7b46..e66c585 100755
--- a/make.sh
+++ b/make.sh
@@ -118,6 +118,24 @@ example_aoc20256() {
     out/aoc20256 <src/examples/aoc20256/rl.aoc20256 >out/rl.c
     c_compile out/rl.c out/rl
     out/rl
+    meta_compile src/examples/aoc20256/rotate.meta out/rotate.c
+    c_compile out/rotate.c out/rotate
+
+    out/rotate <src/examples/aoc20256/example.aoc20256 >out/rotate_example_aoc20256.c
+    c_compile out/rotate_example_aoc20256.c out/rotate_example_aoc20256
+    out/rotate_example_aoc20256 >out/example.aoc20256_2
+    meta_compile src/examples/aoc20256/aoc20256_2.meta out/aoc20256_2.c
+    c_compile out/aoc20256_2.c out/aoc20256_2
+    out/aoc20256_2 <out/example.aoc20256_2 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+
+    out/rotate <src/examples/aoc20256/rl.aoc20256 >out/rotate_rl_aoc20256.c
+    c_compile out/rotate_rl_aoc20256.c out/rotate_rl_aoc20256
+    out/rotate_rl_aoc20256 >out/rl.aoc20256_2
+    out/aoc20256_2 <out/rl.aoc20256_2 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
 }
 
 example() {
diff --git a/src/examples/aoc20256/aoc20256_2.meta b/src/examples/aoc20256/aoc20256_2.meta
new file mode 100644
index 0000000..799712e
--- /dev/null
+++ b/src/examples/aoc20256/aoc20256_2.meta
@@ -0,0 +1,52 @@
+main = section*:xs space !. -> {
+    "#include <stdio.h>\n"
+    "typedef unsigned long Number;\n"
+    "typedef Number (*Op)(Number, Number);\n"
+    "Number op_add(Number a, Number b) { return a + b; }\n"
+    "Number op_times(Number a, Number b) { return a * b; }\n"
+    "Number reverse(Number in) {\n" >
+        "Number out = 0;\n"
+        "while (in) {\n" >
+            "out *= 10;\n"
+            "out += in % 10;\n"
+            "in /= 10;\n"
+        < "}\n"
+        "return out;\n"
+    < "}\n"
+    "int main() {\n" >
+        "Number grand_total = 0;\n"
+        "Number total;\n"
+        "Number number;\n"
+        "Op op;\n"
+        xs
+        "printf(\"Part 2: %ld\\n\", grand_total);\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+section = space plusTimes:x number*:ys -> {
+    x
+    ys
+    "grand_total += total;\n"
+};
+
+number = space digit:x digit*:xs -> {
+    "number = reverse(" x xs ");\n"
+    "total = op(total, number);\n"
+};
+
+digit = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
+
+plusTimes[Escape] =
+    | '+' -> {
+        "total = 0;\n"
+        "op = op_add;\n"
+    }
+    | '*' -> {
+        "total = 1;\n"
+        "op = op_times;\n"
+    }
+    ;
+
+space = spaceChar*;
+spaceChar = ' ' | '\n';
diff --git a/src/examples/aoc20256/rotate.meta b/src/examples/aoc20256/rotate.meta
new file mode 100644
index 0000000..09ffc24
--- /dev/null
+++ b/src/examples/aoc20256/rotate.meta
@@ -0,0 +1,44 @@
+main = row*:xs -> {
+    "#include <stdio.h>\n"
+    "typedef struct {\n" >
+        "int count;\n"
+        "char* chars;\n"
+    < "} Row;\n"
+    "typedef struct {\n" >
+        "int count;\n"
+        "Row* rows;\n"
+    < "} Rows;\n"
+    $top
+    <top
+    $rowsArray
+    xs
+    "static Row rows_array[] = {\n" > <rowsArray < "};\n"
+    "static Rows rows = {" xs.count ", rows_array};\n"
+    "int main(void) {\n" >
+        "int row_index, col_index;\n"
+        "for (col_index=0; col_index< " W[2] "; col_index++) {\n" >
+            "for (row_index=rows.count-1; row_index>=0; row_index--) {\n" >
+                "if (col_index < rows.rows[row_index].count) {\n" >
+                    "printf(\"%c\", rows.rows[row_index].chars[col_index]);\n"
+                < "}\n"
+            < "}\n"
+            "printf(\"\\n\");\n"
+        < "}\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+row = col*:xs '\n' -> {
+    #max(W[2] xs.count)
+    >top {
+        #inc(W[1] 1)
+        "static char row" W[1] "[] = {" xs "};\n"
+    }
+    >rowsArray {
+        "{" xs.count ", row" W[1] "},\n"
+    }
+};
+
+col = !'\n' .:x -> {
+    "'" x "', "
+};

commit ce318e9e9bacbd87d4ef8ad13ab47221e5df41ae
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 00:13:07 2025 +0100

    Clean up

diff --git a/src/examples/aoc20256/aoc20256.meta b/src/examples/aoc20256/aoc20256.meta
index c208175..93983f0 100644
--- a/src/examples/aoc20256/aoc20256.meta
+++ b/src/examples/aoc20256/aoc20256.meta
@@ -22,7 +22,7 @@ main = row*:xs symbols:y -> {
     y
     >rowCount { xs.count }
     >colCount { W[1] }
-    "int main(void) {\n" >
+    "Number part1() {\n" >
         "Number col, row;\n"
         "Number grand_total = 0;\n"
         "for (col=0; col<" <colCount "; col++) {\n" >
@@ -32,7 +32,10 @@ main = row*:xs symbols:y -> {
             < "}\n"
             "grand_total += total;\n"
         < "}\n"
-        "printf(\"Part 1: %ld\\n\", grand_total);\n"
+        "return grand_total;\n"
+    < "}\n"
+    "int main(void) {\n" >
+        "printf(\"Part 1: %ld\\n\", part1());\n"
         "return 0;\n"
     < "}\n"
 };

commit 66e421a8d10659890607e4b2766983ecce1083b5
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Dec 8 00:03:09 2025 +0100

    Day 6 part 1

diff --git a/make.sh b/make.sh
index 7839e1d..b9a7b46 100755
--- a/make.sh
+++ b/make.sh
@@ -16,6 +16,7 @@ main() {
     example_aoc20253
     example_aoc20254
     example_aoc20255
+    example_aoc20256
 }
 
 dotall() {
@@ -109,6 +110,16 @@ example_aoc20255() {
     out/rl
 }
 
+example_aoc20256() {
+    example aoc20256
+    out/aoc20256 <src/examples/aoc20256/example.aoc20256 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20256 <src/examples/aoc20256/rl.aoc20256 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
@@ -145,6 +156,7 @@ languages() {
     meta_compile src/examples/aoc20253/aoc20253.meta out/language_aoc20253.c
     meta_compile src/examples/aoc20254/aoc20254.meta out/language_aoc20254.c
     meta_compile src/examples/aoc20255/aoc20255.meta out/language_aoc20255.c
+    meta_compile src/examples/aoc20256/aoc20256.meta out/language_aoc20256.c
 }
 
 banner() {
diff --git a/src/examples/aoc20256/aoc20256.meta b/src/examples/aoc20256/aoc20256.meta
new file mode 100644
index 0000000..c208175
--- /dev/null
+++ b/src/examples/aoc20256/aoc20256.meta
@@ -0,0 +1,66 @@
+#id = aoc20256
+
+main = row*:xs symbols:y -> {
+    "#include <stdio.h>\n"
+    $rowCount
+    $colCount
+    $initial
+    $ops
+    "typedef unsigned long Number;\n"
+    "static Number numbers[" <rowCount "][" <colCount "] = {\n" >
+        xs
+    < "};\n"
+    "static Number initial[" <colCount "] = {\n" >
+        <initial
+    < "};\n"
+    "typedef Number (*Op)(Number, Number);\n"
+    "Number op_add(Number a, Number b) { return a + b; }\n"
+    "Number op_times(Number a, Number b) { return a * b; }\n"
+    "static Op ops[" <colCount "] = {\n" >
+        <ops
+    < "};\n"
+    y
+    >rowCount { xs.count }
+    >colCount { W[1] }
+    "int main(void) {\n" >
+        "Number col, row;\n"
+        "Number grand_total = 0;\n"
+        "for (col=0; col<" <colCount "; col++) {\n" >
+            "Number total = initial[col];\n"
+            "for (row=0; row<" <rowCount "; row++) {\n" >
+                "total = ops[col](total, numbers[row][col]);\n"
+            < "}\n"
+            "grand_total += total;\n"
+        < "}\n"
+        "printf(\"Part 1: %ld\\n\", grand_total);\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+row = col*:xs '\n' -> {
+    #max(W[1] xs.count)
+    "{" xs "},\n"
+};
+
+col = ' '* number:x ' '* -> {
+    x ", "
+};
+
+number[RuleName] = digit digit*;
+
+digit = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
+
+symbols = symbol*:xs '\n' -> { xs };
+
+symbol = ' '* plusTimes:x ' '* -> { x };
+
+plusTimes[Escape] =
+    | '+' -> {
+        >initial { "0,\n" }
+        >ops     { "op_add,\n" }
+    }
+    | '*' -> {
+        >initial { "1,\n" }
+        >ops     { "op_times,\n" }
+    }
+    ;
diff --git a/src/examples/aoc20256/example.aoc20256 b/src/examples/aoc20256/example.aoc20256
new file mode 100644
index 0000000..2465b9e
--- /dev/null
+++ b/src/examples/aoc20256/example.aoc20256
@@ -0,0 +1,4 @@
+123 328  51 64
+ 45 64  387 23
+  6 98  215 314
+*   +   *   +
diff --git a/src/examples/aoc20256/rl.aoc20256 b/src/examples/aoc20256/rl.aoc20256
new file mode 100644
index 0000000..a549872
--- /dev/null
+++ b/src/examples/aoc20256/rl.aoc20256
@@ -0,0 +1,5 @@
+1   95 97 1177 86 766 487 62 938 15 82 859 77  16 99   99 863 934 3  976 87 27 3268   5  439 14 18 18 83  553 364 96 4  288 3  55  1   491 6   7 89 963 221 5379  8 7445 529  8 379 47  31 32 56 641 2    1 58 939  2  17 27 772 833 922 682 819 333 829 87 6954 16 25  924 25   43 43 7371 13 559 559 61  1   75 7431 54 34 668 95  912 85 69 8  7  5      7 11 299 23 3   95  94  85 4     8 2743 795 581 9    57   81 741 7  93 65  958 535  32 5   93 48   57  736 7    8 9   49 395 89  3242   68 375 4   77 898 173 665  75 34  683 176 92 85  5  6 7512  3 762 36 143 82 1   72  69 145  74 61  8261 59 295 57 29  4199 8   75 52 21 4   2752 31 94 566 548   6  74   6   12 972  3 31 8   57 41 317   314 35 69  62 169 237 15  281 689    1  6 35 44 627 59 86 522 2   77   23  6 558 517 82  3  8886 754 26 3988 143 158 7    99  589 92  1155 762 3286 533 498   6 9437 58  4  8 552 115 836 51 6  9866 771 5    145 64   715 4  228 597 49 152  7  3 1441 46   2  2  91 67 423 4279  987  41 4888 11 634 99 258 76  98  2 25    5 3   84 46 228  36  933 3  445 55 428 78 25 443 582 37   2585 722 88 19 6  39 41 54  44 27 661 452 44 133 325   2 7618 26 118 213 1948  2 527 799 76 17 236 3346 75 3    12  8 3398   4 2  8  857 78 94 85   7247 513 98 845 347 23   5    9487  4  5  152 323 9194  7  3 636 15 7   1647 39  65 169  49 1    52 814 74 9149 1997   6 95   5    79  32 98  4  224 353 85  75 682 8   2  8 674 9529   2  3  7 99  8    76 173 23    3    8   47 9817 19 896  68 98 58 66  65 767 6  1  3  68 946 41 337 76   8 2523 97  565  9 2  6873  8 27 56 8353  57 8  99 37 74  5 51   8 42 2866 714 19  78 662 537 37 29   9 847 4886 4  3  3  217 272  27   2 51   2 32  4  23 23 95 27   6   44 7327 7244 413 94  58  4 58   7 417  657 5  114 92 76 729  979 6215 3  47 78 248  99 5722 8  35 758 79   64 353 12  862 82  19 67 78   86 662  9 46 83 69   2147 8  1396   3 76  126 88 57 11 3  71 699 17 59 9    73  62 3   8446 57  78 2    1 74 191 85  72 56 24  2 24 27 7761 276  859 215 64 82 6411 39 57  4 7264 17 5  72  3 51 24  7   21 7  2355 457 666 713 15 927 526 822 85  351  8 3  24 4    16    4 356    1 17 99 489  26  97 8    7 21   19 43   84 253 46 685  1 84  12  53 89 288 51 5136 551  32 8229 16   422 26  12 3116 9893 43   16 215 86 2  66  25  81 42 92 265 163  7 96 341  1 1369 479 448 44 26  69 22 11 6631 845 84  67 663 7  3762 6    67 3   2574 21  43  98 235 483 76 78 72    5  9 251 21  79 761 9455 9918 384 1  2846   8 14  8832   11 685 951 4244 4    9 39 79 72     6 565 481 11 656 31 48  271  38 8642 426 35 58 124 299 53   6 72  59     88 42 469 958  31 194 5391 99 65 84  35 68 692  84 68 4997 23 25   62 96 242  554 44 184 5   37 63 464 857  79 587  3  751 23   5  7396  9 54 64 336 52    75 56   94   1 39 1486 33   7 76 54  6  331 1   69 97 4265 57   41 1583 6   57  1  7 492  9 37 789 82   5 16 27  84 48 215  9  83 32   1 48 378   6 6212 67 25 8  82  2   4 4   12 1537 355 323 5  2   3165 93 879  27 257 9    953 591  188 65 9   4 7363 4   189 7973 822 4469 126 49 343   1 93 622 2  9    2   25 8933 73 46 2684 261 19 8   5468 65 45   72  3 3  75   77  9859  97 8    3 4377  742  82  2   32 13 19 363 885 69 96  2  6 32 57   19   4939 46 51 5154 3  366 17 24 66   76 78 1   11  698 86  581 18 3251  62 555  6 26  117 88 61  57  144 489 8381 816 3168  3 3   9  1 2   68 4371 1  51 69 67 14 28 82 131  33 58 7353 42  253 1394 86 954 85 28   7  6736 5    811   2  56 19 28    9 75 9   17 6957 287 37 154 691 1757 72 384  2 49   186 2683 674 57 7  948 97 48 94 17 165 8162  89 67 68 8   316  4713 483   22 395 8497  41 5555  24  24  38    8 113 79 5  79 523  3   44 535   6 44 7      3 36    79 8   813  84 391 538 964 43 99 5328 3  1    18  9 53   55 718 568 723 38 29 6  737 836 574  92 89    6 32 81   3 342 862 1184 4   246 61  2 798 5    951 16  3 7   144  67 59   9 68 1364 54   341
+297 25 21 8883 76  75 967 47 791 41 84 151 77 467 656  89 665 939 1  753 16 11 3266   7 2466 34 52 56 13  226 982 14 9  375 52 838 925 643 37  5 34 335 235 9852 39 2121 899 44 789 16 622 53 29 647 44  59 56 467 23  87 43 197 147 91  493 779 367 349 83 7582 62 36 5772 87   71 66 1839 99  71 882 517 5   16 3356 84 93 645 672 428 29 55 61 21 83     9 94 896 82 43  628 27  54 3    22 2751 775 899 429 914 2797 844 35 73 528 421 137  11 28  67 75   51  159 52  36 173 95 662 824 4331   55 971 76  78 196 179 484 181 627 799 541 19 32 11 17 591   1 456 38 931 71 58  15  17 862  52 236 3864 29 98  31 548 2131 48  62 95 91 79  952  46 79 557 512   8 668  82 3573 593 86 54 375 27 97 5184 9891 59 36  48 923 488 768 848 829  984  6 61 56 833 47  9   8 25  72   67 15 837 358 287 82 8467 385 67  444 767 342 861  91  171 86  5732 768 6214 546 649  69 6764 52  5 76 235 124 581 93 61 9765 489 72   351 9942 796 44  61 612 21 188 59 85 6336 75  42  3  74 99 515 2944  684 863 7427 63 279 46 574 26  74  9 21 8415 483 23 35 521  754 253 63 331 28 73  74 98 941 377 657  4874 875 78 74 9  79 39 54 578 69 743  22 96 645 538 797 4789 58 787 915  397 61 493 918 33 47 367 3798 11 3    42  5 8129  19 7  5  117 75 39 178  961  456 79 64  191 345  93   3292 93 92 8229 183 6932  1 53 153 17 1   3674 46  38 179 557 53  442 192 36 3983 8231   6 214  79   658 49 887 24 243 481 37  41 189 72  8 78 512 8795  85  8 25 455 445  31 199 96   91  641   66 3991 95 477   8 75  5 618 14 292 5  32 2  42 764 18 435 79 383 9842 677 522  8 84 2632 24 29 43 5145 812 71 94 72 75 92 18  47 84 6455 456 66  58 131 242 57 39  69 66  6113 47 79 19 359 335 122   1 86  27 68  1 958 15 51 75   6  899 8459 126  943 636 86 59 617 48 7398 357 23 295 93 68 5212  43 169  47 26 78 421  22  126 46 68 415 5264 29 285 17 7242 91  85 36 98   9  596 96 57 22 69   2169 64 3454  85 729 997 12 27 35 27 84 66  63 88 9846 32 936 14  6856 54  75 1  769 42 815 65  72 78 52  4 5  42 5319 3658 296 18  69 34 353  27 77 29 3391 26 68 27 16 76 66 49  787 2  8736  45 434 123 17  59 478  18 86  433 64 65 98 39   87  927 273  565 95 46 55   57  66 7  292 44   31 9896 77 638 11 458  3 622 96 487 21 662 22 5323 244 465 793  572  485 465 26  156  317 313  98  39 46 3  995 79 718 65 69 799 411  8 13 647 88 6138 125  88  2 217 14 16 65 2866 816 55  48 988 55 463  35  997 9   9226 54  54  35 946 821 94 96 67   31 24 336 517 49 258 558  723  746 72 7788  81 958 8251 3647 511 733 4915 89 335 85 83 673  586 127 865 45 822 91 876 464  92 8993 581 32 71 134 184 51  11 82  65    592 8  589 111  56 933 1472 25 44 57  16 76 739 234 77 5441 45 746  62 65 355 4411 71 488 16  98 22  67 88  156 398 61 1869 238  2  6237  3 82 81 264 92   929 4482 17 289 12 2615 35  54 75 266 4  296 53  49 72 6151 85  157 6511 937 74 65  3 72   3 53 636 63  55 89 16 442 22 444  2  95 47  89 65 154 353  191 32 64 2  17 13 349 74 529 9422 327 153 9  65  9636 88  83  93 269 135  977 244  432 26 48  7 9749 81  822 5836 838 8481 956 66 25  117 26 412 52 139  846 96 5778 39 13 1464 664 73 23   939 36 16   98  4 45 8749 968 5756  82 9    5 9564 5469 835  2 5542 81 39 676 553 68 44  7  8 27 972  244  7489 27 59 9272 6  414 27 81 3518 18 19 11  418 785 81  422 21  522 657 741 11 55 9393 1  66 276 3115 132 1257 773 8532 76 1   3  5 6   71 9794 4  59 82 51 12 86 97 61  734 75 2354 72  632 9766 16 295 21 36   1  878  585  857  52 431 67 97   55 94 299 18 44   958 62 279 959 2677 61 925  6 6414 129 9273 543 69 1  452 24 67 67 49 651 6743  76 62 83 29  7569 7113 752  627 869 6981 116 6839  18  21  23 6549 249  4 9  44 719  55  47 841  12 95 16    27 87   212 351 1172 51 738 79  965 41 53 4186 17 952  37  4 9715 56 641 835 515 2  28 38 345 426 662 171 134  83 33 76   7 735 186 6242 756 97  18 38 943 12   833 81  6 6   918  11 71  45 21 2957 838  267
+986 76 3    27 17  63 242 67 932 63 81 299 41 736 2139 74 8   621 18 946 35 55 128  993 9783 61 72 82 38  538 976 41 49   2 65 524 159 694 74 85 88  16  96 3881 42 6653 778 46 453 6  963 74 27 692 59 753 34 564 36  61 61 534 721 32  695 451 913  13 43 8585 67 83 8726 7658 85 86 63   63  77 576 618 695 84 4316 5  73  15 842 538 98 91 37 92 667 8537 95 479 57 165 887 21 896 46   87 4782 213 87  927 628 3455  17 16 51 617 644 845  94 53  64 2586 46 2299 27 438 456  2 51  595  589  988 225 196 22 34  14  897 276 628 17  486 69 27 88 74 175  19 533 75 372 71 288 779 27 2783 78 261 895  27 94  15 123 1238 636 94 11 38 137 544  96 77 2   2151 64 438 455 1658 296 18  6 123 36  2 4264 9769 26 614 64 825 242 749 278 44   825  3 17 26 25  79  1   7 35  166 863 51 678 78  849 37 513   81 82   63 656 393 7147 179 543 268  341 743 846   17 21   59 1448 95 66 86 546 974 338 3  19 8945 638 531 9992 9116 886 23  54 935 48 739 33 67 917  8  694 71 549 6  343 7258  143 646 327   7 499 78 5   97  49 49 75 9421 477 37 49 6126 881 979 35 274 52 49  82 37 786 181 711   451 418 71 48 69 53 72 85 223 51 361  94 33 474 628 396 691  24 164 722  136 59 961 182 77 17 419 9727 9  89   99 39 6624 424 7  9  918 57 88 8553 898  138 35 84  65  3281 533   915 34 53 2827 543  662  9 46 691  3 55   669 23   4 911 169 247 146 153 29 9885 7764 835 8984 693  333 58 126 59 317 14  972 26 999 44 87 82  91  483  37 79 22 942 6444  5 288 7  9634 7431 9664 4675 47 7894  8 89  8 896 67  27 76 73 84 92 157 37 649 82 116  975 524 12  98 53  375 97 74 17 3233 232 67 37 56 59 14 84 385  1 2794 936 69  64 519 314 76 84 314 85   591 59 42 83 523 189 857 923 53  78 5  76 836 53 57 84 388  161  852 12    76 954 78 26 465 33 8798  62 69 943 72 39 6189  19 958  37 1  3   75 432  295 26 8  622 7395 44 338 73 1658 669 16 19 61   5   26 52 74 9  977   953 81 1792 319 316 968 24 99 85 14  1 38  48 52 3482 85 361 576 545  15  84 9  489 66   7 931 44 63 37 72 3  41 578  3296 939 9   43 71 97   62 42 42   46 82 63 87 85  3 22 66  253 51 9293   9 198 743 27   5 64   52 744  26 25 33 65 484  13  997 675 1748 84  2 24  675 239 2  397 23 5224 1619 19 114  7 418 83 937 35 867 74  42 65 4968  53 888 6    351  637 699 14   84   58 441 888  54  9 77 887 61 242 81 58 982 246  3  8 835 82 1837  59  64  9 927 26 88 3  5121 283 23  93 224 91 668  28  633 31  6441 6  998 899 986 19  74 98 352  81 96  39 875 36 18  844  1    361 65 2935  41 465 5553 3899 443 117 7949 13 611 59 96 132 8538   4 746  3 451 45 835  44  96 7116 368 32 78 835 153  5 472 37  6279 5841 2  948 984 325 168 294  49  8 58 812 31 246 481 61 6736 63 6831 31 31 633 2879  1 433 15 578 96  48 67  332 12  22 7116 411  4  2271 36 32 67 549 6819 512 1255 29 563 74 2612 61 281  7 466 77 361 127 11 29 2813 47  341 9948 319 4  45 19 24   2 85  72 33 253 64 24 578 84 7   81  86 59 798 12 47  576   86 24  3 19 63 37 649 38 479 1618  18 821 76 91  7663 79  97  26 893 157  747 174 5962 98 45 56 684  448 988 6973 865 4225 648 38 65  948  3 71  91 5527 646  4 5677 41  4 496  286 42 686   24 94 81  439 41 14 3872 525 3438 155 989 34 57   1739 679  6 9247 11 56 939 714 48 41  7 89 55 5882 1585 2199  8 4  698  65 455 39 33 5796 38 58 988 833 721 652 882 14   75 685  37 39 79 5494 7  13 615 3729 822 711  273  231 59 46  7  7 85  24 5249 1  14 83 82 56 12 11 5   574 84 491  954 73  8164  5 843 56 418  19 937  486 9672 862 551 39 11 2357 22 664 54 84   945 66 818 267 3832 49 315 29 3168 118 7245  16 77 44 181 55 68 2  55 548 7371 149 84 61 873 7262 56   383  253 838  634 356   49 193  57  43 5972 516  4 39 38 9779 758  3  24  28 13 48   437 592  119 785 7554 61 562 4   336 98 41 3547 52 896  92 63 4789 16 882 514 487 2  14 74 428 148 98  593 8382 68 85 86 518 417 881 429  921 49  7  18 279 733 7961 81 93 281 697 686 27  89 48  594 481  144
+347 94 7    18 1   28  39 62  22 93 89 77  48 888 1422 76 9   882 11   2 11 41 64   774 1677 87 53 52 823 23  14  78 35   2 85 483 533 53  63 52 37  57   4 3271 34 91   263 41 265 2  537  1 14 4   64 943 41 372 97 286 25   2 979 66   74   3 886  23 39  475 5  39 9816 6128 6   2 42   77   9  55 883 248 1  244  9  85  98 879  24 83 29 85 63 418 2865 5  19  74 762 938 69 817 749 988 85    48 8   143 735 7123   7 22 9  826 61  8211 19 545  8 1749  6 8865 71 764 628  9 4   556   24 1543 957 774 22 82  65  274 431 668 13  88  92 43 98 98 36   52 2   83 43  28 615 135  6 1983  2 944 219  11 7    7 273 3823 938 81  8 99 761 87   79 68 5   7893 61 864 742 7483 45  53  9 282 57  1 4711 1735 23 975 1  818 66  711 715 24  8829 61 78 42 7    8  5   2 349 291 281 66 783 45  421 21 18     7 19   98  39 297 4971 636 88  955   57  94 76     5 1   259 8935 97 86 19 4   457 25  3  13 2893 64  717 1849 8412 79  32  26 99  17   5 14 13 72   4  599 16 738 7  38     5 7633 786 32    1 24  99 2   581 92 47 18 3645 683 56  9 3445 843  65 46 61  33 9    1 2  52  728 8859   14 794 31 72 97 36 53 12 146 76 29   57 79 293 855 711 626  52   8   6   86 42  86  93 6  68   8 5532 5  63 3452 59 952  124 13 68 2   89 8  3298 62     7  2 84  48  5433 3619  217 43 17 5641  25   53 42 16 25   9 592   82 494  6 733 428 173 484 739 28  849 6647 786 1672 2188 246 47 117 75 19  6   269 26 26  28 58 41   1  849 811 14 64 683 8545  8 732 1  9988 2858 7565 7877 91 4236  3 86  9 626 11  12 45 42 22 2  75   5  32 81 891   75 993 57  31 26  586 29 7  23 7126 753 45 52 4  76 19  7 221  7 8284 213 1  975  15  76 93 33 371 49   172 35 71 14 593 12  399 157 21 265 9  77 599 27  6  2 133 3511    1 2      3 443 64 47 794 33 7438  55 24 824 71 59 1411   9 27   88 1  2    7 713  211 75 9  433 9914 98   8 41 9843 698  8 6  5463 9   33 57 22 1  6243  357 63 5    957 831  95 96 33 14 49  5 2   81 18 9777 87 977 441 78   16 788 74 537 46   1 339 71 99 8  95 5  31 153  9437 78  5    4  8 12   54 83 38   29 3  97 88 14  2 9  31 1327 89 22     9 491 151 65   3 33   16 671  31 33 99 1  9238 929 527   3 6192 49  9 98  766 432 53 795 11 1837 8613 67  28  2 587 53 316 16 362 1   65  4   91   4 527 3    6789 174 665 26    7    2 335 613  96  9 12 815 2  924 9  96 758 9   55  5  84 31 8149  26  85  5 457  3 4  5   154  68 332 99  37 87 49   77 4679 698   84 9  739 272 88  41   9 65 945 911 28   9 623 89 67  769  2    293 43 79   266 472 7    4848 19  233 2938 21 356  9  4 177 7981   5 599  9 723 84 779   8 392  595 391  4 7  496 669  5 235 832 2719 2719 4  1   458 685 763 3    99  3 94 993 66 6   883 87  454  1 4699 47 36 49  1236  4 14  76 839 19  61 63  664 1   68 4993 7815 45 9871 94 94  3 234 8146 491 9497  4 383 96 12   59 663  2 814 12 728 927 34 54 921  57 2999   54 844 8  95 97 18  72 14   8 98 422  5 81 941 85 8   36 126 15 477 89 81  388    1 78  7 96 34 83 544 15 275 3322   6 147 63 127 27   33   7 463  65 8581 739 926 3252 77 87 76 85   293 985 1393 678   25   3 33 29  159  1 6   57 1767 439  9 69   29  3 797  139  2 585   26 55 47 9688 55 16 8921 747 37   189 897 81 12   1999 747 34 2528 53 72  67 617 96 5  15 18 13 1819 1145 4436  4 7  529  45 5   53 36 9457 82  5 358 581 775 579 31   7    3 285  56 43 55 9569 4   9 297 5855 937 19   971  213 48 72 55 81 795 48 2345 84 26  6 89 88  2 98 9   386 33 85   549 5   5888  9 985 88 9526 28 866  421 7267 624 793 86 82 5895 61 288  9 67   736 9  423  14  329  6 948 45 4388 14  4      6 94 81 7    1 65 9  39 49  735  156 96 72 137 4553 3    97  1974 717    1 473   59 361 694 483 5255 875  5 31 39 4412 261  2  97 782 36 691 6737 9439 553 171 4129 47 44  6    52 37 16  662 41 9989 22 33 2191 3   85  44 66  6  16 26 834 65  4   199 7849 77 97 71 953 98  567 44   577 6   1  61 84  176 7172 38 19 692 937 154 119 91 6   632 7673   2
+*   *  *  +    +  *   *   *  +   +  +  +   *  *   +    *  *   *   *  *   +  *  +    +   +    *  *  *  *   *   *   *  *  +   *  +   +   +   *  *  +  +   +   +    +  +    +   +  +   +  *   *  *  +   *  +   +  +   *  *   *  +   +   +   +   +   *   *   +  +    +  +  +    +    +  +  +    *  +   *   +   +   +  +    +  *  *   +   +   *  *  *  *  +   +    *  +   +  *   *   *  *   *   +   +    *   +   *   *   +    *   *  *  *   +   +    *  +   *  +    +  +    *  +   *   +  +   *   +    +    +   *   *  +   *   *   +   *   +   *   +  +  +  *  +    +  *   *  *   +  +   +   +  +    +  *   +    +  +   +  *   +    *   *  *  *  +   +    *  *  +   +    +  *   *   +    *   *  *  *   *  +  +    +    *  *   *  *   *   *   *   *   +    +  *  *  +   +  +  +   *   +   *   *  +   +   *   +  +    *   *  +    *   *   +    *   *   +   +    *   +    +   +   +   +    *  *  *  +   *   +   *  *  +    *   +   +    +    +   *  *   *   *  +   +  +  +    +  *   *  +   *  +   +    +    +   +    +  +   *  +   *   *  *  *  +    +   *  *  +    *   +   +  *   *  *   *  *  *   +   +    +    +   +  +  +  +  *  +  *   *  *   +   *  +   *   +   +    *  *   +   +    *  *   *   *  *  +   +    +  *  +    *  +    *   *  *  +   *  +  +    +    *   +  +   *   +    +    +    *  *  +    *   +    +  *  *   *  *   +    *   *  *   +   *   *   *   +  +    +    *   +    +    +   +  +   *  +   *   *   *  +   *  +  +  +   +    *   *  +  +   +    *  +   +  +    +    +    +    +  +    +  *  *  +   *  +   *  *  *  *  +   *  +   *  *   +    +   *   +  +  +    *  *  *  +    *   *  *  *  +  *  *  +   *  +    *   +  *   +   *   *  *  *   *   +    +  +  +  +   *   *   +   *  +   *  *  *   +  *  *  *   +    +    +    +   *   +  *  +   *  +    +   +  +   *  *  +    +   +    *  *  *  *   *   +    *  +  *   +    +  *   *  +    +   *  +  +    *  *   *  +  *  +    +    *  +    *   +   +   *  *  *  +  +  *   +  *  +    +  +   +   +    *  +   +  +   +  *   +   +  +  *  +  *  +  +    +    *   *   +  +  +    *  *  +  +    *  *  *  +  *  *  *  +    +  +    *   *   *   +  +   +   *   *   +   +  *  +  +    *   *   +   +    *  *  +   *   +   +  +   +  +    +    *  *   *  +   *  *   *  +   +  *   *  +    +   +   +    +    *   +   *  +    +    *   +   *   +  *  +   +  +   *  *  +   *   *  +  *   *  +    +   *   *  +   *  *  *  +    +   *   *  +   *  +    +  +    *   +    +  *   +   *   +   *  *  *   *   +  *   +   +  *   +    +    *   +  +    *   *   +    +    *   *   +    *  *   +  +  +   +    *   *   *  +   *  +   +   +   +    *   +  +  *   *   *  +   *   +    +    +  *   *   *   +   +    *  +  +  *   *  *   +   *  +    *  +    +  *  +   +    *  +   +  *   *  *   +   *   *   *  +    +    *  +    +  +  *  *   +    +   +    *  *   +  +    +  *   *  +   +  +   *   *  +  +    +  +    +    *   *  *  *  +   *  *  +   *  +   *  *  *   +  *   +  *   +  +   +  +   *   +    +  *  *  +  +  *   +  *   +    +   *   *  +   +    *  *   +   *   +    *   *   +    +  *  +  +    *   *   +    +   +    *   *  +   *   +  *   *  +    *   *  +    *  +  +    *   +  *   +    *  +  +    *  *  +    +   +    +   *   *  +    +    +   +  +    +  *  +   +   +  *  +  *  +  +    +    +    +  +  +    *  *   *  *  +    *  *  +   +   *   +   *   *  +    +   +   *  +  +    *  +  *   +    *   +    +   +    +  +  *  +  *   *  +    *  +  +  +  *  +  *  *   *   +  +    +   +   +    *  *   *  +    *  +    *   +    *   *   +  *  +    *  +   +  +    *   *  *   *   +    *  +   *  +    *   +    +   +  +  *   *  +  +  *  *   +    *   *  +  *   +    +    +   +    +   +    *   +    +   +   +   +    +   +  +  *  +    +   +  *   *   *  *   +    +    +   *   +    +  +   +   *   *  *  +    *  +    +  *  +    *  *   *   +   *  +  *  *   +   *   *   +    *  +  *  +   *   *   +    *   *   *  +  +   +   +    +  *  *   *   +   *   *  *  +    +    +  
diff --git a/src/language.c b/src/language.c
index b6fc35d..2ca4320 100644
--- a/src/language.c
+++ b/src/language.c
@@ -6,6 +6,7 @@
 #include "language_aoc20253.c"
 #include "language_aoc20254.c"
 #include "language_aoc20255.c"
+#include "language_aoc20256.c"
 #include "language_generic.c"
 
 typedef enum languages {
@@ -16,6 +17,7 @@ typedef enum languages {
     Language_AOC20253,
     Language_AOC20254,
     Language_AOC20255,
+    Language_AOC20256,
     Language_Generic
 } Language;
 
@@ -27,6 +29,7 @@ Language language_from_string(String name) {
     if (string_eqc(name, "aoc20253")) { return Language_AOC20253; }
     if (string_eqc(name, "aoc20254")) { return Language_AOC20254; }
     if (string_eqc(name, "aoc20255")) { return Language_AOC20255; }
+    if (string_eqc(name, "aoc20256")) { return Language_AOC20256; }
     return Language_Generic;
 }
 
@@ -38,5 +41,6 @@ static MetaParseFunction LANGUAGE_HIGHLIGHERS[] = {
     language_aoc20253_rule_main,
     language_aoc20254_rule_main,
     language_aoc20255_rule_main,
+    language_aoc20256_rule_main,
     language_generic_rule_main,
 };

2025-12-06 23:52 Rickard pushed to rlworkbench

commit b391a58df74321ea6cb5fdc7fabbd44015be145b
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 23:18:01 2025 +0100

    Part 2 complete

diff --git a/src/examples/aoc20255/aoc20255.meta b/src/examples/aoc20255/aoc20255.meta
index fb4011f..685d3b3 100644
--- a/src/examples/aoc20255/aoc20255.meta
+++ b/src/examples/aoc20255/aoc20255.meta
@@ -32,28 +32,30 @@ main = range*:ranges '\n' id*:freshIds !. -> {
         < "}\n"
         "return count;\n"
     < "}\n"
-    "Id overlap(Range a, Range b) {\n" >
-        "if (a.start > b.start) {\n" >
-            "return overlap(b, a);\n"
-        < "}\n"
-        "if (a.end < b.start) {\n" >
-            "return 0;\n"
-        < "}\n"
-        "if (b.start > a.end) {\n" >
+    "Id count_total(Range range, int my_index) {\n" >
+        "if (range.end < range.start) {\n" >
             "return 0;\n"
         < "}\n"
-        "return a.end - b.start + 1;\n"
-    < "}\n"
-    "Id count_total(Range range, int my_index) {\n" >
-        "Id total = range.end - range.start + 1;\n"
-        "int index;\n"
-        "for (index=0; index<my_index; index++) {\n" >
-            "total -= overlap(range, ranges[index]);\n"
+        "if (my_index > 0) {\n" >
+            "Range previous = ranges[my_index-1];\n"
+            "if (range.end < previous.start) {\n" >
+                "return count_total(range, my_index-1);\n"
+            < "} else if (range.start > previous.end) {\n" >
+                "return count_total(range, my_index-1);\n"
+            < "} else {\n" >
+                "Range left, right;\n"
+                "left.start = range.start;\n"
+                "left.end = previous.start-1;\n"
+                "right.start = previous.end+1;\n"
+                "right.end = range.end;\n"
+                "return count_total(left, my_index-1) + count_total(right, my_index-1);\n"
+            < "}\n"
+        < "} else {\n" >
+            "return range.end - range.start + 1;\n"
         < "}\n"
-        "return total;\n"
     < "}\n"
     "Id count_db_total_fresh() {\n" >
-        "Id total;\n"
+        "Id total = 0;\n"
         "int index;\n"
         "for (index=0; index<" ranges.count "; index++) {\n" >
             "total += count_total(ranges[index], index);\n"

2025-12-06 22:40 Rickard pushed to rlworkbench

commit d050381af59adc1620b2a1b76286e0a2d65ff110
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 22:40:03 2025 +0100

    Part 2 in progress

diff --git a/src/examples/aoc20255/aoc20255.meta b/src/examples/aoc20255/aoc20255.meta
index c7e6fbc..fb4011f 100644
--- a/src/examples/aoc20255/aoc20255.meta
+++ b/src/examples/aoc20255/aoc20255.meta
@@ -32,9 +32,37 @@ main = range*:ranges '\n' id*:freshIds !. -> {
         < "}\n"
         "return count;\n"
     < "}\n"
+    "Id overlap(Range a, Range b) {\n" >
+        "if (a.start > b.start) {\n" >
+            "return overlap(b, a);\n"
+        < "}\n"
+        "if (a.end < b.start) {\n" >
+            "return 0;\n"
+        < "}\n"
+        "if (b.start > a.end) {\n" >
+            "return 0;\n"
+        < "}\n"
+        "return a.end - b.start + 1;\n"
+    < "}\n"
+    "Id count_total(Range range, int my_index) {\n" >
+        "Id total = range.end - range.start + 1;\n"
+        "int index;\n"
+        "for (index=0; index<my_index; index++) {\n" >
+            "total -= overlap(range, ranges[index]);\n"
+        < "}\n"
+        "return total;\n"
+    < "}\n"
+    "Id count_db_total_fresh() {\n" >
+        "Id total;\n"
+        "int index;\n"
+        "for (index=0; index<" ranges.count "; index++) {\n" >
+            "total += count_total(ranges[index], index);\n"
+        < "}\n"
+        "return total;\n"
+    < "}\n"
     "int main(void) {\n" >
         "printf(\"Part 1: %d\\n\", count_fresh());\n"
-        "printf(\"Part 2: %d\\n\", 0);\n"
+        "printf(\"Part 2: %ld\\n\", count_db_total_fresh());\n"
         "return 0;\n"
     < "}\n"
 };

commit 00df5bd8400c65bfa0f6486e9557fdb0f9c81a83
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 22:27:59 2025 +0100

    Clean up

diff --git a/src/examples/aoc20255/aoc20255.meta b/src/examples/aoc20255/aoc20255.meta
index 720b68d..c7e6fbc 100644
--- a/src/examples/aoc20255/aoc20255.meta
+++ b/src/examples/aoc20255/aoc20255.meta
@@ -1,6 +1,6 @@
 #id = aoc20255
 
-main = range*:xs '\n' id*:ys !. -> {
+main = range*:ranges '\n' id*:freshIds !. -> {
     "#include <stdio.h>\n"
     "typedef unsigned long Id;\n"
     "typedef struct {\n" >
@@ -8,14 +8,14 @@ main = range*:xs '\n' id*:ys !. -> {
         "Id end;\n"
     < "} Range;\n"
     "Range ranges[] = {\n" >
-        xs
+        ranges
     < "};\n"
-    "Id ids[] = {\n" >
-        ys
+    "Id fresh_ids[] = {\n" >
+        freshIds
     < "};\n"
     "int is_fresh(Id id) {\n" >
         "int index;\n"
-        "for (index=0; index<" xs.count "; index++) {\n" >
+        "for (index=0; index<" ranges.count "; index++) {\n" >
             "if (id >= ranges[index].start && id <= ranges[index].end) {\n" >
                 "return 1;\n"
             < "}\n"
@@ -25,8 +25,8 @@ main = range*:xs '\n' id*:ys !. -> {
     "int count_fresh() {\n" >
         "int count;\n"
         "int index;\n"
-        "for (index=0; index<" ys.count "; index++) {\n" >
-            "if (is_fresh(ids[index])) {\n" >
+        "for (index=0; index<" freshIds.count "; index++) {\n" >
+            "if (is_fresh(fresh_ids[index])) {\n" >
                 "count++;\n"
             < "}\n"
         < "}\n"
@@ -39,15 +39,11 @@ main = range*:xs '\n' id*:ys !. -> {
     < "}\n"
 };
 
-range = start:x '-' end:y '\n' -> {
-    "{" x ", " y "},\n"
-};
-
+range = start:x '-' end:y '\n' -> { "{" x ", " y "},\n" };
 start[Reserved] = number;
 end[RuleName] = number;
 
 id[Escape] = number:x '\n' -> { x ",\n" };
 
 number = digit digit*;
-
 digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';

commit e2afa9067ad2c115798c5030562100e594279f81
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 22:07:58 2025 +0100

    Day 5 part 1

diff --git a/make.sh b/make.sh
index f9c5f27..7839e1d 100755
--- a/make.sh
+++ b/make.sh
@@ -15,6 +15,7 @@ main() {
     example_aoc20252
     example_aoc20253
     example_aoc20254
+    example_aoc20255
 }
 
 dotall() {
@@ -98,6 +99,16 @@ example_aoc20254() {
     out/rl
 }
 
+example_aoc20255() {
+    example aoc20255
+    out/aoc20255 <src/examples/aoc20255/example.aoc20255 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20255 <src/examples/aoc20255/rl.aoc20255 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
@@ -133,6 +144,7 @@ languages() {
     meta_compile src/examples/aoc20252/aoc20252.meta out/language_aoc20252.c
     meta_compile src/examples/aoc20253/aoc20253.meta out/language_aoc20253.c
     meta_compile src/examples/aoc20254/aoc20254.meta out/language_aoc20254.c
+    meta_compile src/examples/aoc20255/aoc20255.meta out/language_aoc20255.c
 }
 
 banner() {
diff --git a/src/examples/aoc20255/aoc20255.meta b/src/examples/aoc20255/aoc20255.meta
new file mode 100644
index 0000000..720b68d
--- /dev/null
+++ b/src/examples/aoc20255/aoc20255.meta
@@ -0,0 +1,53 @@
+#id = aoc20255
+
+main = range*:xs '\n' id*:ys !. -> {
+    "#include <stdio.h>\n"
+    "typedef unsigned long Id;\n"
+    "typedef struct {\n" >
+        "Id start;\n"
+        "Id end;\n"
+    < "} Range;\n"
+    "Range ranges[] = {\n" >
+        xs
+    < "};\n"
+    "Id ids[] = {\n" >
+        ys
+    < "};\n"
+    "int is_fresh(Id id) {\n" >
+        "int index;\n"
+        "for (index=0; index<" xs.count "; index++) {\n" >
+            "if (id >= ranges[index].start && id <= ranges[index].end) {\n" >
+                "return 1;\n"
+            < "}\n"
+        < "}\n"
+        "return 0;\n"
+    < "}\n"
+    "int count_fresh() {\n" >
+        "int count;\n"
+        "int index;\n"
+        "for (index=0; index<" ys.count "; index++) {\n" >
+            "if (is_fresh(ids[index])) {\n" >
+                "count++;\n"
+            < "}\n"
+        < "}\n"
+        "return count;\n"
+    < "}\n"
+    "int main(void) {\n" >
+        "printf(\"Part 1: %d\\n\", count_fresh());\n"
+        "printf(\"Part 2: %d\\n\", 0);\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+range = start:x '-' end:y '\n' -> {
+    "{" x ", " y "},\n"
+};
+
+start[Reserved] = number;
+end[RuleName] = number;
+
+id[Escape] = number:x '\n' -> { x ",\n" };
+
+number = digit digit*;
+
+digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
diff --git a/src/examples/aoc20255/example.aoc20255 b/src/examples/aoc20255/example.aoc20255
new file mode 100644
index 0000000..2e9078d
--- /dev/null
+++ b/src/examples/aoc20255/example.aoc20255
@@ -0,0 +1,11 @@
+3-5
+10-14
+16-20
+12-18
+
+1
+5
+8
+11
+17
+32
diff --git a/src/examples/aoc20255/rl.aoc20255 b/src/examples/aoc20255/rl.aoc20255
new file mode 100644
index 0000000..0ba9926
--- /dev/null
+++ b/src/examples/aoc20255/rl.aoc20255
@@ -0,0 +1,1179 @@
+514636401848126-515021264549070
+284036251378482-284592982874520
+296164416018017-299046449889301
+283426891017632-284036251378482
+343608343658787-349486968016855
+518754439264536-519443780540781
+203443194067628-203933432910977
+519443780540781-519633512362687
+210005855985412-210549428703488
+282811585081172-283522815708147
+282103439366027-282811585081172
+146191319211378-148928182943279
+542009870509829-542009870509829
+285110984007607-285557627386426
+181836090026423-187133491027023
+191383217925987-193740672523902
+529067077613194-530556181878483
+304959261875505-310322684117777
+5221298087814-5845643808551
+121449485422025-121449485422025
+288819540858543-289732112842441
+31314012134697-34077678147946
+355346276508449-356961978424786
+210005855985412-210154987714222
+31314012134697-38289146357504
+57372486536812-58906664319153
+63107431158211-64549017086535
+4590169517791-5221298087814
+50650192430993-52130829319473
+530953193123290-532382284125787
+265252883201638-269190040850024
+496653674559961-496653674559961
+525886102629992-527695520308656
+234586469402843-238198950451156
+519633512362687-520345553919679
+384980372022383-389006578880062
+317844855413056-320364244125646
+503139165919699-507064243567239
+463493316343339-469362738286899
+43073032066090-49251433333982
+6600924130212-7444318394218
+111838895260979-117094893375877
+7648228942274-7897731755256
+84776658354341-90046495985385
+11562463563199-18329087766001
+313521138229416-320364244125646
+193977202606502-196647888828768
+530153466102565-531523921526216
+553391357437896-562488274516946
+459525942526207-459525942526207
+53393578131918-54955075378575
+404190643739100-408213916357702
+520945760876904-521172857358597
+2727821450473-3340299640579
+286048130453075-286665795820799
+528177694307708-529471263275682
+301956083638360-307163599509656
+507064243567240-511953396823239
+260061486329253-260061486329253
+101450700607317-106472683347649
+544317206779689-552355052009161
+283196635166397-283522815708147
+288819540858543-289732112842441
+131234255850576-137062902674911
+352070211023717-353583840322516
+520186230488106-520945760876904
+415995383355085-415995383355085
+395615962419343-397864940668161
+94366474861793-99527846051448
+205173320654056-206051449292310
+58711690964932-59879231977934
+519633512362687-520345553919679
+516022119170784-516365566181711
+238198950451157-238198950451157
+206639071565785-207304603090383
+518602829412794-519443780540781
+82147453568207-84776658354339
+23956737879583-28622963935851
+484025043897742-489248708112258
+544317206779688-544317206779688
+340128853274594-340128853274594
+444827419361595-451800098044043
+294297486844512-296164416018016
+176240640987270-178847650802940
+192995036697202-195029211979726
+404190643739100-408213916357702
+423420802261041-430543339190155
+438096745586433-440661544775439
+516668731856740-516826848891136
+289079205608282-289927106556831
+515546891366899-516365566181711
+56576870014158-58238248382778
+523020705694172-524681162845767
+432699609410984-440661544775439
+73622261592470-78368864856562
+203615147167346-203933432910977
+252433626704883-260061486329253
+415995383355086-418601199927456
+225742115230077-227522359650710
+536745635162015-542009870509829
+208725672081644-208995628405837
+328742269957098-328742269957098
+163318839464148-163318839464148
+242450869652517-250877827576819
+496653674559961-498166797604837
+353406104646330-355006194373241
+207866368794809-208446995196529
+1708595883983-1909532685738
+360121938111677-361422333382878
+173867301639925-176240640987268
+181836090026423-188217989877988
+206944308839538-207304603090383
+101450700607316-101450700607316
+222235372532517-229028822916590
+142908285233132-146191319211377
+354320242004358-355829534227523
+46225481831810-49251433333982
+358708341359993-360462576296801
+1909532685738-2356756942759
+459010164236-822787238930
+52595367244327-53842968937424
+526841632481036-528402608506153
+284592982874520-284889275037951
+198480173290999-200502677914655
+206051449292310-206639071565785
+553391357437896-559252440639087
+213282678483051-217578951006125
+336185428498850-340128853274593
+121449485422025-129884332810178
+356409937299519-358284721371764
+362754678790488-368199822970279
+51349595474361-52880663948995
+163318839464149-167177497489124
+375764731455726-379099669341280
+372528206409103-375764731455724
+283522815708147-283904486146961
+444827419361595-451800098044043
+3811607178621-4081675716328
+154354622006539-157453469587934
+517803425605817-518054191542013
+426576897630361-429161675325908
+284889275037951-285337573624635
+111838895260979-117094893375877
+272614047343400-277766344260508
+392633898190960-400562908625803
+137062902674912-137062902674912
+247628951587102-250877827576819
+466773209641268-471334211762712
+285557627386426-286298272038457
+282557763450697-283426891017632
+2813781325022-3627969709652
+524077645740986-525409953554452
+197098088554829-199433303049802
+54481491520234-55965788224234
+456199144939177-459525942526206
+474922814171466-476551147548164
+14558671052767-16713866144325
+92219205556280-97580264143478
+283426891017632-284036251378482
+55460508141658-56966989766365
+282557763450697-283426891017632
+287379516759852-287963386979452
+64549017086536-69089566650446
+206051449292310-206470060622464
+384980372022383-384980372022383
+525084947593291-526380411135762
+476551147548166-480592004834004
+78368864856562-78368864856562
+286048130453075-286298272038457
+325663773852006-328742269957098
+343608343658787-346343013406331
+154354622006539-154354622006539
+283196635166397-283904486146961
+215411212460336-220375303342442
+517803425605817-518352016878202
+265252883201638-269190040850024
+195877371240788-197931294682307
+357924716181756-359488291571889
+
+278402555432346
+132663185371131
+308642641112043
+33559341434412
+405303123438474
+485951992574145
+313064131630188
+260158596036936
+88167936209309
+172542568004197
+458979566798645
+326040316021558
+441814331976477
+15242696475530
+532409453906558
+264386719516534
+462500896724966
+31810962837711
+376074010339133
+296957769366533
+214356649810920
+391352103109617
+397015393429102
+209254749760423
+396869971040626
+492567648450273
+74223735388468
+235765509681740
+393369865380685
+354084263929807
+29151194853127
+331213306580185
+200775948660881
+184162024247630
+73539350853939
+119830435623787
+27248780736717
+273944736921943
+298748652980771
+299124411214164
+505045728033385
+465052402342861
+114174482868245
+59857080667886
+385740132696595
+80006398406086
+164797560065538
+449676350447067
+331107394599031
+329904479261567
+28661521864528
+241775855437174
+70075146805242
+100377917697325
+320925037686437
+240701225007949
+71167017443884
+409486741604745
+213210388272121
+193305527209317
+454232214381698
+373477528355225
+107915765152720
+484093453725123
+384598203260425
+87692352508770
+287601254688301
+245281846783672
+346938039089651
+268195944549448
+161737144675390
+263926978453657
+399878538434895
+480794774065006
+528604895528697
+140772160424647
+72063884537085
+324924109510539
+232186650292489
+287021682047962
+119395417223177
+63888428378797
+47703189063136
+128421895159085
+145092004217697
+545399776926267
+551091745204299
+324205236371585
+142734991670084
+138011721050796
+29106037358317
+285779273281918
+544729165988472
+278655342638262
+431782774238901
+274987201312127
+482150377119121
+532329225332989
+230886711948544
+277742281856869
+542469937573351
+110928323185174
+406956845060793
+392495345988528
+373156790449365
+28897120503935
+555056437619844
+288282240953804
+233071070092757
+535916810866149
+202318644863533
+274044733613351
+445204650220846
+562599592138838
+484891673726876
+397310529392326
+51152753289229
+221691413891037
+430268065726843
+292727401143432
+148174775882288
+541971954149702
+230205232252218
+394846657281655
+258961064557207
+168538135912262
+306892797457040
+41143047884962
+263909135855905
+555322955749641
+254690587424659
+414433873970870
+24119954815073
+105258178545862
+51575143573061
+129106627117303
+374522807056431
+447497507528143
+223506299719559
+467044350364998
+107409890260230
+503048129804246
+419888793709599
+223670494400224
+254116980329454
+140949814523698
+361281828985173
+52452532098109
+134884440069559
+454230992392750
+513793320462354
+143974081539492
+301367706287735
+112278821902328
+78129336797298
+70183930773340
+113803338297946
+473304604596770
+461769367861589
+357444038347590
+464409465642740
+169918162583622
+381412251915951
+78436010713279
+74247991214850
+294408435111807
+539136654561650
+374103328543636
+211026210839033
+457850304567788
+322287802901955
+393893358183306
+189132199406123
+482062087499501
+119105849679363
+506514462708219
+134680768346040
+174484013026133
+314742387120658
+234825446647221
+526814730910876
+405094103017447
+552239665074466
+487198509367609
+543612878502850
+245955810359582
+138188761104744
+124126125471817
+561823724773957
+129469363656788
+177468379111918
+241039809480056
+550066267667976
+219843124814009
+462720788415678
+274618609488050
+364147995137340
+278379015579457
+340585878842776
+350875903168946
+331070729467974
+100327817295410
+141147271521536
+351926657214835
+262919286473957
+386199840114074
+53393671829457
+379586140154652
+491620501293264
+249990257576572
+64519244313495
+184847470149212
+89126789338975
+544825673728682
+274803776293650
+153834366278901
+435022235924159
+173873826434726
+59042972581418
+148219795626852
+444346667071188
+475532278427376
+507142501942950
+100854211818626
+47917266954190
+288864792760325
+8989755789362
+128822889809511
+478526536303692
+31049864185284
+1587848580816
+147372848518905
+8157614781088
+10988325260280
+449440693245530
+202957505221201
+468146580196327
+341156307953798
+330457556390284
+119275777031453
+157293448767060
+517712624111396
+83382707578378
+211798817670718
+403812991504731
+52438345000658
+141602527034518
+209814406404292
+288892296326853
+278940982316157
+161337794616069
+193325468633700
+385876393717156
+308588158065137
+200934729386951
+307804488538044
+112310131645211
+407549193596788
+347309160609625
+277807738036876
+1124741478798
+181850807389162
+87340536548673
+108917779897587
+409088291844305
+7327968226076
+331409906632409
+55018818407287
+135959244326713
+255607337735622
+404990318863556
+252681084988887
+502726075212134
+376076478146492
+447466454412473
+257429453228785
+252531857544466
+223649896206420
+99921279410798
+289191726250755
+87940639643249
+291657704833929
+250707386270082
+305532517235714
+457845768362257
+499633834016084
+414660722808058
+115185592261478
+323695771212749
+53067690857484
+164312891564458
+184608065212843
+404061324161713
+546670579412106
+34185905019669
+517810909767627
+318928880485847
+57145094982366
+185136468761899
+123803278607569
+275181571671734
+505187529712629
+238513631615170
+150637997035758
+60696159914228
+509153087482532
+143960871978648
+532742283360955
+321896467398818
+78923110493982
+319410013097706
+374545822434791
+329978068684180
+546234683333382
+518615064982021
+265458933753218
+282556850446800
+556536919099390
+408821451178422
+550450331006822
+387020961781675
+392293780264327
+108001809829709
+541151472944936
+372695991295080
+179700539466037
+130945353612610
+29145725683464
+329997728133242
+446881378976432
+127076551811482
+17299891883245
+159462273043256
+393020453645122
+481706204119683
+382389483886370
+423730095802717
+303184318437817
+365797078969040
+209007197844304
+247220926807876
+264292571087588
+135295985727166
+473540877207725
+42383569639867
+284148851920777
+459839683672452
+29598628425336
+92458461620063
+31618483157264
+185648070289563
+98984221426980
+327261545504740
+339544125209591
+351523051242673
+503549480739263
+451133172113710
+198137406661747
+206433566752702
+323117582234084
+402246977646126
+333793124009912
+98992932009061
+501628586740342
+94911549846737
+325461668807707
+130688966388691
+415706162750143
+431795300584506
+551496845169982
+47236321942328
+245545983075020
+110817343051994
+249570412216764
+374802975869957
+325600137603466
+295130410119795
+365918011942534
+22696813705554
+56381928509742
+322479977663160
+328995696233853
+393181808509923
+486543754315217
+384770321822425
+434901434482810
+209992693025500
+35175387586406
+30890674797432
+329334211904446
+95416474896760
+369941677173765
+408776374541039
+463328601327576
+352193059714251
+515561825104149
+509085802605817
+289033271841082
+284129612437330
+128877515059923
+11710783019097
+134496055286541
+318240924531146
+257570046738609
+104319616549205
+89453172689676
+296422863501405
+272224036719966
+403967683900289
+208395071342657
+306101872949874
+120029032017318
+361623195531845
+248456545529726
+314657311386942
+561664993912685
+365060228244264
+20958161702758
+248843859686259
+200203858186422
+6136051960313
+10355251433495
+64511549654450
+55163120105713
+549156964833318
+321255232483566
+302170372255759
+533118918134213
+147734475468464
+531959177379478
+482924799913380
+369403215999109
+517854494165516
+30763624515305
+7116155983626
+82446528448816
+462227031945577
+179818584376189
+123434101955415
+216299405959612
+46271087218668
+463013904377275
+273259685222153
+491125748072723
+448512985842556
+196859191340249
+252832456458708
+442160277872053
+524958983300282
+390106990435196
+129663515108030
+5622352673985
+257173052193326
+239287224626983
+120562509703631
+274159882479959
+228371247154455
+80267049091762
+382314795358348
+529415203479662
+459858722387131
+264282200528651
+75151228174069
+82951634913109
+342763415768211
+28971157275146
+60472601493332
+276337537927196
+351969714938165
+562587650705150
+297284704851148
+499285017085531
+324125551256360
+392206072182703
+35713645611554
+183126895651293
+424679526469974
+271552485627674
+158719592578564
+471693342183649
+97426653934358
+40613102488781
+371993554902223
+114458195370676
+219355431601203
+250239066927683
+376186023004647
+60722752493741
+463087018526652
+34201411990755
+345550248000346
+211780373002897
+169234342894556
+192841149843724
+100042399395284
+111437480645508
+452954711661644
+245907180732031
+418641728926307
+147960464589869
+33233317907622
+473530477343507
+136008282418109
+105521325435126
+487250089102014
+513133744508381
+264552966427013
+176071042788430
+268961848299179
+119949783203076
+51903620717392
+364379781128387
+131580485824532
+344131994194304
+418295349123048
+136697151966550
+548004430449314
+344380637925610
+295135201549386
+155783901147440
+265375979957582
+110702726863666
+475146284606014
+528156187870536
+206423623361985
+320983281821409
+32308190883767
+445953790831068
+280339418761001
+431229011831650
+46684003610056
+38399734614755
+281215185501015
+273353978839061
+449133569775397
+94595686369921
+175731354902944
+21307525454258
+9489987407002
+172412146731026
+193850453491238
+19446253288803
+285378598978585
+135951933336291
+480773983458421
+552984670280393
+261970498485095
+144592737060723
+138116131924687
+460915272940883
+84482553628168
+174659735669386
+404736756586967
+231412765264382
+411604040108554
+172738598023485
+394223174139584
+163258717553805
+53736088706942
+266563475927420
+390310434289887
+83706278003247
+396738905795074
+278225826503322
+191082728745913
+266651846055938
+492508384095809
+316296449653752
+343106511714695
+210459733293601
+233031956892925
+76418270871678
+29769627349822
+556381730568057
+257012482652597
+248840481200902
+222958858307134
+84042322564436
+35720953789269
+260547639489491
+182683830490502
+36952171920209
+307732212279124
+163247408905762
+435855157710622
+318189444743170
+103870743821491
+312285224574605
+98654666776816
+489010975151168
+399507638671271
+365893303170644
+6908925999420
+393324878695594
+383316081935321
+148738496718000
+52774828932456
+296650357872477
+80337082594428
+269671017806274
+55920709856139
+495013170752544
+561155374851795
+338945539513000
+156445561127481
+409561529233480
+484226615652481
+192448259839345
+481903333391252
+264212783399038
+353174725814555
+96222086088154
+493177058134893
+142723498613148
+510045939338343
+213082967590207
+451414930130011
+287178562027706
+35874332629426
+423663996970455
+88932640030339
+898865885810
+366568691213396
+93353448826935
+108107203011512
+484400437194786
+548596042489566
+529313056823226
+463540798359816
+300970233625678
+533498899750362
+134719012789179
+97353115132835
+140521188335366
+445672791299124
+123320177593172
+216791781266638
+119134890365880
+221205354293267
+184784974544773
+179139368257981
+272193704994870
+170024298461309
+271291402037580
+197907060425420
+420240113592691
+414603513638433
+250476880188896
+420090525955459
+61717209916128
+48894483980599
+377367325324804
+172567330529867
+368761772868553
+243859097661139
+116238986487276
+481244946660263
+128604756311656
+247732487283249
+425716677005089
+286601334753733
+361697552270269
+332491437490283
+371464644131715
+359812466559957
+293124187798925
+370182692549338
+402836813601382
+164523843452144
+245507429744801
+26733519594785
+546495124583763
+54555721459701
+198117667481074
+348191326815994
+184329200281240
+539356383362926
+84656623890568
+258149845295513
+209516619356014
+410555079429028
+161984645206044
+357193302837692
+177148646246335
+79841196917799
+4868559382286
+402367850249728
+362642247369303
+478292748379088
+473744859329195
+82709011229711
+524705537585961
+511883694500252
+57879549575559
+73479392417576
+349000443868403
+486425967984117
+323320630688457
+532783358104403
+50005892324280
+10448553976733
+555289371666192
+179277875998235
+295489636648645
+281583361605010
+319406015645873
+209154331723171
+252336179080392
+220101468243703
+123423381556053
+249424456885568
+142214490657924
+394722317410561
+197456057951525
+548966841451350
+266746513524031
+139098093873876
+466273909877373
+312345615912482
+458924144953335
+445118920882541
+24234079914386
+362088150037853
+460399844392608
+111163631417516
+506849603803255
+532375417265875
+187870869665168
+278574590109391
+202009760679628
+266496090594638
+88270214836837
+561632831464762
+76021467178330
+187623147965793
+357276166666099
+166068895666405
+188702242445761
+482351061167209
+391289279201523
+520990493507818
+497475469916
+339228708691089
+495434152189714
+516949693658243
+131555860183160
+481541018788302
+295012343119003
+120501704104067
+165640591375618
+529132580016293
+277893188385960
+269777289670590
+159109932761167
+455564136979615
+188185367614591
+350833577764253
+557233591767987
+123761048587147
+151314215719767
+477449342398537
+62831624082314
+234848279993236
+430602997047715
+405246019124706
+464912511081924
+197393908639185
+291554048390173
+226121989951378
+212676557405587
+554655885820685
+299727225116809
+407472777371527
+420362905416978
+296266044226918
+58192476181379
+121583520951625
+180106397580363
+260200116504662
+498917279509807
+297365431128272
+313584997350275
+456939228573020
+294370795539257
+449502356758512
+312894062722575
+216863658149932
+549519029638937
+491172219037448
+385632358076595
+203419042895174
+180179598866078
+432578305088914
+210183865431187
+388350948160814
+496476163009942
+345666993119293
+445972232903888
+492968915961196
+321236953037237
+272000749564280
+533278028352087
+6448234606804
+255371133551395
+281168111236994
+329978895797265
+81518297099960
+516583473847205
+473238890315554
+312390116937975
+428025089774473
+302568806855463
+442737529200618
+53628674268291
+559025617844995
+335152898280854
+335195085857352
+128606928001719
+539405453793625
+5091586482817
+368211480784205
+72528232324196
+192747744975660
+495687218221476
+244535070342225
+204542989872716
+333607935179787
+460896301612722
+229112968047752
+391421680374751
+110507896326982
+299550929112341
+457383042303170
+307772312034787
+442036711139656
+302535233032398
+386186344798926
+262893592415689
+372413274467022
+279479327522831
+13437891268612
+506325313609980
+131236709875043
+464308682311645
+411378982136999
+120230773754944
+423195153134786
+405990565834555
+534776597763966
+437411109031200
+219742760290494
+228865825066033
+515184891428578
+488544471552241
+269300858458577
+371478928400050
+130159606369408
+287272634734329
+461905672458027
+60329891379141
+60132187294951
+99521362347276
+309350255318622
+510729754639616
+547692850287734
+294380662401067
+310564837887649
+443429135254524
+225864458441609
+204476139942432
+157661558341040
+522328233479084
+108698387051238
+42634436032669
+91659921452940
+541453034568481
+379103522672315
+555689720604736
+132759062170768
+20346299669759
+285095936176573
+75365643884669
+238524319293110
+420903339435757
+334551123089634
+113762253792017
+28849956098160
+194797696966968
+57440169624766
+544810253201978
+436237035019730
+482781361879861
+451562898872753
+395879028348892
+121395935599089
+409431456319018
+154902071228101
+224635463987990
+459013953938681
+142670869874565
+282448069258152
+242382451120362
+17978883345856
+312070524637348
+509249001510454
+336550531120605
+420225858411694
+166872469098795
+554769014606773
+442084799525247
+112555026716453
+518399540637934
+167266744320249
+11629931904201
+313172360380743
+266675580438473
+489981067892109
+539983856126462
+40108126506885
+466597055011791
+293430577847972
+472762959360632
+441385832889494
+421905983310428
+398934722838607
+339061961403756
+225899065252817
+71937122920443
+119350445262324
+261403626362185
+486224612531414
+225971309674624
+473770813799428
+239548733721372
+435235155627578
+317885697957624
+361613326555781
+79814119607842
+459240120548328
+438955250274333
+220175009690700
+474694472577049
+318872451274205
+480338784671075
+270411228834924
+119054285786706
+348514924618706
+122354174726256
+464617525355901
+416113411057972
+420659618938099
+324487471873350
+533600567909712
+300307723453151
+112468187845819
+376164210917809
+26459568637185
+234667763068328
+330656966021309
+227128592895505
+432311421643340
+34030502774204
+437956683674722
+217413642330271
+75283583441064
+538895257967714
+119250975633432
+465464122849785
+239631273839922
+528823824074518
+470974372167650
+457264121923056
+145031905797091
+72730415213737
+106684985437402
+216605441143417
+457701708831003
+224519273459026
+75903444087925
+365475786184033
+122035276077927
+52166796219168
+546664440416045
+542053754220912
+324351452837800
+63702067734507
+243546103671323
+102770017086619
+462250185637793
+292472813603365
+562009114368012
+58620889775917
+138398280327120
+322144689531392
+42371902751795
+291727918325773
+285725217009853
+174366888517324
+366069369837793
+14937448831527
diff --git a/src/language.c b/src/language.c
index f124ea0..b6fc35d 100644
--- a/src/language.c
+++ b/src/language.c
@@ -5,6 +5,7 @@
 #include "language_aoc20252.c"
 #include "language_aoc20253.c"
 #include "language_aoc20254.c"
+#include "language_aoc20255.c"
 #include "language_generic.c"
 
 typedef enum languages {
@@ -14,6 +15,7 @@ typedef enum languages {
     Language_AOC20252,
     Language_AOC20253,
     Language_AOC20254,
+    Language_AOC20255,
     Language_Generic
 } Language;
 
@@ -24,6 +26,7 @@ Language language_from_string(String name) {
     if (string_eqc(name, "aoc20252")) { return Language_AOC20252; }
     if (string_eqc(name, "aoc20253")) { return Language_AOC20253; }
     if (string_eqc(name, "aoc20254")) { return Language_AOC20254; }
+    if (string_eqc(name, "aoc20255")) { return Language_AOC20255; }
     return Language_Generic;
 }
 
@@ -34,5 +37,6 @@ static MetaParseFunction LANGUAGE_HIGHLIGHERS[] = {
     language_aoc20252_rule_main,
     language_aoc20253_rule_main,
     language_aoc20254_rule_main,
+    language_aoc20255_rule_main,
     language_generic_rule_main,
 };

commit 4d60916b526bd0f0d94ea3d82188e1b36f7c8d1b
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 21:49:15 2025 +0100

    Clean up

diff --git a/src/examples/aoc20254/aoc20254.meta b/src/examples/aoc20254/aoc20254.meta
index 2bc1a92..e9b2d81 100644
--- a/src/examples/aoc20254/aoc20254.meta
+++ b/src/examples/aoc20254/aoc20254.meta
@@ -24,21 +24,22 @@ main = grid:x !. -> {
         "sum += paper_roll_at(row+1, col+1);\n"
         "return sum;\n"
     < "}\n"
-    "int count() {\n" >
-        "int row, col, paper_roll_count = 0;\n"
+    "int count_accessible_paper_rolls() {\n" >
+        "int row, col;\n"
+        "int count = 0;\n"
         "for (row=0; row<" <rowCount "; row++) {\n" >
             "for (col=0; col<" <rowCount "; col++) {\n" >
                 "if (paper_roll_at(row, col) && neighbour_paper_rolls(row, col) < 4) {\n" >
-                    "paper_roll_count++;\n"
+                    "count++;\n"
                     "can_be_removed[row][col] = 1;\n"
                 < "} else {\n" >
                     "can_be_removed[row][col] = 0;\n"
                 < "}\n"
             < "}\n"
         < "}\n"
-        "return paper_roll_count;\n"
+        "return count;\n"
     < "}\n"
-    "void remove_rolls(void) {\n" >
+    "void remove_paper_rolls(void) {\n" >
         "int row, col;\n"
         "for (row=0; row<" <rowCount "; row++) {\n" >
             "for (col=0; col<" <rowCount "; col++) {\n" >
@@ -48,22 +49,18 @@ main = grid:x !. -> {
             < "}\n"
         < "}\n"
     < "}\n"
-    "int count2() {\n" >
-        "int total = 0, paper_roll_count = 0;\n"
-        "while (1) {\n" >
-            "paper_roll_count = count();\n"
-            "if (paper_roll_count > 0) {\n" >
-                "total += paper_roll_count;\n"
-                "remove_rolls();\n"
-            < "} else {\n" >
-                "break;\n"
-            < "}\n"
+    "int count_total_removable_paper_rolls() {\n" >
+        "int total = 0;\n"
+        "int count = 0;\n"
+        "while ((count = count_accessible_paper_rolls())) {\n" >
+            "total += count;\n"
+            "remove_paper_rolls();\n"
         < "}\n"
         "return total;\n"
     < "}\n"
     "int main(void) {\n" >
-        "printf(\"Part 1: %d\\n\", count());\n"
-        "printf(\"Part 2: %d\\n\", count2());\n"
+        "printf(\"Part 1: %d\\n\", count_accessible_paper_rolls());\n"
+        "printf(\"Part 2: %d\\n\", count_total_removable_paper_rolls());\n"
         "return 0;\n"
     < "}\n"
 };
@@ -75,12 +72,8 @@ grid = row*:xs -> {
         xs
     < "};\n"
     "int can_be_removed[" <rowCount "][" <colCount "];\n"
-    >rowCount {
-        W[1]
-    }
-    >colCount {
-        W[2]
-    }
+    >rowCount { W[1] }
+    >colCount { W[2] }
 };
 
 row = cell*:xs '\n' -> {
@@ -96,5 +89,3 @@ cell =
 
 empty             = '.' -> { "0, " };
 paperRoll[Escape] = '@' -> { "1, " };
-
-number = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';

commit 8d50434a8dd2e0a6c78724fda5736cce8ff7ea84
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 21:38:55 2025 +0100

    Part 2

diff --git a/src/examples/aoc20254/aoc20254.meta b/src/examples/aoc20254/aoc20254.meta
index bcbf3e2..2bc1a92 100644
--- a/src/examples/aoc20254/aoc20254.meta
+++ b/src/examples/aoc20254/aoc20254.meta
@@ -25,18 +25,45 @@ main = grid:x !. -> {
         "return sum;\n"
     < "}\n"
     "int count() {\n" >
-        "int row, col, paper_roll_count;\n"
+        "int row, col, paper_roll_count = 0;\n"
         "for (row=0; row<" <rowCount "; row++) {\n" >
             "for (col=0; col<" <rowCount "; col++) {\n" >
                 "if (paper_roll_at(row, col) && neighbour_paper_rolls(row, col) < 4) {\n" >
                     "paper_roll_count++;\n"
+                    "can_be_removed[row][col] = 1;\n"
+                < "} else {\n" >
+                    "can_be_removed[row][col] = 0;\n"
                 < "}\n"
             < "}\n"
         < "}\n"
         "return paper_roll_count;\n"
     < "}\n"
+    "void remove_rolls(void) {\n" >
+        "int row, col;\n"
+        "for (row=0; row<" <rowCount "; row++) {\n" >
+            "for (col=0; col<" <rowCount "; col++) {\n" >
+                "if (can_be_removed[row][col]) {\n" >
+                    "paper_rolls[row][col] = 0;\n"
+                < "}\n"
+            < "}\n"
+        < "}\n"
+    < "}\n"
+    "int count2() {\n" >
+        "int total = 0, paper_roll_count = 0;\n"
+        "while (1) {\n" >
+            "paper_roll_count = count();\n"
+            "if (paper_roll_count > 0) {\n" >
+                "total += paper_roll_count;\n"
+                "remove_rolls();\n"
+            < "} else {\n" >
+                "break;\n"
+            < "}\n"
+        < "}\n"
+        "return total;\n"
+    < "}\n"
     "int main(void) {\n" >
         "printf(\"Part 1: %d\\n\", count());\n"
+        "printf(\"Part 2: %d\\n\", count2());\n"
         "return 0;\n"
     < "}\n"
 };
@@ -47,6 +74,7 @@ grid = row*:xs -> {
     "int paper_rolls[" <rowCount "][" <colCount "] = {\n" >
         xs
     < "};\n"
+    "int can_be_removed[" <rowCount "][" <colCount "];\n"
     >rowCount {
         W[1]
     }

commit 6d56c2295bcdb2f576d6dabe9ff466a4fbb18f86
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 21:22:57 2025 +0100

    Clean up

diff --git a/src/examples/aoc20254/aoc20254.meta b/src/examples/aoc20254/aoc20254.meta
index 6144d9d..bcbf3e2 100644
--- a/src/examples/aoc20254/aoc20254.meta
+++ b/src/examples/aoc20254/aoc20254.meta
@@ -3,41 +3,40 @@
 main = grid:x !. -> {
     "#include <stdio.h>\n"
     x
-    "int is_paper_roll(int row, int col) {\n" >
+    "int paper_roll_at(int row, int col) {\n" >
         "if (row < 0 || row >= " <rowCount ") {\n" >
             "return 0;\n"
         < "}\n"
         "if (col < 0 || col >= " <colCount ") {\n" >
             "return 0;\n"
         < "}\n"
-        "return paperRolls[row][col];\n"
+        "return paper_rolls[row][col];\n"
     < "}\n"
-    "int neighbours(int row, int col) {\n" >
+    "int neighbour_paper_rolls(int row, int col) {\n" >
         "int sum = 0;\n"
-
-        "sum += is_paper_roll(row-1, col-1);\n"
-        "sum += is_paper_roll(row-1, col);\n"
-        "sum += is_paper_roll(row-1, col+1);\n"
-
-        "sum += is_paper_roll(row, col-1);\n"
-        "sum += is_paper_roll(row, col+1);\n"
-
-        "sum += is_paper_roll(row+1, col-1);\n"
-        "sum += is_paper_roll(row+1, col);\n"
-        "sum += is_paper_roll(row+1, col+1);\n"
-
+        "sum += paper_roll_at(row-1, col-1);\n"
+        "sum += paper_roll_at(row-1, col);\n"
+        "sum += paper_roll_at(row-1, col+1);\n"
+        "sum += paper_roll_at(row, col-1);\n"
+        "sum += paper_roll_at(row, col+1);\n"
+        "sum += paper_roll_at(row+1, col-1);\n"
+        "sum += paper_roll_at(row+1, col);\n"
+        "sum += paper_roll_at(row+1, col+1);\n"
         "return sum;\n"
     < "}\n"
-    "int main(void) {\n" >
-        "int row, col, paperRollCount;\n"
+    "int count() {\n" >
+        "int row, col, paper_roll_count;\n"
         "for (row=0; row<" <rowCount "; row++) {\n" >
             "for (col=0; col<" <rowCount "; col++) {\n" >
-                "if (is_paper_roll(row, col) && neighbours(row, col) < 4) {\n" >
-                    "paperRollCount++;\n"
+                "if (paper_roll_at(row, col) && neighbour_paper_rolls(row, col) < 4) {\n" >
+                    "paper_roll_count++;\n"
                 < "}\n"
             < "}\n"
         < "}\n"
-        "printf(\"Part 1: %d\\n\", paperRollCount);\n"
+        "return paper_roll_count;\n"
+    < "}\n"
+    "int main(void) {\n" >
+        "printf(\"Part 1: %d\\n\", count());\n"
         "return 0;\n"
     < "}\n"
 };
@@ -45,7 +44,7 @@ main = grid:x !. -> {
 grid = row*:xs -> {
     $rowCount
     $colCount
-    "int paperRolls[" <rowCount "][" <colCount "] = {\n" >
+    "int paper_rolls[" <rowCount "][" <colCount "] = {\n" >
         xs
     < "};\n"
     >rowCount {

commit 9d7072adaa14309eaabecb756f961faacb263243
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 21:11:32 2025 +0100

    Day 4 part 1

diff --git a/make.sh b/make.sh
index 1299e50..f9c5f27 100755
--- a/make.sh
+++ b/make.sh
@@ -14,6 +14,7 @@ main() {
     example_aoc20251
     example_aoc20252
     example_aoc20253
+    example_aoc20254
 }
 
 dotall() {
@@ -87,6 +88,16 @@ example_aoc20253() {
     out/rl
 }
 
+example_aoc20254() {
+    example aoc20254
+    out/aoc20254 <src/examples/aoc20254/example.aoc20254 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20254 <src/examples/aoc20254/rl.aoc20254 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
@@ -121,6 +132,7 @@ languages() {
     meta_compile src/examples/aoc20251/aoc20251.meta out/language_aoc20251.c
     meta_compile src/examples/aoc20252/aoc20252.meta out/language_aoc20252.c
     meta_compile src/examples/aoc20253/aoc20253.meta out/language_aoc20253.c
+    meta_compile src/examples/aoc20254/aoc20254.meta out/language_aoc20254.c
 }
 
 banner() {
diff --git a/src/examples/aoc20254/aoc20254.meta b/src/examples/aoc20254/aoc20254.meta
new file mode 100644
index 0000000..6144d9d
--- /dev/null
+++ b/src/examples/aoc20254/aoc20254.meta
@@ -0,0 +1,73 @@
+#id = aoc20254
+
+main = grid:x !. -> {
+    "#include <stdio.h>\n"
+    x
+    "int is_paper_roll(int row, int col) {\n" >
+        "if (row < 0 || row >= " <rowCount ") {\n" >
+            "return 0;\n"
+        < "}\n"
+        "if (col < 0 || col >= " <colCount ") {\n" >
+            "return 0;\n"
+        < "}\n"
+        "return paperRolls[row][col];\n"
+    < "}\n"
+    "int neighbours(int row, int col) {\n" >
+        "int sum = 0;\n"
+
+        "sum += is_paper_roll(row-1, col-1);\n"
+        "sum += is_paper_roll(row-1, col);\n"
+        "sum += is_paper_roll(row-1, col+1);\n"
+
+        "sum += is_paper_roll(row, col-1);\n"
+        "sum += is_paper_roll(row, col+1);\n"
+
+        "sum += is_paper_roll(row+1, col-1);\n"
+        "sum += is_paper_roll(row+1, col);\n"
+        "sum += is_paper_roll(row+1, col+1);\n"
+
+        "return sum;\n"
+    < "}\n"
+    "int main(void) {\n" >
+        "int row, col, paperRollCount;\n"
+        "for (row=0; row<" <rowCount "; row++) {\n" >
+            "for (col=0; col<" <rowCount "; col++) {\n" >
+                "if (is_paper_roll(row, col) && neighbours(row, col) < 4) {\n" >
+                    "paperRollCount++;\n"
+                < "}\n"
+            < "}\n"
+        < "}\n"
+        "printf(\"Part 1: %d\\n\", paperRollCount);\n"
+        "return 0;\n"
+    < "}\n"
+};
+
+grid = row*:xs -> {
+    $rowCount
+    $colCount
+    "int paperRolls[" <rowCount "][" <colCount "] = {\n" >
+        xs
+    < "};\n"
+    >rowCount {
+        W[1]
+    }
+    >colCount {
+        W[2]
+    }
+};
+
+row = cell*:xs '\n' -> {
+    #inc(W[1] 1)
+    #max(W[2] xs.len)
+    "{" xs "},\n"
+};
+
+cell =
+    | empty:x -> { x }
+    | paperRoll:x -> { x }
+    ;
+
+empty             = '.' -> { "0, " };
+paperRoll[Escape] = '@' -> { "1, " };
+
+number = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
diff --git a/src/examples/aoc20254/example.aoc20254 b/src/examples/aoc20254/example.aoc20254
new file mode 100644
index 0000000..8209399
--- /dev/null
+++ b/src/examples/aoc20254/example.aoc20254
@@ -0,0 +1,10 @@
+..@@.@@@@.
+@@@.@.@.@@
+@@@@@.@.@@
+@.@@@@..@.
+@@.@@@@.@@
+.@@@@@@@.@
+.@.@.@.@@@
+@.@@@.@@@@
+.@@@@@@@@.
+@.@.@@@.@.
diff --git a/src/examples/aoc20254/rl.aoc20254 b/src/examples/aoc20254/rl.aoc20254
new file mode 100644
index 0000000..ba20dae
--- /dev/null
+++ b/src/examples/aoc20254/rl.aoc20254
@@ -0,0 +1,138 @@
+.@@@@.@@@@.....@@@@....@.@@.@@.@@.@@..@@.@.@@@@@@@@@.@@@@....@@.@@@@@......@@@@@@.....@.@@@@@.@@.@@.@@.@.@@@@@@@@.@@.@.@.@.@@.@@.@.@.@.@@.
+@@@@.@@@@...@@@@.@...@....@@@@.@@.@.@@@@@@@.@...@@.@@.@@@@@.@@@@....@@@..@...@@@@.@@.@@@@..@.@.@@@@@@.@@...@@@@.@@.@@.@..@@@..@@@@@.@@@.@@
+@...@.@.@.@..@@@.@...@@.@@..@.@...@@@@.@@@@@@@@@@@@@.@....@@@@@@...@@@@..@@@..@@...@.@@@@.@...@@@@@@@@@.@@@@@.@@@@@@@.@@@@@..@@@...@.@@@@@
+@@.@@@@@@.@..@..@@@@@@@@@.@...@@@.@@.@.@@.@.@@@@.@.....@.@@@@@@.@.@..@@@@.@@@...@...@.@..@@..@.@..@.@.@@.@@@@.@..@@@@@..@@@@@.@..@@...@@@@
+@.@@@@@.@@@@@@..@@.@@@@...@.@.@.@@@@.@@@@.@...@@@@@.@.@..@@@@@@.@.@@.@@@@.@@@@..@@@.@.@@.@.@.@...@..@..@@.....@@@@.@@@.@.@.@..@@@.@..@@@@@
+@.@.@@@@.@..@..@@@@@.@.@.@@.@.@.@@@@..@.@@.@@@@@.@.@@@.@@.@..@@@@@@@@.@@....@@@.@.@@@.@@@.@@@...@@@@.@@@@....@@@@.@..@@@.@@@@.@@@@.@@@@@.@
+@@..@@..@@@@@.@.@.@@@@@.@@@@@@@@@.@@.@@@@@@@@@@@@@@.....@@@@@@@@.......@@@@.@..@@@.@...@@@@@@@@.@@@@@.@@..@@.@@@@@.@.@@@@.@@....@@@@@.@.@@
+.@.@@.@@@@@.@..@@@@@@@@@@.@@@@@@@@....@@..@@.@.@...@@.@@@@..@@@..@@@.@@@@@@..@@@@.@@@@@..@@....@.@@@@@.@@...@@@@@@.@@....@@@@@.@@@..@..@@.
+.@@.@@.@....@@.@@@...@@@@@@..@@@@@..@@@..@..@..@@@.@@@..@@.@@@@@@@.@@@...@@@.@@..@.@@@@@.@@@@...@.@@@@@@.@@@@@...@..@@@@@..@.@@@@@@@...@..
+@..@@@.@.@@@@@@@@@.@@@@@@..@@..@.@@@@@.@..@@@..@@@@.@.@...@.@@@@.@@..@@@@.@...@@@..@.@@@@.@@@@@@@.@.@@@@.@.@@@@@@@.@.@..@@..@@.@@.@@@@...@
+@@.@@.@.@@.@.....@@@@.@@@@@....@@.@@@@.@.@.@@..@..@@@@@@@@.@@@.@@..@@@@@@@@@@@@@...@.@@@..@@.@@@....@@@...@@..@..@..@@....@.@@@@@@@@..@.@.
+.@@@@@@@@@@.@@@@..@@@.@@@.@..@....@.@@@@@@@@..@@@@@@@@@@@.@.....@@@@..@@@..@@@@@..@.@@@@@@.@..@.@..@@.@.@@.@@@@@@@.@@@@@@...@@@@@.@@.@.@.@
+.@.@@@..@@@....@..@.@@@.@@@@.@@@@@....@.@.@@@..@@..@.@@.@@.@@@.@.@.@@@@.@.@@@...@@.@@@...@.....@@@@@.@@@.@@@@.@@..@..@@.@@@.@@.@..@@@@@@@@
+...@.@...@...@@@.@.@@.@.@@.@.@.....@.....@@@@@@.@@@.....@@@@.@@@@..@@..@@@@@@@@@@@@@..@@@@.@@@@.@..@@@@@@@..@@.@@@.@@@@@@@@@.@@..@@@@@@@.@
+..@@@@@@@@@@..@@.@@@.@..@@@@@@@@@@...@@.@@.@@@@@@@@@@.@@.@.@@@@@@@.@.@..@@..@@@@@.@@.@@@@@@@@..@@@@@@.@@@@@@@@@@@.@.@@@@@.@@.@.@@@.@@.@...
+.@@@.@@@.@.@@.@@@@@@@.@...@@@@.@@@.@@.@@..@..@@@@@@..@@.@@@.@.@@@@..@@@@@@@@@@@@.@@@@@.@@.@@@@@.@@@.@@@@@@@.@@@.@@@@@.@..@@.@@@.@@.@@@@@@@
+.@@@@.@@@@@@@@@@@@@@...@@..@@.@@@.@@.@.@@@..@.@..@@@.@@@.@.@@@@@@@@@.@@@@.@..@@..@@@@@@@@.@..@@@....@.@@@@@@@.@.@@.@@..@@@@.@@@..@@.@@@.@@
+...@@@@@...@@@@@@.@...@@.@@@@@..@@@@@@@.@@@@@@@@@@...@@@.@..@..@@@..@@@@@..@@@..@@@@.@@@@@@@@@.@.@@@.@@@.@@@@......@@@.@..@@.@.@..@@..@...
+@@@.@@@.@@@@..@@.@..@.@@.@@@.@@@@@@@@@.@@.@@@.@@@@@@@@.@..@@@.@@@@.@@@..@@.@@@.@@.@..@@@@@.@.@.@.@@@..@@..@@...@..@@..@@@@@.@@@@@.@@@@..@@
+@@@.@...@@.@@@.@@@@.@@@@@...@.@@.@.@@@@.@@@@.@@@..@@.@.@.@@@@.@@.@@..@@@@..@@@.@@@.@.@@@@.@.@@@.@@@@@@@@.@..@.@@@@.@@.@.@@@.@...@@@@@.@@@@
+@.@@@.@.@.@@@@@@...@@@.@@@@@.@@@@@@@@..@@@@@@@@@@@@@@.@@.@@.@@@.@@@.@..@@@@.@...@@.@@@@@....@@.@.@@.@@@@@@...@@..@@@.@@.@@.@.@@@@..@..@@@.
+.@@.@@...@@@.@@@@.@@@.@@@@@@@@@.@.@.@...@@...@@@@@@@@@@@@@@@@@@@.@..@.@@@..@..@@@..@@@@@.@@@@@@.@@@.@@@.@.@.......@@.@@....@@@@@@@.@@.@@.@
+@.@.@@.@@@@.@@.@@@.@@..@@@@.@@.@.@@....@@@.@@.@@.@@..@@@.@@.@.@@.@.@@@@.@@@.@@@.@@@.@@.@@...@.@@@@@..@.@@@@@.@@.@.@..@@@@@@.@...@.@@@@...@
+.@@@.@@@@@.@@@.@...@.@@@@@.@..@.@@@@@@@@@@@.@@@@@@@@@@.@.@@.@@@@.@@@@@..@@..@@.@@@@@.@@..@@@@@@@@...@@..@.@@@@.@@@.@.@@..@..@@.@@@..@@@@@.
+.@.@@..@@.@.@...@@@.@@@@@@@@@....@.@@.....@@@...@@@@@@.@@.@....@@.@.@.@@@@@.@......@.@@@@@.@@@@.@@@@.@.@@@@@@@.@@.@@@@@@@..@@@@@@@.@@.@.@.
+@@@.@@@.@@.@@@@.@@@@@..@@@.@.@@.@@@@@@@.@@@@@@.@@@@@.@@@@.@@...@@@.@@.@@@@.@@@@...@@@.@.@@@@@@.@@@@@@@@@@@@@.@@@@@@@...@@@@@@.@@@.@@.@@.@@
+.@.@.@.@@@..@@.@@.@.@@@@@.@.@@@@.@..@@..@@@@.@@@@@..@.@.@@@@....@@...@.@@@@@..@@@.@.@@@@@..@.@.@@...@.@.@.@..@.@..@@@@@@@@@.@@@..@@@@@@@@@
+@@@@@@@.@..@@@.@@@@@@.@@.@..@@@@@@@.@@.@.@@@.@@@....@@@@.@.@@@@@@..@.@@@.@.@.@@@@@@@@@@.@.@..@.@@@.@.@.@.@@..@.@.@@@@@@@@@.@@@@@@@.@@.@..@
+@@@@..@...@@@@.@@@...@@@@@@@@@@@@.@@@.@.@@@@@..@@..@@@@.@...@@.@@@@.@..@....@@@@.@@...@..@..@@@@@@@...@.@@.@@@.@@.@.@.@@@@@.@@.@..@.@.@..@
+..@.@.@@@..@..@@@@@@@@@.@@.@@@@@@@@@..@@@@@@@.@@@.......@.@.@@@.@@@@@@@@@@.@@..@@.@.@@.@.@.@@..@@.@@.@@@..@@.@@@@.@@@.@@@@@@@.....@...@.@@
+@..@@..@..@@@.@@..@@@@@@.@@@@..@@@@.@@...@@@.@@@..@@@..@.@.@.@@@@@@@..@..@@@@@@@@@@@.@@@@....@@@..@.@@.@.@@@@.@@@@....@@.@.@@..@.@.@@@@.@@
+.@.@..@..@@@@@@..@@@@@@@.@@@@@@@.@..@.@@@.@.@@.@..@@@@@.@.@@@@@@.....@.@@..@@@@.@.@@@@@@@@@@.@@@..@@@@@.@...@@@@@@@.@.@...@@@@@@@@.@@.@..@
+@@@@.@@@@@.@@@.@.....@..@@..@@@@@@@@.@@......@...@@.@..@@@@.@.@@.@.@@@@.@@@...@@@.@@..@@...@@..@..@@@@.@@@@@@@@.@@@...@@@@@@@@.@..@@@..@@@
+@.@..@.@.@@@.@..@@.@@@..@@@.@@....@.@@@@@..@.@.@....@@@.@@@..@..@@@@@@..@.@.@..@@.@..@@@.@@@@@@@@@@...@@@@@.@@.@@.@@@@@@@@@@.@..@@@@@@@..@
+@@.@@.@@@.@@@.@@.@..@@@..@@.@@@@.@.@.@@@@@@.@@@@@@@@@......@.@@@.@.@@.@@@@.@@@....@@@.@@.@@..@@@..@.@@@@@@.@@@..@@@@@@@..@..@@@@..@@.@.@.@
+.@@..@..@.@@@.@@@@@.@...@@@@@@@@.@...@@.@@@.@.@@@@.@@@@@.@@@@@@....@.@@@@@@@@@@@@..@@@@.@@@.@@.@.@@...@@.@.@...@@.@...@@@..@.@@.@.@@.@@@@@
+@.@@.@@@@@@@@@@@@@@@@.@@.@@.@.@@..@@.@.@.@.@@@..@@@@@.@@@@..@@.@@@@@@@@@.@@@.@@@@@.@@@@@@.@@@@@@@.@@@@.@@@@@@@@..@@@@..@.@..@.@@.@@@@....@
+@@.@.@.@@@@..@@@@@....@@@@@@@.@@@@.@@.@@@.@.@@.@@@..@@.@@@@.@..@.@@@@..@@@.@..@@@@@@..@.@@...@.@@.@.@.@@@@.@@.@@@.@....@...@.@@..@...@@.@@
+@...@.@@.@@@@.@.@.@@.@@@..@@.@@.@@@...@....@@@.@@.@@.@.@@@@..@@@.@.@@@...@@@@@.@.@@.@..@@@...@@.@@.@@.@@@@.@..@@@.@.@.@@@@@@@@@.@@@@.@@@@.
+@@@@@@.@@.@@@..@.@@@@@@..@@@.@@@.@@....@..@.@@.@@@@@@@@@@@@@@...@@@.@.@@@.@..@@.@..@@@@.@@@..@@@@..@.@@@@@..@.@@@@@@.@..@@@...@@@@@@.@@@@.
+.@.@@@.@@.@@@@@.@@@@@@.@@@@@..@@.@.@@@..@..@@..@..@.@..@@..@..@@@.@@..@@@@.@@.....@@@@.@.@.@@.@@.@@@@.@@@@....@@.@@.@..@@.@.@.@.@@@@.@@@@.
+.@@.@@@.@@@@@..@@@.@..@@.@@@@@....@@@@@@.@@@@@@@@@@.@@....@.@.@.@@@.@...@.@@.@@@@@@@.@@@@.@@@@@@@.@@.@@@.@..@@@@@.@.@..@.@..@@.@.@@.@@.@@.
+....@.@@..@.@@..@@.@.@..@.@.@@.@@..@@..@@@..@..@.@.@@.@@@@..@.@@@@@....@@..@@.@.@@..@@....@@.@@..@..@......@@@..@@@@...@@@@@.@@@@@@@@@@@@.
+@@@.@@@@.@@@.@@@@@@@.@.@@@..@@.@.@@@.@@.@@@...@@@@@@@..@.@@..@@.@...@@.@..@@@..@@.@@@..@@@@@@@@.@@@@@@..@@@@@.@@@@@@@@@@@....@@@@@@@@@@@@@
+@..@@@@.@.@.@@@@@@.@.@@@.@@.@.@@@@@..@@.@@.@@@..@@@.@@@..@..@@..@...@...@@@.@.@..@..@@@..@@.@@@.@@@@@@@@@@.@@@@..@@..@..@.@@@@@@@.@@..@.@@
+@@.@.@.@.@.@@@@.....@@.@@@@@@@@@..@.....@..@.@@.@.@.@.@.@@...@@@@@@@@...@....@.@@.@@@@.@@@.@@@@.@@@.@@@@@@@@...@@.@.@@@@@@@@@.@@@@@@.@.@@@
+..@@@.@@@@.@.@@@.@@@.@@@.@@.@..@@@.@@@.@@..@..@@@@@.@@.@@@.@@@@@@@.@@@.@@@@@.@.@@@@@.@@.@.@@@.@.@@@@.@@@@.@@@@@...@@@@@@@.....@@@..@@.@@.@
+.@@...@.@@@@.@@@@..@@@.@..@@@@@...@@.@@@.@.@@.@@@.@@@@@@.@.@@...@@@....@@.@@@@@@.@@@@.@@@..@@@@@.@@.@@.@..@@@@.@@@...@@..@@@@@@.@@@@@.@@@@
+@@@@@@@@@.@.@.@.@......@...@@@@..@..@@..@.@@@.@@@@.@.@@@..@@@...@@@@@...@..@@.@@.@@@@@@.@@..@@.@@.@@@.@.@@.@..@.@.@@.@...@@@@.@@@@@@@@@@@@
+@@.@@@.@@@@@.@@@...@.@@..@@@@@.@..@.@@..@@.@@.@@@.@@@@..@.@.@@@@@.@@.@@@@.@@@@.@.@@@@.@.@@@...@@@@.@.@@.@..@@@@@..@@@.@@@..@@@.@@.@@..@.@@
+.@.@.@.@@@..@.@@@.@@.@@..@@@...@.@...@.@@..@..@.@@@.@@@.@@@@@@.@@@@@@@.@.@.@@.@@@.@@..@@...@@@@@@.@@@@.@..@@@...@@.@@@@@@..@@.@@@@.@@@@...
+@@.@@@@@@@.@@@.@@.@@@...@.@@.@.@@@@@@@@@@.@...@@.@.@@@@@@@@.@@@@@.@.@@@@@@...@@......@@@..@@@@@@.@@@@@@@@@@.@...@.@@@@...@@@@.@@.@@@.@.@@@
+@@@.@.@@.@@@@@@..@@@@@@.@...@....@@.@@@@@@@@@.@@@@@@@@..@..@@@@@@.@@@@@..@.@@.@.@@@.@@@@@@.@...@@..@..@@@..@@@.@....@@@@.@.@.@@@@@@@@.@@@@
+@@@.@@@@@@.@@.@@..@@.@.@.@@@@@.@.@@@@.@@.@.@@@@@.@..@@@.@@@@@@@@.@@..@@@.@@@@@@@@.@@...@.@@@@@@@@@@@@@@@@.@@.@.@@@.@...@@@...@..@.@.@@@@.@
+@.@...@@@.@@@@..@@..@@..@.@@@@..@.@.....@@..@.@@@@.@.@@@@@@@.@@.@.@@@...@.@@@@@.@@@..@@.@@@@@..@@@.@.@@.@@.@@@@@@@@@@@..@.@.@@.@@@.@.@@@.@
+@@@@@@@..@@.@@.@..@@@...@.@.@@@@..@@@@@@.@..@.@.@@@@@..@@@@..@@@.@@@@@@.@@@@.@.@@@..@@@.@@.@@.@@@@@.@.@@.@.@@@@@.@@@@@@..@@@@@@@..@@@.@@@.
+...@@@@@.@@@..@@..@@@@.@.@@@.....@@@@@@.@@@.@@.@@@@.@@...@@@.@@...@.@@@.@@@@@...@.@@@..@.@@.@@@@@@@@@....@.@@@.@@@.@@@@@@..@...@@@.@..@@.@
+@..@@@.@@@@.@.@@@@.@.@@@...@@@@@..@@..@@..@@@.@@.@@@@.@@..@@@@@@@@@@@@@.@.@@@.@@..@@...@@@@@.@@.@@.@@@@@@@@@..@@@.@@.@@.@..@@@@@@.@@@@.@@@
+@@@@@..@@..@@..@...@@@.@..@@@@@.@@....@@@@@@.@.@@@@@@@.@.@..@..@@@@@@@@.@@@@.....@@@@.@@@@@@@@@.@.....@@@@@@..@.@@@@@@@@@@.@@@@@@......@@@
+@.@.@@@....@.@@@@@.@...@.@.@@@@.@@@..@@..@..@@@@@@@@@@@@@@.@.@@.@@@@.@@@@..@@@@.@@@.@@@@..@@@@..@@@..@@@...@..@.@@@@@@@@@@..@@@@@@@@..@@@.
+@@....@@@.@@..@.@@.@..@@@.@.@..@@@.@@.@@.@@@@@@@@@@@@@.@@@.@.@.@@@@....@@.@@@.@@...@.@@@@@..@...@....@@@@@@@.@@..@@...@.@@.@@@.@.@@@.@.@.@
+..@@@.@.@@@@.@.@@....@@...@@.@@@.@.@@.@.@@@@.@.@...@@@@@.@@.@@@@@.@@@@@@..@@.@@@@@@.@..@.@@.@@.@..@@@@@@@@@.@..@.@@.@@..@@@@@...@@@@@@.@.@
+@@.@.@.@@.@@@.@@.@@@@@@.@.@..@.@@@.@@.@..@@@..@@@@@@@.@..@@@@..@@@.@@@.@@.@@@..@....@@@@@@@@@.@@@@@..@.@@@.@..@@@@@...@@@@.@..@.@.@.@...@@
+..@@@@.@@@.@.@@..@.@@@@@.@@.@@@@.@@.@.@.@@@.@@.@..@@@@....@@.@@.@@.@.@.@@@@@...@@.@@@@@@@@@@@@@@@.@.@@@.@@.@..@..@@@@..@.@@..@@.@.@@..@@@@
+@.@@@@@@.@@.@.@...@..@@..@@...@..@@@.@@@@@.@@@.@....@@@@..@@.@@@@@..@@..@@.@@@...@@.@@@@.@@.@.@.@@@@@@@@@@@.@@@@.@@@@.@..@.@@@@.@@.@.@@@@@
+@@@@@.@.@.@@@@@@@@@@@@.@...@@@@@@@@@.@.@.@@@@@@.@.@...@@.@..@.@@@@@.@@.@@@@@.@@@.@@.@@@@@..@@@.@...@@@@..@@.@@.@@@@@@@@@@@@..@..@@.@@@@.@@
+@@@@@.@@.@.@@@...@@.@@@@@@..@@@..@@@.@@.@@@.@@@@@.@@@@@...@..@@@@@@@@@@..@@@@.@@...@..@@@..@@@@@@@.@@@.@@..@.@@@@@@@@@..@@@@.@@.@@@@.@@.@.
+@@@@@@@@@@@@@.@@@@@.@@@@@@@@@..@@@@@.@@.@@@@@@.@@@@@.@@.@.@.@@@@@.@@@@.@.@@.@@...@.@@@@.@@@@@.@@@@@.@@@@..@@@@@@@@@@@@@@.@..@...@.@@@@.@.@
+@...@@@.@..@@@@.@@@@@...@@..@@..@@@@.@.@@..@@@@@@.@@.@@@.@..@@..@@@.@@.@@@@@.@..@.@@.............@@@.@.@@@..@@@@@@@@.@@...@.@@@.@.@@@@@@@.
+.@@..@@@..@@.@..@@@@.@@.@...@..@@@@@@@.@@@@.@@@@@.@....@@@@@.@.@..@@.@.@@@..@...@.@@@@@@@.@@@.@..@@.@.@..@.@@..@@.@@@@@.@.@@.@@@@.@.@@@@@.
+..@@@@@@.@.@.@.@@.@..@@@.@..@@@.@@@@..@@@@....@@@.@.@@@@@..@.@@@.@.@.@....@@.@...@.@@@@@@.@@@.@.@.@@@.@.@.@@@.@.@@@..@@@@@@@@..@@.....@@@@
+.@@.@.@...@@@@@@@...@@@@@@@.@..@@.@@@@.@@@.@@@@...@.@@@@@@@@@...@@@@.@.@@..@@.@@@@@@.....@@@....@.@.@@@@.@@...@...@@@@@.@@.@@@@@.@.@@..@..
+@@.@@@@@.@...@@.@@.@@..@.@@@@...@.@.@@.@@@@.@@.@....@@@.@@@@..@.@@..@@.@.@@.@.@@@@.@@..@@.@@@@@@@@@.@.@.@@.@@...@.@.@..@@@@@.@.@@..@@@.@.@
+.@..@@...@.@@@@....@.@@@@@@@.@.@@@.@.@@.@@.@..@@@@@@.@@.@@.@.@.@@@@@@@@@..@@@@@@.@.@@.@@@@@.@@.@.@.@@@@@@@..@...@@.@@..@..@@@..@@@@@@@.@@.
+.@...@@@@.@@..@...@..@.@@@@@@@@.@@@...@@.@@@@@@@.@@.@.@.@@@@@@@@@.@.@@@..@@.@.@..@.@@@@@.@@@@.@@@.@.@.@@@...@.@..@..@....@@.@@@.@...@.@..@
+@...@@..@.@.@@@@..@.@.@@@..@@@.@@@@@..@@.@@@.@.@@..@@@@@.@@@@@@..@@...@@.@@@.@@@@@.@@..@@.@@@@@@@@@@.@@.@@@@@.@.@..@.@@@@.....@@@@@@@.@@@@
+@.@@@.@..@@@@.@@.@@@@@@.@.@@@@@@.@..@@.@@@@@@@.@..@.@.@@@@@@..@@@.@.@..@@.@@@@.@@@@@@@@@@@...@....@..@..@.@....@@.@@@@@@@.@@@.@@@@@@.@.@@@
+@.@..@@..@@..@....@@.@.@@.@..@@..@@@..@@@.@@.@@@@.@.@@.@.@@@@@@@@@@@.@@@@@@.@@@@@@@..@@.@.@@@@@@@@.....@.@@@.@@@@.@.@.@@..@@@@@.@.@..@@.@@
+@@@@@@@.@@@@..@.@@@@@@.@.@.@@@@@.@.@@@@.@@@.@@@@@@@@@@@@@@.@@.@@@@@@@@@...@.@..@@@......@@@.@@@.@@@.@@..@@.@@@@..@.@.@@@.@@.@@..@@@@.@@.@.
+.....@@@@...@@..@@.@@.@@@@.@@.@@@@.@@.@@@@@@@..@..@@@@@.@@@@@@@..@@.@@..@.@@@.@..@.@.@@@@@@@...@@@..@@@.@.@.@@..@.@.@@@.@....@.@@@@@...@@@
+@..@@@@@.@.@.@@@@@.@@@@@.@@@.@@....@@.@@@@@@@.@.@@@...@@@@@@.@.@@@@.@@@.@@@..@@@@@.@@@@@.@@.@@@@@@@@@@@@@@@@.@@.@@@@.@@@...@@@@@.@@..@.@@.
+.@@.@@.@.@@@@.@.@.@@@@@@@@@@@.@.......@@.@@..@@@@..@@.@@.@@.@@@.@@.@@.@@.@.@@.@..@@@.@.@@.@@@.@@.@@@@.@.@@@@@@..@@@@.@.@..@.@...@@@@@...@.
+@@@.@.@@@@@@@@@@.@@@...@@@.@@@@...@@@@.@@@.@.@.@@@@@@@@@@....@.@..@.@.@@@@@..@@..@@.@@@@@@..@@.@.@@.@..@@@.@@@@.@@@@.@@@@@@@@@...@@.@@@.@.
+@@@@.@@@@@@@.@@@@@@@@@@..@.@@..@@@..@.@@@@.@.@@@@@@..@.@@...@.@@@.@@..@.@..@@...@....@@.@.@@@@@..@@.@@@...@.@@@@@@@@..@@@@@@@@@...@..@..@@
+@@@@.@.@@.@@@@.@@@@@.@@.@@@.@@@.@@@..@@..@@@.@@@.@@.@.@@@@.@@.@@.@..@@@@@.@@@@@@@@@@...@@@.@@.@...@.@@@....@@@@...@..@..@@....@.@.@@...@.@
+@@..@.@@@@..@@@..@@.@@.@.@@@@...@@.@@.@.@@@.@@@....@@@@@.@@@@.@.@@..@@..@.@..@@@@@..@@.@@.@@@@@@@...@@.@@@..@.@@@.@.@@@@.@@..@@@@.@@@.@.@.
+@@.@....@@@@@@@@@@@@@@...@@@.@@@@@@@@.@@.@@.@.@....@@.@.@@@@..@@@@..@@@@@@.@.@@@.@@@..@@@@@@@..@@@@.@@.@@.@...@.@@..@@@..@@@.@.@@@@..@@@@.
+@....@.@@@.@.@@.@.@.@@@@....@@@...@@..@.@...@@@@..@@@.@@@@.@@@@@@.@.@@@@@.@@..@@@@@.@@@@...@@@@..@@@@@@@@@.@@@@@@@..@@.@@@@.@@@...@@@@@@.@
+@@@@@@@@@@@..@@.@@@@.@@.@@.@@@.@@@.@@@...@@@@.@@..@@@@@@@.@@...@@@@@@.@@@@....@.@@@@@@.@@.@@@@.@.@..@@@@@..@@.@@...@@@@@@@.@.@@..@.@@.@@@.
+@@.@@.@@@.@.@@.@..@.@.@@@@@@.@@@.@.@@@.@@@.@@@@..@.....@@@@.@.@@.@..@...@..@@.@@.@@.@@@@@.@..@.@@@@@.@@@..@.@@@.@@@@@@..@.@@@.@@.@@@@.@@@.
+@@@@@@@.@@.@@@@.@@@@.@@@@@@@.@@...@@@@.@.@@..@@@@@.@.@@..@@@.@@@..@@@...@@@@..@@@@@...@@@@@.@@@..@.@@@@@@@@.@@.@@@@@.@@@.@@@.@@@...@@.@@.@
+@@@..@.@@@.@...@..@@..@@@@@@.@@@@@@@@@.@.@@.@@....@.@@..@..@@@@@@@@@@.@@@@@@@@@.@@@.@..@.@@.@@@.@.@....@@....@@@@.@@.@@.@.@@.@@....@..@@@.
+@@@@@@@@@@@@@@.@@@@.@...@.@..@@@.@@@..@@..@@@@@@@@.@..@.@@@..@@..@@..@@.@.@@@.@@@@@@@...@..@@.@@@.@@@@@@.@@@@.@.@@@@..@@@@.@@@..@@.@@@@..@
+@.@@@@@@@.@@@@..@.@@@........@@@@@.@@@@@@@@@@.@@@.@..@@@.@@..@@@@@.@..@.@.@..@@....@.@@.@.@..@...@@@.@@@.@.@.@..@.@@@@@@.@@@..@@.@.@@.@.@@
+@@@@@@@@@@.@@..@.@@@@@@@@@@.@.@@@.@@....@@@@@@..@@@@@@..@@@..@.@@..@@.@..@.@@.@@.@@..@@@@@@@@@.@@@@.@@@@..@.@@@.@.@.@@.@@@@@@@@@@@.@.@@.@.
+@@@@@@@@.@@@@@@@@@.@@@@@@@@@.@..@@@@@@@@@.@@@.@@@@@.@@@@.@@.@@..@.@@@@@@.@@.@@@.@@@@@.@..@@@@..@@@..@@@@@@@@@.@@.@@@.@.@..@@..@@@@@.@.@..@
+@@@@..@.@@..@.@@.@@.@.@@@@@@@@@@@@@@@@@@@@@@.@@@@@.@@@@@@.@@.@@@@..@.@@@@@@.@@..@@..@..@@@@@@.@.@@@.@@@@@@.@..@@@@.@@@@@@@@@@@@@@@@@@.@@@@
+@..@.@@@@@@..@@..@@.@@@@@...@@.@@...@@@..@@.@@..@@@@@@@@@@.@@@@@@.@@@.@@.@@@.@@@@..@.@@@.@.@.@@.@.@@@..@@@@@@@..@@@.@@@@@..@@@@@@@@.@.....
+..@...@@.@...@...@@.@@...@@.@@@@@.@@@@.@.@@.@...@@.@@..@@@@@@.@@@@.@@..@.@@@.@@@@.@@@@@@.@.@..@@@..@@.@.@.@@@@@.@@@@@@@.@.@@@@@@@@.@@.@..@
+..@@@@@@@@@@@@@.@@.@@@...@@@@@@@@@@@@@@@@@@.@.@@@@@@@@@@@@@..@@@@@..@@.@@..@....@.@.@..@.@@@@@.@..@.@@@@@@@@..@@@@@@.@@....@@@..@@@@@.@@@@
+.@@@@..@@@@@@....@@@@@@@@.@@..@.@.@.@@.@@.@@@.@@@..@..@@@.@.@@@@.@..@@.@.@@@@.@.@.@.@.@@.@@.@@@@@@.@@@..@.@@..@@@.@...@.@.@@@@@@@@@.@@.@@@
+@@@...@.@@@@@@.@@@@..@.@@@@@@@@@@@.@@@@.@.@@.@.@@@@@@.@.@@.@@...@@..@.@@@@@@@@@@@.@.@@@.@.@..@@@..@@@.@@@@.@@.@..@.@@@.@.@....@..@.@@@@@@.
+.@.@@@@@@.@@@@@@@@@.@@@@..@.@.@...@.@@@@@@.@@.@@@@@@@..@@@@@@..@.@@@.@.@.@..@@...@@@@@@@@.@.@@@.@.@@@.@..@@@.@@..@.@..@...@.@@@@@@@..@@@@.
+..@.@..@@@.@@@@@..@.@@@@@@.@.@@@@@@....@.@@.@..@@..@@@@@@..@@@.@.@@@@.@@.......@@@@@...@..@@...@.@@..@.@.@.@@@.@@.@@@...@@@@.@.@.@.@@@@.@.
+.@@.@@.@...@..@...@..@.@@.@@.@@@@@@.@@.@.@..@@@@@@@@@@@@@@..@@@@@@.@@@@...@@@@..@.@@@@@.@@@@.@@@@.@@....@@.@..@.@@..@@....@@.@@@@@@@.@..@@
+@.@@..@@@.@.@@@@@.@@@@@..@@@.@@@@@@.@.@.@@.@@@......@@@.@..@@@.@@@@@@@@@@@.@.@@@@@@@.@@.@.@...@@...@..@@@@@.@..@@@@@@.@.@@@@@.@....@..@.@.
+@@.@@@@.@@@.@@..@@@@@.@..@@.@@@@@@.@.@..@.@@@@@.@@.@.@@..@@@..@..@@.@@@..@@@.@@@..@@..@@......@@@.@@.@@.@@@@@@@..@@@.@@@@@@@@.@.@@@@.@@@@@
+.@.@@@@@@...@.@..@@...@@@@@.@..@.@..@@@@@@@@@@.@@@@@@.@@@@.@@.@@.@....@@.@@@@@.@@..@@..@@@.@@@.@@@..@.@.@@@@@@.@@@..@@@@.@.@@.@.@@.@@@.@.@
+@@@@@...@@..@.@@@..@@.@@@@@@.@@@@@@.@@@..@@@.@@@@.@@@.@.@.@@@@@@.@@@..@@@.@@.@@@@....@.@.@@@@@@@.@.@@@@@.@@@@@@@....@@@....@..@@@..@@.@@@@
+@@.@@@@@@.@..@.@.@.@@...@..@@@@@@@.@@.@@@@..@@...@@..@....@@@..@.@@....@@@@@.@@@@@.@.@@.@..@..@@@@@@@@@@@@..@@@...@..@..@@@..@@.@@@@@@@.@.
+.@@..@@@.@.@.@@@@.@...@@@@.@@@@@@.@.@@@@@@@@..@.@@@@@.@@.@@@.@@...@@...@@@.@@@@@@.@@@@@.@..@@@@@@@@@..@.@@..@.@.@..@@..@@@@...@@@..@@@@@@@
+@...@...@@@@.@@@@.@.@@@@@.@@.@@..@@@.@.@..@@.@..@@@@@@@..@@..@@@@@@.@..@..@@@@@@@.@.@.@..@@@@@..@@@.@@@..@.@.@@@@@@@@@@.@@.@..@@@@@@@@@...
+...@@.@@@@.@@.....@@@.@@@@@@@..@...@....@...@@.@@@@@@.@..@.@@.@..@.@......@@@@...@@@.@..@@@@.@@..@.@@@.@@....@@..@...@.@@..@@@..@@@@@@@.@.
+@@.@@@@@@@@@@.@@..@..@@@@.@@@@@@.@..@@@.@@.@..@@@.@@@@..@.@@.@.@@@@@@@..@.@@@@@.@@.@.@.@@@.@.@..@@@..@@.@@@@@@@@@@@@..@@.@.@@..@..@@.@@.@.
+@@@.@@@.@@@@@.@.@@@@@@..@@@@@@@...@..@@@@...@.@.@.@@.@..@@@.@@@..@@@@..@@.@@@@@@...@@.@.@@@@@...@@...@@@..@@@.@@@@@@.@@@@@@...@@@@@@.@.@.@
+...@...@@@@@..@@.@.@.@@....@@@@@.@@@@@@..@@@@@.@.@.@@@...@..@@.@..@@@@@@..@@@.@@.@@.@.@@..@@@@@@.@..@@..@.@@.@..@@@@..@@@@@@@@@@@.@.@@@@.@
+@@.@@@@@@.@@.@@@.@@@....@.@.@@@.@@@.@.@@@@@.@@..@.@@@@.@@@.@.@@.@..@....@@@@@@.@@.@@@@@@@.@@@.@@@@@.@.@@@.@@@.@@@@@..@@.@@@..@@@.@@@@.@...
+@@.@@@.@@..@..@.@@.@.@...@.@@.@@@@@@@@@@.@.@@@.@.@..@@@....@@@@@@..@@..@@.@@.@@@@@@.@@@@@@@@.@@..@.@@@..@.@@@@.@@.@...@@@.@@@@@.@.@@@@.@@@
+...@@@..@@@..@@.@@.@@@@@@..@@@@@@.@...@@@@.@@@@@@@@.@.@@@@@@@@@.@@@.@@@..@@@.@.@@@@@.@@.@@@@.@@@@@@@@.@.@.@@@...@.......@.@@.@...@@@@@@...
+@@@@@@@...@.@@..@....@@@@@..@@@@.@.@@@@@..@@@@..@.@.@@@.@..@.@...@@.@..@@@.@@@.@@@.@@@@@.@.@@@@.@.@..@@.@@..@..@.@@@@@@.@...@.@@@..@@@.@@@
+@.@.@@..@@.@@@@@@@@@@@..@@@.@@@..@..@@@@@@@@..@.@@@@@@@@@@.@@.@.@@..@@@.@....@@@.@..@.@@@@@.@.@@@@.@@@@@@@@.@@.@.@@.@.@.@.@@..@@@@@@@.@@..
+.@@@@.@.@.@@@..@@@@...@@..@@.@@@@@...@@@@..@.@@@@@..@@.@@...@@@@..@@.@@@@@@.@.@.@@@@@@@@.@..@@@.@@@@.@.@.@@@@@@.@.@@@.@@@.@@@.@@.@@@@@@.@.
+..@...@@@..@@@..@@@@@@@@..@.@@@@@..@@....@.@.@@@@@@@@.@@@..@....@@@@@@@@.@@.@..@.@@@..@.@@@.@@@@.@@@....@@@.@@.@.@@@@@.@.@@..@@@@@@..@@@@@
+@@@@@@@@@..@@@..@@@@.@.@@@@@@@@@@@@@@@.@@.@..@.@..@@.@...@@@.@@@@.@..@@.@@@@.@@@@..@..@@.@@@@@@@@..@@@@@.@@..@@..@.@@@@.@@@@..@@.@..@@.@@@
+@@.@@@@@.@@@@@@@@@.@.@.@.@.@@@@.@@@..@@.@@@@@@.@.@@@@@@@@@@@@@.@@@@.@@@@@.@@@.@@@.@.@@...@@@@.@@@@@.@.@@.@@@@.@@.@..@@@@...@@..@@@@@...@@@
+@...@.@.@@@@.@.@..@@@@@.@..@@@.@..@.@.@@.@@@@@@@.@@.@@@@.@@@@@@@@.@@.@.@.@@@@.@@@..@@@@@@.@.@@.@.@@@@.@@.@@@.......@.@@@@@@.@@@.@.@..@@@@.
+@@..@@.@@.@@@@..@..@@@@.@@..@@@.@.@.@@@@@@@@....@@.@.@@.@@.@@@.@@.@@@@@.@.@@@.@@@@@.@.@@@@@@@.@@@@@@@.@@@.@.@@.@.@@@.@@@.@.@@@@@@.@.....@@
+@@@.@@@.@.@.@..@@@.@@@@@....@@.@@@..@@@@@@@.@@@@..@@@@.@.@.@.@.@@@@..@@.@@...@@...@.@.@.@....@@..@@@@@@@@@@@@@.@@.@@....@@@.@@@@.@...@..@@
+..@@@@....@.@@.@.@.@@@@..@....@@@@@@@@@@.@@.@@@@@..@.@@@...@@@@@@..@..@@@@@@.@@@..@@@@@@.@.@@..@@@@@@@@@@.@@@.@@@@.@@@.@...@...@...@.@@@@.
+@..@.@.@.@@.@@.@.@.@@...@@...@...@@@..@@@@@..@@@@@@@@.@@.@@@@.@..@@@..@..@@@@@..@..@@@..@@@.@..@.@@.@@@...@@@..@@.@..@..@@.@@@@@@@@@@@@.@@
+@..@.@@.@@...@@@@@@@@.@..@@@..@@.@@@..@@@@@.@@@@@.@.@@@@@@@@@..@@.@..@@..@@.@@....@.@.@@.@.@@@@@...@.@..@@@.@...@.@.@@@@.@@.@@.@.@@@@@@.@@
+.@.@..@...@@.@@...@..@@.@.@@@.@.@.@@.@@@.@.@@@@.@@...@@..@..@@@.@@@.@@@@@.@.@.@@@.@.@.@@@@@@..@@...@.@.@@.@@@.@@@@@..@.@.@.@@@.@.@.@@.@@@@
+@@...@.@.@..@@@@..@..@@...@.@@@.....@.@@.@@@@@@@@@@@@.@@.@.@@@@@@@..@.@@@@@.@@.@@@@@.@@@.@@.@@@.@@@@@@@.@@@.@@@@..@.@@.@@@.@@@@@@@@@@@@.@@
+@..@..@@.@@@@@.@@..@.@@.@@..@@.@@@@@.@..@@@@@@@.@@...@@@@@@.@.@.@@@...@.@.@..@@@..@@@@@.@...@.@.@.....@.@@.@..@@.@@@.@@..@@.@@.@@..@..@...
+.@@.@.@@@@@@@@@@.@..@@@.@@@@....@@.@@@@@@@.@@.@.@@@@@@@.@..@.@@@@@@@...@@@...@@@...@@@@@@@@...@@@@.....@@@@@@@..@...@@.@@@@@@@@@@@..@@.@@@
+..@@@@..@@@@...@@..@@@@@@@.@..@@@@@@@@@@@.....@@...@.@.@@@@.......@.@@@.@.@@@@@@@@@@.@@@@@@@@.@@.@..@.@.@@@.@@.@@@@.@.@@@@@@@@.....@@@@@.@
+.....@@@...@@@.@@@@@.@@..@.@@...@...@.@@@@....@@..@@@@@.......@@...@.@@@..@@@@@.@@.@@@@@@@.@@@@@..@@@@..@@@@@@.@.@@@.@@@.@@@@@@..@@.@@@@@.
+.@@.@@@@.@.@@.@@@@@@@..@@.@.@.@@@@.@.@@..@.@..@.@@@..@.@@@@@@@@@.......@@@@@..@.@.@@@@@@@@@@@@@..@@.@.@@@@@.@@.@@@@@@.@...@@.@@@.@.@.@..@@
diff --git a/src/language.c b/src/language.c
index 9d16d75..f124ea0 100644
--- a/src/language.c
+++ b/src/language.c
@@ -4,6 +4,7 @@
 #include "language_aoc20251.c"
 #include "language_aoc20252.c"
 #include "language_aoc20253.c"
+#include "language_aoc20254.c"
 #include "language_generic.c"
 
 typedef enum languages {
@@ -12,6 +13,7 @@ typedef enum languages {
     Language_AOC20251,
     Language_AOC20252,
     Language_AOC20253,
+    Language_AOC20254,
     Language_Generic
 } Language;
 
@@ -21,6 +23,7 @@ Language language_from_string(String name) {
     if (string_eqc(name, "aoc20251")) { return Language_AOC20251; }
     if (string_eqc(name, "aoc20252")) { return Language_AOC20252; }
     if (string_eqc(name, "aoc20253")) { return Language_AOC20253; }
+    if (string_eqc(name, "aoc20254")) { return Language_AOC20254; }
     return Language_Generic;
 }
 
@@ -30,5 +33,6 @@ static MetaParseFunction LANGUAGE_HIGHLIGHERS[] = {
     language_aoc20251_rule_main,
     language_aoc20252_rule_main,
     language_aoc20253_rule_main,
+    language_aoc20254_rule_main,
     language_generic_rule_main,
 };

2025-12-06 17:37 Rickard pushed to rlworkbench

commit 9880a3b1995fbab750c7f964eea7ad9c7dee1d72
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 17:34:02 2025 +0100

    Clean up

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index 78591fb..52729d9 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -1,14 +1,16 @@
 #id = aoc20253
 
-main = bank*:xs !. -> {
+main = bank12*:xs !. -> {
     "#include <stdio.h>\n"
     "int main(void) {\n" >
-        "printf(\"Part 1: %ld\\n\", 0 " xs ");\n"
+        "printf(\"Part 1: %ld\\n\", (long int)(0" xs "));\n"
         "return 0;\n"
     < "}\n"
 };
 
-bank = joltage12:x number* '\n' -> { " + " x };
+bank2 = joltage2:x number* '\n' -> { " + " x };
+
+bank12 = joltage12:x number* '\n' -> { " + " x };
 
 joltage12 =
     | nine:x  joltage11:y -> { x y }

commit e6b65eb6c161a064f48aa3de7a146b75f6acad05
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 17:32:03 2025 +0100

    Clean up

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index 405c5aa..78591fb 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -8,141 +8,141 @@ main = bank*:xs !. -> {
     < "}\n"
 };
 
-bank = number1:x number* '\n' -> { " + " x };
-
-number1 =
-    | nine:x  number2:y -> { x y }
-    | eight:x number2:y -> { x y }
-    | seven:x number2:y -> { x y }
-    | six:x   number2:y -> { x y }
-    | five:x  number2:y -> { x y }
-    | four:x  number2:y -> { x y }
-    | three:x number2:y -> { x y }
-    | two:x   number2:y -> { x y }
-    | one:x   number2:y -> { x y }
+bank = joltage12:x number* '\n' -> { " + " x };
+
+joltage12 =
+    | nine:x  joltage11:y -> { x y }
+    | eight:x joltage11:y -> { x y }
+    | seven:x joltage11:y -> { x y }
+    | six:x   joltage11:y -> { x y }
+    | five:x  joltage11:y -> { x y }
+    | four:x  joltage11:y -> { x y }
+    | three:x joltage11:y -> { x y }
+    | two:x   joltage11:y -> { x y }
+    | one:x   joltage11:y -> { x y }
     ;
 
-number2 =
-    | nine:x  number3:y -> { x y }
-    | eight:x number3:y -> { x y }
-    | seven:x number3:y -> { x y }
-    | six:x   number3:y -> { x y }
-    | five:x  number3:y -> { x y }
-    | four:x  number3:y -> { x y }
-    | three:x number3:y -> { x y }
-    | two:x   number3:y -> { x y }
-    | one:x   number3:y -> { x y }
+joltage11 =
+    | nine:x  joltage10:y -> { x y }
+    | eight:x joltage10:y -> { x y }
+    | seven:x joltage10:y -> { x y }
+    | six:x   joltage10:y -> { x y }
+    | five:x  joltage10:y -> { x y }
+    | four:x  joltage10:y -> { x y }
+    | three:x joltage10:y -> { x y }
+    | two:x   joltage10:y -> { x y }
+    | one:x   joltage10:y -> { x y }
     ;
 
-number3 =
-    | nine:x  number4:y -> { x y }
-    | eight:x number4:y -> { x y }
-    | seven:x number4:y -> { x y }
-    | six:x   number4:y -> { x y }
-    | five:x  number4:y -> { x y }
-    | four:x  number4:y -> { x y }
-    | three:x number4:y -> { x y }
-    | two:x   number4:y -> { x y }
-    | one:x   number4:y -> { x y }
+joltage10 =
+    | nine:x  joltage9:y -> { x y }
+    | eight:x joltage9:y -> { x y }
+    | seven:x joltage9:y -> { x y }
+    | six:x   joltage9:y -> { x y }
+    | five:x  joltage9:y -> { x y }
+    | four:x  joltage9:y -> { x y }
+    | three:x joltage9:y -> { x y }
+    | two:x   joltage9:y -> { x y }
+    | one:x   joltage9:y -> { x y }
     ;
 
-number4 =
-    | nine:x  number5:y -> { x y }
-    | eight:x number5:y -> { x y }
-    | seven:x number5:y -> { x y }
-    | six:x   number5:y -> { x y }
-    | five:x  number5:y -> { x y }
-    | four:x  number5:y -> { x y }
-    | three:x number5:y -> { x y }
-    | two:x   number5:y -> { x y }
-    | one:x   number5:y -> { x y }
+joltage9 =
+    | nine:x  joltage8:y -> { x y }
+    | eight:x joltage8:y -> { x y }
+    | seven:x joltage8:y -> { x y }
+    | six:x   joltage8:y -> { x y }
+    | five:x  joltage8:y -> { x y }
+    | four:x  joltage8:y -> { x y }
+    | three:x joltage8:y -> { x y }
+    | two:x   joltage8:y -> { x y }
+    | one:x   joltage8:y -> { x y }
     ;
 
-number5 =
-    | nine:x  number6:y -> { x y }
-    | eight:x number6:y -> { x y }
-    | seven:x number6:y -> { x y }
-    | six:x   number6:y -> { x y }
-    | five:x  number6:y -> { x y }
-    | four:x  number6:y -> { x y }
-    | three:x number6:y -> { x y }
-    | two:x   number6:y -> { x y }
-    | one:x   number6:y -> { x y }
+joltage8 =
+    | nine:x  joltage7:y -> { x y }
+    | eight:x joltage7:y -> { x y }
+    | seven:x joltage7:y -> { x y }
+    | six:x   joltage7:y -> { x y }
+    | five:x  joltage7:y -> { x y }
+    | four:x  joltage7:y -> { x y }
+    | three:x joltage7:y -> { x y }
+    | two:x   joltage7:y -> { x y }
+    | one:x   joltage7:y -> { x y }
     ;
 
-number6 =
-    | nine:x  number7:y -> { x y }
-    | eight:x number7:y -> { x y }
-    | seven:x number7:y -> { x y }
-    | six:x   number7:y -> { x y }
-    | five:x  number7:y -> { x y }
-    | four:x  number7:y -> { x y }
-    | three:x number7:y -> { x y }
-    | two:x   number7:y -> { x y }
-    | one:x   number7:y -> { x y }
+joltage7 =
+    | nine:x  joltage6:y -> { x y }
+    | eight:x joltage6:y -> { x y }
+    | seven:x joltage6:y -> { x y }
+    | six:x   joltage6:y -> { x y }
+    | five:x  joltage6:y -> { x y }
+    | four:x  joltage6:y -> { x y }
+    | three:x joltage6:y -> { x y }
+    | two:x   joltage6:y -> { x y }
+    | one:x   joltage6:y -> { x y }
     ;
 
-number7 =
-    | nine:x  number8:y -> { x y }
-    | eight:x number8:y -> { x y }
-    | seven:x number8:y -> { x y }
-    | six:x   number8:y -> { x y }
-    | five:x  number8:y -> { x y }
-    | four:x  number8:y -> { x y }
-    | three:x number8:y -> { x y }
-    | two:x   number8:y -> { x y }
-    | one:x   number8:y -> { x y }
+joltage6 =
+    | nine:x  joltage5:y -> { x y }
+    | eight:x joltage5:y -> { x y }
+    | seven:x joltage5:y -> { x y }
+    | six:x   joltage5:y -> { x y }
+    | five:x  joltage5:y -> { x y }
+    | four:x  joltage5:y -> { x y }
+    | three:x joltage5:y -> { x y }
+    | two:x   joltage5:y -> { x y }
+    | one:x   joltage5:y -> { x y }
     ;
 
-number8 =
-    | nine:x  number9:y -> { x y }
-    | eight:x number9:y -> { x y }
-    | seven:x number9:y -> { x y }
-    | six:x   number9:y -> { x y }
-    | five:x  number9:y -> { x y }
-    | four:x  number9:y -> { x y }
-    | three:x number9:y -> { x y }
-    | two:x   number9:y -> { x y }
-    | one:x   number9:y -> { x y }
+joltage5 =
+    | nine:x  joltage4:y -> { x y }
+    | eight:x joltage4:y -> { x y }
+    | seven:x joltage4:y -> { x y }
+    | six:x   joltage4:y -> { x y }
+    | five:x  joltage4:y -> { x y }
+    | four:x  joltage4:y -> { x y }
+    | three:x joltage4:y -> { x y }
+    | two:x   joltage4:y -> { x y }
+    | one:x   joltage4:y -> { x y }
     ;
 
-number9 =
-    | nine:x  number10:y -> { x y }
-    | eight:x number10:y -> { x y }
-    | seven:x number10:y -> { x y }
-    | six:x   number10:y -> { x y }
-    | five:x  number10:y -> { x y }
-    | four:x  number10:y -> { x y }
-    | three:x number10:y -> { x y }
-    | two:x   number10:y -> { x y }
-    | one:x   number10:y -> { x y }
+joltage4 =
+    | nine:x  joltage3:y -> { x y }
+    | eight:x joltage3:y -> { x y }
+    | seven:x joltage3:y -> { x y }
+    | six:x   joltage3:y -> { x y }
+    | five:x  joltage3:y -> { x y }
+    | four:x  joltage3:y -> { x y }
+    | three:x joltage3:y -> { x y }
+    | two:x   joltage3:y -> { x y }
+    | one:x   joltage3:y -> { x y }
     ;
 
-number10 =
-    | nine:x  number11:y -> { x y }
-    | eight:x number11:y -> { x y }
-    | seven:x number11:y -> { x y }
-    | six:x   number11:y -> { x y }
-    | five:x  number11:y -> { x y }
-    | four:x  number11:y -> { x y }
-    | three:x number11:y -> { x y }
-    | two:x   number11:y -> { x y }
-    | one:x   number11:y -> { x y }
+joltage3 =
+    | nine:x  joltage2:y -> { x y }
+    | eight:x joltage2:y -> { x y }
+    | seven:x joltage2:y -> { x y }
+    | six:x   joltage2:y -> { x y }
+    | five:x  joltage2:y -> { x y }
+    | four:x  joltage2:y -> { x y }
+    | three:x joltage2:y -> { x y }
+    | two:x   joltage2:y -> { x y }
+    | one:x   joltage2:y -> { x y }
     ;
 
-number11 =
-    | nine:x  number12:y -> { x y }
-    | eight:x number12:y -> { x y }
-    | seven:x number12:y -> { x y }
-    | six:x   number12:y -> { x y }
-    | five:x  number12:y -> { x y }
-    | four:x  number12:y -> { x y }
-    | three:x number12:y -> { x y }
-    | two:x   number12:y -> { x y }
-    | one:x   number12:y -> { x y }
+joltage2 =
+    | nine:x  joltage1:y -> { x y }
+    | eight:x joltage1:y -> { x y }
+    | seven:x joltage1:y -> { x y }
+    | six:x   joltage1:y -> { x y }
+    | five:x  joltage1:y -> { x y }
+    | four:x  joltage1:y -> { x y }
+    | three:x joltage1:y -> { x y }
+    | two:x   joltage1:y -> { x y }
+    | one:x   joltage1:y -> { x y }
     ;
 
-number12 =
+joltage1 =
     | nine:x  -> { x }
     | eight:x -> { x }
     | seven:x -> { x }

commit fe7bd415aa519c384e2f2aa3275979cb8156d484
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 17:27:50 2025 +0100

    Part 2

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index 292705a..405c5aa 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -3,7 +3,7 @@
 main = bank*:xs !. -> {
     "#include <stdio.h>\n"
     "int main(void) {\n" >
-        "printf(\"Part 1: %d\\n\", 0 " xs ");\n"
+        "printf(\"Part 1: %ld\\n\", 0 " xs ");\n"
         "return 0;\n"
     < "}\n"
 };
@@ -23,6 +23,126 @@ number1 =
     ;
 
 number2 =
+    | nine:x  number3:y -> { x y }
+    | eight:x number3:y -> { x y }
+    | seven:x number3:y -> { x y }
+    | six:x   number3:y -> { x y }
+    | five:x  number3:y -> { x y }
+    | four:x  number3:y -> { x y }
+    | three:x number3:y -> { x y }
+    | two:x   number3:y -> { x y }
+    | one:x   number3:y -> { x y }
+    ;
+
+number3 =
+    | nine:x  number4:y -> { x y }
+    | eight:x number4:y -> { x y }
+    | seven:x number4:y -> { x y }
+    | six:x   number4:y -> { x y }
+    | five:x  number4:y -> { x y }
+    | four:x  number4:y -> { x y }
+    | three:x number4:y -> { x y }
+    | two:x   number4:y -> { x y }
+    | one:x   number4:y -> { x y }
+    ;
+
+number4 =
+    | nine:x  number5:y -> { x y }
+    | eight:x number5:y -> { x y }
+    | seven:x number5:y -> { x y }
+    | six:x   number5:y -> { x y }
+    | five:x  number5:y -> { x y }
+    | four:x  number5:y -> { x y }
+    | three:x number5:y -> { x y }
+    | two:x   number5:y -> { x y }
+    | one:x   number5:y -> { x y }
+    ;
+
+number5 =
+    | nine:x  number6:y -> { x y }
+    | eight:x number6:y -> { x y }
+    | seven:x number6:y -> { x y }
+    | six:x   number6:y -> { x y }
+    | five:x  number6:y -> { x y }
+    | four:x  number6:y -> { x y }
+    | three:x number6:y -> { x y }
+    | two:x   number6:y -> { x y }
+    | one:x   number6:y -> { x y }
+    ;
+
+number6 =
+    | nine:x  number7:y -> { x y }
+    | eight:x number7:y -> { x y }
+    | seven:x number7:y -> { x y }
+    | six:x   number7:y -> { x y }
+    | five:x  number7:y -> { x y }
+    | four:x  number7:y -> { x y }
+    | three:x number7:y -> { x y }
+    | two:x   number7:y -> { x y }
+    | one:x   number7:y -> { x y }
+    ;
+
+number7 =
+    | nine:x  number8:y -> { x y }
+    | eight:x number8:y -> { x y }
+    | seven:x number8:y -> { x y }
+    | six:x   number8:y -> { x y }
+    | five:x  number8:y -> { x y }
+    | four:x  number8:y -> { x y }
+    | three:x number8:y -> { x y }
+    | two:x   number8:y -> { x y }
+    | one:x   number8:y -> { x y }
+    ;
+
+number8 =
+    | nine:x  number9:y -> { x y }
+    | eight:x number9:y -> { x y }
+    | seven:x number9:y -> { x y }
+    | six:x   number9:y -> { x y }
+    | five:x  number9:y -> { x y }
+    | four:x  number9:y -> { x y }
+    | three:x number9:y -> { x y }
+    | two:x   number9:y -> { x y }
+    | one:x   number9:y -> { x y }
+    ;
+
+number9 =
+    | nine:x  number10:y -> { x y }
+    | eight:x number10:y -> { x y }
+    | seven:x number10:y -> { x y }
+    | six:x   number10:y -> { x y }
+    | five:x  number10:y -> { x y }
+    | four:x  number10:y -> { x y }
+    | three:x number10:y -> { x y }
+    | two:x   number10:y -> { x y }
+    | one:x   number10:y -> { x y }
+    ;
+
+number10 =
+    | nine:x  number11:y -> { x y }
+    | eight:x number11:y -> { x y }
+    | seven:x number11:y -> { x y }
+    | six:x   number11:y -> { x y }
+    | five:x  number11:y -> { x y }
+    | four:x  number11:y -> { x y }
+    | three:x number11:y -> { x y }
+    | two:x   number11:y -> { x y }
+    | one:x   number11:y -> { x y }
+    ;
+
+number11 =
+    | nine:x  number12:y -> { x y }
+    | eight:x number12:y -> { x y }
+    | seven:x number12:y -> { x y }
+    | six:x   number12:y -> { x y }
+    | five:x  number12:y -> { x y }
+    | four:x  number12:y -> { x y }
+    | three:x number12:y -> { x y }
+    | two:x   number12:y -> { x y }
+    | one:x   number12:y -> { x y }
+    ;
+
+number12 =
     | nine:x  -> { x }
     | eight:x -> { x }
     | seven:x -> { x }

commit ddbba44513c03a8819824b5a3d0edd032508ceb0
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 17:23:02 2025 +0100

    Clean up

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index d46aecf..292705a 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -2,26 +2,27 @@
 
 main = bank*:xs !. -> {
     "#include <stdio.h>\n"
-    "int main(void) { printf(\"Part 1: %d\\n\", 0 " xs "); return 0; }\n"
+    "int main(void) {\n" >
+        "printf(\"Part 1: %d\\n\", 0 " xs ");\n"
+        "return 0;\n"
+    < "}\n"
 };
 
-bank = highest:x number* '\n' -> {
-    " + " x
-};
+bank = number1:x number* '\n' -> { " + " x };
 
-highest =
-    | nine:x  low:y -> { x y }
-    | eight:x low:y -> { x y }
-    | seven:x low:y -> { x y }
-    | six:x   low:y -> { x y }
-    | five:x  low:y -> { x y }
-    | four:x  low:y -> { x y }
-    | three:x low:y -> { x y }
-    | two:x   low:y -> { x y }
-    | one:x   low:y -> { x y }
+number1 =
+    | nine:x  number2:y -> { x y }
+    | eight:x number2:y -> { x y }
+    | seven:x number2:y -> { x y }
+    | six:x   number2:y -> { x y }
+    | five:x  number2:y -> { x y }
+    | four:x  number2:y -> { x y }
+    | three:x number2:y -> { x y }
+    | two:x   number2:y -> { x y }
+    | one:x   number2:y -> { x y }
     ;
 
-low =
+number2 =
     | nine:x  -> { x }
     | eight:x -> { x }
     | seven:x -> { x }

commit f939b99a0d9392ad35ec24a6ee3dc2b27a0dccbe
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 17:16:20 2025 +0100

    Clean up

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index 997b536..d46aecf 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -43,6 +43,6 @@ three = &'3' hit:x -> { x } | number three:x -> { x };
 two   = &'2' hit:x -> { x } | number two:x   -> { x };
 one   = &'1' hit:x -> { x } | number one:x   -> { x };
 
-hit[VariableName] = .;
+hit[Escape] = number;
 
-number[Escape] = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
+number = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';

commit c299a28b338f0446adbbcd41801de0b87e563282
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 14:10:51 2025 +0100

    Part 2

diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
index 8e91ace..997b536 100644
--- a/src/examples/aoc20253/aoc20253.meta
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -1,13 +1,48 @@
 #id = aoc20253
 
-main = bank* !. -> {
-    "int main(void) { return 0; }"
+main = bank*:xs !. -> {
+    "#include <stdio.h>\n"
+    "int main(void) { printf(\"Part 1: %d\\n\", 0 " xs "); return 0; }\n"
 };
 
-bank = battery* '\n';
+bank = highest:x number* '\n' -> {
+    " + " x
+};
+
+highest =
+    | nine:x  low:y -> { x y }
+    | eight:x low:y -> { x y }
+    | seven:x low:y -> { x y }
+    | six:x   low:y -> { x y }
+    | five:x  low:y -> { x y }
+    | four:x  low:y -> { x y }
+    | three:x low:y -> { x y }
+    | two:x   low:y -> { x y }
+    | one:x   low:y -> { x y }
+    ;
+
+low =
+    | nine:x  -> { x }
+    | eight:x -> { x }
+    | seven:x -> { x }
+    | six:x   -> { x }
+    | five:x  -> { x }
+    | four:x  -> { x }
+    | three:x -> { x }
+    | two:x   -> { x }
+    | one:x   -> { x }
+    ;
+
+nine  = &'9' hit:x -> { x } | number nine:x  -> { x };
+eight = &'8' hit:x -> { x } | number eight:x -> { x };
+seven = &'7' hit:x -> { x } | number seven:x -> { x };
+six   = &'6' hit:x -> { x } | number six:x   -> { x };
+five  = &'5' hit:x -> { x } | number five:x  -> { x };
+four  = &'4' hit:x -> { x } | number four:x  -> { x };
+three = &'3' hit:x -> { x } | number three:x -> { x };
+two   = &'2' hit:x -> { x } | number two:x   -> { x };
+one   = &'1' hit:x -> { x } | number one:x   -> { x };
 
-battery = high | medium | low;
+hit[VariableName] = .;
 
-high[Reserved] = '9' | '8';
-medium = '4' | '5' | '6' | '7';
-low[RuleName] = '3' | '2' | '1';
+number[Escape] = '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';

2025-12-06 09:03 Rickard pushed to rlworkbench

commit e8d75af547d58d4acdac3c32bcdd54f3ae7d2fbb
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Dec 6 09:03:05 2025 +0100

    Parse aoc 2025 day 3

diff --git a/make.sh b/make.sh
index 563845d..1299e50 100755
--- a/make.sh
+++ b/make.sh
@@ -13,6 +13,7 @@ main() {
     workbench_sdl
     example_aoc20251
     example_aoc20252
+    example_aoc20253
 }
 
 dotall() {
@@ -76,6 +77,16 @@ example_aoc20252() {
     out/rl
 }
 
+example_aoc20253() {
+    example aoc20253
+    out/aoc20253 <src/examples/aoc20253/example.aoc20253 >out/example.c
+    c_compile out/example.c out/example
+    out/example
+    out/aoc20253 <src/examples/aoc20253/rl.aoc20253 >out/rl.c
+    c_compile out/rl.c out/rl
+    out/rl
+}
+
 example() {
     banner "Example: $1"
     meta_compile src/examples/$1/$1.meta out/$1.c
@@ -109,6 +120,7 @@ languages() {
     meta_compile src/generic.meta out/language_generic.c
     meta_compile src/examples/aoc20251/aoc20251.meta out/language_aoc20251.c
     meta_compile src/examples/aoc20252/aoc20252.meta out/language_aoc20252.c
+    meta_compile src/examples/aoc20253/aoc20253.meta out/language_aoc20253.c
 }
 
 banner() {
diff --git a/src/examples/aoc20253/aoc20253.meta b/src/examples/aoc20253/aoc20253.meta
new file mode 100644
index 0000000..8e91ace
--- /dev/null
+++ b/src/examples/aoc20253/aoc20253.meta
@@ -0,0 +1,13 @@
+#id = aoc20253
+
+main = bank* !. -> {
+    "int main(void) { return 0; }"
+};
+
+bank = battery* '\n';
+
+battery = high | medium | low;
+
+high[Reserved] = '9' | '8';
+medium = '4' | '5' | '6' | '7';
+low[RuleName] = '3' | '2' | '1';
diff --git a/src/examples/aoc20253/example.aoc20253 b/src/examples/aoc20253/example.aoc20253
new file mode 100644
index 0000000..7255fca
--- /dev/null
+++ b/src/examples/aoc20253/example.aoc20253
@@ -0,0 +1,4 @@
+987654321111111
+811111111111119
+234234234234278
+818181911112111
diff --git a/src/examples/aoc20253/rl.aoc20253 b/src/examples/aoc20253/rl.aoc20253
new file mode 100644
index 0000000..da1e67f
--- /dev/null
+++ b/src/examples/aoc20253/rl.aoc20253
@@ -0,0 +1,200 @@
+1122328377227565294573525668246252925164246287987784122693983869922222576473238222367725229292476776
+3439534344443341434449413434544546443313443434337243446444273233229964474333524343343263333397462332
+6446534656654345665545756845652445664554567453344355533455445732365554785365556466544424657625334454
+5764366546346565433173426656673446256755342552276356475358736554561768323235448436642626716668436552
+2432245322434343223312234234145234422422151425334232333434465223124422432123313313144223245434213122
+6373269138466626334224232272352251726573428236361362251272335335353545412626366252362443323122568732
+5673357339533533557574944447475576653565555474357764385574312376575243553954836367339357555551434444
+3232332132231233321122322231333232213233313332432312143232132213233232233243131223222222233422123252
+2532332134274262221121535425342131732342222326625224242334335132442252434322423352213461259334224487
+7565667856454556567454551653458944467437678656453544834356545556463354463263379773577656253433555445
+1376533544556457252934534268532349354424919842725952222763551835834557316545232355343561434353534372
+2523224493232433232232455126224252263322422141222233724236541332332735342832245213233463352313233144
+2125433524432544443453442442415232314454515362344343344431423442473342513223323343242354443455412243
+2223253513531336231535341344345453334337333533533361233323412322433143663333333373465253335734633327
+4222443232236314324237231323222882275222733343331312832133839321228313232237135332232232382344322422
+2531231222624224222222221242321222233212232242324222212221311445532222222224121224222222221252222524
+1282322243523323214433323343353334144321323323232732322223331131423423332423323326142343424314333343
+2233222322332112322233213222336221232222222214321225322213222122222352112222251322233152122421233222
+2133332225122552132443253453123412221223124644261212221552222235242211223223252155412122322122223222
+2342322335344224245235521242242243244442442432343445366241334834335442144222344342324144436322223252
+2255222226226744212232452222211222226644152224654642222241212623263422212222222123625471252525231222
+5253225434222243232256531212424522455213211226332242213164222254163325125452125461243424432232521451
+4288524434546485223254522441625265492255546828544443435345215657285553533178244452552176455574652293
+3235223132313212332222313343333222533331243421222333232232242221233321253222222311122211231321322323
+4123522222232222222222212221222312422443212311122224412242222422224221222222222421211512213232212222
+3322373222222242321232243243233223232232512214323122273433454631213413261244431323333233422222231333
+2436942332444453225144242332328323644174461313334813734323432222643133233737233352242843536483323424
+6623144536217362257362532276645667275225345632247317547264542717622752322512614462233614623212714313
+7643456556435262153535522356454446472226533567512621825444284454542422642342465553247415548425143345
+4232122253524333334533233324453222123233355235433223215572332412412135421543333225525442333542135342
+4323634634112252442592132533345314252129523914383352446365752563854222222135312255213224324234346522
+4353236333333443555453153222447234744855224242235222342821423544314432335143463324453212425243526253
+4534533361674341342373533433515133733463337326382435134633116532215664264731353346325231336324543442
+2441442233421553345123135143544543514414123543133232143423433134342241153555343533344332141124526789
+2212132232223312224121332321533433233231422432232322122242112121722221232232333333243232232321421332
+8276778647457225634262651262236665334746366328315345666276362545653426736648663235942674241466416645
+6757738683896779756978663273677647866865646763676539757557937794766886638666596578695866568667655479
+3235324533378448433335274942743645133375734577352715333261865358656374737284338777478232537365245343
+4544353485657685546454346442946313765454162559656661655383342671254345353453455264741766557648336668
+4264444443344473336242134323433423332343324333333254454443353213543335532443424243315435135233422373
+1432231244233483432121332254224143463222222243441213141223116223382721445238114213423233232232332221
+2222232322231222124222632512222322213212221522222322622211221322323233231312252122312222125222322125
+5366463442922353342532343315353122223432333452564936553861366438243355223456466376443429233733334342
+3333313233338514434336423444332456333438337336334342944347366333335933448363374642593526334235338432
+4222227222723244622222522625222227222591432114121271213422152232224222226451352886471215497226325622
+1111232241325222223121223534135331234513222224322152124231242425541542225512524325733232352114412425
+2223242372213783432244443234232241344257232234142233121223233244472224342214321145234135323222432222
+7222442251221342522212221263241222371222232252234532724122222223222242224126211222532342223261652272
+4123225523222243223332322233234223232323322421142343312222229252254332222231193233834232232232232342
+2455764672725285657557127457517886446383484443658853833551482862866696188528695445645864389836857824
+2335444449544244436542644344544332333444523525443443443433354544543555542346346934445434844534545545
+5456273732532761553636356321172336466215117763244762713542265616432246521176656227355141144521551389
+2333422422432424443133444224144223341444434246243346423344424236632222442323343342324426234343122243
+3232132222422262223173221122312222152213222216322222322165261222322331222222121213321311112321122223
+3336333635243464343314533547253312547553323635943356434524952334676984593636433632765833434735333295
+4466554446434343493244435644444546434456454446348134436455234534443633474446345344434349465344542534
+2283252222342324222242622432262222323242122472321325124722324133443416344232141342132222553222421221
+4733348213224614422542424524214442636434324322292112134274318423422425123232424143342426622122238342
+2547264446444453762654263745461534446445544246536154444456443634445537415555334834377456344442646345
+3234224523322112535364324435413222325212153235152232455542541542221253231224252442422424254422322212
+4434564642215554435546544343332243535432454423352834136234355653533947223444444433559353348543449567
+2252223221242232222222222222322222135222522222422222212152222212142212232121524124222322322224512122
+6635325243417345346543264825444676456234266553634661542263245335263444345423441364353444546365574427
+7244414324124342461462282831333363334223423253732522331422224422472834422742232252325332625423268222
+2522622422112622217136512442223148422522324324124421413262423456322242411142825222228223214212228222
+3542431852246554422545441526832353454624686525132255542551525344785454952341555431284422845282543531
+6456543746236666493367458482564445566646525647444144454366346513356435534382553243655846351653344585
+4223242121216152122132225135242212122223222322224214222231222243243232242222241122122221122232122545
+3666373263664638165458763666665656467334352246464434543434477354455615261454865224445241343254422436
+2545565568686975346357665466842836222436467776544436712632246471487464342898667553627255465468376526
+8222221224443333523484433432432252335423242323328434425143514452234724343465245447444244224323224222
+2231312223232323222282423422223414222223222212211122131222271221212222132322225122122322122122313322
+2351332722235622221115145344331322225322122522212322121233331363235353126542531252122234332322222632
+2222242222312422212844422121412221224224124242222252422142322325522324223312222232212212221212211423
+2422244322524332312422342135124221236423242242223232314218225183222432432232316163341254323211322422
+7932432222612262562422365343251724436522544235334252356725456232252325344141535346213432274336253556
+9517575495452463285625246622534143448544564729362945322553625244434653552723435775592696432635377248
+3285162422434542545733334242423355222835383224499473445323643214353333757362543467664433552383344345
+2624644522324533575226262424221534652968142565323566422323427228547262322561472973342542424234374363
+4252222322228122522222212224312211422343261243323222142222222223232323122231233212321322212352523231
+6333223322633614336133113463236222231322323361233153422235132233233241222221222633632232623332353323
+2434212432262232444423248513532323352132223343222235343843132342229242656331455524752215233354246225
+2821224223223233412223241321221222321222222132223132222321312242322424223132131232228221623221812221
+2522242314662335523532565226725434225254232633423425643565362345346345325359543433233622333547274127
+2142225142338322332322243224221253323412624233233424332332213311232233333332232242212321243433422222
+5457355948683856656457323863456263474356866754656654653576636656534564565268665746465622445365445614
+2221341212182232121222221241212223211232222322227222232222452221432211221422115225225322222212412223
+3333434443324362261444445643385443327443332324449763243385411335233354943533422338233545444394352393
+2433147245324334441433333313333642232142541344333123332343338463224233333342333343532434433113523383
+5214225313223233254524132672222242143113242231232312312242222244224353533113122132312212131222343213
+2651382833637664484389263776638888223726886234133422477852462545242564244982243246336763492552122385
+3447347335463643563377634477743644335336334244551444337536654736676124685542476435225623446634324664
+6798722675959385959955965473475636478285786397788537344625695675694767865289787789684444365577697799
+4342392334342333343323434242433342443444334332454368444343443444343333316224422333634353433444524243
+1132232222322423222322812312222222211132213222212222223231223222225212222222222222232122232222222242
+6777676475454474963718646644654675646848455656875566677876634666673675765957556849565967666775724657
+9937685975477776554675666685777758757636985565656687448887574884454865669765655445678158564484556665
+2233222122221222222222221222222121231221322322422242321332222222211122222122221222221122511322222222
+5343434464433254367753443233454474354443464536462244254424343346533432454253644316546443536534322563
+4231232232312222222223113211223222125212232132224222122332212223322243121332233232322123232324331322
+3323243333343232234442221332433312233222222241343232223342434132441343322223233243433115233233341142
+2261321222222222221229246925531422323635533332222333422527231332353227222133228352423224227332262223
+5555958875565589677535967847573599996477698587254577575545554589558899538785774458869568857545573977
+5214222222222222222345312246222322237247342225222235222222222242413322222322222222153223442132322472
+3243338152344243429215412527332523242224373343648344241373243332385624742434422444654442336442534422
+1222226123222152934223223122222162221222672222122222122222213232212222222235212212222322222252222222
+5854456249637745756667484452645648695565856545425335866356574555555555676868475555378293465665575479
+3245455545452243862642554833652545413524455331444434334363344434431241365343523434433554332553213535
+2654764623252226452222126726264584214222526925222565934251222228175322722323627475621432222712266228
+2211593522362319922453245223592262143135224173239127386572222172224261212222442582447253172726525722
+1292232247422327232931222122473236332229414132432322226322242422234121254245434124433749432244311222
+2376266634476255566464645552246527646527116472755384536339256364314546223561571544557837662576545225
+4256364466666844987645457666556542666665666585356953545624223376445516665425542276465756445675634233
+3331333333333342254332333333353233333532352323341332433232533353333423443433123224333923333323434533
+3133323315314232333313215512438333233223223344623343221322442854333391333223333321332325333856733144
+2232222221222352222322322222233121222123222321212223222122221323314223224325221232322222212322322242
+3223312325434422333263234122126353314612232211222412424324351423242327324333333214232432252512415321
+4324312443333412313243112123212343331122241334333241341134433343134413422313423234433431244324156789
+4243522334622415411232154541422322533823354423252322454343524624233244321332422341223121253327212442
+2634332652432675331222272824265621332859222925233323632295371137223232376222225232424762243526136227
+1262622222432222213232222211223822221322222123223331323222222236221422512212222223131233122261422232
+2894221243222512212222224123331312229212222125136523212542122321322222222342223223233231221522572623
+2743946428734154148535536567233352844848227254434468132453632673482434344253644422324567623737462358
+7475533242444354536668624624455233655454632655465453454463323345444646265533671445624652646445424353
+2142321233213322114232225223224533224241233623642342221121313233223222219423222211222313433233226332
+3434447434937346434744423322255134514526553464272334633641332232434322443445343343224644244646223345
+2226242226412127622225121242432463313111222132325122221212523113223132231321263325122122122324221112
+2243533353234655333344333313536352333333232343322335123433453333533334333352254222333354553335324334
+2242124281222122144913212222222322222242222442222322228223218223122723422121222222231225222222212521
+6333333233846425213386353453331543224231222232388343243131333732311233327753333353226142471182426927
+4835333534662133342343434444343462583311535233334453433455584323535433641444144234314733352343442243
+6536758559666357457485434644655556854996457444563433954756763433378345587465535696547957436365555476
+3311312223223242222213222223322422221322223222322112254333221212322612352313212444222252312212232233
+5235222121222231324221123333123212122212221222532262222244223423132223241423212211423323221244248244
+2323121223423223324222223322232333233232324222323122223432123232232322222333342323333433332322122223
+5153323234232342222332222226312232113233322222222132233122232211232232322132223222232322222233231332
+4445242122222412252131484252816482332322212742325664246322226222235222222726222422222723148172562332
+5313353552552441443332334323344544346525363544533433453334332452543645345333333145125333435532535545
+2253325121232521322235332544212312312334233333613533544262125333433323242334312213353412313224335323
+3442455225824322325483215225328113822323363525253546424414346444685422225156364832522575532426362223
+1221232215252242322241122222322122232222222232222222221222222312222122524222222322225224232221142222
+1434411514222231342462123235465455646133223251262356536544253133563344423361124424434443451651453789
+5421333333154443254642523234545223143421434524543454242744542212333743422434244174422545424435324354
+2422225221321523422522321223422222221282132222421214132232224212127424222332352213214233722312221224
+8353366333623336363313332333668463335533335157633543646363234266534224738445635343936313336233333233
+4322313323734333233333133324332223361223333223333643133333152343333233334332222431433334232332342333
+4433555432513464345746344453554444945533345446356524754433455232462436463458454945555522134644345462
+1113322363222143322232422212222212112222233722231223321222234222322213321222262213432332223223222322
+4222333453325447341444442235423245335414424246724344234442633222442244424342345526444334443433343311
+2132392234222424334346324322232414433224332241443234442222422333423412332323524464444342261235341532
+2112332342532272232223275313233436223321233437135331262264123523352223532764132713226233262613423352
+4322222423721333283242323831364445738311334244633453347343472243237432374552234437223243212124322625
+1242468252334224755152335722155522422413313344554714234126324454626564243715252472212245243814274254
+7288471218123876835345677886537524525236527146666547752676112542531773366423574584288157326835587569
+7873669783877895986988965879478566639655779488956895968166899989557765975793814875581995987549987493
+1334334411325223943913344532323253464273222224622231241226241385242422514224312467644744674332264744
+1435222224242252225222521223522262223246265253223153233312525272222325424212513524222225183226643257
+3333332333333333333333333233323332333733313223313322432333323553322223334326334383334373323433423332
+2434222434342632322321224344227322233222451243242242322331322422422424223452222341223222524244223224
+2334113333222224331331421225323232452662862632333236231524234433234233233432434234343532393232233332
+4134224234542424342343312344334323334322342434444643233924434333338222243241442324422333425544423233
+3565636644445546545564766358556624446435646236664567636346646356364654647675612752316533743545346563
+2122232321222232134122222263434222142312323322211322222512231121221821122222131125232242232232342322
+5375425527762434248677433758261823212541262432573347762373434443753131295314323323425336274272313675
+3222222222222222246212321331121322212122262252122223122222121222232222222221223222222212222222533232
+2142432532411353333545333513346433433533244333233326433433333566331333335445333143333333323363373533
+3333334214223333334343323343323453434333333333333244343343443343233333334344524233313337434333432322
+2232432224433433313385333321323345333333333223243243334333332252323333233212223342433323353333233223
+3234337223322314472232212314143623424244223434234133321222215136433234223221321442432422424334222224
+4422625214416262624221172625722223459222256245232634254242434722522128225323225713135335221224222111
+1332233222222352233332151322322233222222321233324232332132222233133625322222222323143225333424413222
+1212221233434411242222222232342272261362231222122213233211242123448423412622121212224222245232221231
+5299239242432267722312144753524325235544143326621526223357993233413345372525642521566214321229314226
+4145815259445253437345286245352965222465396946455525666535157576493246439135482348345259474534214895
+4359454935483443642555444253332646423565846452265442345833574549442746543574436733264526894364357572
+4455362612251424257347533535244543123224216453411496584314352529524942421253415255562112225354222522
+1442232342433253322444534281432832532221672244522533352331353433357344632533273418434294521434522442
+4222222215222314232121254322233232222223122634122452442325321222225215221262211462212251222122432225
+5433343433354336555313334535433334646344314443334434323324433351432333233343343453434443354755443144
+7455735614556556475541373865756554446747474542632733338546537454714443436561535533325555442337664366
+3344244343421362432233243522354253434334144424341223843414452442242233253333415322242242421421222344
+6566496645534446467563655546666284568446568656566488652487754568586356364667666343653435344856634686
+3144742294362343433433444152533433333354533454223125636323643244343342222413333242523375333224753333
+3221523222332442343532222237412235442452325221435232234441525512343524244632563143252254222455154221
+3224327652164274373434256367436252531482365553771428333238873236774688169262541264643619643249432147
+4884532535643454176544345559146393647314561543235243325754646564452432255522565243562352226356533255
+2311434244645331433437443324222242222346543444433231311844443214411344612234346424445322444644242422
+2162123222225122221111123222322122322233422452224412222322421212222421237222222225232132222231522142
+4634423245446733424454237456446454376514876546452544686573653263546426444252424446345435263643465462
+3333433236833532333323333332633353333373964224333234334234434235324533133333366333323333233443527332
+2213222322242112532233111222211252231251222334273212372255322233222322521253222127321321121222351322
+3333531243833462333332223231353333233423323335442148233323423433334223232432341332332113321733223323
+1253222412232122142223322252221331232333213442223222222322329232133533222333322223233421612131455332
+2126352214354453312222742413223131233982433261445213341234522712243224286251232222322412242832421233
+6755646362147242536753172684353487842555958732547755226562634346554123245448573341747273467855165235
+2222212222222722222322211223233322242232221125222151222152123226222164222523412311242122125222222212
+3335321234234455143444233435223252532335334336334245233424223444352465523413253533334644323424424432
+3343742454932436532444334343432433343532443425428234452394453474344344383332325454346344412541474253
+2474477763936979663333346343374443344643635572649454475855374386394583444346862733437379465433493339
+3289373373182327263634375433233261632333632233239373343722362254522232326722313742223237132632342532
diff --git a/src/language.c b/src/language.c
index fcfba64..9d16d75 100644
--- a/src/language.c
+++ b/src/language.c
@@ -3,6 +3,7 @@
 #include "language_c.c"
 #include "language_aoc20251.c"
 #include "language_aoc20252.c"
+#include "language_aoc20253.c"
 #include "language_generic.c"
 
 typedef enum languages {
@@ -10,6 +11,7 @@ typedef enum languages {
     Language_C,
     Language_AOC20251,
     Language_AOC20252,
+    Language_AOC20253,
     Language_Generic
 } Language;
 
@@ -18,6 +20,7 @@ Language language_from_string(String name) {
     if (string_eqc(name, "c"))        { return Language_C;        }
     if (string_eqc(name, "aoc20251")) { return Language_AOC20251; }
     if (string_eqc(name, "aoc20252")) { return Language_AOC20252; }
+    if (string_eqc(name, "aoc20253")) { return Language_AOC20253; }
     return Language_Generic;
 }
 
@@ -26,5 +29,6 @@ static MetaParseFunction LANGUAGE_HIGHLIGHERS[] = {
     language_c_rule_main,
     language_aoc20251_rule_main,
     language_aoc20252_rule_main,
+    language_aoc20253_rule_main,
     language_generic_rule_main,
 };