From b94c5be1af9418e8e6449e94138d65eb74d524d1 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Sun, 11 Feb 2024 15:08:54 -0800 Subject: [PATCH] Linear patterns (#1362) * add linear patterns Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * fix clippy Signed-off-by: Jess Frazelle * add failing test for serialisation issue * cleanup tests Signed-off-by: Jess Frazelle * cleanup memoryitem Signed-off-by: Jess Frazelle * add test to serialize memory item from rust Signed-off-by: Jess Frazelle * update test Signed-off-by: Jess Frazelle * run cargo sort everywhere Signed-off-by: Jess Frazelle * run fmt everywhere Signed-off-by: Jess Frazelle * fix typo Signed-off-by: Jess Frazelle * clean up linear paterns on re-execute * selections fix for patterns * fix clippy Signed-off-by: Jess Frazelle * fixes Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle Co-authored-by: Kurt Hutten Irev-Dev --- docs/kcl/std.json | 2964 ++++++++++++++--- docs/kcl/std.md | 157 +- e2e/playwright/flow-tests.spec.ts | 39 + src/lang/std/engineConnection.ts | 19 +- src/lang/wasm.ts | 1 + src/lib/selections.ts | 7 +- src/wasm-lib/Cargo.toml | 6 +- src/wasm-lib/derive-docs/Cargo.toml | 1 - src/wasm-lib/grackle/Cargo.toml | 2 - src/wasm-lib/grackle/src/binding_scope.rs | 14 +- src/wasm-lib/grackle/src/lib.rs | 8 +- src/wasm-lib/kcl-macros/Cargo.toml | 1 - src/wasm-lib/kcl/Cargo.toml | 1 - src/wasm-lib/kcl/src/ast/types.rs | 3 +- src/wasm-lib/kcl/src/ast/types/none.rs | 3 +- src/wasm-lib/kcl/src/engine/conn.rs | 14 +- src/wasm-lib/kcl/src/executor.rs | 63 +- src/wasm-lib/kcl/src/std/extrude.rs | 5 +- src/wasm-lib/kcl/src/std/mod.rs | 70 +- src/wasm-lib/kcl/src/std/patterns.rs | 101 + src/wasm-lib/kcl/src/std/sketch.rs | 76 +- src/wasm-lib/kcl/src/std/utils.rs | 3 +- src/wasm-lib/kcl/src/token/tokeniser.rs | 6 +- src/wasm-lib/tests/executor/main.rs | 137 +- .../outputs/different_planes_same_drawing.png | Bin 82177 -> 81755 bytes .../outputs/patterns_linear_basic.png | Bin 0 -> 73542 bytes .../outputs/patterns_linear_basic_3d.png | Bin 0 -> 69677 bytes .../outputs/patterns_linear_basic_holes.png | Bin 0 -> 84872 bytes .../patterns_linear_basic_negative_axis.png | Bin 0 -> 72707 bytes ...atterns_linear_basic_negative_distance.png | Bin 0 -> 72707 bytes 30 files changed, 3170 insertions(+), 531 deletions(-) create mode 100644 src/wasm-lib/kcl/src/std/patterns.rs create mode 100644 src/wasm-lib/tests/executor/outputs/patterns_linear_basic.png create mode 100644 src/wasm-lib/tests/executor/outputs/patterns_linear_basic_3d.png create mode 100644 src/wasm-lib/tests/executor/outputs/patterns_linear_basic_holes.png create mode 100644 src/wasm-lib/tests/executor/outputs/patterns_linear_basic_negative_axis.png create mode 100644 src/wasm-lib/tests/executor/outputs/patterns_linear_basic_negative_distance.png diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 4a2248351..b80f789a4 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -12958,225 +12958,652 @@ "args": [ { "name": "hole_sketch_group", - "type": "SketchGroup", + "type": "SketchGroupSet", "schema": { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "position", - "rotation", - "start", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "planeId": { - "description": "The plane id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", + "description": "A sketch group or a group of sketch groups.", + "oneOf": [ + { + "description": "A sketch group is a collection of paths.", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to" + "__meta", + "id", + "position", + "rotation", + "start", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" ], "properties": { - "__geoMeta": { + "__meta": { "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "planeId": { + "description": "The plane id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", "type": "object", "required": [ - "id", - "sourceRange" + "__geoMeta", + "from", + "name", + "to" ], "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "sourceRange": { - "description": "The source range.", + "from": { + "description": "The from point.", "type": "array", "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" }, "maxItems": 2, "minItems": 2 } } }, - "from": { - "description": "The from point.", + "type": { + "type": "string", + "enum": [ + "sketchGroup" + ] + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", "type": "array", "items": { "type": "number", "format": "double" }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", "type": "array", "items": { "type": "number", "format": "double" }, - "maxItems": 2, - "minItems": 2 + "maxItems": 3, + "minItems": 3 + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 } } }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", + { + "type": [ + "object", + "array" + ], "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } + "maxItems": 2, + "minItems": 2 } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] } } }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "planeId": { + "description": "The plane id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", "type": "object", "required": [ "__geoMeta", - "ccw", - "center", "from", "name", - "to", - "type" + "to" ], "properties": { "__geoMeta": { @@ -13205,20 +13632,6 @@ } } }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, "from": { "description": "The from point.", "type": "array", @@ -13242,274 +13655,442 @@ }, "maxItems": 2, "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] } } }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "maxItems": 2, - "minItems": 2 + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } } } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - } + ] } }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - } - } + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] - } - } + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 } - ] + } + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "sketchGroups" + ] + } } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 } - } + ] }, "required": true }, @@ -18413,6 +18994,1499 @@ "unpublished": false, "deprecated": false }, + { + "name": "patternLinear", + "summary": "A linear pattern.", + "description": "", + "tags": [], + "args": [ + { + "name": "data", + "type": "LinearPatternData", + "schema": { + "description": "Data for a linear pattern.", + "type": "object", + "required": [ + "axis", + "distance", + "repetitions" + ], + "properties": { + "axis": { + "description": "The axis of the pattern. This is a 3D vector.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "distance": { + "description": "The distance between each repetition. This can also be referred to as spacing.", + "type": "number", + "format": "double" + }, + "repetitions": { + "description": "The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once.", + "type": "integer", + "format": "uint", + "minimum": 0.0 + } + } + }, + "required": true + }, + { + "name": "geometry", + "type": "Geometry", + "schema": { + "description": "A geometry.", + "oneOf": [ + { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "position", + "rotation", + "start", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "planeId": { + "description": "The plane id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "type": { + "type": "string", + "enum": [ + "SketchGroup" + ] + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + } + } + }, + { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "type", + "value" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "type": { + "type": "string", + "enum": [ + "ExtrudeGroup" + ] + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + } + ] + } + } + } + } + ] + }, + "required": true + } + ], + "returnValue": { + "name": "", + "type": "Geometries", + "schema": { + "description": "A set of geometry.", + "oneOf": [ + { + "type": [ + "object", + "array" + ], + "items": { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "planeId": { + "description": "The plane id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + } + } + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "SketchGroups" + ] + } + } + }, + { + "type": [ + "object", + "array" + ], + "items": { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "value" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + } + ] + } + } + } + }, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExtrudeGroups" + ] + } + } + } + ] + }, + "required": true + }, + "unpublished": false, + "deprecated": false + }, { "name": "pi", "summary": "Return the value of `pi`. Archimedes’ constant (Ï€).", diff --git a/docs/kcl/std.md b/docs/kcl/std.md index 598e7fef8..9867267a0 100644 --- a/docs/kcl/std.md +++ b/docs/kcl/std.md @@ -40,6 +40,7 @@ * [`log2`](#log2) * [`max`](#max) * [`min`](#min) + * [`patternLinear`](#patternLinear) * [`pi`](#pi) * [`pow`](#pow) * [`segAng`](#segAng) @@ -2430,12 +2431,12 @@ Use a sketch to cut a hole in another sketch. ``` -hole(hole_sketch_group: SketchGroup, sketch_group: SketchGroup) -> SketchGroup +hole(hole_sketch_group: SketchGroupSet, sketch_group: SketchGroup) -> SketchGroup ``` #### Arguments -* `hole_sketch_group`: `SketchGroup` - A sketch group is a collection of paths. +* `hole_sketch_group`: `SketchGroupSet` - A sketch group or a group of sketch groups. ``` { // The id of the sketch group. @@ -2455,6 +2456,7 @@ hole(hole_sketch_group: SketchGroup, sketch_group: SketchGroup) -> SketchGroup // The to point. to: [number, number], }, + type: string, // The paths in the sketch group. value: [{ // The from point. @@ -2517,6 +2519,9 @@ hole(hole_sketch_group: SketchGroup, sketch_group: SketchGroup) -> SketchGroup yAxis: [number, number, number], // The z-axis of the sketch group base plane in the 3D space zAxis: [number, number, number], +} | +{ + type: string, } ``` * `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. @@ -3475,6 +3480,154 @@ min(args: [number]) -> number +### patternLinear + +A linear pattern. + + + +``` +patternLinear(data: LinearPatternData, geometry: Geometry) -> Geometries +``` + +#### Arguments + +* `data`: `LinearPatternData` - Data for a linear pattern. +``` +{ + // The axis of the pattern. This is a 3D vector. + axis: [number, number, number], + // The distance between each repetition. This can also be referred to as spacing. + distance: number, + // The number of repetitions. Must be greater than 0. This excludes the original entity. For example, if `repetitions` is 1, the original entity will be copied once. + repetitions: number, +} +``` +* `geometry`: `Geometry` - A geometry. +``` +{ + // The id of the sketch group. + id: uuid, + // The plane id of the sketch group. + planeId: uuid, + // The position of the sketch group. + position: [number, number, number], + // The rotation of the sketch group base plane. + rotation: [number, number, number, number], + // The starting path. + start: { + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], +}, + type: string, + // The paths in the sketch group. + value: [{ + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], + type: string, +} | +{ + // arc's direction + ccw: string, + // the arc's center + center: [number, number], + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], + type: string, +} | +{ + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], + type: string, + // The x coordinate. + x: number, +} | +{ + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], + type: string, + // The x coordinate. + x: number, + // The y coordinate. + y: number, +} | +{ + // The from point. + from: [number, number], + // The name of the path. + name: string, + // The to point. + to: [number, number], + type: string, +}], + // The x-axis of the sketch group base plane in the 3D space + xAxis: [number, number, number], + // The y-axis of the sketch group base plane in the 3D space + yAxis: [number, number, number], + // The z-axis of the sketch group base plane in the 3D space + zAxis: [number, number, number], +} | +{ + // The height of the extrude group. + height: number, + // The id of the extrude group. + id: uuid, + // The position of the extrude group. + position: [number, number, number], + // The rotation of the extrude group. + rotation: [number, number, number, number], + type: string, + // The extrude surfaces. + value: [{ + // The id of the geometry. + id: uuid, + // The name. + name: string, + // The position. + position: [number, number, number], + // The rotation. + rotation: [number, number, number, number], + // The source range. + sourceRange: [number, number], + type: string, +}], +} +``` + +#### Returns + +* `Geometries` - A set of geometry. +``` +{ + type: string, +} | +{ + type: string, +} +``` + + + ### pi Return the value of `pi`. Archimedes’ constant (Ï€). diff --git a/e2e/playwright/flow-tests.spec.ts b/e2e/playwright/flow-tests.spec.ts index 12392a923..eea3105e9 100644 --- a/e2e/playwright/flow-tests.spec.ts +++ b/e2e/playwright/flow-tests.spec.ts @@ -810,3 +810,42 @@ const part002 = startSketchOn('XY') |> line([-47.44, 0], %)`.replace(/\s/g, '') ) }) + +test('ProgramMemory can be serialised', async ({ page, context }) => { + const u = getUtils(page) + await context.addInitScript(async (token) => { + localStorage.setItem( + 'persistCode', + `const part = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 1], %) + |> line([1, 0], %) + |> line([0, -1], %) + |> close(%) + |> extrude(1, %) + |> patternLinear({ + axis: [1, 0, 1], + repetitions: 3, + distance: 6 + }, %)` + ) + }) + await page.setViewportSize({ width: 1000, height: 500 }) + await page.goto('/') + const messages: string[] = [] + + // Listen for all console events and push the message text to an array + page.on('console', (message) => messages.push(message.text())) + await u.waitForAuthSkipAppStart() + + // wait for execution done + await u.openDebugPanel() + await u.expectCmdLog('[data-message-type="execution-done"]') + + const forbiddenMessages = ['cannot serialize tagged newtype variant'] + forbiddenMessages.forEach((forbiddenMessage) => { + messages.forEach((message) => { + expect(message).not.toContain(forbiddenMessage) + }) + }) +}) diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index b862f555d..18bc574a6 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -1075,7 +1075,7 @@ export class EngineCommandManager { if (command && command.type === 'pending') { const resolve = command.resolve - this.artifactMap[id] = { + const artifact = { type: 'result', range: command.range, pathToNode: command.pathToNode, @@ -1083,6 +1083,13 @@ export class EngineCommandManager { parentId: command.parentId ? command.parentId : undefined, data: modelingResponse, raw: message, + } as const + this.artifactMap[id] = artifact + if (command.commandType === 'entity_linear_pattern') { + const entities = (modelingResponse as any)?.data?.entity_ids + entities?.forEach((entity: string) => { + this.artifactMap[entity] = artifact + }) } resolve({ id, @@ -1194,12 +1201,14 @@ export class EngineCommandManager { // this fact is very opaque in the api and docs (as to what should can be deleted). // Using an array is the list is likely to grow. 'start_path', + 'entity_linear_pattern', ] - if (!artifactTypesToDelete.includes(artifact.commandType)) return - artifactsToDelete[id] = artifact + if (artifactTypesToDelete.includes(artifact.commandType)) { + artifactsToDelete[id] = artifact + } }) Object.keys(artifactsToDelete).forEach((id) => { - const deletCmd: EngineCommand = { + const deleteCmd: EngineCommand = { type: 'modeling_cmd_req', cmd_id: uuidv4(), cmd: { @@ -1207,7 +1216,7 @@ export class EngineCommandManager { object_ids: [id], }, } - this.engineConnection?.send(deletCmd) + this.engineConnection?.send(deleteCmd) }) } addCommandLog(message: CommandLog) { diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index 05d8a057b..353599689 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -147,6 +147,7 @@ export const _executor = async ( ) return memory } catch (e: any) { + console.log(e) const parsed: RustKclError = JSON.parse(e.toString()) const kclError = new KCLError( parsed.kind, diff --git a/src/lib/selections.ts b/src/lib/selections.ts index 6b291435a..a92b72c4a 100644 --- a/src/lib/selections.ts +++ b/src/lib/selections.ts @@ -352,7 +352,7 @@ export function processCodeMirrorRanges({ } }) const idBasedSelections: SelectionToEngine[] = codeBasedSelections - .map(({ type, range }): null | SelectionToEngine => { + .flatMap(({ type, range }): null | SelectionToEngine[] => { // TODO #868: loops over all artifacts will become inefficient at a large scale const entriesWithOverlap = Object.entries( engineCommandManager.artifactMap || {} @@ -362,8 +362,7 @@ export function processCodeMirrorRanges({ : false }) if (entriesWithOverlap.length) { - const [id, artifact] = entriesWithOverlap?.[0] - return { + return entriesWithOverlap.map(([id, artifact]) => ({ type, id: type === 'line-end' && @@ -371,7 +370,7 @@ export function processCodeMirrorRanges({ artifact.headVertexId ? artifact.headVertexId : id, - } + })) } return null }) diff --git a/src/wasm-lib/Cargo.toml b/src/wasm-lib/Cargo.toml index 0b2e60cf9..2226c9554 100644 --- a/src/wasm-lib/Cargo.toml +++ b/src/wasm-lib/Cargo.toml @@ -52,9 +52,9 @@ debug = true [workspace] members = [ "derive-docs", - "grackle", + "grackle", "kcl", - "kcl-macros", + "kcl-macros", ] [workspace.dependencies] @@ -75,4 +75,4 @@ path = "tests/modify/main.rs" # Example: how to point modeling-api at a different repo (e.g. a branch or a local clone) # [patch."https://github.com/KittyCAD/modeling-api"] # kittycad-execution-plan = { path = "../../../modeling-api/execution-plan" } -# kittycad-modeling-session = { path = "../../../modeling-api/modeling-session" } \ No newline at end of file +# kittycad-modeling-session = { path = "../../../modeling-api/modeling-session" } diff --git a/src/wasm-lib/derive-docs/Cargo.toml b/src/wasm-lib/derive-docs/Cargo.toml index a0703d1eb..f22ffcd62 100644 --- a/src/wasm-lib/derive-docs/Cargo.toml +++ b/src/wasm-lib/derive-docs/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" rust-version = "1.73" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] diff --git a/src/wasm-lib/grackle/Cargo.toml b/src/wasm-lib/grackle/Cargo.toml index 8561f4539..d70fa8b53 100644 --- a/src/wasm-lib/grackle/Cargo.toml +++ b/src/wasm-lib/grackle/Cargo.toml @@ -3,7 +3,6 @@ name = "grackle" version = "0.1.0" edition = "2021" description = "A new executor for KCL which compiles to Execution Plans" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -14,7 +13,6 @@ kittycad-modeling-session = { workspace = true } thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["macros", "rt"] } - [dev-dependencies] pretty_assertions = "1" serde_json = "1.0.113" diff --git a/src/wasm-lib/grackle/src/binding_scope.rs b/src/wasm-lib/grackle/src/binding_scope.rs index f5daf401a..32b133f15 100644 --- a/src/wasm-lib/grackle/src/binding_scope.rs +++ b/src/wasm-lib/grackle/src/binding_scope.rs @@ -1,14 +1,10 @@ -use kcl_lib::ast::types::LiteralIdentifier; -use kcl_lib::ast::types::LiteralValue; - -use crate::CompileError; -use crate::KclFunction; - -use super::native_functions; -use super::Address; - use std::collections::HashMap; +use kcl_lib::ast::types::{LiteralIdentifier, LiteralValue}; + +use super::{native_functions, Address}; +use crate::{CompileError, KclFunction}; + /// KCL values which can be written to KCEP memory. /// This is recursive. For example, the bound value might be an array, which itself contains bound values. #[derive(Debug, Clone)] diff --git a/src/wasm-lib/grackle/src/lib.rs b/src/wasm-lib/grackle/src/lib.rs index f4ae506f4..3a581a318 100644 --- a/src/wasm-lib/grackle/src/lib.rs +++ b/src/wasm-lib/grackle/src/lib.rs @@ -17,9 +17,11 @@ use kittycad_execution_plan_traits as ept; use kittycad_execution_plan_traits::{Address, NumericPrimitive}; use kittycad_modeling_session::Session; -use self::binding_scope::{BindingScope, EpBinding, GetFnResult}; -use self::error::{CompileError, Error}; -use self::kcl_value_group::SingleValue; +use self::{ + binding_scope::{BindingScope, EpBinding, GetFnResult}, + error::{CompileError, Error}, + kcl_value_group::SingleValue, +}; /// Execute a KCL program by compiling into an execution plan, then running that. pub async fn execute(ast: Program, session: Option) -> Result { diff --git a/src/wasm-lib/kcl-macros/Cargo.toml b/src/wasm-lib/kcl-macros/Cargo.toml index b84eabd41..10c93e1da 100644 --- a/src/wasm-lib/kcl-macros/Cargo.toml +++ b/src/wasm-lib/kcl-macros/Cargo.toml @@ -5,7 +5,6 @@ version = "0.1.0" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index 8776c9ba0..510491432 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -8,7 +8,6 @@ repository = "https://github.com/KittyCAD/modeling-app" rust-version = "1.73" authors = ["Jess Frazelle", "Adam Chalmers", "KittyCAD, Inc"] keywords = ["kcl", "KittyCAD", "CAD"] - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/ast/types.rs index 641404a63..25edf2f26 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/ast/types.rs @@ -10,8 +10,7 @@ use serde::{Deserialize, Serialize}; use serde_json::{Map, Value as JValue}; use tower_lsp::lsp_types::{CompletionItem, CompletionItemKind, DocumentSymbol, Range as LspRange, SymbolKind}; -pub use self::literal_value::LiteralValue; -pub use self::none::KclNone; +pub use self::{literal_value::LiteralValue, none::KclNone}; use crate::{ docs::StdLibFn, errors::{KclError, KclErrorDetails}, diff --git a/src/wasm-lib/kcl/src/ast/types/none.rs b/src/wasm-lib/kcl/src/ast/types/none.rs index eeb06ceba..958a296bb 100644 --- a/src/wasm-lib/kcl/src/ast/types/none.rs +++ b/src/wasm-lib/kcl/src/ast/types/none.rs @@ -4,9 +4,8 @@ use databake::*; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::executor::{MemoryItem, SourceRange, UserVal}; - use super::ConstraintLevel; +use crate::executor::{MemoryItem, SourceRange, UserVal}; /// KCL value for an optional parameter which was not given an argument. /// (remember, parameters are in the function declaration, diff --git a/src/wasm-lib/kcl/src/engine/conn.rs b/src/wasm-lib/kcl/src/engine/conn.rs index 0ff96c0e6..ec987e824 100644 --- a/src/wasm-lib/kcl/src/engine/conn.rs +++ b/src/wasm-lib/kcl/src/engine/conn.rs @@ -69,13 +69,13 @@ impl EngineConnection { async fn start_write_actor(mut tcp_write: WebSocketTcpWrite, mut engine_req_rx: mpsc::Receiver) { while let Some(req) = engine_req_rx.recv().await { let ToEngineReq { req, request_sent } = req; - let res = if let kittycad::types::WebSocketRequest::ModelingCmdReq { cmd, cmd_id: _ } = &req { - if let kittycad::types::ModelingCmd::ImportFiles { .. } = cmd { - // Send it as binary. - Self::inner_send_to_engine_binary(req, &mut tcp_write).await - } else { - Self::inner_send_to_engine(req, &mut tcp_write).await - } + let res = if let kittycad::types::WebSocketRequest::ModelingCmdReq { + cmd: kittycad::types::ModelingCmd::ImportFiles { .. }, + cmd_id: _, + } = &req + { + // Send it as binary. + Self::inner_send_to_engine_binary(req, &mut tcp_write).await } else { Self::inner_send_to_engine(req, &mut tcp_write).await }; diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/executor.rs index 3e7c6332b..6286103e2 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/executor.rs @@ -102,6 +102,7 @@ impl ProgramReturn { } } +/// A memory item. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] @@ -109,7 +110,13 @@ pub enum MemoryItem { UserVal(UserVal), Plane(Box), SketchGroup(Box), + SketchGroups { + value: Vec>, + }, ExtrudeGroup(Box), + ExtrudeGroups { + value: Vec>, + }, #[ts(skip)] ExtrudeTransform(Box), #[ts(skip)] @@ -122,6 +129,42 @@ pub enum MemoryItem { }, } +/// A geometry. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub enum Geometry { + SketchGroup(Box), + ExtrudeGroup(Box), +} + +impl Geometry { + pub fn id(&self) -> uuid::Uuid { + match self { + Geometry::SketchGroup(s) => s.id, + Geometry::ExtrudeGroup(e) => e.id, + } + } +} + +/// A set of geometry. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type")] +pub enum Geometries { + SketchGroups(Vec>), + ExtrudeGroups(Vec>), +} + +/// A sketch group or a group of sketch groups. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum SketchGroupSet { + SketchGroup(Box), + SketchGroups(Vec>), +} + /// A plane. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] @@ -212,7 +255,15 @@ impl From for Vec { match item { MemoryItem::UserVal(u) => u.meta.iter().map(|m| m.source_range).collect(), MemoryItem::SketchGroup(s) => s.meta.iter().map(|m| m.source_range).collect(), + MemoryItem::SketchGroups { value } => value + .iter() + .flat_map(|sg| sg.meta.iter().map(|m| m.source_range)) + .collect(), MemoryItem::ExtrudeGroup(e) => e.meta.iter().map(|m| m.source_range).collect(), + MemoryItem::ExtrudeGroups { value } => value + .iter() + .flat_map(|eg| eg.meta.iter().map(|m| m.source_range)) + .collect(), MemoryItem::ExtrudeTransform(e) => e.meta.iter().map(|m| m.source_range).collect(), MemoryItem::Function { meta, .. } => meta.iter().map(|m| m.source_range).collect(), MemoryItem::Plane(p) => p.meta.iter().map(|m| m.source_range).collect(), @@ -1040,9 +1091,8 @@ fn assign_args_to_params( mod tests { use pretty_assertions::assert_eq; - use crate::ast::types::{Identifier, Parameter}; - use super::*; + use crate::ast::types::{Identifier, Parameter}; pub async fn parse_execute(code: &str) -> Result { let tokens = crate::token::lexer(code); @@ -1703,4 +1753,13 @@ show(bracket) ); } } + + #[test] + fn test_serialize_memory_item() { + let mem = MemoryItem::ExtrudeGroups { + value: Default::default(), + }; + let json = serde_json::to_string(&mem).unwrap(); + assert_eq!(json, r#"{"type":"ExtrudeGroups","value":[]}"#); + } } diff --git a/src/wasm-lib/kcl/src/std/extrude.rs b/src/wasm-lib/kcl/src/std/extrude.rs index a59835cb4..ba45aa7c1 100644 --- a/src/wasm-lib/kcl/src/std/extrude.rs +++ b/src/wasm-lib/kcl/src/std/extrude.rs @@ -47,7 +47,10 @@ async fn inner_extrude(length: f64, sketch_group: Box, args: Args) .await?; Ok(Box::new(ExtrudeGroup { - id, + // Ok so you would think that the id would be the id of the extrude group, + // that we passed in to the function, but it's actually the id of the + // sketch group. + id: sketch_group.id, // TODO, this is just an empty array now, should be deleted. This // comment was originally in the JS code. value: Default::default(), diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index cca0cf447..87bf49d8f 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -3,6 +3,7 @@ pub mod extrude; pub mod kcl_stdlib; pub mod math; +pub mod patterns; pub mod segment; pub mod shapes; pub mod sketch; @@ -24,7 +25,9 @@ use crate::{ docs::StdLibFn, engine::EngineManager, errors::{KclError, KclErrorDetails}, - executor::{ExecutorContext, ExtrudeGroup, MemoryItem, Metadata, Plane, SketchGroup, SourceRange}, + executor::{ + ExecutorContext, ExtrudeGroup, Geometry, MemoryItem, Metadata, Plane, SketchGroup, SketchGroupSet, SourceRange, + }, }; pub type StdFn = fn(Args) -> std::pin::Pin>>>; @@ -67,6 +70,7 @@ lazy_static! { Box::new(crate::std::sketch::TangentialArcTo), Box::new(crate::std::sketch::BezierCurve), Box::new(crate::std::sketch::Hole), + Box::new(crate::std::patterns::PatternLinear), Box::new(crate::std::math::Cos), Box::new(crate::std::math::Sin), Box::new(crate::std::math::Tan), @@ -284,7 +288,7 @@ impl Args { Ok((segment_name, sketch_group)) } - fn get_sketch_groups(&self) -> Result<(Box, Box), KclError> { + fn get_sketch_groups(&self) -> Result<(SketchGroupSet, Box), KclError> { let first_value = self.args.first().ok_or_else(|| { KclError::Type(KclErrorDetails { message: format!("Expected a SketchGroup as the first argument, found `{:?}`", self.args), @@ -292,11 +296,16 @@ impl Args { }) })?; - let sketch_group = if let MemoryItem::SketchGroup(sg) = first_value { - sg.clone() + let sketch_set = if let MemoryItem::SketchGroup(sg) = first_value { + SketchGroupSet::SketchGroup(sg.clone()) + } else if let MemoryItem::SketchGroups { value } = first_value { + SketchGroupSet::SketchGroups(value.clone()) } else { return Err(KclError::Type(KclErrorDetails { - message: format!("Expected a SketchGroup as the first argument, found `{:?}`", self.args), + message: format!( + "Expected a SketchGroup or Vector of SketchGroups as the first argument, found `{:?}`", + self.args + ), source_ranges: vec![self.source_range], })); }; @@ -308,7 +317,7 @@ impl Args { }) })?; - let second_sketch_group = if let MemoryItem::SketchGroup(sg) = second_value { + let sketch_group = if let MemoryItem::SketchGroup(sg) = second_value { sg.clone() } else { return Err(KclError::Type(KclErrorDetails { @@ -317,7 +326,7 @@ impl Args { })); }; - Ok((sketch_group, second_sketch_group)) + Ok((sketch_set, sketch_group)) } fn get_sketch_group(&self) -> Result, KclError> { @@ -400,6 +409,49 @@ impl Args { Ok((data, sketch_group)) } + fn get_data_and_geometry(&self) -> Result<(T, Geometry), KclError> { + let first_value = self + .args + .first() + .ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a struct as the first argument, found `{:?}`", self.args), + source_ranges: vec![self.source_range], + }) + })? + .get_json_value()?; + + let data: T = serde_json::from_value(first_value).map_err(|e| { + KclError::Type(KclErrorDetails { + message: format!("Failed to deserialize struct from JSON: {}", e), + source_ranges: vec![self.source_range], + }) + })?; + + let second_value = self.args.get(1).ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a SketchGroup as the second argument, found `{:?}`", self.args), + source_ranges: vec![self.source_range], + }) + })?; + + let geometry = if let MemoryItem::SketchGroup(sg) = second_value { + Geometry::SketchGroup(sg.clone()) + } else if let MemoryItem::ExtrudeGroup(eg) = second_value { + Geometry::ExtrudeGroup(eg.clone()) + } else { + return Err(KclError::Type(KclErrorDetails { + message: format!( + "Expected a SketchGroup or ExtrudeGroup as the second argument, found `{:?}`", + self.args + ), + source_ranges: vec![self.source_range], + })); + }; + + Ok((data, geometry)) + } + fn get_data_and_plane(&self) -> Result<(T, Box), KclError> { let first_value = self .args @@ -741,8 +793,6 @@ mod tests { buf.push_str(&fn_docs); } - // uncomment to update - // std::fs::write("../../../docs/kcl/std.md", &buf).expect("Unable to write to file"); expectorate::assert_contents("../../../docs/kcl/std.md", &buf); } @@ -756,8 +806,6 @@ mod tests { let internal_fn = stdlib.fns.get(key).unwrap(); json_data.push(internal_fn.to_json().unwrap()); } - // uncomment to update - // std::fs::write("../../../docs/kcl/std.json", json_output).expect("Unable to write to file"); expectorate::assert_contents( "../../../docs/kcl/std.json", &serde_json::to_string_pretty(&json_data).unwrap(), diff --git a/src/wasm-lib/kcl/src/std/patterns.rs b/src/wasm-lib/kcl/src/std/patterns.rs new file mode 100644 index 000000000..f47a391c4 --- /dev/null +++ b/src/wasm-lib/kcl/src/std/patterns.rs @@ -0,0 +1,101 @@ +//! Standard library patterns. + +use anyhow::Result; +use derive_docs::stdlib; +use kittycad::types::ModelingCmd; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{ + errors::{KclError, KclErrorDetails}, + executor::{Geometries, Geometry, MemoryItem}, + std::Args, +}; + +/// Data for a linear pattern. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct LinearPatternData { + /// The number of repetitions. Must be greater than 0. + /// This excludes the original entity. For example, if `repetitions` is 1, + /// the original entity will be copied once. + pub repetitions: usize, + /// The distance between each repetition. This can also be referred to as spacing. + pub distance: f64, + /// The axis of the pattern. This is a 3D vector. + pub axis: [f64; 3], +} + +/// A linear pattern. +pub async fn pattern_linear(args: Args) -> Result { + let (data, geometry): (LinearPatternData, Geometry) = args.get_data_and_geometry()?; + + if data.axis == [0.0, 0.0, 0.0] { + return Err(KclError::Semantic(KclErrorDetails { + message: + "The axis of the linear pattern cannot be the zero vector. Otherwise they will just duplicate in place." + .to_string(), + source_ranges: vec![args.source_range], + })); + } + + let new_geometries = inner_pattern_linear(data, geometry, args).await?; + match new_geometries { + Geometries::SketchGroups(sketch_groups) => Ok(MemoryItem::SketchGroups { value: sketch_groups }), + Geometries::ExtrudeGroups(extrude_groups) => Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }), + } +} + +/// A linear pattern. +#[stdlib { + name = "patternLinear", +}] +async fn inner_pattern_linear(data: LinearPatternData, geometry: Geometry, args: Args) -> Result { + let id = uuid::Uuid::new_v4(); + + let resp = args + .send_modeling_cmd( + id, + ModelingCmd::EntityLinearPattern { + axis: data.axis.into(), + entity_id: geometry.id(), + num_repetitions: data.repetitions as u32, + spacing: data.distance, + }, + ) + .await?; + + let kittycad::types::OkWebSocketResponseData::Modeling { + modeling_response: kittycad::types::OkModelingCmdResponse::EntityLinearPattern { data: pattern_info }, + } = &resp + else { + return Err(KclError::Engine(KclErrorDetails { + message: format!("EntityLinearPattern response was not as expected: {:?}", resp), + source_ranges: vec![args.source_range], + })); + }; + + let geometries = match geometry { + Geometry::SketchGroup(sketch_group) => { + let mut geometries = vec![sketch_group.clone()]; + for id in pattern_info.entity_ids.iter() { + let mut new_sketch_group = sketch_group.clone(); + new_sketch_group.id = *id; + geometries.push(new_sketch_group); + } + Geometries::SketchGroups(geometries) + } + Geometry::ExtrudeGroup(extrude_group) => { + let mut geometries = vec![extrude_group.clone()]; + for id in pattern_info.entity_ids.iter() { + let mut new_extrude_group = extrude_group.clone(); + new_extrude_group.id = *id; + geometries.push(new_extrude_group); + } + Geometries::ExtrudeGroups(geometries) + } + }; + + Ok(geometries) +} diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index 7ab28a3e0..9d5edb712 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -1,6 +1,5 @@ //! Functions related to sketching. -use crate::std::utils::{get_tangent_point_from_previous_arc, get_tangential_arc_to_info, TangentialArcInfoInput}; use anyhow::Result; use derive_docs::stdlib; use kittycad::types::{Angle, ModelingCmd, Point3D}; @@ -8,14 +7,17 @@ use kittycad_execution_plan_macros::ExecutionPlanValue; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::executor::SourceRange; use crate::{ errors::{KclError, KclErrorDetails}, executor::{ BasePath, GeoMeta, MemoryItem, Path, Plane, PlaneType, Point2d, Point3d, Position, Rotation, SketchGroup, + SketchGroupSet, SourceRange, }, std::{ - utils::{arc_angles, arc_center_and_end, get_x_component, get_y_component, intersection_with_parallel_line}, + utils::{ + arc_angles, arc_center_and_end, get_tangent_point_from_previous_arc, get_tangential_arc_to_info, + get_x_component, get_y_component, intersection_with_parallel_line, TangentialArcInfoInput, + }, Args, }, }; @@ -1419,7 +1421,7 @@ async fn inner_bezier_curve( /// Use a sketch to cut a hole in another sketch. pub async fn hole(args: Args) -> Result { - let (hole_sketch_group, sketch_group): (Box, Box) = args.get_sketch_groups()?; + let (hole_sketch_group, sketch_group): (SketchGroupSet, Box) = args.get_sketch_groups()?; let new_sketch_group = inner_hole(hole_sketch_group, sketch_group, args).await?; Ok(MemoryItem::SketchGroup(new_sketch_group)) @@ -1430,31 +1432,57 @@ pub async fn hole(args: Args) -> Result { name = "hole", }] async fn inner_hole( - hole_sketch_group: Box, + hole_sketch_group: SketchGroupSet, sketch_group: Box, args: Args, ) -> Result, KclError> { //TODO: batch these (once we have batch) - args.send_modeling_cmd( - uuid::Uuid::new_v4(), - ModelingCmd::Solid2DAddHole { - object_id: sketch_group.id, - hole_id: hole_sketch_group.id, - }, - ) - .await?; - - //suggestion (mike) - //we also hide the source hole since its essentially "consumed" by this operation - args.send_modeling_cmd( - uuid::Uuid::new_v4(), - ModelingCmd::ObjectVisible { - object_id: hole_sketch_group.id, - hidden: true, - }, - ) - .await?; + match hole_sketch_group { + SketchGroupSet::SketchGroup(hole_sketch_group) => { + args.send_modeling_cmd( + uuid::Uuid::new_v4(), + ModelingCmd::Solid2DAddHole { + object_id: sketch_group.id, + hole_id: hole_sketch_group.id, + }, + ) + .await?; + // suggestion (mike) + // we also hide the source hole since its essentially "consumed" by this operation + args.send_modeling_cmd( + uuid::Uuid::new_v4(), + ModelingCmd::ObjectVisible { + object_id: hole_sketch_group.id, + hidden: true, + }, + ) + .await?; + } + SketchGroupSet::SketchGroups(hole_sketch_groups) => { + for hole_sketch_group in hole_sketch_groups { + println!("hole_sketch_group: {:?} {}", hole_sketch_group.id, sketch_group.id); + args.send_modeling_cmd( + uuid::Uuid::new_v4(), + ModelingCmd::Solid2DAddHole { + object_id: sketch_group.id, + hole_id: hole_sketch_group.id, + }, + ) + .await?; + // suggestion (mike) + // we also hide the source hole since its essentially "consumed" by this operation + args.send_modeling_cmd( + uuid::Uuid::new_v4(), + ModelingCmd::ObjectVisible { + object_id: hole_sketch_group.id, + hidden: true, + }, + ) + .await?; + } + } + } // TODO: should we modify the sketch group to include the hole data, probably? diff --git a/src/wasm-lib/kcl/src/std/utils.rs b/src/wasm-lib/kcl/src/std/utils.rs index 0a811d88a..389ab7d99 100644 --- a/src/wasm-lib/kcl/src/std/utils.rs +++ b/src/wasm-lib/kcl/src/std/utils.rs @@ -638,9 +638,10 @@ pub fn get_tangential_arc_to_info(input: TangentialArcInfoInput) -> TangentialAr #[cfg(test)] mod get_tangential_arc_to_info_tests { - use super::*; use approx::assert_relative_eq; + use super::*; + fn round_to_three_decimals(num: f64) -> f64 { (num * 1000.0).round() / 1000.0 } diff --git a/src/wasm-lib/kcl/src/token/tokeniser.rs b/src/wasm-lib/kcl/src/token/tokeniser.rs index f44d31bc8..673ab2aec 100644 --- a/src/wasm-lib/kcl/src/token/tokeniser.rs +++ b/src/wasm-lib/kcl/src/token/tokeniser.rs @@ -4,7 +4,7 @@ use winnow::{ error::{ContextError, ParseError}, prelude::*, stream::{Location, Stream}, - token::{any, none_of, one_of, take_till1, take_until0}, + token::{any, none_of, one_of, take_till, take_until}, Located, }; @@ -47,13 +47,13 @@ pub fn token(i: &mut Located<&str>) -> PResult { } fn block_comment(i: &mut Located<&str>) -> PResult { - let inner = ("/*", take_until0("*/"), "*/").recognize(); + let inner = ("/*", take_until(0.., "*/"), "*/").recognize(); let (value, range) = inner.with_span().parse_next(i)?; Ok(Token::from_range(range, TokenType::BlockComment, value.to_string())) } fn line_comment(i: &mut Located<&str>) -> PResult { - let inner = (r#"//"#, take_till1(['\n', '\r'])).recognize(); + let inner = (r#"//"#, take_till(1.., ['\n', '\r'])).recognize(); let (value, range) = inner.with_span().parse_next(i)?; Ok(Token::from_range(range, TokenType::LineComment, value.to_string())) } diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 073cf5884..8de4381a0 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -481,10 +481,10 @@ async fn optional_params() { |> startProfileAt(pos, %) |> arc({angle_end: 360, angle_start: 0, radius: radius}, %) |> close(%) - + return sg } - + show(circle([2, 2], 20)) "#; let result = execute_and_snapshot(code).await.unwrap(); @@ -559,3 +559,136 @@ circle([0,0], 22) |> extrude(14, %)"#; let result = execute_and_snapshot(code).await.unwrap(); twenty_twenty::assert_image("tests/executor/outputs/top_level_expression.png", &result, 0.999); } + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_patterns_linear_basic() { + let code = r#"fn circle = (pos, radius) => { + const sg = startSketchOn('XY') + |> startProfileAt([pos[0] + radius, pos[1]], %) + |> arc({ + angle_end: 360, + angle_start: 0, + radius: radius + }, %) + |> close(%) + return sg +} + +const part = circle([0,0], 2) + |> patternLinear({axis: [0,0,1], repetitions: 12, distance: 2}, %) +"#; + + let result = execute_and_snapshot(code).await.unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/patterns_linear_basic.png", &result, 0.999); +} + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_patterns_linear_basic_3d() { + let code = r#"fn circle = (pos, radius) => { + const sg = startSketchOn('XY') + |> startProfileAt([pos[0] + radius, pos[1]], %) + |> arc({ + angle_end: 360, + angle_start: 0, + radius: radius + }, %) + |> close(%) + return sg +} + +const part = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0,1], %) + |> line([1, 0], %) + |> line([0, -1], %) + |> close(%) + |> extrude(1, %) + |> patternLinear({axis: [1, 0,1], repetitions: 3, distance: 6}, %) +"#; + + let result = execute_and_snapshot(code).await.unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/patterns_linear_basic_3d.png", &result, 0.999); +} + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_patterns_linear_basic_negative_distance() { + let code = r#"fn circle = (pos, radius) => { + const sg = startSketchOn('XY') + |> startProfileAt([pos[0] + radius, pos[1]], %) + |> arc({ + angle_end: 360, + angle_start: 0, + radius: radius + }, %) + |> close(%) + return sg +} + +const part = circle([0,0], 2) + |> patternLinear({axis: [0,0,1], repetitions: 12, distance: -2}, %) +"#; + + let result = execute_and_snapshot(code).await.unwrap(); + twenty_twenty::assert_image( + "tests/executor/outputs/patterns_linear_basic_negative_distance.png", + &result, + 0.999, + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_patterns_linear_basic_negative_axis() { + let code = r#"fn circle = (pos, radius) => { + const sg = startSketchOn('XY') + |> startProfileAt([pos[0] + radius, pos[1]], %) + |> arc({ + angle_end: 360, + angle_start: 0, + radius: radius + }, %) + |> close(%) + return sg +} + +const part = circle([0,0], 2) + |> patternLinear({axis: [0,0,-1], repetitions: 12, distance: 2}, %) +"#; + + let result = execute_and_snapshot(code).await.unwrap(); + twenty_twenty::assert_image( + "tests/executor/outputs/patterns_linear_basic_negative_axis.png", + &result, + 0.999, + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_patterns_linear_basic_holes() { + let code = r#"fn circle = (pos, radius) => { + const sg = startSketchOn('XY') + |> startProfileAt([pos[0] + radius, pos[1]], %) + |> arc({ + angle_end: 360, + angle_start: 0, + radius: radius + }, %) + |> close(%) + return sg +} + +const circles = circle([5, 5], 1) + |> patternLinear({axis: [1,1,0], repetitions: 12, distance: 3}, %) + +const rectangle = startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> line([0, 50], %) + |> line([50, 0], %) + |> line([0, -50], %) + |> close(%) + |> hole(circles, %) + +"#; + + let result = execute_and_snapshot(code).await.unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/patterns_linear_basic_holes.png", &result, 0.999); +} diff --git a/src/wasm-lib/tests/executor/outputs/different_planes_same_drawing.png b/src/wasm-lib/tests/executor/outputs/different_planes_same_drawing.png index c22597eb06b0453fa35374f4b1c688a975fa6cdb..9c1987ad5da424005ed7ff50562346879de3b78b 100644 GIT binary patch literal 81755 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 R^1o}Q{^eIzUp4F7{}+WuL(~8O diff --git a/src/wasm-lib/tests/executor/outputs/patterns_linear_basic.png b/src/wasm-lib/tests/executor/outputs/patterns_linear_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e6cca263ec2a955c8bc5ebf7c8b23c285e3da3 GIT binary patch literal 73542 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 P=;!q0nUhN=u3rBOVegAx literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_3d.png b/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..0deb038691bc72cdef8879e09eea2a07e6b032f5 GIT binary patch literal 69677 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 OYi{_?lB;j~#s3DsvUF+y literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_holes.png b/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_holes.png new file mode 100644 index 0000000000000000000000000000000000000000..770e2b4ea04d19a1aff8e4ffaa42c7807763c67d GIT binary patch literal 84872 zcmeFaeOy%MwJ*MBKtNGJauhvD1P#^xq7{Ru=9r8QnppK}V|#j2;t2tgsGM_SODwU1 zA~S|qw6xLG(;~${l77xf8yhg;_A2#dP_ZTzowR9!CMGCJAQ2;y3GzPse%D&hGwdzo zob&tR{%1aBnAx*uzpQ7yeAjoa=h-{H^T3iZqyB!BVHjhUExrGr3}Xb|I^T+lz#spX z558|WmaklP|HA*7=lJ}hV^`9$UnDJyD|w~t(31P_U%Phg_aDT68|lBUhW{7;Jw=C3 zOQW-_UHh$X-T%y?^0HC>6>HNrZrHeSrJqi@;;}7n6-};xFzt~I?+ktE^u+ygU)3Kk zzcS2=dFP$O|7gQI=7az9D}MBfx$n2>!<`A+%(U;;4tu6o_64h7`q40#M+X|nT>Qy! zmxpb=zMuYi=soe-J3ZrX-k3$AH%H8-ls8q;q8m4D%%&S@kKA+~cE^9ydDs->rt`Sz zJZ>Tn8vwkC6>S*$CJ46S{F~_BmcZOhTkP59P3LjbdEBH1tVG65&ciB=oB5bc8aL@T zdvN#GrqJR3h(jEIUVgoB$+DaFZl8=zB#VXk8kD^ z=$f3l>C=TVn_|^Xbmnx_R`%8UI=eh(mv7)V?%v;2o-k7y({s-h`93Q@`q^g*Urb5( zVwYT2Y5wz#`OkM1z81gvwZ`7wYO}ZNlIKPLzy<%ns|h{NCG_m|bQgQNe-MoC-BH;+ z()YppN1pG_{B%ub*Z2i(f8Ei4rKx|P`%=@ljKpAIhv{zcEWrIVo$Pyjd9A${SM;3!X#3H=AAaI_k$3rhQ}3%yy_18boA@4rxZ2{T z7SD^gt;YOz{_=;xm9a|`w}!_JzC^|PmwOF|GdwCbG1c~_K6;vEgY`FqzqY*_JW5CZ z$QzHQj^D92JZe{}b7a!sOR6_-g5~`6fjGJlwFlm94IMY{0d<+-vCVEjX7mw!I=i`Y{^slNY9-htKY+krZEtzST;NQqDDK`lr6Q&yb5Z}@asJ0L zW_KjK;ff6Gt@k}&yU4XW@41O}MqDkv=?-(MGqA3?sm@iBKewa$@v2yF-gD=m z?rY?hPPob&2Cg2>OW2-0$3HE@*owW3mU(-!Z%N*hKW!`D%!Mr-3nqK|tNee&l@|7~ zr%)=t=`XRN;WuJm`Y{@=)*4=-?-9Oii-a_WLaR47q9+wT8 zVcr84Q}s^`*<;0S+yotcN88Gb=%`qAH=&zQ_CZEhQ7ZNmlgQT=+yCaPp1zCl-u|9% zX!pK&$&(6=Ccnfk?;GBbqO&tm_MzP3@7SeOhy0Dz7Cf)b$v*4qzH+_>e*bwnH9MBj zwefXZ%zN0=zu+7GoKeYnS`t|ugdSQ+wN z`Z{GC&JQOxQEH2_**yC&Vzj8W9Pi+wLA8Y(lufWiMDh6S&ie6I@rxH%-&cG)bOcwq z4gkB1^<{?R=|daaKSKD#4y;EsFtoE=1zQ8+3O3M{;&v&_#3ml>Yu-}uN&6OavyY{$ zjW(oV=hTO9~1C5@6J{p9hAKhCxp)TZB_}hU`5f56g`Oa~4=n8$w2hbkr zc>^YHyu47~gw?G(^5T5SO>7^U6owr&e%)41$+6lcvU#+FwU1{GAH(IlUAzxC1s6jj@1CTz&X6>?(%|dC$f5XQAJG+pg4C;*`YH#rs%o;YL_e!0Z+Wo~!oXwi8~r~Tc=L%6I(L<;qglLhxIC=lX@7z{ZgWt-i9c6V>>Dtvk4rkDLK${s4>k14useyPRr>MY^< zrG((6CP@UelpjOlP#yTtH}Jl1V17UQUgQewZqJxMvUys4XR(Qcb{#VC*sl(I!#J)G zAo$PUe6_N& z=5Y7U>rei%g^Y>5QB_5eEGlXlpP|Drytnykp|b!jl8+rSdN|@UmQfh=P0EBWUR|EO zkdXzSTLZmRFOP+sc`yPgH3R&iV^+EI$Kd2@V{@5uS{lx1qp4U-SH%zpKl)+Qq4tH) z`h?&k8lB`WirMs5ksg}9EmvC$ujV-VDY@*@D6kPgV`CdfhOuUeN>Sg~+5bj1u?3T0 zCo-VOzB}7bm@-8F%+}(eG=6h;=9QMxytg(Fd~)^ejJ}Ewq783%%=F+u{exX|%)%D; z)_jmfcbO?+dpz+VlzLM9jh)l0E?tf8>d0A}VSqzA*5Io=Vx@Qg?%S8uAIy$G5?+ZT=|0ojNj3RGx1TwuvLU{e)&S={Ovm2NN^F%r6`?qd=ELj|BAwBpWU-@& z=PuJ3SXAbjA8_tz%>qrbZMLx|{_No=BW5S>!X1TSYsNnY(i>{_#5cGSA_7mB#Wxrc zFFbIe_b2ZscP@~t5pC==Z&x1MY#06&yyS%@jTCE#V#)Z;l9e+Hs4-_PgUHWSZeL39 z^0h|wr8!#697bXB7Ua8U!7+)xPPFd^_aSaiIhLq}QHx@qj(sLEe9F+b7I+wn zecD4LdJT2!aiimhSj*jPP)P6;Jn46%u)k8mzJp!~=M$tK}ca<<%^Helg+Y+jeVX{s?e zGJN-oVr@c~u@WhT$EF&N@S%=Z$uJ6Xc1Gzzw4I41g@F?%8}j1eoD1II^9Qd-SlvYu z+${qYQk+zUZjk@$k>fF!oB&s#+_}mT5HWEf2*|=#;LhpPD#(@&y!iuV3spextibs&WBuioC&al5;1N#Vy!78IMG0PbhB9`RSq-z4 zuX*Y$#R>~u{uTGCWakVYM%eV7Siuc)`|6L%Vpv2LGvv{C&=`aSx)r9yCszY*86Oo| zAzy*|N->};mN2g_e2@s;KI1C~hK|GofrOKG8XOk3Hlozp`);qi{sQ}w`l7Sr^YI(Z2$)2H3rY5Tnf%f)}nX9pwR{B5nd?r8dM&ZF&|{`7sHHCXp`p4 z(x<2alS7d;K^5Sy*j=k+ZB06i~u6>?hDtgNJ3&424O|0?M%&`oPl6OYOy zBo9`#uB$3jX6R6^4T)jQp&oa$#M9+TvB`V$#zocpp6x!cyW73odl|lQ803L3_@SW@v_#eR9Ae*(`BbeZ*RTN<%tMu?wOO=;TrvhD<-VDtiEQ? zjPR_ABJecf5%qJ*vhPaU-n!Z#7OJrOO<&K4$sIsc_u2#H7=?F&nW|F8NoEi0S&OF@ zY0$>r-zz0l8b)=qSKBX{UJj3%aEXyrwU>W+$sFZ47CmLwEoMr`OS`-89%pW;uPHMZ zIXl+1WG+d6G%$5sR>z_pGe&1sBs*Hl>I1P^6>lDXvUy$PWsw@UDJ5@ETOO&0_X-j zixgLH-YayOfDw&dx;QZyLB~+-4<+ zEW=q9>~Lt%XY(AoS$vmvLdup1HCUruIJv`+DI@_(gnXhiv>C=Eb_=_cJ0bH5SsW~p zjWA@&>dMuTj&)8ytDI`+Cn`d*hauk<%BVT(6N1;#{CZ{Z{icFzq#mAlJvjI2!I>e2 zH$$gm8!bF$n=jbbRBVQU)co+XnxjE{-qP*9$oAETtl+>=DUF$7;x|o7A`bNULJT|n z&7j2C@zb?Kbb2$%m1Hh(#<~ZFF4b@h`mX={oq`dzF+u&7k)8cq8n!u{7F3d`hrw&; z*g|NIb;&u%1ZbVp`@pBM+rtp^jZ!vP8|REq!D;aKPTZTXj0&zj?} ztY6d8b4ymhIdVTJXE+W64l#a(%hNLAmeOU34x?q;>+q8Bf`>;hbw!4y_)mEArghAW zSY1(s%JS(C4rTW&F#nW&qybl>N~5__X)+_jm16pyWc>p$%JsBq{SzqUP*kYyq{a*}u*i3=Z&<#F9eRT4{ zphT=p5>=t`A$1OcU((jWt?E(~bi%O&*E$E?iS{sBy_Mrr?gm~2Ox*LI^xl#kx=($3 zqP~(XAU>0yF%*YqQOolml%D-jaMRH?OT*28CskEK%y{9a#VHUU0mIiLqsHwH8MmgZ zpMUs3zjEeVENoAhrS-?L>O>^z`_@(`QJCLL<&dxA83U;)v4vvUG z5UbsuJuYoe>&gftP!Lr=zNKgPF;{}q(UL!MfBt0W%!**@C4zKhX5i&@C=YBtSI-Q zLkg)5WkDF=!2mdtf(%8mkjiL17+wu6-&&!&_GECiDlg#US;850?OzdbfXf!o*d|Sf>jUSvI|sNsqBQSj>>nc`?k2w`o1mg+4F7WeX#mB zs=dnmSD_#cRdP$XMs!y7fPje~=XCwJ+1xG|9c?r*`BCN)ajl+rv$wq4cFj}IiIpm6 zC67x)hf9#uX9}QTdVSz)!Or^VDZw+;ZL%?Cd#fMF&;^hckG`3z*)fR~i(TdU87an| z)~T`3)USd2nneowW)`|`T;bp2jyKIz8}<%vr@WZ2872`jWgrgzkHzm%T-zs9Ye|3aTZ40 z-E8-r+C_$P15y!%TokS%9cCn?)KJkWGO%zgT6Yskf%%1%LHjONg~9IzchGvNs2Q!( zQG5&>lzbL>;z1`%$7L+RSArc$T@<7OSE6VE0gEc!YjmRgqL>JMARD~;;k}Wxg${#l zaw7W&iQL2ojFjvrO~N{MKiK!zEd}pn4t%=V*InZ4enQ7Nz0gOmoBJ3Al-V1IB2}ja zmH$rU1U&UZyg)UxkBo(?T1$SOH!K`L@^h)6_55h?$~#t{JI;S!|LOYZL~xqE-FcT9 zq92X*zlrv)$<5~*0*^v5(cLw*YPSC*bQZr^3?+?lv^eV5I2&^Bikj_T<_r|>_s@;~Q#v4S$bi1}!H)Op=zVL#4Ns$G-q|M1V|I064EK}cBN(ohx|wiopD_k%nC zF}J0m$Z-~A$P8_*inj99f9-Zx_sX;GOUHaY|JxT)pBoFmkG!QmdU{0(Zg=tYjHr&} zI1{jg_~*sbit-;gz9(`v-J{phP!lz~W!30k>^~DW^3n3_Ir3&S3hPr={HUyUMbzUJ zCljB!%l}wx*5taxI+yq7;dA|Kch$8xer5y=lGwU%IoRr1xBSVqyLJT<$K0~;|C66M zC@^a8Vzd}O)ScvFlEKlc=_2eS4nKT2bx?Csto1FZ#~p_cK6ugEW}b3$zJvn%KB)|D}PT+=!D(*N7-&JZ24?vQ*~4D%H7me@h3&F^729hnF}@Cn!{Mh!?m3)3e~^C z?LY4-u@sAE7@(?7>ow0CHppKr5l&Nw-@OL(Qy-X)tBe#86m^&Gh)+G7+U%Lo@zPz% z-i5B@lGf#}>4Ego&F5!U6y?o@wy)m?8esbj+-Uvy2yq|NFv4g76Prh(gM?-3|il{o8A-(TlV_MA9BwAnJ4oT$oL=Fh|kSh=59 z)S5N|D>bJgdyei4jFEQfpftdmyDa7T%sVKIP&P`4OOjCj=wLS<0#}?{@+QGt6np5G z63-B`bg{L%oO<7>V*kD3XUq0Nf|;;;ouyY!xC+#)6gbj0aVV6YhVgb=P!a0 zYPG9@%4=Mu3Nby(%?m~Y7|WR+RD-1Htz81nv~8oQu%U=}@EK-f)GpZJ zVK}YqaZspPP-5lfGne$w*kRrlVRTH5Lw10qbl#h;>4;tkcTm@wRjx>7v_^9ZEV&Gp z92R9Dfl%+17f&+C(YwmYu#LdpaA!l!n_|qjDPyL5w$!f6yYVq4?CGw)Oa8)ZrwXYj z*jn2h$kF{{X6J_;NM37<1p)NYZ|HV^%nf60(o}EWXQ7|f-N)o}?Mst;do21}c}FZf z37mLFGnplBI=*8jnxT`ud1ITK9_WuB=RW~vkDNDR^T|N0e{IF?hMI?9^6Og8udX-= z>5XTXRzfLNc1qN2Y9GZ{v*vh>RNQ}&5m*7_>KN^8m@|?D4AbG(YEC+OfSO_uRx3llx<| z&Q0l0_`*&OP7xTZD5?Z%@VKX4Pn4KqgAJKUiQqJ2(8a(gU}kdN-Vf{XU@%UP zj{1*DF$+9f3L3weU7i2D6-72}*M!&;!xS;Wi&1cBL=4VKHBGqYhtib<>SeWe7`ZXX(!U(|1_Z|KhY%`}dH=P1n2s~O*L>2|v zIQC?}27_ZaGiM|^E=4#jr8$%8$4@B57JlQON}@=AbbT2?hlO4Tfd(Z%C8Vt^KEMh7 zf|U!jJc$ewEXeQ74fOB8yakZ&yX(Bh=(@@a0|z6`=GKCNoGr`=D*x-bLv<1c)1=x8zig(S?^K@b`{R!G8CZ*b>?y{Lw!c*6;oX@`IdCn_5Em!v>^@>IKqClpoR0?Js z87TsCG^EHTkt;;GbKs+>i%_Q0JH0#oR>ehrXZf1m(!qF_!N^L<9>vBR&l`?|^94wb zNFf|?RKg?}Idzc;j~u-v_N&c^flDbVmaI}k*dBPE>B0i7cD?MY$ZI`Nfx4+u8c;&!xrOz$uv z43vG~+|r1ofR#fJ*QJ!MqBptQ8pbHBjN{U<3cXaAf1N)dd$;9`4$F`0ab=f5f%&a%rat-upIf52vg3yux5uJm*hf6odA1L-7C1z%8V>SP2T_ylmQ8?fzKpyxjasC3r{*@ z&8Z#jNwMaSBM=mM?$r7E=&bz)r2y-i%SIa$kZ!ETJfzwN#vTZ;HF*=(Z>wDtVNlGO zSeIC}|KN)BN2_+x9`r>^O37)&77EFPL=bMmqSR*&KRE6@4nB}sImIJ{9$@TaPE2KD z`61hI8eu720N1Mu|E2qbuEHHC8aAoiNHLq=(5aX2&*C<1GnrJ*V6CmXTZDSI)_xwB z0Pb$9So_o^Lp|d%lTlk6xR* z4dOyG`>cp)1Ghqo_7H;9ne-_Lo+sD9zmA9IsX*hcOP^9T+snRG1)S26v(w%%vM3di z00hy&#S))^g6u6(vr8ZGZTab;uCoq9iwaXQCoo3I z%D^TDrlSNCzbJiL##7Cn2og{>z(sGFNsJEE2Ktp%waZcG1jz~GZ4gWm>rQ{He)rQG0INU zZ;eIz4t1(=pe-kNn=u;JI0G(gHY=0p%)#U7Q^LF>BpgHSI2x;u6H^KFQM6XUnm*PR z_Wi@g_R28Y#@gjyUGZ)Df)fsaCURvn=WYkNaK=?~X-4I>-NVwiPpO4}dlTA)dzIR% znm}?FyC6H@`%*Yu)u_3UMV5hSlI}0&L1c{b*vA!{`@)|AoF~0n29<{Zp;x)%I8T5l zBZ@G2S9kmLjHjSVVIZC#gCd=VxrL!HLhTDh)Yed6b3Pq4yp~bxw~e84%P7Z0C|w%$ zJHWw_%Q^-}<7gRGc6ufdvZz|FFs|Wd3ZY&`4G~yL${FC=W z)5v>G3v(Ly^8jeb6e2`nr;wauG|@k<-N#T%tzBe9gs~)Hq$EfL1GspxT_vd$N5t$X zm^3UnjHHWCNX;H->HYle3r9R-K{0tLezG&D_%=JOnlj`wXP|W0I&qh=r)AT%o+tji z@sZr?zit$MQ2G4dX`kgj7Svo3erXe1Tv(=BES0yYBD@UJ$Ig4FS+jR_U4z0c2q zoPI?a3$`MIErX~4DwY9M5FwDeAA`a0f{b(J)y>C?JfG$It{-rB7rDESDMr>E%E(Uj zau@48L_~P{4tV-Dvp)}b8bmy-FlUL1&jSA9ggxRPH($TsFxG&E(Y!nBz^%5*}SLO_iRt&U2w(4 z`N!7b1v9U=VZi~U2FS%T71cOsWInja^b`Zv>V(0B?h03+x?~ zmXZ$()S!dROZVme8obB5gu zs7TPO^ug=q9JQk;oT|eYWnABod8uaBk-xp0ZMM`-H@tZUVj)uP6wE)Rdgb&Tty3lo zCoqjFC({hT56{<7c1It$(Xx0gYVT_XetVAq22TBLfF;YMPy8O9ed)f{>klPiUS8?*IrA)uCK`{ZEj0%%~?W}!IH1+0mM*!WP4 zzlgqP7zhCoHB*i_x(>b+4T$9H0G(Zt(P&2O`*!a9gPzygs6{V3(>nDt__C(gJ^v=P zBPJcMDtbL;ld40JB{#L0FL2l4=klt_S+%}|?DC3vB#ClsYNl~KBb2&>nF2HvQ1|H+ zU9_doOJh^H?MAq5$?1u(W(r*8_1vdNM`WtNIW-YoTQ{%*vcKB8-5Z5}+!~>O#NUIt z52y2k8t22uI!9PP5;Fk4Kq!A<3G}YS`O{T7h;s*pVDLSFIEa-Ed?QW=PZL^{$UQtD z)02pUr|u5y9byBh#g_`vbR60Wy1*eFZWf+^7!XAuC>oy1%!*;)5&-Ja)E)73W#Q%a z8+st7hf?5)_O?ES3~keszbmY&nyHl_OK#XECVy9G2TdGI!}WqP2YNv?jVs*&wF6!5 zU#7t&@#%r-AVOm>gL%98EhL~5k+`7N!~ExALY2S?(V(6&Q(~= z2>S^2Xoi>pP*8_&B6ffcL@Ec0!MGK%KJASxG%I1B3Hm+CZh-O>{U@Nbgd=gXESU4W z1b#9G*hdk}ZiJIqY>*2Rq89Y*Jo@<`nm(fDM$gCK5^B_9B_5~FVs_ekN2D#t{H@fY ztTUoxgtN8Lup&LZYDt21p4;2uQz{mNWag+wka9Y>m>48;%NSrzCl(Zq#))8I)2Sco ziLx1RKrm=v%LU;mKoo;0b;8sMWs-M+YaJ@fTa!SlR?SXhL6P^Em_#2E!<-QGt@Iv% zOOTa+Y7yl(<5M1TO%H>+qf8NrB0*X5G6J&*bW+~Q4rgt}x5-W6NbF=j0N!fVP?ksp@!-?(p)OdeX8c6+;OP6@3O7A?}Yec%z36s(8^hB`lb!^S;ewM zAYjyCUFAp;BV&=~&?W#-q>PwH55x|BOUQ-=Va+3uFV9Zi<8S~p0+GjWJwr3U{X+gMAloOT$*qgU*jOFjoF)kS{rGn}!B%!%5BoygqxXa^Aoy!jC!D zrK3F4wPqer^AfCG zf@_u$t4E+7a@ygQu;uEB0D5x( zI51$;iHbbSrkm-Ha$-sH&5biWKe{?HCV0}{^GZ`MPqb6*QxZQz5H1=E~Dd?Cu zw31;fGVw{Qw#S-N95-kxl1ur%q6oPaU>QkQTRVMpl@ozR)^1=830L_s44V@GW&4bo zI5ze67P`%CF~M{2hwX}uR$1n(kjV!W4Ww#QDx?V0qpH7Z2B6G<^r%$~RKHWP%p&Ab zxnvemGENqctQZaNs4`{mM(w369E+_`B@}D0aK^q6EukI9QMO5r>u7(Rrf#74v?o55 z>XY+8btKhgQ6LHj9EF-^A&Cu(qxV(&Qvq5-VpZlpF_tWx+yef2$H0yUMGJH`=md(w zA@0%e2eAI;Rja9-N)#RWQP3T1_LRtjg<`BWO7I$cc8%VCa;VGS@yi3jhRwb{B$uyB z>{Y2%(^g&k`i8A)s*1^1Y&iFXl$xdWR2JTGU$Kz0#ftk-nf~+PSQ>1xYd1#SAbsTz z>{iiGm4wJd91?kguhHrv9Zu*jc(+E(bcufsw4l)tSW~eq{ZZii#qeuLA4ksK)4JM$ z!U2Y7?w|{R7qI@L5KsR`PXK{S-_%9G(m61Nr6l5`5iwHYf0%O}6x0h4K*6fMhH(G@ zamX=f)kVSf7G^~eq7djMW{pPytq(!!+3G*GXE*izJfr`lr?uS-wtIB>V4r@PmhS@l z$l)4JZa~EQrBT6;c{-bJ*X~xgnjEy`x|!1x!wtZuWd?Lt#r=l26%BI zy6jen6N`+#R6|=~1Essp<;nt#AvZ z-06>QB_9kQF+Kw7DvHc1jEqAzWEF)Q5#f*@Vih@usQmy);h;*^#6jUh@yr3L6oCvE z4!Q=aOy~dvD-uTI8G~XbqxLj% z!;@a6NZ0~d1VXKH=drG1q)WO&L`kpHlkb>gfR7E3nsWi8P%vREkR6Aa^n|S-T&OfL z$mqU>p9O-VCF7EU_ff}F7V2EiC=u85QNCFHe3AxV55{JOs!<+;c1f=S>__}BW!v8L|etcKw znvST(t~dN#Iwre8mq9}qaVTkk&WHeq{2bBJqcI-xI|3Xg=nes&G6iK`q-~aio*!gmUwQ za1Ao|u=cV!b|exe(#QH5Z3t453@N(`E;ysl$VO9_3UY5+$|%4%?e5P>U0+k4j5i&qD73*4Um^EqEa zP(Kr;QoX>{p?M^6%#qq_wQ44`qOU%ZK&Bb4t2V;sBO763Vy;W`C~^WUW6Tt;SWHks z%NVkSPk_!+1stBYm|I{n6JyQA^#Mq7>r8O=)YiPdY)tdKRosyR|4PE04HnDGV0I?T zY3QOuOq+>%EhMUd0ZH63=y0=AQOOJ^IOdoO41iCB|LN0Gl-!UhAc?3r!y8bYn!_6z zF90M{aYVUYs+9nqu-CqQa2gFY7%qHyaI@+1{iS17Bao6kSD33?K$aH}tlcQJ zN!?d|PTVgOX}TU#Jah%ooeG^P&})rqoY@9$E1+D2;yz{2I({Yr|Fu!AG18nZILw44vP5&^et`} zgb%SkPU>pm`$uaD-bE1)#ghs!8TFa4q z*)Pp_p2dh#aoSQ>39upH_W2~_HWUyj>Z1QwMF?ht@}sCmn-12L3~OP%?+tH5^fY8H zC{a*ZZz9_B*lQ8whSx&1Z$wJzq*!kq8jMF^4$Lml%G0)vA^g&UK!K!Z>lk8&Le?cf z2KFS#WoZ`d#er@$1X(z(T`Ihi7jvK=0MXcw?u*hlvr?U)`58HC9~O?u4FHM6#ftxe zeF8qFO+@@PypFuL6Z*O%J?GhaxPMG1j?+Sd)|gP%2s01bCT^?vx`1*+Q%#byJFrMg zYk;}cOO12vwBWNq{E4(jIe@mo6(Kc`R4IBSRYADTaXC-=K!vE%?*;#sP3`5bk~8RV zq$Yd=cM4pH$(WDf9bEG{06AyFnh3n1Y$qiwPQB6c#ei_|0H48Z2mOWnLjFRy5ZMm- zG@2E{;h1EL(-9ko(mTM?8o+eO9eP0pyDS4ANV+;o&|lh?KUXe?!1~14f=_ODcMaDk znym><&##4dX6as0^R`aO5+x4p(k{rNq^f=!qo&HJ1m}VjTvVYm6P;HF7r~9L-&S9< z6pbd!(8^5Ead&F^6w2Ad!Ddj_Za`a+{WObKQ-g*NK{1%iCNT?!1Mal0z#@-HA$C=E1PdDugffdQ!;ZqR97+gGSfB&hwNZpf>4Pj^i;)#@O zS%tug@yJTWJHX4-<`l?%0t(4srXT^O;7Cvr!HLxH8qupI`E&w!%R3$t!kPd^K=AZV zMuuQg7O6NGRk#*`rt}%w&j5<5Z1CjW53pQ(OWwDUWP9zYewJ2~-tC9dA69R`F-9A0_5Df%(B{?LL6rt(H{Y%@Uha{ymb+hmm{bM0)DcCcx#vi+Q9%KtFEJEq zP3Ztp1ITzz>pHhL?-IO!=CZ^8(%}0kD)PtCVoycTlUW@zBbKJZwW5qV4K-N0=hCtn z>ncuChso%cQPbh#S;YIv#h~>ZQ~>C1YOg?0B@siMG%hk8^xM=dG+&PalR)B6JD0w; z3cvN@STrg~ttJ@fj4b#l@PoI?Xwq@;d*Wu$9#DH6TtdWbj2T5%OckQCdBWxseu7F%On*`5>+P_sgsE&tx}!Fw2363RD8uK5EBl)@z^x1T673iaHT6z)2nlX|y*w(Q(>uhuL zA|>}yliNKKD5U2;6Zn-nSrJcI zkcs5b!GJMJ)LO4@?=cnj)-cO957)!dfR{y_VOAmsG2nR)t}tK%r11vmhbqja+QGPzf^5f3CL!X8 z<0UGB8l0&$oDdIBCXT#?It0;rgb?dOGK^>t5frYqs;rA3NR+j8bOeFT5me$qg;BxG;ok5tPz}jo21CX`YD#H}S~lto z@nj5;*A5wpGDjx4@V8MDsfAkSV=TMF+)m6 zRK_%7O{c@#-G!ndW){K7(d-8s2+W*-E@>z}?oKq01UnjC&|3|Nmc{`N1_{)D+F>0f zSg;Cg6%@*r0Z=0*!fyy|0_#v7mGTfVKR`N2gFtL_+(y}!7zQyJ$h?4K&yNPgM6@9i z1mrNYa579(htDlTu^rqs?yPQ?b#FiR0dS}C_453jh%z%28;5Lni5)nc12E!2=g@!c~creHqNY9OjyvMw3 z3$$)K+{=HW^7K`OdvF)=P9$wN91zi;MMgB!OH^?p#|0)7`Yz(8Vm73%M*!MDTs=d7 zDjfh>0}yolva7#&xH?n2o_6dhmH2F1EhC1P53&J&v)v;imO8EM|bx zy|Mxd6i5U(7eKfGbBD47QUC~<8zp{`HyP84(GFpBv`_7LY0e%b%Ef2a#QBd!AU}rM zd!f8W6i6}Be@wc_noSxHPeWgbJ?N1@Nd&=@ToWPxtz(9<1&SLWn)L`E3b4*YjkljB ze+2ptWfDr|utmz-@Ie$0DF0I4M@EA`uH9je)7e9;xDa>?Ku~lg>%rf4u|ir~c&R&<1Kx zw9d-Ptxe`?H4250LW`)bl*K&M+(T2X<)If*ZJM?<9PxmIfsO?R%mc}S2B{o4B>4)t zr-jY)u)Y>rHmUP<&W`vp%zS9Q4;)4e*4aXvJ?62XR$pIpE)i1@Am!8ukv9HDK-&R| z;<8xjV*&ILgefz? zrp*Bb8BDCE2m?|AOm|pHC@LUY*LfQ%(>MK3zsgR2m25;eJHrxe>LkOn@;*h(22lCw)HZWwJYos;`6EMGN|h!Q6o9YJV{q~J zTwKz&9+_F(E=w5|my0r8){0b_>9ibcJNWck*zczlGU35iv_24N5QiGlBD3{6B{rBxpz^ZIFm(A3vEQ`e2YbdKz34o zT0vD{DYV3;NQ^FBmB?TTtzH6`6iTIpg5)gL0k?(lyqmET&=QRbp(DjXWA;0_B~*E- zBm_hS$7BFCQ&ElIktfQ6i)HqY*-`kVa5OU!VT!E=lcT6V&t1Rm7_n0Xx+AcbS&TpM z%dX&GhYQ-(A=CJ!1Z~@LFqP_g7CbprI>MAUx?4X!NJVY+G!e5wGP$NG1OSkYn6eUQ za56`RG18zyCdOjm*}QSCPm4U?^LM}7IEV9y&cHgFrB%BdGGR5hEDD}tOPX%>iOPQM|eP{4@gE=!!2n`%(RJE4ld z0BgVSN-6f27ieuXDqrUP>2BY%`QKfZxR4egqXOUv{$GE_-}}Acai}`d*Y~H=$}Uvy zj9dDGF#=n$g*xa*eaGwkJ8b!Ss>Ax0m#RsmR(Sdn6-iW3NAQ8X&ZO-qj~XNY4wX+i z$tZkEQvYKs&WX}16mwb=u68PpWWIWfH|qE@RSF zVJ9m3O8qmO-eAofo~@5VtLgbTClxoHixR2WNlo+U&(Uw4v?v^JhStWRqPdmZ+flh! zQyX;|SSuDUr#KN>T} zOBqfnI%&DMWH5Y2n+Hvi!#}Ex*3yDoMcYp|1b&e}cPofG1MOI|(e<-77yY7hOP6KA zUW~bLiu{K`0@?_Q!r4I*RKWL)4xE$33!;#x93Z~ZPLUHB7#rFP+_aJlt=vM$pm`n| zZIRaR71V|a#K$f62aru&I2yERoB;Gdz>N}1BshqM=;z_25^o5=b${&Xu4pXWi6Wgp z$W2G;K|Y?5da>)pB3EgZQR^8b^vDwH);6UbOu5U>YWYI<7cxJe@!Sb>j)iYAmm)v` zxp|=+24^th5-Ci9d2wEx)D(>PmP%-dioshV;tAgg>GEw9G^h$lO{CnKYhp13UMvSS z8&Iu)(U^dZHgHry>oE9ZjJR{@RHTlhrtdLv=fFPUl{V2hxOU$#Isr60VGcUM0tk^o z91_J89uh!_(0dvlAT_k)5@?{QjYwMv5)hIwBzST1DrkXo8pI}wM08$V6m)XfqD*J2 z0~|dHy^`KsUGR_ot{)7X&ptwrXnj?dh*908$2AMNZO8&NC(Ju!#Pl-JZdsv69?*Km zoMW>VHBkDAOiN(#Y&RkNKt=-@9$e%!)ClQh6Jx{C%87u6fx$l@HtL_o8tb%l7%0}v zq>h}m&_imYM0YJ{0;C(y(F}LAd(qIy5CL%0Nbv|IZbeRt5HtpZ0CYiS<4>Y-ScKkR zu@wJeS}lM897afx1dtjPwNbl4J!2&DOY{H{XCqJ{Yv`ch2bd|q<79;IIZZRBc5=tg2k<*M+oD32pAUq^L zK{zz`vskx*N_A*#I|GadDlFANBiaZ9eY_Cvh>78#gwdjkKMS1cz* zXEy-b0NzZ3?S^~^O%oMEz=GZYJlKt9DOT+w{x=Gq4kHRmhI-yW6`+9)!wJttEt*vK z2HzrYX&>=r5n`Uzpf1`%S-Ej87i_Yc`b4$)5a_EY$*A!SpXoHlq;9u~!FR1Xl{aq0JQ3`ICAB z2(VRFZTmaI4v5kK4T$iFqzp8+Iw}4W!T_G2$!%6lF%)S~r_=q6KY$;+Q8>&f`~glO zMDceocw^}(_!-ayFbEDTh=NeXIGms02hPPn35bDq8#xsnUK%{;y8<|15Jjz2>J4v_ z8^tDB!VV{9lmxs>Kal&B-*TfA!wUungTR6ssNxa{YhX1yfgDT$b2SQyK7(b-`1Kow zEwGd;=I7=4ntFa3$Q?Jps3~J*DkYOn@k&{9 zNd>aygyNSWaTOJzPk zK~OJ_R3`1t+ET*{kzl0x=1XlblSq-GX_6w@QC;AIsV`lkZslQw@H zdrrmwY=?l-No0d$cx0hdQ(1)t*e7!Lp)vtjw{$QH-lyX@#?gUcWm7}eECxr`B^EY< ztW4|?)?D#-w4Q0TS{Cro||$BY$fQgY3Py#wG1Qv?ZWgU12t1xhdKBNJvD(QZY0*h1`Wl@0qRVeX((hucrglvWz=sF z;utrA&0wrTWJUizf+JXHib%fT4_5CdumTDNJO_AQ(6lsd5pMt$36C5DtH^K29s&HA z($J7Z@FDm{=9h%_)`myK6HY|kPXra~|Mzz%7hL`KyN52~{Ko_p_WYMDtw*}Zu!MUV zZO^DSZOg6*rQ}!TA%3zLW^c@qhiH*qeUigW7TV-XAJglwML4k?7;d-d9!!r3((12qGam3dRW2AYCFU_)tP ztW_{K-aw&`$_qrCQkjiXSbhU@qii~gI*F+(=Hkj(^LrMGMX78cRXf?!T-uvZr@AWr z3g7U-7^a?Zd7l!KyGg^6W!N9e6~^ z=_NrRU^>(m9uOu%1lbT(q0!C_NC)GM(Gdj!su91e4@AC^9W@T%WY7I|f-L|$G%DCj z94>vykjC;kYz6gk^A(@!sA^>ugk!Scl{t{aB=oK^FH2i_u=c)kDl6W zzU%HEaQDwO{V4jDMN;UDG*2{{SeV{y_-5nY{A*>j+?#DDTE*r3!#y4(GG|@XD0dc% zyU(ea^L|Xl17{Kn_S}Irvv!<*22*gnC&Qw!fRBIbGw3ItIXM+eXD9C3wkGw$O7sM- zFPn*Vr;#f^vmX;<-~f+LjP1f2tUyXdCv%zHMINmZ0<89%)o~mAV_>GUVPLd3_D`-| z`047|En8`qqBXODRxbFBH?kZptHLJ+Qd9OsrYxG6ixu9zcf}+XB(ZbWd`l@J}xrs?sd;Mmzoz>HnqkC zuUGrjbi}ucCV!d8cqiyP1W8Wr@67D^7BUOlb#C+l5$^G*(`xjTs%CwvknK^3Cud4p!9{sc=LshcPY*nW2+G%zl zlK#GKPYc(84!Jix?Kgj2jTw{)y*nzqN6KT|Jf8|%i@Nrb1);;pN;XFDi@VJ$s3NI_ zm4w?1_*(X56s!A^X%Sn3jRo(tT{9&|dw1nPZ*`$wX2&n3S(#s~%7$fXLTArjf6uGZ zl*r~``o^(a9B_Bp7qeFIQRok~l7^e6JKfVR+{g*@K1s>dGtJx^s8B|0*MGmN*YgQ? zH6j5-kM4`yoy!%==Hy^=^%?U%S=LRs%6|8k3|t0ejR}4Q@gj$nSBw81Fu%pDcc*zy zxo_2t9dksMDU`)<^{`V0+OO)Q_wmhy>ZF!cn)U@V=b`ynmZA@se`A;K=i@^w=yCJk zmnYNxAXv#e$^)BZ=(|0iV&SXm&ZmWSOR9zAWVpS?*5j$fqjRqI)YWH;bhM zOFaq7bJ^1AfG;gQ4hO)~|GUiI=Oh6}B5P>#!l(`AeY`F*%Wb}0z+14|?ZbEyCzk1k zg7E-xm9p<-X8*}dc@(i2saYvc1_~w&AU-t21z5?c3Y`E8X9JTg{I*Rr&)`d&Ha=ymj%{;4cu6*GQ zV!v*Q_-4#-eGP9(W1@9kj8&!?p!qdT zBlL7kWp^RQQr1Qkh2auVxz;#ccD_Q=x%i4%%I#$vF-1JH{|`N$%Th4n0mE;k_l$I* ze}gDokLOcX&s(J(4T>oGDSPsDAL8{fd(Ca~q*3!Z$y^mHAWs^tl$k`mJUo|7nalfo zPHWc%D`lZ2>$1Mz6R#twYdW5fdA=q)XFkm|!Zp*a@Dg;gQ@@)PsJGnLQ{E&i{hU-b zAZo%kaK7K&$&*=SCENi#JLrK*=@vE25j*?yHXp9_aU$*F2!FR@zq7L&4PIB;R880DHuWGF zrMPM;uhltg>!U1PJ!=tXwM~KBY0cBHn&%TN*?#v%3V=dpRukSwq-PgR?qv)2kF=P- zW3a-k++M;B=B!|)<@$#Pmv1Zgv1GX5B1;p6n&x)eo;+@<^&iA@z~_(W8TJC2UgPVq z$N4^Xpt44Kvr_gScp2H{=&R(l@OyZQtdj3ECEp_ZQ@K5A{27LZ#^3r>ZY4(bXdTls zwGA%fbHWef)y%A&vR;MgK!;M0>nv6tZ!K0{zNwN~&2_pd1$ry8jGM>^Q889-STC-b`qmFc2K;YZSEvD_U@eQvw$A0(!V8;uE%qQ z;nCfmz}>z!=7UPiQ__mcn&aaq$n)IfPEWKjN2YpSM`a(7^uro5D{B;Nt7=(~i+3=@ z*5L;%Rr)gz>X~wNtedRZ6U?0q9Pp@^>+iyV;yplpedMc}j&^;xxiYAn-Qxn6#o5_h zUI81F43NYIUT(P46R9s={Ik6Tcb(&8r@HK1zU&Nvmi=y-XVsjgpXe-63c$Q)Y7a38qxV zpjMUXS{t$@Oo;PU0LU-SSG>lP;|ICu+RJzH+(KC>IIV*fN5a%eGgoeo?D85PZmv>! zJ61l&HX$K~A$6l55&_JIR0vGAwv($y%vOnSdNn?eT8V?bU->@iA=Ii=djqa;SdcMb z^Hm#cZsnXs*71{bbbGGaQS&L@#Z8M@{Xz0C4s~LIzIbJUj}2#m0zFj5{h$n>#%yX` zgF)m5Z6HEL3P4DGI$e0KVBgQIa7f8ne1poJ#MiN$TA6StH(U9K5(WLl8GJ)2$W)~u zmzl$ezQ{L<{Y5uKPCDyQ^BW~4Q6d(bZMl=4j`#wFxbNe@j$jb8kq#vEojY}OLRyCn z73B_tim;Y4oP;2Lg_v{2^U13SQowTi{Q{PKvf%fGIz<;KHMQd8C&!ClRx9P46tx!M znI^qfl1J^EEce~YiF5HjT7#sxNqQ1m?vxZsLRalit$?4^3KT*g4Da)HDV6dfawjEE zU7(=EX~{&a<%TE6TfId3$svGVT_A<6U)t6A6w>B(Qd0E|m&=R3(dDT?DI_4~7#%cjlS#Y0!w zp2@n;@*K>x4vCgR+jwr{-W71Fpi-$?gx*&xJv#Cl9+Nro;+_LP95Kk55?T3G`}0@- zK~evqUyxzGY&+V2@k92yd`qKvvcOkd(+x*iK{vlYiR8Sp6^%Im#l?m0Q?yfNV4$_* zzki|pgo)*UWnGt*#l%D2E1giinIAK#X=C%1ZqQ=0RRB0?^F|363`M>$W$^~b{Lnn~un%2f z^fZBC_R0qhM5YdlSy_1>5 z1As5NOSdoJo!V?YjK4I$`wW{SICTurv(b# zrrosSztT@iu1VR(06XHAJ0%XQd%p}CX0gBv!Kmpc8AUK&yDmO3Z9OHp^hn-!C7r5j z=DQ3LUlI^4_tCEQ1Bl!gY*n}^;VR2iNDcj<#Orc*^5E(ROH~TUrt;)FYwWQ3JYSBY z8sSNuJR`B?mD7@)$bB8W{5q#Pdj(snp|QsAeFr(?<`n}ZU9{4n>y&IyNXBYiJS%s+ z#7+^H0-Qqy{K{#&gkNXd;`o4Q5D;j$g*n}Qv+kv3JviY?d*nL%bmlW853l_xfq-|L z`p-1=SFw`LQuo6%_~^l#xrHSH|IaJP`u@ay+GRmtVK0gjIjMVr577ReVA@ zHZM0qm%Ea^G3QH^CU6gM0bDSt{%1=9^}W1Ver~o4yAL^75)~Li9qxr36{~ zIr^eN>3y>{TU&V`%`4zw|G;^!GR{BJmXjIcpo?+E7S8;U&H~cZNetg=FRzk071His zd--*Wx1&_j@*wYMO|jB9oR=hw8FefASfSJ+OaQzMeY~^A#(Ci&)&+^u=ARZDWRpTy zi%NQVu)(q(iM5y?@WOd9Jpuz+7#nsfj1mQYmO$o%3&O~WmCdqEN%M@hTza0c8BkPt z3@}ckt6K_eENt~y0Dc}xzcufIB{H|EVl1~TV*IVdol@xYg9sa7bsO8(5dzu`50)}? z`fzjmk(C~%cwwpvVA12hB~`~QigAh((n!u0hl6;EM;Z$e$-J>pHl7KJ0D07!a_Lzb zud{|#u?x7OAhhUr8=r=>no=u+FaVj8&qZV)Y`Ns%Y2=q(fJ4Gfs8&LV8)1T~iI7-`H3wE!UYE>uvfKN6&V#GjTDtZ9lBq zG?pTIEFj8MTZQYD)@#=E{XzeaI9KOLATaMF>|CCWM_^j$5SUis;M1q9WzQ^KvRX&RO2817GQIOQF;a<<2QSZKKqW-arC0W4gfm&Dx-sXo-gbu^ z%~&xz2?;oq;CGAFYrG)VD(SEcqL^owJcgz>hnLn;VM#mb6Jni~+J-%js-;VzB%CC3w+VETZ5DnibEg`C zW7g}ndlOyYz_nT|bTYKW8cs264f-3*g5XW83H6Rp{)z+uT2uHQPO#`okqxoY~n)SjW99C8?e>VP^=oVH>t-w7~Q z&?MTCC>D-GNhDW#420`x#^G4A1<-O;T}xP`DW0wN@;v6jH_~G@@i=47u!SngEK$-` zZAy&Fq-gh`?nD*u#jh~<6Kn$V9O$uW^LJWImCRBE9`Yf+adT`@Wf7)N1w zKywtw9?6Peax8oytE6LE+34qhTwR|jTkE`S7*MXltuq0zU4mY@fH|=$V%UX;oCS1Fc|_SXZ@avTxvh-+*e$ z!M#~HRsl;GKE8V^URNL=Gp>96D$rzJ6oCs39nuRa2CF&mA+JHB-K{9tic@x&zTq9u z4bW<`D2_U5en0E0L+m5>o!ssruw08?AwjZL6&Cf?R!W^wuXF?j9>!@;7Isr^JiXH; zK2{FOT|>2(^KXDw<|wNtksJ;>v0y+)#uL!|$_@@S0Ul07o{xqC@%hEW6hd-UC1JWO zlvv2c;h-#p`%0@Kz&N9q5)EvX6EsnJ4W{ghvFRxL5QP-ArYlkRNDr5s2!2JS(3F(w za$T+@^|ny2JSbO^0`FB1yw@(x2-4c((S_6`K8tWN62uNdp3JGJ2Vy??PQdCYTV82x zV>#;O+-y1zm)n^mo^L>UvLIQ}MlJkP7B|gG7Y{p;2&M|wTG_ec_?`r9tFp`F_RdPh zR7x_ZmHm|P--?i&pDAAN2KBK5bGuW2q%+~hJ|ZZcKu^i(`M1z`k-4-kaLx|NFju5{ zNCwxa?yM{lSMEN>aY@gc!+o=LSMl9{uA}&5x|QG~Qm{zxEKpT5m4*hmnKGm*5z;rZ zbIX;-GfVbWRNK+`WOf>2xhh-kbV-;Gpn`o!hxvRJg!mkM9Wnu|GeL!Tx4orOdp7l8 zJPojpD&u4baqx1Fm`ITI@)Goh4S{SAb*+J0c?IM4!_+#`1|^enu}mRD#@8r;oXuu# z+Wbrrhq!g^++AM*4HH!8bgR%Q$XW-SOk2GK^5u#>8lVQ=-KgXmuy%k}RNGM2A1^mq ziYB-#*1SHdqex3sE^q>qY!pD7G|IN=h6?j)KhYssr9_${cohxzSSkN`c5x~oS|L?< z$-+8awuKyOA#m|VA%WYttqkG0<+lX5{y!$M;$J(a%2PN&CB0x-*&b8|kiA&pO8u1Z(kYweZ+gn~n;%ub2X56cnzz zrU+WvIBX1Q<53IoA^O-{t7S|{)*<0qg%c9~D}3FdJp3qIx!_pEMPBZ?hdP;=k>{TS z+hvMxFmxhQAk`h!4Z>kSYSHZq*tHLnuVlO+&|bQ1sy1!4b0Z_dNL8-^zOBQydtmX@Xv&%MGTc#6f# z@~}Lwhxe%XKJn}t?<;j-{#OCzPN(YWRQ@+wdTPlk2$YVs!J-i)VZ~@4NtLf`DSGuV zSXzck+62I9FK9g=+HpXY4(^u6v`MQO`;@^LERk5@>x>sf|3c$n#Y(l8xAC)_6=r(H zBd}f|e+C!a-(?k3VOx)ebmXKRNgd7s7l_xC<&#*lDsJQ`b;*(H*obS=(ehyOTfz=2 zUwkB090XYuCe%4*(i1gQ zGeD=)>RhDP2)>v(w&C0JOP&?nl&L0Oa{jMzXT}R+)>gKA(^eS?jbyjo;Cj@9k8ijO zX~B&a0HWHCps5y|%0ob^$wOdG!qPj{ohlo!puU$xr8bR|tUkm$M9W+m{R}0XiPIj5 zAgl(+)?XAQ)+&`rnw^c@+LVqX)u<1nmbMwqM8;nhG%}cS&{f~yKrfBKc z=j7>zVPJnDJ!^C>83EB+E9re&Q9UE%D{H?c9EobfCEiH22g7Bk7Hy>8?>C)zFxl3! zpEgipPs|o7uE+POP`T`WOZH{_b|~xJ>Ew6?(mU9)QS&>u}?~mQLWcZsd$v9+em-YB0DbbPlMWMd5jb@5D=;y|pFIkE2MUwo4swQazrPAEW zAzDTmBdZ$CxoU?o9n#9b9^)*N5agBHRHU^kT1^^rN)Q>eQc-t3uO6CVfm||EBBb=% zaVB$wMf5hatnK{ioym44JpM9yAbDU~-wguh7|fP-66chHtk5C_r#AM_WQwXn)kj)C zlK3w$UsaGZe#-(Bvk>|j7og_ZFiUgk6%Vb1)ONU$@neiubCz;DIhm~ti$YE&Qvy~% zK?Cz8LCWm0a;kdchw zvq%$O34MwS`)}A$e$^{z`867Qn(FyKr*(t~S)g2 zJq;#L@ZDac;nGME($5fb_((Rq{1I|Qi)gt?m6O1G*SZu9qcmyVVH0-v;M)@d5lB(mzps|9PaUE?_H-6lqDt>=NnO zuoZc=T@+T75Z@i|ARVVA+-)t(BBhjIgY}uWaZ5zH*?oXeYo7=gOhH`aZ+lE}U?r)P z-cWC#DpxSPMRMeVPcZO3o97D*!MN9J67tLpCd{*#I4kM1;gS^i7Pq`Myzd(G2JmTqYWB7Rj$@rKQf`)~a$PH5uC^q5FD6ec(bI|Ldt`(|}Xvh^rfq5bfd@B`!~qJRF> zB($6L$E4=J&Ha=PF}BzCJN}D4hL}4y1b^suDqq8pL^O}FBwM-7rBCI48^@vh&6Mp^ zo>w|xn{H{qdBZ(mq|}5=frpO^|7EcNTOf3-l4kx?I)@0iJucP>K;{-y5SN=(X1#`*r!iL*MzV1n+dfDLEV(39KALjgqc>(v^+{P50l@r^5(k< zR2fS6`k~(iGf9&Ni{R}J5Idn_u?4`jqlU@NZoqe|DAWP@vWU-+?9AP%pXrJx)OrG= zmG039@0Mi|RFW!`yHP94ZUqu6H}2@#4_UJ!La~KVlZK3UUP7%{-l3*1g@w<<1ifgc z?>V(0$~NhvA=EskzLb=|@c{k#v)&q#7E%kc;SzcnS_mb))%qkReEw7<$u;L18kF6| z-0brSz=Ix6(Tp02QKd2_Kkt9gJCSF!Z+MOtgf{H)!?VyK8Tjs{NkhPf=TZuDR)d;? zmSqh%m%AGi-n9(8MXk(Hj~{$f^Q|q*BHTM@bobrL48cI%u%nBGc_RQ4o&EE#f~ZLd zKk{M0A|-mo7liHZDt|;CQy~^6gv(rf4uVCs!5B_br?m4E*^vPYSyeBL(H9Gl(%{hwMz$Vz;o6bI3>-I}PRO%A0|j z{n`6Ql0J81K~!|ZfoUc1(+!W!xk^q10^bNA&^5!|yB0bobU7}tFr{lh!GW|Z-+IKT zF4as%^s0Tc*x$$4#4o}=Kl^7ae7Dl;Y7#^F$=$#OEG`7<5{J5rhL8Jdr$y807=#9H zqL!gJtk#pZFU$ACXC(!MA`kWa$Wejko9PFD@gx>kb%k5K#XJ1tV98k3yWu&=4*$Z| zglORwE9L28k!Om&ucG$@b*k}^oT2+HV2b-sDkDPzBir@(L(;NK3wu3U$|0JIL_?E= zh$)%_0g%yX@+k~LPxwy5&BqbUfHYrCq5euF)FJLYfG1;| z)7hW5rL1{JTB(`0MZii1ee}60_)Kxx2Y^Qzym!gxuqKh8wodFPQY_2^BiTJ5=M0l5 zx5jO|`F{F3jp)6i^b@SCrfa7T(jRy;#gGR&7(yP^MCgucr#qc{WufsZ-aX+@!_(#; zh6Q@=T{4mrTLzxA%Cl1a>=sm-X52J?|b{zEjPX?8+-mO zuWf8Cec*q*LVdJDzJd%9@qy+4e;*ynJ07lW+W*S=O!(2yd@cte;=K!&z0Xrl#p8iP z-jAKd?ye(BA9yD{4gE!K4s8;LN3b&5+xs)TR~V5R@eLd&W1SZr2N+*cBQUI@)4lx7 zE0%p{-0pv$ddky}O4gH-H8ofUml)uvzc>o4CuIM;{(! z)B@hq#*b5hKtL31$&;*W)kS~>)_y74Lr(U@4)Tc-rMz@f; z4`KGIV>1maqzcZE&E&+}7?h3hW3%|zI9yPKQf()5!bsk(OUd-&8p04CrGH;s`1Sj~ zfS~dB(iSTIvb@;?=QH4X&S9Fn)7DmmY#cQ1q13nbgUqrss)lTIG)%huq*AEBVGthRI1 z0Q1=58Uz$40H2%_9A@S`If|7b%ZGd4bma zR0EhAXhg70Ta>?H8MsF*5pxgO_8^E45Zily)lAMBgLDB5+A z;Jzab@83j;fq@gobq0FhL$+!%FwR!#cSsW|tB!z;8^-f$BHf-Qsch4y5iws4nD_19 zM|p_sYy=dt(@5th1tKEaAPx0U3eUvooS@L8-0Ix2HPM*}Sw4DRj~pfg2ptR{y8wQU zT&@N@vgZwGTzwu=(C}nvfwU)iq(Q<>)|d1YX7^BXG;mJ0+_|hEsxYY!;(|gBucie7 zSxCB8Cup^~uLG&`sjL!GRT+s7s|D#8Y&b;AeUX9OXSq9!Z7e6TD)s{wRa};)eJZ^C zjZuX}dzT^eRnNGcq;!yW3RK7s8W){kruwIBQDr}AIEJ$TY2p^(GPFPn`2mYyrP`7O zIW-N#lCu2#vPLBCAU~TTiB~ZLm(c)NRYFCp{PmxGJbgccz(g%~z{sGKMI+-{Kf|(! z*_Z6b?;>`Hlpq-cACq3jm{e~QBi(GP=-^UA!Cc;W>-Apx%Rn zECms2vzzHVh9bY|3SI;Z?5EHoFqH_S(jBC3w9~j=(p#pWQg;miMAOD1TPRmL;ry zb`L#Lco=T4CEc>s{2ut!zwx^dJ8Tt}{rM-LUjiJrAj7ZoYDG?JAdsI#`J@+XUyPm1 zaI@xT#x81i4YR}J zXm`CR0DdJlyRu&+N^zJ^jYLlIGn9{C=)zKmm$rPnYtppa!g%tUjxurA6nta$AF&-_ zo2%sAM&2<2Ac}+^zlBvV>kd~Mw0w(9;b6w`WME5LQ6o|NAv5tr$u-SKxNE2y?81V^ z$kvczBh#dLw|syaP2~Cb;YvC!pu&u@I*|3WBGztP)@FP(o*CSwddAY>zc`{83#}%@ zrN2b_u=E1x_=1j7tWO9KV08p}zbTc$)Zrju6nl#<#Ew&s2etiMWG8CQ6)Uv59xeU^ z2B}4Kr9jS*V5zRg2Cvm$sr=2D> zySN#C!txa5T}kRq9sw0pEb5iwf-U~&0~T-6{@vd`d*P8aBF6`k8n}D_mXc1{&{Spg zutf1}#I>Vv;dE3V=FhU*=(uCBh=L2%*wN&fMO>`Gw1G#xwB1yEF~bNenq&cP=rt*C zfjjr*?J~2ry|$h$JJ!smR`V#+76B5_b{3OwJ+~wI*1VT`mn7fvd1J#^1DghBwoUl0KN z6Ks7Vt20m;uvX-a`Qf8nR8Rtw6>2lB9$?>*gaf7*%~#AqsA_+ce*O5;pZQi!A3A&^be7 z6x{?Fisxu*adWnsU&k3X^=WyIw>f3~1;?~lp%y}Xi+H+elmMkp5t~R~A8euuzW%e= zM6{`JbZLJ+FUr4}Ag{+tLjtZG_f2Cv1yHI+pk9}Y1Wf!AqM&RAb&)%2I8isVZp@P% z$3_Sw(svo{B7m!O2w;E~PY~C<$c|WkXiMErS_H%_QJrF$m%uE2mq3>FG~u6yJQgYq zcNZ*pA=9}VXUicOQZ~1qWgtv|i;H#}VGG31tYy_0_Cs9E;t|%vfv*w8>xPG+;sMur z*Typ3Xbux=l>C^N>JZbjYn6sep<#C;RzxVM)K;D!RYEpWQfT}C?=27+vDl$=ii7`S&OX;(Zu2y?jG!O zC!;?E94J&W*+ky3cJST*;`va#V-Xyd*hx;XL!nwa6{eOMHS8Td65p@rU+3TKZb^%L1z z^dmojEJi&HDo=#V@8HECI+@jIh&}oo0RZZAXpu@jQ&9_Wfw=tLbb1VT{buVO1i^Sv zG}OSklR?6U#`PhRqbWL%_{357Nt8dtweRzm{mp1b%{HEPZ9V;MYRlKs{_s^}OfifR zU8FrP+1iAPbL`*Hc&5TgFDacg$&cGshK?|K&hZc&T?WG{^@{I`rc?4)n(t_HAEPgw z7-Mwh(}ssMfgX2=yX(Ox&9`FhX3oE~4mmj^z%q^L+T8K@Nm=w}j-%tTi}~CG^U30W zp1nA4K50tNsl+J^3w>w#88n!Ol9}KF_lhhFJv@U2Hoq*Ap#eM-(}<=;0f9koh`_$# z--u&-18*0%&=d`ZJ7y{xbi!=@AfJH#q8{g!P%k{(!|t9DpZ_%y-JP5=FU|X)H!Qjk zwNvqjIIF{TCl{hT_jy*P{w&G-u%PDu@5QufClV~J6S;wiWm`Z?n2^X zIR)k%esS8h(yUht@uBfrU$@N6mU^%oY~OwKQ>hAzuEWlVFjrQa4{IRN$>b0@?R{dQ z7+v#wQ?*EHEmW#XNEZ?KS*}A|>}pEPwFJ9qj;t~mnO$pJ$!BWSRNQlIvSSdwiF0-9 z&w#W9x4|T2CL-1$+AuFwprQF5HIVsCmimzkHAb|&8$N`%Q9+M~l^m~DdWM!LzI>v+ z)~RhdnhJ1dkpjD^@RwOgIZ+-R2Pab2GKvPSXjPWsNE2Jrv^Z4x(Cp~AqW zV&t;>Fum-$0*GvS3*953am9T~kvg&o>Wxa97@cYZaji4(=zG&Lxzbi{0_^`^$tFat z?N)-QUSJQ@q`vLSXoPwAwTsCf%_NSZ<*@Fu>`vHEDn&4a2dS-amBNW`6Yr z{0&U243^*FzRDjhRo8qFJ03{%jT+`@TXS|_91GEW4-duVQm75I@k8Pao0lTiOGXKr zqum%60&2ZZb|=gMZx{%v#U{OJ#^boMFrHsaNp(>uTsid!wUVzQUL3Ou>9Gg6lZM9+ z;4}DDZNj{hDqR+ewdyU=C3@TDgRq_2VS_!Yo0L#Mm)(~J9!+|?Z@qEFz2MEDj<73j zg+?WyvgvJdyV}m=zGfgt4SH!4wb1vaya1I$DQGq+3=*hleZMNaN0)++n_oZel?P6E zTB?Tr4bukXS3R#2GWJk{PHh`HGR^)}91%}CGR{BpW z)gQ?fYn@(p=_y&>(Ukw8X~|ilU2Km)sg+!Q=Z1$iwz*GXB0As5BT*A6n~^mk4z93R zFderf>Jp8yWv!F(660V2+m}O8tieEx0qaoZOgNN3Anlnc z2cF#rpOIptjUe1uvQNDZGdQc7z8oMvViaMis1k1l4Fg`}KoRaF9JoHoQN!4>)+-8z zE9&C)Qo-)Qy$M3&Ar>IN~$^S z=_STjmbqC`mI}8dOyb^?W_C8Fa>0A?y!#0xcL}(1!^!BLclZBY|Q|oW&GPL=X zz{{ILxn59hGeHMTf;Vkxl(R<=(eGr=yR88Wk+HXNq0K|BHpPwB;ve>={-G3KI_Kvtl{J#L{8T6T zESf5jmdo*=geeR(L@6j?b^3%7zr>Hx{sv34>k_|{RY973P4QhRZUYyRq*J4?f(XTt za4Eh~%qJg@A~5!;l&Yl}9;Bz>h8MP-k^{*-SH3VF@=%Xr{vMEe@~#36-r1;q&|U6@ zxju2JnRlEpS1;nT@qQl;2636fQWPDzly9tI6dIA`jXN@Sjv@lG*}2sw&MArSrD$^x zHfA8^&jqgQ+7Ij#21A<=^Lv6dUq^%yKr^r23C+}dA#gq~{BaMErbKo|Sl8w^pvB%B z`+2AGD9Feg51y@yf;4MF5%GkUa-6cFJ#n|QsHt5P*7!a#akwufQ$IvVMmM3j8xk4e z#R5j@dLfT_@Vyid)D);YsdYx3vo>_eU5;q2ps0K!6&0Mpk}!3t+KpJIg(6D+ie*7& zUkYvEZZF-Gb=#Np>JN9Q+7>{+JV!`vXNBm=S! z_f7s+4@qx+FfQQ;-iS{D%JFqeoHQMcCM#QFb1y>#2&6P|lyIS!|NIO$w0_z8P#iZt zG=`U60#ZQEld!@+K?AyECTXK$Bg%%eAnPZ-qalmcOYDsw$3m8u$kv9PO(QIK1CcVF zl^6Dlps{R3sda+i&TZbs7aWl#*n9g8x@~DY{TslhF$W1fYsGF5T@*X#%%+WF?t@p?p+&L6XP7Q{qhCM|p`SZ}t)jAi0=`D#L z?n+BjT6rbUtv+WZC>EZUsHNQ@8N=FRw@Wx+d9I8dlqIgPHC=!i7#V#@7;5c-6Q$7c=jv)38;i3Yk4~Mji!OGravB!i$c`2rY6*>DJ2L|t?8a;9N zbRU`O?J|Vurns#Qrlh*l=z=WYQW}71eKDK|1F29+J{kH3?!g}(-bOntn7x-I6)>m` z9B@<*!eG|=Tq%YP0Ek)Zk#M8PU2+(57Z<9TLw%~7L^B>js2(0ywBJ%n(3_U5xVe6R zPVgu_xf@m97)Q&pk>^D66acU30=~n4`Y}8cDGCEQ{dwkzHMyr1qZg9my;j!M+0Z6; zE!C_b^)sxqps;$8`Zz7vi$JcPQ5NOYod$8T1XxN~W$rXhnzG!(JqHBQP!7+cHc7n+>z3ly(GfgNR-nWph^QkZ{#p^hER|gigL9)RizE6 zU8=`hZijbIg1c+Am>J?KCTqZF_X|~s^a^%==24;5{8U7j`LNC{FHqjCZ!3N@5O8fH z%3Cdbz>i^A)2Ri@yC^FR?BNLl<$X>A3TC?%@fqdq${upLQ|aSrKCEcGhv|Zpfay)g zG`YD1QUQk{kHbNU9}xk}IMSOl1-v$rtN5;lGj47a^#5M0-C_71hI`fqq4vLF*|^KF z{*U5}(;3mF9Ta6|P<#|1jY+*)l!dLb3Kch(j~_I+Kp^=b2GzmLrv(RlP94rze7ZfN z<*bG^`!NKJRK7od7c#M~Nf6Ai+Z3;~?oVK?>L7h?0rDPB?2L!!*&SYrwQ4-;!`H&4 z4QlS7=WvR4=MW$tAJS7?Dg!>mmbjXHf;h@*#>wqr7J5EMr`73gU|ApV%ql37iTT46 zb142|af5rj?+vZW?l!-~FWZzRTOFQD62-c@q-MMo0ih-jv{~FetUN_x7yH}@RB;`V z9$={sAPY-Jb}wK;KEM#5fV4BUDpO(ADf%piWBS}oI2x_;csTx_Lvah6*pD3uLQ_26 zTjhicUq<{VLx{DC4<}qF>A&iW5Nozmr32Fj-GEfl^&iKz{@JaP}K!Q(<_G^{%O@ zJI-f0J;F9K0n8a}w6cl%9-r)~#22gzXSJP5W(6rX73#%%4l^%=h*|A&)<<58uUNA0 zf^hyi^lHgwy#lZJ5UfEpp}UC)(sI8&aWJpCuOJi;K z>m0=d{^-Z=9PR@)7f+BmS%^f193X}HK)PU(ZLOROA9p|qLlch7Y znvPK0Ua;j$Q_{ATl-x;rF}gdH*3L=}(_ib&J1AkE{Bn=N36LwY6t#O8U@^U5rnD!5 zS5_!qt9ZKBU5wjV7mnvq`c0t%b8AAprbLUG>S+u#xHpd3LJ3NZc$O?VPbG9ptTSB2zw_!Ge|OXG`I@ zEkeu41KEV8TK6&Zs1nnNftpBdH&flg3O=pWH;LcQ>|$Cap5yj(cc2kBUfz_NZoRTq z-52M*xrs5#E^nfeE0hrf`>U86p9UF7sPW!t&kgmvn;KB#`bJtDpvXXt=Zg_!J`-oK zaOo;A*|$V=6qK9Pw7dlX5mFJ;VoWYlvo!%L5(OU5w)T)nS(-BAExfQLsVyw+f$L{8 z9AI8x#PE zUjn&$JAGe&J{vwMf<9tfTHXSKZ+2z43rNl+=QEuw*GItyo#D_a*axbFA4ff4VMLzZh%-m0W(wrcs!98s(T~)xmW+| zic_9^_24f$UVn9sd?<@9gxT+Ylv({D1lMwsTFuAmaNh{Ixy?b(aLK1F5bZtzn_0ToPF%xhTr7<%ITPwGy0FjnzZpgdMqk^ zas5Asl`kyM|F3KRM+Dg6!RvpSuNr%>`fiM!SV5ALc&s(sDlpL*nr+YVIE UT|Q3!yL8r<{$b@sU%mam0fcD@xBvhE literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_negative_axis.png b/src/wasm-lib/tests/executor/outputs/patterns_linear_basic_negative_axis.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6e47deedfdcbc88f07966eb2414bfc022714c5 GIT binary patch literal 72707 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‰&3cyU)1m(=W7c-@| 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‰&3cyU)1m(=W7c-@| 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